#!/usr/local/bin/bc -l funcs.bc cf.bc ### CF_SYLVESTER.BC - Sylvester expansion experimentation using array pass by reference # Workhorse: Create an Sylvester expansion of x in pbr array sy__[] define sylvester_new_(mode) { # expects *sy__[] and x to be declared elsewhere auto i,max,q,iq,p,h # error checking .=check_cf_max_() #p=(abs(x)>=1); q=(scale<6); #if(p||q){print "sylvester";if(mode)print "2";print "_new: "} #if(p){print "Can't work with integer part.\n"; x-=int(x)} if(q){print "scale is ",scale,". Poor results likely.\n"} max=A^int(scale/2) i=0;p=1;h=3/2 for(i=0;x&&p=max){ if(!mode)if(!--i)i=1 if(abs(sy__[i])>max){ sy__[i]=0;.=i-- while(iq=int(q=(sy__[i]*sy__[i-1])/(sy__[i]+sy__[i-1]))==q){ sy__[i]=0;sy__[--i]=iq } }else{ sy__[i]=0.0 } }else{ sy__[i]=0 } return 0; } #echo 'scale=250;sylvester_new(a[],7/15);.=sylvester_print(a[])+newline();sylvester_value(a[])' | bc -l funcs.bc *.bc # Create Sylvester expansion of x in pbr array sy__[] # . all terms same sign as x define sylvester_new(*sy__[],x) { return x+sylvester_new_(0); } # Create secondary Sylvester expansion of x in pbr array sy__[] # . first term same sign as x, all other terms opposite sign # . terms in implied Egyptian fraction sum have alternating signs define sylvester2_new(*sy__[],x) { return x+sylvester_new_(1); } # Output pbv array sy__[] formatted as an Sylvester expansion define sylvester_print(sy__[]){ auto i; .=check_cf_max_(); print "{"; if(sy__[1]==0){print sy__[0],"}";return 0} for(i=1;sy__[i];i++)print sy__[i-1],", "; print sy__[i-1]; if(scale(sy__[i]))print ",..."; print "}";return 0; } # Print a number as an Sylvester expansion define print_as_sylvester(x){ auto sy[]; .=sylvester_new(sy[],x)+sylvester_print(sy[]) return x; } define print_as_sylvester2(x){ auto sy[]; .=sylvester2_new(sy[],x)+sylvester_print(sy[]) return x; } # Turn the Sylvester expansion in pbv array sy__[] into its value define sylvester_value(sy__[]) { auto i,p,n,d; .=check_cf_max_(); n=0;d=1;for(i=0;i