In [ ]:
x=: 3
In [ ]:
c=: 3 4 2
In [ ]:
e=: 2 5 4
In [ ]:
x^e
In [ ]:
c * x^e
In [ ]:
+/c * x^e
In [ ]:
perm=: 1 2 0
In [ ]:
] ep=: perm { e
In [ ]:
] cp=: perm { c
In [ ]:
cp * x^ep
In [ ]:
+/cp * x^ep
In [ ]:
cd=: 4 2 0 3 0 0
In [ ]:
ed=: 5 4 3 2 1 0
In [ ]:
cd * x^ed
In [ ]:
+/cd * x^ed
A polynomial may also be written in a standard ascending order:
In [ ]:
] ca=: |. cd
In [ ]:
] ea=: |. ed
In [ ]:
+/ca*x^ea
The descending order is commonly used in elementary mathematics, but the ascending order is more common in advanced work because it allows the use of power series, polynomials with an indefinite (or even infinite) number of terms. We will mainly use the ascending form, but the descending form will be used in discussing number systems.
In a polynomial in standard form, the exponents are completely determined by the coefficients. For example:
In [ ]:
c=: 0 0 3 0 2 4
In [ ]:
# c
In [ ]:
]e=: i.#c
In [ ]:
+/c*x^i.#c
These steps may be collected in a single function as follows:
In [ ]:
p=: (+/ @ ([ * ] ^ i.@#@[)) " 1 0
In [ ]:
c p x
In [ ]:
c p 1
Because of its importance, the polynomial is provided as a primitive function in J, with the two-character name p.:
In [ ]:
c p. x
In [ ]:
y=: 2 3 5 7 11
In [ ]:
c p. y
In [ ]:
c=: 3 _4 2
In [ ]:
e=: 2 5 4
In [ ]:
+/c*x^e
In [ ]:
0 0 3 0 2 _4 p. x
The term polynomial refers to a function of a single argument, the x in the expression $4x^5+2x^4+3x^2$.
The primitive p. is a function of two arguments, and is therefore not properly a polynomial. However, an expression of the form c&p. bonds it with a left argument of coefficients to produce a polynomial function. For example:
In [ ]:
c2=: 1 2 1
In [ ]:
c3=: 1 3 3 1
In [ ]:
f=: c2&p.
In [ ]:
g=: c3&p.
In [ ]:
x=: 2 3 5 7 11
In [ ]:
f x
In [ ]:
g x
In [ ]:
h=: f*g
In [ ]:
h x
In [ ]:
(f+g) x
In [ ]:
f g x
In [ ]:
f@g x
In [ ]:
k=: f@g
In [ ]:
k x
In [ ]:
4 12 21 22 15 6 1&p. x
As illustrated above, the coefficients of the polynomial k are 4 12 21 22 15 6 1. We will examine means of finding the coefficients of other polynomials (such as the sum f+g and product f*g), after analyzing the effects of appending zeros to coefficients.
In [ ]:
x=: 2 3 5 7 11
In [ ]:
x^3
In [ ]:
^&3 x
In [ ]:
0 0 0 1&p. x
Moreover, the polynomial (0 0 0,c)&p. is equivalent to the product of the cube function with the polynomial c&p.. For example:
In [ ]:
c2=: 1 2 1
In [ ]:
]pre=: 0 0 0,c2
In [ ]:
pre&p. x
In [ ]:
c2&p. x
In [ ]:
(^&3 * c2&p.) x
However, appending zeros to the end of a list of coefficients has no effect. For example:
In [ ]:
]post=: c2,0 0 0
In [ ]:
post&p. x
In [ ]:
(post&p. = c2&p.) x
In [ ]:
k=: f@g
In [ ]:
tk=: k t. NB. Taylor coefficient function for k
In [ ]:
c=: tk 0 1 2 3 4 5 6 NB. Coefficients 0 through 6 for k
In [ ]:
c NB. Compare with earlier result
In [ ]:
c p. x
In [ ]:
k x
In [ ]:
tk 2 3 NB. Coefficients 2 and 3 for k
In [ ]:
f@g t. i. 10 NB. Coefficients with trailing zeros
In [ ]:
]csum=: (f+g) t. i.10
In [ ]:
csum p. x
In [ ]:
(f+g) x
In [ ]:
]cdif=: (f-g) t. i. 10
In [ ]:
]cprod=: (f*g) t. i. 10
In [ ]:
(h%f) x
In [ ]:
g x
In [ ]:
(h%f) t. i. 10
Similarly, f is a divisor of g, but g is not a divisor of f:
In [ ]:
(g%f) x
In [ ]:
(g%f) t. i. 10
In [ ]:
1 1&p. x
In [ ]:
(f%g) x
In [ ]:
]cq=:(f%g) t. i. 10
Note that although f%g is not a polynomial, it is a function, called a rational function. Moreover, the Taylor operator applies to it to provide a result that does not terminate with zeros as would a polynomial. Moreover, the leading coefficients of such a "non-terminating" list can be meaningfully used to define a polynomial, provided that it is applied only to arguments whose magnitudes are less than one. The higher powers of such an argument become so small that "neglected" coefficients have no appreciable effect. For example:
In [ ]:
]y=: 10^-i.9
In [ ]:
cq&p. y
In [ ]:
(f%g) y
Results produced by the Taylor operator are called Taylor coefficients, and the functions defined by bonding them with p. are called Taylor series. Not only are Taylor series useful for approximating non-polynomials, but the patterns of the coefficients may provide important insights. For example:
In [ ]:
x=: i. 5
In [ ]:
i=: i. 8
In [ ]:
exp=: ^
In [ ]:
sin=: 1&o.
In [ ]:
cos=: 2&o.
In [ ]:
exp x NB. Exponentials
In [ ]:
]etc=: exp t. i NB. Exponential Taylor coefficients
In [ ]:
etc&p. x NB. Taylor series approximation
The Taylor coefficients for the exponential follow a pattern that is made clear in their reciprocals:
In [ ]:
% etc
In [ ]:
! i
In [ ]:
etc * !i
In [ ]:
dec=: ^@- NB. Decaying exponential
In [ ]:
sinh=: 5&o. NB. Hyperbolic sine
In [ ]:
cosh=: 6&o. NB. Hyperbolic cosine
In [ ]:
a=: (exp t:,dec t:,sinh t:,sin t:,cosh t:,:cos t:) i
In [ ]:
comments=. > ;: 'Exp Decay Sinh Sin Cosh Cos'
In [ ]:
comments;a
In an earlier section, we have seen how the operator t. can be used to obtain Taylor coefficients for sums and products of polynomials f=: c&p. and g=: d&p.. We will now examine how they may be obtained directly from the coefficients c and d. If c and d have equal numbers of coefficients, the case of the sum is obvious:
In [ ]:
x=: i. 6
In [ ]:
c=: 3 1 4
In [ ]:
d=: 5 3 1
In [ ]:
(c&p. + d&p.) x
In [ ]:
(c+d)&p. x
Lists of differing lengths cannot be so added, but can be extended by zeros by laminating them to form a table, and their sum can then be obtained by adding the two rows:
In [ ]:
c2=: 1 2 1
In [ ]:
c3=: 1 3 3 1
In [ ]:
c2,:c3
In [ ]:
+/c2,:c3
In [ ]:
(c2 p. x) + (c3 p. x)
In [ ]:
(+/ c2,:c3) p. x
A function for "adding" polynomial coefficients may therefore be defined and used as follows:
In [ ]:
plus=: +/@,:
In [ ]:
c2 plus c3
In [ ]:
times=: +//.@(*/)
In [ ]:
c2 times c3
In the function times, the diagonal operator /. applies its argument (the sum function +/) to each of the diagonals of the results of the multiplication table function */. The details may be seen as follows:
In [ ]:
] table=: c2 */ c3
In [ ]:
</.table NB. The box function shows the diagonals
to which any function applies
In [ ]:
+//. table
The reason why these diagonal sums of the multiplication table yield the coefficients of the product polynomial may appear obvious. If not, consider the following:
The product of two sums of terms is the sum of the products of a term from one with each of the terms from the other. The product of typical terms:
```j```
```c x```
and
```k```
```d x```
is
```j+k```
```c d x```
The multiplication table of all coefficients (c*/d) may therefore be multiplied by x raised to the powers in the addition table for the indices (that is, (i.#c +/ (i.#d)), and the entire resulting table can be summed. Thus:
In [ ]:
x=: 3
In [ ]:
] exp=: (i.#c2) +/ (i.#c3)
In [ ]:
table;exp;(x^exp);(table*x^exp);(+/+/table*x^exp)
Any element of the table exp is an exponent of the final result that concerns the corresponding element in the table; the fact that equal elements of exp lie along the diagonals indicates that the elements of the table must be summed along these diagonals.
In [ ]:
1 1× 1
In [ ]:
1 1× 1 1× 1
In [ ]:
1 1× ^:(i.6) 1
In [ ]:
]q=: c3× ^: (i.#c2) 1 NB. Powers of c3 times
In [ ]:
c2*q NB. weighted by c2
In [ ]:
+/c2*q
In [ ]:
coeffs=. 4 : '+/ x * y× ^: (i.#x) 1'
In [ ]:
c2 coeffs c3
The points with coordinates x,f x and y,f y lie on the graph of the function f. The straight line through them is called a secant, and its slope is the quotient rise%run, where rise is the difference (f y)-(f x), and run is the difference y-x The slope of the secant through x and y gives an "average" value for the rate at which the function f is changing in the interval. If y=: x+s and the spacing s is small, the secant slope is a good approximation to the rate of change of the function f at x; geometrically, it is an approximation to the slope of the tangent to the graph of f at x
The slope of the cube function may be explored as follows:
In [ ]:
f=: ^&3
In [ ]:
x=: 0 1 2 3 4 5
In [ ]:
((f x+1) - f x) % 1
In [ ]:
((f x+0.0001) - f x) % 0.0001
In [ ]:
scs=: ((f@+ - f@]) % [) " 0
In [ ]:
0.0001 scs x
In [ ]:
]s=: 10 ^ - i.5
In [ ]:
s scs/ x
In [ ]:
3*x^2
In [ ]:
SCS=: 1 : 0
((x@+ - x@]) % [) "0
)
In [ ]:
,. (s ^&3 SCS/ x) ; (s ^&4 SCS/ x)
In [ ]:
4 * x ^ 3
The derivative of a function f is a function g that gives the rate of change of f, that is, the slope of the tangent to the graph of f. As suggested by the approximations provided by the secant slopes of the cube and fourth power in the preceding section, the derivative of the power $x^n$ is $nx^{n-1}$.
The derivative of a constant multiple of a function is the same multiple of its derivative, and the derivative of the term $cx^n$ is $ncx^{n-1}$.
Since the derivative of a sum is the sum of the derivatives of the terms, the derivative of the polynomial
$c + cx + cx^2 + cx^3$
is
$0 + c + 2cx^1 + 3cx^2$.
In general, the coefficients of the derivative polynomial are obtained by multiplying the coefficients by their indices, and dropping the first. Thus:
In [ ]:
c=: 3 1 4 2
In [ ]:
c*i.#c
In [ ]:
}.c*i.#c
In [ ]:
der=: }.@(] * i.@#)
In [ ]:
der c
In [ ]:
x=: 0 1 2 3 4 5 6 7
In [ ]:
c p. x
In [ ]:
(der c) p. x
In [ ]:
f=: 3 1 4 2 & p.
In [ ]:
f D.1 x
In [ ]:
0.01 c&p. SCS x
In [ ]:
der
In [ ]:
int=: 0: , ] % 1: + i.@#
In [ ]:
c
In [ ]:
int c
In [ ]:
der int c
In [ ]:
x
In [ ]:
(int c) p. x
If d is the list of digits representing a number in the decimal system, then the number represented is obtained by summing the product of d with the powers of 10, in descending order.
It can therefore be treated as a polynomial with argument 10 and coefficients that are the list d in reverse order, |.d. In particular the function times=: +//.@(*/) can be adapted for the product of decimal digits:
In [ ]:
d=: 1 9 9 7
In [ ]:
|.d
In [ ]:
(|.d) p. 10
In [ ]: