Changeset 3d5b277 in git
- Timestamp:
- Jul 25, 2019, 1:23:11 PM (4 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', '0604212ebb110535022efecad887940825b97c3f')
- Children:
- 35a153cf7acb82519d52d0b74581e9a193d15765
- Parents:
- c9824e54c705dcaedb3b991c6bf81f9f974e758d3f94cbdb24129f0002a999ab5fb63a34f0fc933d
- git-author:
- Hans Schoenemann <hannes@mathematik.uni-kl.de>2019-07-25 13:23:11+02:00
- git-committer:
- GitHub <noreply@github.com>2019-07-25 13:23:11+02:00
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/algebra.lib
r3f94cb r3d5b277 1032 1032 } 1033 1033 // --------------------- change of variable names ------------------------- 1034 execute("ring @bsr = ("+charstr(bsr)+"),y(1..m),("+os+");"); 1034 list l2; 1035 for (int ii = 1; ii <= m; ii++) 1036 { 1037 l2[ii] = "y("+string(ii)+")"; 1038 } 1039 ring @bsr = create_ring(ringlist(bsr)[1], l2, "("+os+")", "no_minpoly"); 1035 1040 ideal J = fetch(bsr,J); 1036 1041 ideal PHI = fetch(bsr,PHI); -
Singular/LIB/assprimeszerodim.lib
r3f94cb r3d5b277 364 364 //=== mapping T to p and test if d=deg(F) 365 365 def R = basering; 366 execute("ring Rhelp = ("+charstr(R)+"), T, dp;");366 ring Rhelp = create_ring(ringlist(R)[1], "T", "dp", "no_minpoly"); 367 367 setring R; 368 368 map phi = Rhelp,p; -
Singular/LIB/chern.lib
r3f94cb r3d5b277 3305 3305 int n=nvars(basering); 3306 3306 def br@=basering; // remember the base ring 3307 execute("ring r@=("+ charstr(basering) +"),("+varstr(basering)+",homvar@), dp;");3307 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+",homvar@)", "dp", "no_minpoly"); 3308 3308 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 3309 3309 ideal I=F(I); -
Singular/LIB/finvar.lib
r3f94cb r3d5b277 1390 1390 poly A(1)=M[1,2]; // denominator of Molien series (for now) 1391 1391 string mp=string(minpoly); 1392 execute("ring R=("+charstr(br)+"),("+varstr(br)+"),ds;");1392 ring R = create_ring(ringlist(br)[1], "("+varstr(br)+")", "ds", "no_minpoly"); 1393 1393 if (mp!="0") 1394 1394 { -
Singular/LIB/goettsche.lib
r3f94cb r3d5b277 81 81 def br@=basering; // remember the base ring 82 82 // add additional variables z@, t@ to the base ring 83 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", z@, t@), dp;");83 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", z@, t@)", "dp", "no_minpoly"); 84 84 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 85 85 // compute the generating function by the Goettsche's formula up to degree n in t@ … … 144 144 def br@=basering; // remember the base ring 145 145 // add additional variables z@, t@ to the base ring 146 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", z@, t@), dp;");146 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", z@, t@)", "dp", "no_minpoly"); 147 147 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 148 148 // compute the generating function by the Goettsche's formula up to degree n in t@ … … 208 208 def br@=basering; // remember the base ring 209 209 // add additional variables z@, t@ to the base ring 210 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", z@, t@), dp;");210 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", z@, t@)", "dp", "no_minpoly"); 211 211 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 212 212 poly rez=1; … … 267 267 def br@=basering; // remember the base ring 268 268 // add additional variables z@, t@ to the base ring 269 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", z@, t@), dp;");269 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", z@, t@)", "dp", "no_minpoly"); 270 270 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 271 271 // compute the generating function by the Nakajima-Yoshioka formula up to degree n in t@ … … 322 322 def br@=basering; // remember the base ring 323 323 // add additional variables z@, t@ to the base ring 324 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", z@, t@), dp;");324 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", z@, t@)", "dp", "no_minpoly"); 325 325 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 326 326 // compute the generating function by the Nakajima-Yoshioka formula up to degree n in t@ … … 377 377 def br@=basering; // remember the base ring 378 378 // add additional variables z@, t@ to the base ring 379 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", z@, t@), dp;");379 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", z@, t@)", "dp", "no_minpoly"); 380 380 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 381 381 poly rez=1; … … 434 434 def br@=basering; // remember the base ring 435 435 // add additional variables z@, t@ to the base ring 436 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", z@, t@), dp;");436 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", z@, t@)", "dp", "no_minpoly"); 437 437 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 438 438 poly rez=1; … … 485 485 def br@=basering; // remember the base ring 486 486 // add additional variables z@, t@ to the base ring 487 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", z@, t@), dp;");487 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", z@, t@)", "dp", "no_minpoly"); 488 488 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 489 489 poly rez=1; … … 536 536 def br@=basering; // remember the base ring 537 537 // add additional variables z@, t@ to the base ring 538 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", z@, t@), dp;");538 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", z@, t@)", "dp", "no_minpoly"); 539 539 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 540 540 poly rez=1; … … 594 594 def br@=basering; // remember the base ring 595 595 // add additional variable t@ to the base ring 596 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", t@), dp;");596 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", t@)", "dp", "no_minpoly"); 597 597 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 598 598 poly rez=(1-t@^2)*PPolyW(q, m, n, t@, d); … … 637 637 def br@=basering; // remember the base ring 638 638 // add additional variable t@ to the base ring 639 execute("ring r@= (" + charstr(basering) + "),("+varstr(basering)+", t@), dp;");639 ring r@ = create_ring(ringlist(basering)[1], "("+varstr(basering)+", t@)", "dp", "no_minpoly"); 640 640 execute( "map F= br@,"+varstr(br@)+";" ); // define the corresponding inclusion of rings 641 641 poly rez=(1-t@^2)*PPolyW(q, m, n, t@, d); -
Singular/LIB/graal.lib
r3f94cb r3d5b277 210 210 { 211 211 def origin = basering; 212 execute("ring ringForGeneralPosition = ("+charstr(basering)+"),("+varstr(basering)+"),lp;");212 ring ringForGeneralPosition = create_ring(ringlist(basering)[1], "("+varstr(basering)+")", "lp", "no_minpoly"); 213 213 ideal m = fetch(origin,m); 214 214 newRing = 1; -
Singular/LIB/numerAlg.lib
r3f94cb r3d5b277 230 230 setring W1; 231 231 number j1=jj; 232 execute("ring q=(real,0),("+varstr(S)+"),dp;");232 ring q = create_ring("(real,0)", "("+varstr(S)+")", "dp"); 233 233 ideal I=imap(W1,I); 234 234 ideal J=imap(W1,J); 235 execute("ring qq=0,("+varstr(S)+"),dp;");235 ring qq = create_ring(0, "("+varstr(S)+")", "dp"); 236 236 ideal I=imap(S,I); 237 237 ideal J=imap(S,J); … … 315 315 if((u^2)==0) 316 316 { 317 execute("ring A=(real,e-1),("+varstr(S)+",I),ds;");317 ring A = create_ring("(real,e-1)", "("+varstr(S)+",I)", "ds"); 318 318 ideal II=imap(S,J); 319 319 list rw=imap(S,rw); … … 332 332 { 333 333 int d=dim(std(J)); 334 execute("ring R=(complex,e-1,I),("+varstr(S)+"),ds;");334 ring R = create_ring("(complex,e-1,I)", "("+varstr(S)+")", "ds"); 335 335 list w=imap(S,w); 336 336 ideal II=imap(S,J); … … 355 355 if(tt==d) 356 356 { 357 execute("ring A=(complex,e,I),("+varstr(S)+"),dp;");357 ring A = create_ring("(complex,e,I)", "("+varstr(S)+")", "dp"); 358 358 t=tt; 359 359 } 360 360 else 361 361 { 362 execute("ring RR=(real,e-2),("+varstr(S)+",I),dp;");362 ring RR = create_ring("(real,e-2)", "("+varstr(S)+",I)", "dp"); 363 363 ideal II=imap(S,J); 364 364 list rw=imap(S,rw); … … 398 398 setring M; 399 399 sz1=size(SOL); 400 execute("ring RRRQ=(real,e-1),("+varstr(S)+",I),dp;");400 ring RRRQ = create_ring("(real,e-1)", "("+varstr(S)+",I)", "dp"); 401 401 ideal HH=imap(RR,HH); 402 402 if(dim(std(HH))==0) … … 413 413 if(sz1==sz2) 414 414 { 415 execute("ring A=(complex,e,I),("+varstr(S)+"),dp;");415 ring A = create_ring("(complex,e,I)", "("+varstr(S)+")", "dp"); 416 416 t=d; 417 417 } 418 418 else 419 419 { 420 execute("ring RQ=(real,e-1),("+varstr(S)+"),dp;");420 ring RQ = create_ring("(real,e-1)", "("+varstr(S)+")", "dp"); 421 421 ideal II=imap(S,J); 422 422 def RW=WitSet(II); … … 448 448 if((ni+nr)<1/10^(2*e-3)) 449 449 { 450 execute("ring A=(complex,e,I),("+varstr(S)+"),dp;");450 ring A = create_ring("(complex,e,I)", "("+varstr(S)+")", "dp"); 451 451 list W(ii)=imap(RW,W(ii)); 452 452 t=0; … … 459 459 { 460 460 def SS=Singular2bertini(W(ii)); 461 execute("ring D=(complex,e,I),("+varstr(S)+",s,gamma),dp;");461 ring D = create_ring("(complex,e,I)", "("+varstr(S)+",s,gamma)", "dp"); 462 462 string nonsin; 463 463 ideal H,L; … … 504 504 if(tr<=1/10^(2*e-3)) 505 505 { 506 execute("ring A=(complex,e,I),("+varstr(S)+"),dp;");506 ring A = create_ring("(complex,e,I)", "("+varstr(S)+")", "dp"); 507 507 t=ii; 508 508 ii=d+1; -
Singular/LIB/numerDecom.lib
r3f94cb r3d5b277 349 349 if((n-rn)!=dd) 350 350 { 351 execute("ring R=0,("+varstr(S)+",z(1..dd)),dp;"); 351 list l2 = ringlist(S)[2]; 352 for (int ii = 1; ii <= dd; ii++) 353 { 354 l2[size(l2)+1] = "z("+string(ii)+")"; 355 } 356 ring R = create_ring(0, l2, "dp"); 352 357 ideal I=imap(rs,I); 353 358 ideal H(0..n),L,LL,L(1..dd),LL(1..dd),h(1..dd),N(0..dd); … … 483 488 { 484 489 int w(q-1)=0; 485 execute("ring D(q)=(0,s,gamma),("+varstr(S)+",z(1..q)),dp;"); 490 list l2 = ringlist(S)[2]; 491 for (int ii = 1; ii <= q; ii++) 492 { 493 l2[size(l2)+1] = "z("+string(ii)+")"; 494 } 495 ring D(q) = create_ring("(0,s,gamma)", l2, "dp"); 486 496 string nonsin(q),stnonsin(q); 487 497 ideal H(1..q); … … 579 589 for(qq=q-1;qq>=1;qq--) 580 590 { 581 execute("ring T(qq)=(complex,16,I),("+varstr(S)+",z(1..qq)),dp;"); 591 list l2 = ringlist(S)[2]; 592 for (int ii = 1; ii <= qq; ii++) 593 { 594 l2[size(l2)+1] = "z("+string(ii)+")"; 595 } 596 ring T(qq) = create_ring("(complex,16,I)", l2, "dp"); 582 597 list W(qq-1)=var(1); 583 598 } … … 591 606 { 592 607 int w(qq-1); 593 execute("ring T(qq)=(complex,16,I),("+varstr(S)+",z(1..qq)),dp;"); 608 list l2 = ringlist(S)[2]; 609 for (int ii = 1; ii <= qq; ii++) 610 { 611 l2[size(l2)+1] = "z("+string(ii)+")"; 612 } 613 ring T(qq) = create_ring("(complex,16,I)", l2, "dp"); 594 614 list W(qq-1)=var(1); 595 615 } … … 600 620 for(qq=q;qq>=1;qq--) 601 621 { 602 execute("ring T(qq)=(complex,16,I),("+varstr(S)+",z(1..qq)),dp;"); 622 list l2 = ringlist(S)[2]; 623 for (int ii = 1; ii <= qq; ii++) 624 { 625 l2[size(l2)+1] = "z("+string(ii)+")"; 626 } 627 ring T(qq) = create_ring("(complex,16,I)", l2, "dp"); 603 628 list W(qq-1)=var(1); 604 629 } … … 1951 1976 export(J(i)); 1952 1977 } 1953 execute("ring RR=0,(x(1..n),"+varstr(S)+"),dp;"); 1978 list l2; 1979 for (int ii = 1; ii <= n; ii++) 1980 { 1981 l2[ii] = "x("+string(ii)+")"; 1982 } 1983 l2 = l2+ringlist(S)[2]; 1984 ring RR = create_ring(0, l2, "dp"); 1954 1985 for(i=1;i<=d;i++) 1955 1986 { … … 1995 2026 int zc=size(D(d)); 1996 2027 export(zc); 1997 execute("ring DR=0,("+varstr(S)+",x(1..zc)),dp;"); 2028 list l2 = ringlist(S)[2]; 2029 for (int ii = 1; ii <= zc; ii++) 2030 { 2031 l2[size(l2)+1] = "x("+string(ii)+")"; 2032 } 2033 ring DR = create_ring(0, l2, "dp"); 1998 2034 matrix TT(d)=imap(R,TT(d)); 1999 2035 ideal I=imap(S,I); -
Singular/LIB/resolve.lib
r3f94cb r3d5b277 396 396 laM=subst(laM,var(templist[4][j]),0); 397 397 } 398 execute("ring Rnew=("+charstr(basering)+"),("+string(templist[1])+"),dp;");398 ring Rnew = create_ring(ringlist(basering)[1], "("+string(templist[1])+")", "dp", "no_minpoly"); 399 399 ideal Jnew=imap(R,Jsub); 400 400 ideal eD=imap(R,Esub); … … 639 639 v=N[4]; 640 640 for(j=1;j<=size(v);j++){BO[5]=subst(BO[5],var(v[j]),0);} 641 execute("ring R1=("+charstr(R0)+"),("+newvar+"),dp;");641 ring R1 = create_ring(ringlist(R0)[1], "("+newvar+")", "dp", "no_minpoly"); 642 642 list BO=imap(R0,BO); 643 643 ideal C=imap(R0,C); … … 1115 1115 laM=subst(laM,var(v[j]),0); 1116 1116 } 1117 execute("ring R2=("+charstr(S)+"),("+newvar+"),dp;");1117 ring R2 = create_ring(ringlist(S)[1], "("+newvar+")", "dp", "no_minpoly"); 1118 1118 list BO=imap(S,B); 1119 1119 ideal laM=imap(S,laM); … … 2984 2984 //--- hypersurface is V(@f) 2985 2985 @f=Jb[fvec[i]]; 2986 execute("ring R1=("+charstr(R)+"),(@y,"+varstr(R)+"),dp;");2986 ring R1 = create_ring(ringlist(R)[1], "(@y,"+varstr(R)+")", "dp", "no_minpoly"); 2987 2987 poly p=imap(R,@p); 2988 2988 poly f=imap(R,@f); … … 4233 4233 kill tr,L; 4234 4234 } 4235 execute("ring R1=("+charstr(S)+"),(@z,"+varstr(S)+"),dp;");4235 ring R1 = create_ring(ringlist(S)[1], "(@z,"+varstr(S)+")", "dp", "no_minpoly"); 4236 4236 poly p=imap(S,@p); 4237 4237 list BO=imap(S,BO); … … 4800 4800 { 4801 4801 string newvar=string(N[1]); 4802 execute("ring R1=("+charstr(R)+"),("+newvar+"),dp;");4802 ring R1 = create_ring(ringlist(R)[1], "("+newvar+")", "dp", "no_minpoly"); 4803 4803 list BO=imap(R,BO); 4804 4804 ideal cent=imap(R,cent); -
Singular/LIB/rinvar.lib
r3f94cb r3d5b277 658 658 minPoly = string(minpoly); 659 659 } 660 execute("ring RA1=0,(" + varstr(basering) + "," + parName + "), lp;");660 ring RA1 = create_ring(0, "(" + varstr(basering) + "," + parName + ")", "lp"); 661 661 if (minPoly!="0") { execute("ideal mpoly = std(" + minPoly + ");"); } 662 662 ideal I = imap(RIRR,invarsGens); … … 962 962 minPoly = string(minpoly); 963 963 } 964 execute("ring RA1=0,(" + varstr(basering) + "," + parName + "), lp;");964 ring RA1 = create_ring(0, "(" + varstr(basering) + "," + parName + ")", "lp"); 965 965 if (minPoly!="0") { execute("ideal mpoly = std(" + minPoly + ");"); } 966 966 ideal Grp = imap(ROBR,Grp); -
Singular/LIB/sing.lib
r3f94cb r3d5b277 1076 1076 int ii; 1077 1077 def bas = basering; 1078 execute("ring @r_locstd 1079 =("+charstr(bas)+"),(@t@,"+varstr(bas)+"),(dp(1),dp);"); 1078 ring @r_locstd = create_ring(ringlist(bas)[1], "(@t@,"+varstr(bas)+")", "(dp(1),dp)", "no_minpoly"); 1080 1079 ideal @id = imap(bas,id); 1081 1080 ideal @hid = homog(@id,@t@); -
Singular/LIB/standard.lib
r3f94cb r3d5b277 2572 2572 { 2573 2573 string name; 2574 intvec w;2575 2574 int b1 = find(ordering, "(", 1); 2576 2575 if (b1 == 0) // no parentheses … … 2579 2578 if (name == "C" || name == "c") 2580 2579 { 2581 w = intvec(0);2580 intvec w = intvec(0); 2582 2581 } 2583 2582 else 2584 2583 { 2585 w = 1:n_vars;2584 intvec w = 1:n_vars; 2586 2585 } 2587 2586 } … … 2593 2592 if (c == 0) 2594 2593 { 2595 w = 1:int(ordering[b1+1, b2-b1-1]); 2594 if (name == "L") 2595 { 2596 int w = int(ordering[b1+1, b2-b1-1]); 2597 } 2598 else 2599 { 2600 intvec w = 1:int(ordering[b1+1, b2-b1-1]); 2601 } 2596 2602 } 2597 2603 else 2598 2604 { 2599 2605 list W = tuple_to_tokens(ordering[b1, b2-b1+1]); 2600 w = intvec(int(W[1..size(W)]));2606 intvec w = intvec(int(W[1..size(W)])); 2601 2607 } 2602 2608 } -
Singular/LIB/tropical.lib
r3f94cb r3d5b277 3644 3644 CHARAKTERISTIK=CHARAKTERISTIK[1..size(CHARAKTERISTIK)-2]; 3645 3645 def BASERING=basering; 3646 execute("ring INITIALRING=("+CHARAKTERISTIK+"),("+varstr(basering)+"),("+ordstr(basering)+");");3646 ring INITIALRING = create_ring("("+CHARAKTERISTIK+")", "("+varstr(basering)+")", "("+ordstr(basering)+")"); 3647 3647 list l=solve(imap(BASERING,i)); 3648 3648 l; … … 5551 5551 setring LIFTRing; 5552 5552 poly mp=minpoly; 5553 execute("ring TESTRing=("+charstr(LIFTRing)+"),("+varstr(BASERING)+"),dp;");5553 ring TESTRing = create_ring(ringlist(LIFTRing)[1], "("+varstr(BASERING)+")", "dp", "no_minpoly"); 5554 5554 minpoly=number(imap(LIFTRing,mp)); 5555 5555 ideal i=imap(BASERING,i); … … 5939 5939 else 5940 5940 { 5941 execute("ring PARARing=("+charstr(basering)+"),t,ls;");5941 ring PARARing = create_ring(ringlist(basering)[1], "t", "ls", "no_minpoly"); 5942 5942 } 5943 5943 ideal PARA; // will contain the parametrisation … … 6200 6200 else 6201 6201 { 6202 execute("ring SATURATERING=("+charstr(basering)+"),("+varstr(basering)+"),("+ordstr(basering)+");");6202 ring SATURATERING = create_ring(ringlist(basering)[1], "("+varstr(basering)+")", "("+ordstr(basering)+")", "no_minpoly"); 6203 6203 ideal i=imap(BASERING,i); 6204 6204 export(i); … … 6341 6341 // - the variable t is superflous, 6342 6342 // the variable @a is not if it was already present 6343 execute("ring INITIALRING=("+charstr(basering)+"),("+string(variablen)+"),dp;");6343 ring INITIALRING = create_ring(ringlist(basering)[1], "("+string(variablen)+")", "dp", "no_minpoly"); 6344 6344 ideal ini=imap(BASERING,ini); 6345 6345 // compute the minimal associated primes of the … … 6367 6367 // define the extension ring which contains 6368 6368 // the new variable @a, if it is not yet present 6369 execute("ring EXTENSIONRING=("+charstr(BASERING)+"),("+string(imap(BASERING,variablen))+",@a,"+tvar+"),(dp("+string(anzahlvariablen-1)+"),dp(1),lp(1));");6369 ring EXTENSIONRING = create_ring(ringlist(BASERING)[1], "("+string(imap(BASERING,variablen))+",@a,"+tvar+")", "(dp("+string(anzahlvariablen-1)+"),dp(1),lp(1))", "no_minpoly"); 6370 6370 // phi maps x_i to x_i, @a to @a (if present in the ring), 6371 6371 // and the additional variable … … 6378 6378 else // @a was already present in the BASERING or no 6379 6379 { // field extension is necessary 6380 execute("ring EXTENSIONRING=("+charstr(BASERING)+"),("+varstr(BASERING)+"),("+ordstr(BASERING)+");");6380 ring EXTENSIONRING = create_ring(ringlist(BASERING)[1], "("+varstr(BASERING)+")", "("+ordstr(BASERING)+")", "no_minpoly"); 6381 6381 // phi maps x_i to x_i, @a to @a (if present in the ring), 6382 6382 // and the additional variable … … 7255 7255 { 7256 7256 def BASERING=basering; 7257 execute("ring INTERRING=0,("+varstr(basering)+"),("+ordstr(basering)+");");7257 ring INTERRING = create_ring(0, "("+varstr(basering)+")", "("+ordstr(basering)+")"); 7258 7258 poly n=imap(BASERING,n); 7259 execute("ring REALRING=(real,50,100),("+varstr(basering)+"),("+ordstr(basering)+");");7259 ring REALRING = create_ring("(real,50,100)", "("+varstr(basering)+")", "("+ordstr(basering)+")"); 7260 7260 map phi=INTERRING,maxideal(1); 7261 7261 string s=string(phi(n)); … … 7873 7873 { 7874 7874 def BASERING=basering; 7875 execute("ring TRING="+string(char(BASERING))+",t,ds;");7875 ring TRING = create_ring(string(char(BASERING)), "t", "ds"); 7876 7876 poly hn=imap(BASERING,hn); 7877 7877 poly c4=imap(BASERING,c4); -
factory/FLINTconvert.cc
r3f94cb r3d5b277 692 692 convFactoryPFlintMP(F,f,ctx,N); 693 693 convFactoryPFlintMP(G,g,ctx,N); 694 nmod_mpoly_init 3(res,lF+lG,bits+1,ctx);694 nmod_mpoly_init(res,ctx); 695 695 nmod_mpoly_mul(res,f,g,ctx); 696 696 nmod_mpoly_clear(g,ctx); … … 713 713 convFactoryPFlintMP(F,f,ctx,N); 714 714 convFactoryPFlintMP(G,g,ctx,N); 715 fmpq_mpoly_init 3(res,lF+lG,bits+1,ctx);715 fmpq_mpoly_init(res,ctx); 716 716 fmpq_mpoly_mul(res,f,g,ctx); 717 717 fmpq_mpoly_clear(g,ctx); … … 737 737 convFactoryPFlintMP(F,f,ctx,N); 738 738 convFactoryPFlintMP(G,g,ctx,N); 739 nmod_mpoly_init 3(res,lf,bits,ctx);739 nmod_mpoly_init(res,ctx); 740 740 int ok=nmod_mpoly_gcd(res,f,g,ctx); 741 741 nmod_mpoly_clear(g,ctx); -
libpolys/polys/flint_mpoly.cc
rc9824e r3d5b277 65 65 #if 1 66 66 // memory allocation is not thread safe; singular polynomials must be constructed in serial 67 68 /* 69 We agree the that result of a singular -> fmpq_mpoly conversion is 70 readonly. This restricts the usage of the result in flint functions to 71 const arguments. However, the real readonly conversion is currently only 72 implemented in the threaded conversion below since it requires a scan of 73 all coefficients anyways. The _fmpq_mpoly_clear_readonly_sing needs to 74 be provided for a consistent interface in the polynomial operations. 75 */ 76 static void _fmpq_mpoly_clear_readonly_sing(fmpq_mpoly_t a, fmpq_mpoly_ctx_t ctx) 77 { 78 fmpq_mpoly_clear(a, ctx); 79 } 67 80 68 81 void convSingPFlintMP(fmpq_mpoly_t res, fmpq_mpoly_ctx_t ctx, poly p, int lp, const ring r) … … 186 199 } 187 200 201 202 /* 203 In order that flint may sometimes borrow the large integer coeffs of 204 polynomials over QQ (borrow means: simply point to the same GMP structs 205 that singular has already allocated), we define the result of a 206 singular -> fmpq_mpoly conversion to be readonly. This means we agree 207 that 208 - it can only be used as an const argument to a flint function 209 - singular must not mutate the original coeffs while the readonly object is in use 210 */ 211 212 static void _fmpq_mpoly_clear_readonly_sing(fmpq_mpoly_t a, fmpq_mpoly_ctx_t ctx) 213 { 214 if (fmpq_is_one(a->content)) 215 { 216 if (a->zpoly->alloc > 0) 217 { 218 flint_free(a->zpoly->coeffs); 219 flint_free(a->zpoly->exps); 220 } 221 222 fmpq_clear(a->content); 223 } 224 else 225 { 226 fmpq_mpoly_clear(a, ctx); 227 } 228 } 229 188 230 /* singular -> fmpq_mpoly conversion */ 189 231 … … 197 239 std::vector<poly> markers; 198 240 ring r; 199 200 convert_sing_to_fmpq_mpoly_base(slong num_threads_, fmpq_mpoly_struct * res_, 201 const fmpq_mpoly_ctx_struct * ctx_, const ring r_, poly p) 202 : num_threads(num_threads_), 241 fmpq_t content; 242 243 convert_sing_to_fmpq_mpoly_base(fmpq_mpoly_struct * res_, 244 const fmpq_mpoly_ctx_struct * ctx_, const ring r_, poly p) 245 : num_threads(0), 203 246 res(res_), 204 247 ctx(ctx_), 205 248 r(r_) 206 249 { 250 fmpq_t c; 251 fmpq_init(c); 252 fmpq_init(content); 253 fmpq_zero(content); 254 207 255 length = 0; 208 256 while (1) 209 257 { 210 258 if ((length % 4096) == 0) 259 { 260 my_convSingNFlintN_QQ(c, number(pGetCoeff(p))); 261 fmpq_gcd(content, content, c); 211 262 markers.push_back(p); 263 } 212 264 if (p == NULL) 213 265 return; … … 215 267 pIter(p); 216 268 } 269 270 fmpq_clear(c); 271 } 272 273 ~convert_sing_to_fmpq_mpoly_base() 274 { 275 fmpq_clear(content); 217 276 } 218 277 }; … … 248 307 249 308 flint_bitcnt_t required_bits = MPOLY_MIN_BITS; 250 fmpq_ zero(arg->content);309 fmpq_set(arg->content, base->content); 251 310 252 311 while (idx < arg->end_idx) 253 312 { 254 my_convSingNFlintN_QQ(c, number(pGetCoeff(p))); 255 fmpq_gcd(arg->content, arg->content, c); 313 number n = number(pGetCoeff(p)); 314 315 if (fmpq_is_one(arg->content) && (SR_HDL(n)&SR_INT || n->s >= 3)) 316 { 317 /* content is 1 and n is an integer, nothing to do */ 318 } 319 else 320 { 321 my_convSingNFlintN_QQ(c, n); 322 fmpq_gcd(arg->content, arg->content, c); 323 } 256 324 257 325 #if SIZEOF_LONG==8 … … 293 361 } 294 362 363 slong N = mpoly_words_per_exp(base->res->zpoly->bits, base->ctx->zctx->minfo); 364 fmpz * res_coeffs = base->res->zpoly->coeffs; 365 ulong * res_exps = base->res->zpoly->exps; 366 flint_bitcnt_t res_bits = base->res->zpoly->bits; 367 295 368 while (idx < arg->end_idx) 296 369 { 297 my_convSingNFlintN_QQ(c, number(pGetCoeff(p))); 298 FLINT_ASSERT(!fmpq_is_zero(base->res->content)); 299 fmpq_div(t, c, base->res->content); 300 FLINT_ASSERT(fmpz_is_one(fmpq_denref(t))); 301 302 slong N = mpoly_words_per_exp(base->res->zpoly->bits, base->ctx->zctx->minfo); 303 fmpz_swap(base->res->zpoly->coeffs + idx, fmpq_numref(t)); 370 if (fmpq_is_one(base->res->content)) 371 { 372 // borrowing singular integers 373 // the entry res_coeffs[idx] is junk, we should just overwrite it 374 375 number n = number(pGetCoeff(p)); 376 377 if (SR_HDL(n)&SR_INT) 378 { 379 // n is a singular-small integer 380 res_coeffs[idx] = SR_TO_INT(n); 381 } 382 else if (n->s<3) 383 { 384 // n is an element of QQ \ ZZ, should not happen 385 assume(false); 386 } 387 else 388 { 389 // n is a singular-large integer, n may be flint-small 390 res_coeffs[idx] = PTR_TO_COEFF(n->z); 391 if (fmpz_fits_si(res_coeffs + idx)) 392 { 393 slong val = fmpz_get_si(res_coeffs + idx); 394 if (val >= COEFF_MIN && val <= COEFF_MAX) 395 res_coeffs[idx] = val; 396 } 397 } 398 } 399 else 400 { 401 my_convSingNFlintN_QQ(c, number(pGetCoeff(p))); 402 FLINT_ASSERT(!fmpq_is_zero(base->res->content)); 403 fmpq_div(t, c, base->res->content); 404 FLINT_ASSERT(fmpz_is_one(fmpq_denref(t))); 405 fmpz_swap(res_coeffs + idx, fmpq_numref(t)); 406 } 407 304 408 #if SIZEOF_LONG==8 305 409 p_GetExpVL(p, (int64*)exp, base->r); 306 mpoly_set_monomial_ui( base->res->zpoly->exps + N*idx, exp, base->res->zpoly->bits, base->ctx->zctx->minfo);410 mpoly_set_monomial_ui(res_exps + N*idx, exp, res_bits, base->ctx->zctx->minfo); 307 411 #else 308 412 p_GetExpV(p, (int*)exp, base->r); 309 mpoly_set_monomial_ui( base->res->zpoly->exps + N*idx, &(exp[1]), base->res->zpoly->bits, base->ctx->minfo);413 mpoly_set_monomial_ui(res_exps + N*idx, &(exp[1]), res_bits, base->ctx->minfo); 310 414 #endif 311 415 … … 324 428 thread_pool_handle * handles; 325 429 slong num_handles; 326 slong thread_limit = 1000; 327 328 /* get workers */ 430 slong thread_limit = 1000; // TODO: should be paramter to this function 431 432 /* the constructor works out the length of p and sets some markers */ 433 convert_sing_to_fmpq_mpoly_base base(res, ctx, r, p); 434 435 /* sensibly limit thread count and get workers */ 436 thread_limit = FLINT_MIN(thread_limit, base.length/1024); 329 437 handles = NULL; 330 438 num_handles = 0; … … 340 448 } 341 449 342 convert_sing_to_fmpq_mpoly_base base(num_handles + 1, res, ctx, r, p);343 344 450 /* fill in thread division points */ 451 base.num_threads = 1 + num_handles; 345 452 convert_sing_to_fmpq_mpoly_arg * args = new convert_sing_to_fmpq_mpoly_arg[base.num_threads]; 346 453 slong cur_idx = 0; … … 348 455 { 349 456 slong next_idx = i + 1 < base.num_threads ? (i + 1)*base.length/base.num_threads : base.length; 457 FLINT_ASSERT(cur_idx <= base.length); 350 458 next_idx = FLINT_MAX(next_idx, cur_idx); 351 459 next_idx = FLINT_MIN(next_idx, base.length); … … 367 475 required_bits = FLINT_MAX(required_bits, args[i].required_bits); 368 476 369 /* initialize res with optimal bits */370 fmpq_mpoly_init3(res, base.length, mpoly_fix_bits(required_bits, ctx->zctx->minfo), ctx);371 372 477 /* sign of content should match sign of first coeff */ 373 fmpq_zero(base.res->content); 478 fmpq_t content; 479 fmpq_init(content); 480 fmpq_zero(content); 374 481 for (slong i = 0; i < base.num_threads; i++) 375 fmpq_gcd( base.res->content, base.res->content, args[i].content);482 fmpq_gcd(content, content, args[i].content); 376 483 if (p != NULL) 377 484 { … … 380 487 my_convSingNFlintN_QQ(c, number(pGetCoeff(p))); 381 488 if (fmpq_sgn(c) < 0) 382 fmpq_neg( base.res->content, base.res->content);489 fmpq_neg(content, content); 383 490 fmpq_clear(c); 384 491 } 492 493 /* initialize res with optimal bits */ 494 required_bits = mpoly_fix_bits(required_bits, ctx->zctx->minfo); 495 if (fmpq_is_one(content)) 496 { 497 /* initialize borrowed coeffs */ 498 slong N = mpoly_words_per_exp(required_bits, ctx->zctx->minfo); 499 slong alloc = base.length; 500 if (alloc != 0) 501 { 502 res->zpoly->coeffs = (fmpz *) flint_malloc(alloc*sizeof(fmpz)); 503 res->zpoly->exps = (ulong *) flint_malloc(alloc*N*sizeof(ulong)); 504 } 505 else 506 { 507 res->zpoly->coeffs = NULL; 508 res->zpoly->exps = NULL; 509 } 510 res->zpoly->alloc = alloc; 511 res->zpoly->length = 0; 512 res->zpoly->bits = required_bits; 513 514 fmpq_init(res->content); 515 fmpq_one(res->content); 516 } 517 else 518 { 519 /* initialize coeffs that will be created and destroyed */ 520 fmpq_mpoly_init3(res, base.length, required_bits, ctx); 521 fmpq_swap(res->content, content); 522 } 523 524 fmpq_clear(content); 385 525 386 526 /* fill in res->zpoly */ … … 468 608 thread_pool_handle * handles; 469 609 slong num_handles; 470 slong thread_limit = 1000; 471 472 /* get workers */ 610 slong thread_limit = 1000;// TODO: should be paramter to this function 611 612 /* sensibly limit threads and get workers */ 613 thread_limit = FLINT_MIN(thread_limit, f->zpoly->length/1024); 473 614 handles = NULL; 474 615 num_handles = 0; … … 485 626 486 627 convert_fmpq_mpoly_to_sing_base base(num_handles + 1, f, ctx, r); 487 488 628 convert_fmpq_mpoly_to_sing_arg * args = new convert_fmpq_mpoly_to_sing_arg[base.num_threads]; 489 629 slong cur_idx = 0; … … 492 632 slong next_idx = i + 1 < base.num_threads ? (i + 1)*base.f->zpoly->length/base.num_threads 493 633 : base.f->zpoly->length; 634 FLINT_ASSERT(cur_idx <= base.f->zpoly->length); 494 635 next_idx = FLINT_MAX(next_idx, cur_idx); 495 636 next_idx = FLINT_MIN(next_idx, base.f->zpoly->length); … … 542 683 ring r; 543 684 544 convert_sing_to_nmod_mpoly_base( slong num_threads_,nmod_mpoly_struct * res_,545 546 : num_threads( num_threads_),685 convert_sing_to_nmod_mpoly_base(nmod_mpoly_struct * res_, 686 const nmod_mpoly_ctx_struct * ctx_, const ring r_, poly p) 687 : num_threads(0), 547 688 res(res_), 548 689 ctx(ctx_), … … 624 765 } 625 766 767 slong N = mpoly_words_per_exp(base->res->bits, base->ctx->minfo); 768 ulong * res_coeffs = base->res->coeffs; 769 ulong * res_exps = base->res->exps; 770 flint_bitcnt_t res_bits = base->res->bits; 771 626 772 while (idx < arg->end_idx) 627 773 { 628 slong N = mpoly_words_per_exp(base->res->bits, base->ctx->minfo);629 774 #if SIZEOF_LONG==8 630 775 p_GetExpVL(p, (int64*)exp, base->r); 631 mpoly_set_monomial_ui( base->res->exps + N*idx, exp, base->res->bits, base->ctx->minfo);776 mpoly_set_monomial_ui(res_exps + N*idx, exp, res_bits, base->ctx->minfo); 632 777 #else 633 778 p_GetExpV(p, (int*)exp, base->r); 634 mpoly_set_monomial_ui( base->res->exps + N*idx, &(exp[1]), base->res->bits, base->ctx->minfo);779 mpoly_set_monomial_ui(res_exps + N*idx, &(exp[1]), res_bits, base->ctx->minfo); 635 780 #endif 636 781 637 base->res->coeffs[idx] = (ulong)(number(pGetCoeff(p)));782 res_coeffs[idx] = (ulong)(number(pGetCoeff(p))); 638 783 639 784 pIter(p); … … 649 794 thread_pool_handle * handles; 650 795 slong num_handles; 651 slong thread_limit = 1000; 652 653 /* get workers */ 796 slong thread_limit = 1000; // TODO: should be paramter to this function 797 798 /* the constructor works out the length of p and sets some markers */ 799 convert_sing_to_nmod_mpoly_base base(res, ctx, r, p); 800 801 /* sensibly limit thread count and get workers */ 802 thread_limit = FLINT_MIN(thread_limit, base.length/1024); 654 803 handles = NULL; 655 804 num_handles = 0; … … 665 814 } 666 815 667 convert_sing_to_nmod_mpoly_base base(num_handles + 1, res, ctx, r, p);668 669 816 /* fill in thread division points */ 817 base.num_threads = 1 + num_handles; 670 818 convert_sing_to_nmod_mpoly_arg * args = new convert_sing_to_nmod_mpoly_arg[base.num_threads]; 671 819 slong cur_idx = 0; … … 674 822 slong next_idx = i + 1 < base.num_threads ? (i + 1)*base.length/base.num_threads 675 823 : base.length; 824 FLINT_ASSERT(cur_idx <= base.length); 676 825 next_idx = FLINT_MAX(next_idx, cur_idx); 677 826 next_idx = FLINT_MIN(next_idx, base.length); … … 777 926 thread_pool_handle * handles; 778 927 slong num_handles; 779 slong thread_limit = 1000; 780 781 /* get workers */ 928 slong thread_limit = 1000; // TODO: should be paramter to this function 929 930 /* sensibly limit threads and get workers */ 931 thread_limit = FLINT_MIN(thread_limit, f->length/1024); 782 932 handles = NULL; 783 933 num_handles = 0; … … 794 944 795 945 convert_nmod_mpoly_to_sing_base base(num_handles + 1, f, ctx, r); 796 797 946 convert_nmod_mpoly_to_sing_arg * args = new convert_nmod_mpoly_to_sing_arg[base.num_threads]; 798 947 slong cur_idx = 0; … … 801 950 slong next_idx = i + 1 < base.num_threads ? (i + 1)*base.f->length/base.num_threads 802 951 : base.f->length; 952 FLINT_ASSERT(cur_idx <= base.f->length); 803 953 next_idx = FLINT_MAX(next_idx, cur_idx); 804 954 next_idx = FLINT_MIN(next_idx, base.f->length); … … 845 995 { 846 996 fmpq_mpoly_t pp,qq,res; 847 convSingPFlintMP(pp,ctx,p,lp,r); 848 convSingPFlintMP(qq,ctx,q,lq,r); 997 convSingPFlintMP(pp,ctx,p,lp,r); // pp read only 998 convSingPFlintMP(qq,ctx,q,lq,r); // qq read only 849 999 fmpq_mpoly_init(res,ctx); 850 1000 fmpq_mpoly_mul(res,pp,qq,ctx); 851 1001 poly pres=convFlintMPSingP(res,ctx,r); 852 1002 fmpq_mpoly_clear(res,ctx); 853 fmpq_mpoly_clear(pp,ctx);854 fmpq_mpoly_clear(qq,ctx);1003 _fmpq_mpoly_clear_readonly_sing(pp,ctx); 1004 _fmpq_mpoly_clear_readonly_sing(qq,ctx); 855 1005 fmpq_mpoly_ctx_clear(ctx); 856 1006 p_Test(pres,r); … … 878 1028 { 879 1029 fmpq_mpoly_t pp,qq,res; 880 convSingPFlintMP(pp,ctx,p,lp,r); 881 convSingPFlintMP(qq,ctx,q,lq,r); 1030 convSingPFlintMP(pp,ctx,p,lp,r); // pp read only 1031 convSingPFlintMP(qq,ctx,q,lq,r); // qq read only 882 1032 fmpq_mpoly_init(res,ctx); 883 1033 fmpq_mpoly_divides(res,pp,qq,ctx); 884 1034 poly pres = convFlintMPSingP(res,ctx,r); 885 1035 fmpq_mpoly_clear(res,ctx); 886 fmpq_mpoly_clear(pp,ctx);887 fmpq_mpoly_clear(qq,ctx);1036 _fmpq_mpoly_clear_readonly_sing(pp,ctx); 1037 _fmpq_mpoly_clear_readonly_sing(qq,ctx); 888 1038 fmpq_mpoly_ctx_clear(ctx); 889 1039 p_Test(pres,r); … … 934 1084 { 935 1085 fmpq_mpoly_t pp,qq,res; 936 convSingPFlintMP(pp,ctx,p,lp,r); 937 convSingPFlintMP(qq,ctx,q,lq,r); 1086 convSingPFlintMP(pp,ctx,p,lp,r); // pp read only 1087 convSingPFlintMP(qq,ctx,q,lq,r); // qq read only 938 1088 fmpq_mpoly_init(res,ctx); 939 1089 int ok=fmpq_mpoly_gcd(res,pp,qq,ctx); … … 959 1109 } 960 1110 fmpq_mpoly_clear(res,ctx); 961 fmpq_mpoly_clear(pp,ctx);962 fmpq_mpoly_clear(qq,ctx);1111 _fmpq_mpoly_clear_readonly_sing(pp,ctx); 1112 _fmpq_mpoly_clear_readonly_sing(qq,ctx); 963 1113 fmpq_mpoly_ctx_clear(ctx); 964 1114 return pres; -
libpolys/polys/operations/p_Mult_q.cc
r3f94cb r3d5b277 67 67 } 68 68 69 static void pqLengthApprox(poly p, poly q, int &lp, int &lq, const int min) 70 { 71 int l = 0; 72 73 do 74 { 75 if (p == NULL) 76 { 77 lp=l; 78 lq=l+(q!=NULL); 79 return; 80 } 81 if (q == NULL) /* && p!=NULL */ 82 { 83 lp=l+1; 84 lq=l; 85 return; 86 } 87 if (l>min) /* && p,q!=NULL */ 88 { 89 lp=l; lq=l; 90 return; 91 } 92 pIter(p); 93 pIter(q); 94 l++; 95 } 96 while (1); 97 } 98 69 99 70 100 static poly _p_Mult_q_Bucket(poly p, const int lp, … … 290 320 poly pt; 291 321 292 pqLength(p, q, lp, lq, MIN_LENGTH_FACTORY); 322 // MIN_LENGTH_FACTORY must be >= MIN_LENGTH_FACTORY_QQ, MIN_FLINT_QQ, MIN_FLINT_Zp 20 323 pqLengthApprox(p, q, lp, lq, MIN_LENGTH_FACTORY); 293 324 294 325 if (lp < lq) … … 309 340 if (pure_polys && rField_is_Q(r) && !convSingRFlintR(ctx,r)) 310 341 { 311 lp=pLength(p); 312 //printf("mul in flint\n"); 313 poly res=Flint_Mult_MP(p,lp,q,lq,ctx,r); 342 // lq is a lower bound for the length of p and q 343 poly res=Flint_Mult_MP(p,lq,q,lq,ctx,r); 314 344 if (!copy) 315 345 { … … 325 355 if (pure_polys && rField_is_Zp(r) && !convSingRFlintR(ctx,r)) 326 356 { 327 lp=pLength(p); 328 //printf("mul in flint\n"); 329 poly res=Flint_Mult_MP(p,lp,q,lq,ctx,r); 357 // lq is a lower bound for the length of p and q 358 poly res=Flint_Mult_MP(p,lq,q,lq,ctx,r); 330 359 if (!copy) 331 360 { … … 357 386 { 358 387 lp=pLength(p); 359 assume(lq == pLength(q));388 lq=pLength(q); 360 389 return _p_Mult_q_Bucket(p, lp, q, lq, copy, r); 361 390 }
Note: See TracChangeset
for help on using the changeset viewer.