Return to tk_cform.rr CVS log | Up to [local] / OpenXM / src / asir-contrib / packages / src |
File: [local] / OpenXM / src / asir-contrib / packages / src / tk_cform.rr (download)
Revision 1.1, Wed Oct 12 05:19:49 2011 UTC (12 years, 7 months ago) by takayama
to_cform(F) translates the polynomial F into a C form. cf. ctrl("fortran_output",1); Example. [1630] load("tk_cform.rr")$ Xm_noX=1$ [1641] [1642] tk_cform.to_cform( (x+y-1/2)^3 ); (8*sm1power(x,3)+24*sm1power(x,2)*y+24*x*sm1power(y,2)+8*sm1power(y,3)-12*sm1power(x,2)-24*x*y-12*sm1power(y,2)+6*x+6*y-1)/(double)8 [1643] tk_cform.to_cform( -(x+y-1/2)^3 |nodouble=1); (-8*sm1power(x,3)-24*sm1power(x,2)*y-24*x*sm1power(y,2)-8*sm1power(y,3)+12*sm1power(x,2)+24*x*y+12*sm1power(y,2)-6*x-6*y+1)/8 [1644] |
/* $OpenXM: OpenXM/src/asir-contrib/packages/src/tk_cform.rr,v 1.1 2011/10/12 05:19:49 takayama Exp $ */ module tk_cform; static Tk_cform_double$ static Tk_cform_sm1$ Tk_cform_double=1$ Tk_cform_sm1=-1$ localf mystart; localf to_cform; def mystart() { /* extern Tk_cform_sm1; */ extern Sm1_lib; extern Xm_noX; if (Xm_noX) { P = ox_launch_nox(0,Sm1_lib+"/bin/ox_sm1_forAsir"); }else{ P = ox_launch(0,Sm1_lib+"/bin/ox_sm1_forAsir"); } if (Xm_noX) { sm1.sm1(P," oxNoX "); } ox_check_errors(P); Tk_cform_sm1 = P; sm1.sm1(P,"[(COutput) 1] system_variable "); return(P); } def to_cform(F) { /*extern Tk_cform_double; extern Tk_cform_sm1; */ if (type(getopt(nodouble)) >= 0) { if (getopt(nodouble)) Tk_cform_double=0; else Tk_cform_double=1; } if (type(F) <= 1) { if (Tk_cform_double) { return("(double)"+rtostr(F)); }else return(rtostr(F)); } if (Tk_cform_sm1 < 0) mystart(); V=vars(F); G=dp_ptod(F,V); Den=1; while (G != 0) { C=dn(dp_hc(G)); Den=Den*C/igcd(Den,C); G=dp_rest(G); } F = F*Den; /* return([F,Den]); */ Com="[("; for (I=0; I<length(V)-1; I++) { Com=Com+rtostr(V[I])+","; } Com = Com+rtostr(V[length(V)-1])+") ring_of_polynomials 0] define_ring "; /* print(Com); */ sm1.sm1(Tk_cform_sm1,Com); sm1.sm1(Tk_cform_sm1,"("+rtostr(F)+"). toString "); R=ox_pop_cmo(Tk_cform_sm1); if (Tk_cform_double) { if (Den == 1) return(R); else return("("+ R + ")/(double)"+rtostr(Den)); }else{ if (Den == 1) return(R); else return("("+ R + ")/"+rtostr(Den)); } } endmodule; end$