# SwissKnifePolynomials # A Maple code companion to # http://www.luschny.de/math/seq/SwissKnifePolynomials.html # ================================ # Peter Luschny, 2009/07/01 # Licensed under a Creative # Commons Attribution 3.0 License #================================ # -------------------- # Auxiliary functions restart; # Workaround: To avoid '0^0 undefined'. pow := (n,k) -> `if`(n=0 and k=0,1,n^k): # Workaround: Some Maple versions give euler(0,1) = -1. Euler := (n,x) -> `if`(n=0,1,euler(n,x)): # -------------------- # SwissKnifePolynomial Zig := n -> euler(n); Chen := m -> if irem(m+1,4) = 0 then 0 else 1/((-1)^iquo(m+1,4)*2^iquo(m,2)) fi: # Polynomials SKP := proc(n,x) local v,k; add(add((-1)^v*binomial(k,v)*Chen(k)*pow(v+x+1,n),v=0..k),k=0..n) end: SKP1 := proc(n,x) local k; add(binomial(n,k)*Zig(k)*pow(x,n-k),k=0..n) end: SKP3 := proc(n) n!*coeff(series(exp(x*t)*sech(t),t,24),t,n) end: # Coefficients SKP4 := proc(n,k) binomial(n,k)*Zig(n-k) end: SKP2 := proc(n,k) option remember; if k = 0 then RETURN(Zig(n)) fi; SKP2(n-1,k-1)*n/k end: # Generate the triangle of Swiss-Knife polynomials and coefficients: seq(print(sort(expand(SKP(i,x)))),i=0..7); seq(print(sort(expand(SKP1(i,x)))),i=0..7); seq(print(seq(coeff(SKP3(i),x,i-j),j=0..i)),i=0..7); seq(print(seq(SKP2(i,i-j),j=0..i)),i=0..7); seq(print(seq(SKP4(i,i-j),j=0..i)),i=0..7); # ---------------------- # CoSwissKnifePolynomial Zag := n -> 2^n*Euler(n,1)-`if`(n=0,1,0): lambda := k -> `if`(k=0,0,-1-`if`(k-1 mod 4 <> 0,1,0)*(-1)^iquo(k-1,4)/2^iquo(k,2)): CoSKP := proc(n,x) local v,k; add(add((-1)^v*binomial(k,v)*lambda(k)*pow(x+v+1,n),v=0..k),k=0..n) end: CoSKP1 := proc(n,x) local k; add(binomial(n,k)*Zag(k)*pow(x,n-k),k=0..n) end: CoSKP2 := proc(n,x) local k; add(binomial(n,k)*euler(k)*pow(x+1,n-k),k=0..n)-pow(x,n) end: CoSKP4 := proc(n) n!*coeff(series(exp(x*t)*tanh(t),t,24),t,n) end: # Coefficients CoSKP5 := proc(n,k) binomial(n,k)*Zag(n-k) end: CoSKP3 := proc(n,k) option remember; if k = 0 then RETURN(Zag(n)) fi; CoSKP3(n-1,k-1)*n/k end: # Generate the triangle of Co-Swiss-Knife polynomials and coefficients: seq(print(sort(expand(CoSKP1(i,x)))),i=0..7); seq(print(sort(expand(CoSKP2(i,x)))),i=0..7); seq(print(sort(expand(CoSKP4(i,x)))),i=0..7); seq(print(seq(CoSKP3(i,i-j),j=0..i)),i=0..7); seq(print(seq(CoSKP5(i,i-j),j=0..i)),i=0..7); # ----------------------- # Swiss-Sword polynomials ZigZag := n -> 2^n*(Euler(n,1/2)+Euler(n,1))-`if`(n=0,1,0): sigma := proc(n) local nmod8; nmod8 := n mod 8; if n = 0 then RETURN(1) fi; if member(nmod8,{2,6}) then RETURN(-1) fi; if member(nmod8,{0,1,7}) then 1 else -1 fi; %*2^(-iquo(n-1,2))-1 end: # Polynomials SSP := proc(n) local k,v; add(add((-1)^v*binomial(k,v)*sigma(k)*pow(x+v+1,n),v=0..k),k=0..n) end: SSP1 := proc(n) local k; add(binomial(n,k)*euler(k)*(pow(x+1,n-k)+pow(x,n-k)),k=0..n)-pow(x,n) end: SSP2 := proc(n) n!*coeff(series(exp(x*t)*(sech(t)+tanh(t)),t,24),t,n) end: # Coefficients SSPc1 := proc(n,k) binomial(n,k)*ZigZag(n-k) end: SSPc3 := proc(n,k) option remember; if k = 0 then RETURN(ZigZag(n)) fi; SSPc3(n-1,k-1)*n/k end: # Generate the triangle of Swiss-Sword polynomials and coefficients: seq(print(seq(SSPc1(n,k),k=0..n)),n=0..7); seq(print(seq(SSPc3(n,k),k=0..n)),n=0..7); seq(print(seq(coeff(SSP(n),x, k),k=0..n)),n=0..7); seq(print(seq(coeff(SSP1(n),x, k),k=0..n)),n=0..7); seq(print(seq(coeff(SSP2(n),x, k),k=0..n)),n=0..7); # -------------------- # Alternating sum of powers of even integers 2^k - 4^k + 6^k - 8^k + 10^k ... TE := proc(n,k) local j; add((-1)^(j+1)*pow(2*j,n),j=1..k) end: SE := proc(n,k) (SKP(n,1)-(-1)^k*SKP(n,2*k+1))/2 end: for n from 0 to 5 do print(n); print(seq(TE(n,k-1),k=0..6)); print(seq(SE(n,k-1),k=0..6)); od; # -------------------- # Alternating sum of powers of odd integers 1^k - 3^k + 5^k - 7^k + 9^k ... TO := proc(n,k) local j; add((-1)^(j+1)*pow(2*j-1,n),j=1..k) end: SO := proc(n,k) (SKP(n,0)-(-1)^k*SKP(n,2*k))/2 end: for n from 0 to 5 do print(n); print(seq(TO(n,k),k=1..6)); print(seq(SO(n,k),k=1..6)); od; # -------------------- # Alternating sum of powers of integers 1^k - 2^k + 3^k - 4^k + 5^k ... TA := proc(n,k) local j; sum((-1)^(j+1)*pow(j,n),j=1..k) end: SA := proc(n,k) 2^(-n-1)*(SKP(n,1)-(-1)^k*SKP(n,2*k+1)) end: for n from 0 to 5 do print(n); print(seq(TA(n,k),k=1..6)); print(seq(SA(n,k),k=1..6)); od; ############################################## # Let's go systematic -- the general setup # (including Bernoulli and Euler polynomials) ############################################## PolynomialFactory := proc(F,n,x) local v,k; add(add((-1)^v*binomial(k,v) *F(k)*pow(v+x+1,n),v=0..k),k=0..n); sort(expand(%))end: F_SKP := k -> if irem(k+1,4) = 0 then 0 else 1/((-1)^iquo(k+1,4)*2^iquo(k,2)) fi: P_SKP := (n,x) -> PolynomialFactory(F_SKP,n,x): F_CSKP := k -> `if`(k=0,0,-1-`if`(k-1 mod 4 <> 0,1,0)*(-1)^iquo(k-1,4)/2^iquo(k,2)): P_CSKP := (n,x) -> PolynomialFactory(F_CSKP,n,x): F_SSP := proc(n) local n8; n8 := n mod 8; if n = 0 then RETURN(1) fi; if member(n8,{2,6}) then RETURN(-1) fi; if member(n8,{0,1,7}) then 1 else -1 fi; %*2^(-iquo(n-1,2))-1 end: P_SSP := (n,x) -> PolynomialFactory(F_SSP,n,x): F_EUL := k -> 2^(-k): P_EUL := (n,x) -> PolynomialFactory(F_EUL,n,x-1): F_BER := k -> (k+1)^(-1): P_BER := (n,x) -> PolynomialFactory(F_BER,n,x-1): # -------------------- seq(P_BER(i,x),i=0..7); seq(bernoulli(i,x),i=0..7); # -------------------- seq(P_EUL(i,x),i=0..7); seq(euler(i,x),i=0..7); # -------------------- # Sure, the 'generating sequences' are much simpler in the case of the Bernoulli and # Euler polynomials. However the result, the polynomials, are much simpler in the # SKP-type cases -- and this is what counts. # -------------------- seq(P_SKP(i,x),i=0..7); seq(P_CSKP(i,x),i=0..7);