Jacques Gélinas on Mon, 08 Apr 2019 15:19:01 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Learning with GP: Verification of identities |
How can GP detect typos and sign errors in published identities ? A quick test is also needed after transforming formulas or using special cases of general identities. However, "===" and "==" are not adequate for floating-point, summations, infinite series, limits, etc., when equality conditions must be relaxed somehow. We first store in "verif.gp" some routines for such comparisons. \\-------- File: verif.gp --------------------- Start cut \\ relative proportion of equal bits eqr(x,y) = if(x==y,1,exponent(if(!x,y,1-y/x))/exponent(0.)); \\ floating-point equality at r*precision fleq(x,y,r=7/8) = if(x==y, oo, eqr(0,\ normlp(Pol(x-y))/normlp(Pol(x+y)))) >= r; IS(e,msg="") = print(if(e,"Pass: ","Fail: "),msg); ISF(x,y,msg,r=7/8) = IS( fleq(x,y,r),msg); \\ f(n)=g(n) on [1,N] ISN(f,g,msg,r=7/8,N=8) = IS( N == sum(n=1,N, fleq(f(n),g(n),r)), msg); \\ f(m,n)=g(m,n) on [1,M]x[1,N] ISMN(f,g,msg,r=7/8,M=8,N=8) = IS( M*N == sum(m=1,M, sum(n=1,N, fleq(f(m,n),g(m,n),r))), msg); \\-------- File: verif.gp --------------------- End paste Next, we define "ckverif()" to perform mininal tests of the previous routines, using identities published by John Blissard, the inventor in the 1860s of the representative notation (known as umbral calculus). \\-------------------------------------------- Start cut ckverif() = { \\ floating-point IS(1.===1,"1.===1"); IS(1.==1,"1.==1"); ISF( Pi, 4*atan(1), "Pi=4*atan(1) (r=oo)",oo); print( "eqr(Pi,4*atan(1)) = ", eqr(Pi,4*atan(1)) ); ISF( Pi, 4*atan(1), "Pi=4*atan(1) (r=1)",1); \\ vectors ISF( vector(8,n, -bernfrac(2*n)/2/n),\ vector(8,n, zeta(1-2*n)), "bernfrac (r=oo)",oo); ISF( vector(8,n, -bernfrac(2*n)/2/n),\ vector(8,n, zeta(1-2*n)), "bernfrac (r=1)",1); \\ finite sums [1] ISN( n->sum(k=1,n,k), n->n*(n+1)/2, "1+...+n (r=oo)",oo); ISMN((m,n)->sum(k=0,n, (-1)^k*binomial(n,k)/(m+k)), (m,n)->n!/prod(k=0,n,m+k), "Blissard 124 (r=oo)",oo); \\ Maclaurin series [1] my( A(k,n)=sum(j=1,k,(-1)^(k-j)*binomial(n,j-1)/(k+1-j))); ISN( n->(1+x)^n*log(1+x), n->sum(k=1,n, A(k,n)*x^k ) + n!*sum(k=1, default(seriesprecision), (-1)^(k-1)*(k-1)!/(n+k)!*x^(n+k) ), "Blissard 125 (r=oo)",oo); \\ infinite series [1] my( L130(n,N) = sum(k=1,N, (-1.)^(k-1)*(k-1)!*n!/(n+k)!) ); my( R130(n) = 2^n*log(2) - sum(k=1,n, A(k,n)) ); ISF( L130(16,4000), R130(16), "Blissard 130 (r=3/4)", 3/4); } ckverif(); \\-------------------------------------------- End paste Output for GP 2.12.0 on Windows/Cygwin-64 (38 digits) : Fail: 1.===1 Pass: 1.==1 Fail: Pi=4*atan(1) (r=oo) eqr(Pi,4*atan(1)) = 127/128 Pass: Pi=4*atan(1) (r=1) Fail: bernfrac (r=oo) Pass: bernfrac (r=1) Pass: 1+...+n (r=oo) Pass: Blissard 124 (r=oo) Pass: Blissard 125 (r=oo) Pass: Blissard 130 (r=3/4) ------------------------------ Features used !,==,===,Pi,atan,exp,log,binomial,default, seriesprecision,exponent,normlp,sum,prod,vector, bernfrac,print,if,my,anonymous closure ------------------------------ References [1] John Blissard 1862 On the generalization of certain trigonometrical formulae, Messenger of Mathematics I, 124-136 https://archive.org/details/oxfordcambridge00unkngoog/page/n136 [2] Tutorial: http://pari.math.u-bordeaux.fr/pub/pari/manuals/2.12.0/tutorial.pdf [3] Reference card: http://pari.math.u-bordeaux.fr/pub/pari/manuals/2.12.0/refcard.pdf Jacques Gélinas Next: Verification of identities - Romik numbers