Changeset fe99ed in git
- Timestamp:
- Jul 22, 2014, 12:34:15 PM (9 years ago)
- Branches:
- (u'spielwiese', 'a7324b6e0b44a1a8ed3fa4d9ca3e2ff210ddd52c')
- Children:
- 4e65f09322d32da3c0c1b29ba2d27d1aaf5a50ff
- Parents:
- 9a6f8c15b898f962115ce36f094aaa7f9dc0be1f
- git-author:
- Claus Fieker <fieker@mathematik.uni-kl.de>2014-07-22 12:34:15+02:00
- git-committer:
- Hans Schoenemann <hannes@mathematik.uni-kl.de>2014-07-23 13:12:50+02:00
- Location:
- libpolys/coeffs
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
libpolys/coeffs/rintegers.cc
r9a6f8c1 rfe99ed 1005 1005 return c; 1006 1006 } 1007 number _nrzAdd (number a, number b, const coeffs R)1007 number _nrzAdd (number a, number b, const coeffs ) 1008 1008 #else 1009 number nrzAdd (number a, number b, const coeffs R)1009 number nrzAdd (number a, number b, const coeffs ) 1010 1010 #endif 1011 1011 { … … 1050 1050 } 1051 1051 1052 number nrzSub (number a, number b, const coeffs)1052 number nrzSub (number a, number b, const coeffs ) 1053 1053 { 1054 1054 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) … … 1080 1080 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1081 1081 mpz_init(erg); 1082 if ( INT_TO_SR(b)>0)1082 if (SR_TO_INT(b)>0) 1083 1083 mpz_sub_ui(erg, (int_number) a, (unsigned long)SR_TO_INT(b)); 1084 1084 else … … 1097 1097 number nrzGetUnit (number n, const coeffs r) 1098 1098 { 1099 //if (n_Z_IS_SMALL(n))1100 //{1101 // if (SR_TO_INT(n)<0)1102 // return INT_TO_SR(-1);1103 // else1104 // return INT_TO_SR(1);1105 //}1106 1099 if (nrzGreaterZero(n, r)) 1107 1100 return INT_TO_SR(1); … … 1193 1186 } 1194 1187 1195 number nrzDiv (number a,number b, const coeffs R)1188 number nrzDiv (number a,number b, const coeffs) 1196 1189 { 1197 1190 assume(SR_TO_INT(b)); … … 1408 1401 } 1409 1402 1410 number nrzModNMap(number from, const coeffs src, const coeffs /*dst*/)1403 number nrzModNMap(number from, const coeffs /* src */, const coeffs /*dst*/) 1411 1404 { 1412 1405 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); … … 1415 1408 } 1416 1409 1417 number nrzMapQ(number from, const coeffs src, const coeffs dst)1410 number nrzMapQ(number from, const coeffs /* src */, const coeffs dst) 1418 1411 { 1419 1412 if (SR_HDL(from) & SR_INT) … … 1562 1555 return omStrDup("integer"); 1563 1556 } 1557 1558 #include "factory/canonicalform.h" 1559 #include <factory/cf_gmp.h> 1560 #include "factory/singext.h" 1564 1561 1565 1562 static CanonicalForm nrzConvSingNFactoryN( number n, BOOLEAN setChar, const coeffs /*r*/ ) -
libpolys/coeffs/rintegers.h
r9a6f8c1 rfe99ed 10 10 #include <coeffs/coeffs.h> 11 11 12 extern int nrzExp; 13 extern NATNUMBER nrzModul; 12 #if SI_INTEGER_VARIANT == 3 13 #define SR_HDL(A) ((long)(A)) 14 #define SR_INT 1L 15 #define INT_TO_SR(INT) ((number) (((long)INT << 2) + SR_INT)) 16 #define SR_TO_INT(SR) (((long)SR) >> 2) 17 #define n_Z_IS_SMALL(A) (SR_HDL(A) & SR_INT) 18 #define INT_IS_SMALL(A) ( ((A << 1) >> 1) == A ) 19 #endif 20 21 //extern int nrzExp; 22 //extern NATNUMBER nrzModul; 14 23 15 24 BOOLEAN nrzInitChar (coeffs r, void * parameter); -
libpolys/coeffs/rmodulon.cc
r9a6f8c1 rfe99ed 57 57 omFreeSize(b,l); 58 58 return s; 59 } 60 61 static void nrnKillChar(coeffs r) 62 { 63 mpz_clear(r->modNumber); 64 mpz_clear(r->modBase); 65 omFreeBin((void *) r->modBase, gmp_nrz_bin); 66 omFreeBin((void *) r->modNumber, gmp_nrz_bin); 59 67 } 60 68 … … 104 112 } 105 113 106 static number nrnAnn(number b, const coeffs r);107 114 /* for initializing function pointers */ 108 115 BOOLEAN nrnInitChar (coeffs r, void* p) … … 110 117 assume( (getCoeffType(r) == ID) || (getCoeffType (r) == ID2) ); 111 118 ZnmInfo * info= (ZnmInfo *) p; 112 r->modBase= info->base; 119 r->modBase= (int_number)nrnCopy((number)info->base, r); //this circumvents the problem 120 //in bigintmat.cc where we cannot create a "legal" nrn that can be freed. 121 //If we take a copy, we can do whatever we want. 113 122 114 123 nrnInitExp (info->exp, r); … … 157 166 r->cfGetUnit = nrnGetUnit; 158 167 r->cfExtGcd = nrnExtGcd; 168 r->cfXExtGcd = nrnXExtGcd; 169 r->cfQuotRem = nrnQuotRem; 159 170 r->cfName = ndName; 160 171 r->cfCoeffWrite = nrnCoeffWrite; 161 172 r->nCoeffIsEqual = nrnCoeffsEqual; 162 r->cfKillChar = n dKillChar;173 r->cfKillChar = nrnKillChar; 163 174 r->cfQuot1 = nrnQuot1; 164 175 #ifdef LDEBUG … … 307 318 * Give the largest k, such that a = x * k, b = y * k has 308 319 * a solution and r, s, s.t. k = s*a + t*b 320 * CF: careful: ExtGcd is wrong as implemented (or at least may not 321 * give you what you want: 322 * ExtGcd(5, 10 modulo 12): 323 * the gcdext will return 5 = 1*5 + 0*10 324 * however, mod 12, the gcd should be 1 309 325 */ 310 326 number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r) … … 323 339 return (number)erg; 324 340 } 341 /* XExtGcd returns a unimodular matrix ((s,t)(u,v)) sth. 342 * (a,b)^t ((st)(uv)) = (g,0)^t 343 * Beware, the ExtGcd will not necessaairly do this. 344 * Problem: if g = as+bt then (in Z/nZ) it follows NOT that 345 * 1 = (a/g)s + (b/g) t 346 * due to the zero divisors. 347 */ 348 349 //#define CF_DEB; 350 number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r) 351 { 352 number xx; 353 #ifdef CF_DEB 354 StringSetS("XExtGcd of "); 355 nrnWrite(a, r); 356 StringAppendS("\t"); 357 nrnWrite(b, r); 358 StringAppendS(" modulo "); 359 nrnWrite(xx = (number)r->modNumber, r); 360 Print("%s\n", StringEndS()); 361 #endif 362 363 int_number one = (int_number)omAllocBin(gmp_nrz_bin); 364 int_number erg = (int_number)omAllocBin(gmp_nrz_bin); 365 int_number bs = (int_number)omAllocBin(gmp_nrz_bin); 366 int_number bt = (int_number)omAllocBin(gmp_nrz_bin); 367 int_number bu = (int_number)omAllocBin(gmp_nrz_bin); 368 int_number bv = (int_number)omAllocBin(gmp_nrz_bin); 369 mpz_init(erg); 370 mpz_init(one); 371 mpz_init_set(bs, (int_number) a); 372 mpz_init_set(bt, (int_number) b); 373 mpz_init(bu); 374 mpz_init(bv); 375 mpz_gcd(erg, bs, bt); 376 377 #ifdef CF_DEB 378 StringSetS("1st gcd:"); 379 nrnWrite(xx= (number)erg, r); 380 #endif 381 382 mpz_gcd(erg, erg, r->modNumber); 383 384 mpz_div(bs, bs, erg); 385 mpz_div(bt, bt, erg); 386 387 #ifdef CF_DEB 388 Print("%s\n", StringEndS()); 389 StringSetS("xgcd: "); 390 #endif 391 392 mpz_gcdext(one, bu, bv, bs, bt); 393 number ui = nrnGetUnit(xx = (number) one, r); 394 #ifdef CF_DEB 395 n_Write(xx, r); 396 StringAppendS("\t"); 397 n_Write(ui, r); 398 Print("%s\n", StringEndS()); 399 #endif 400 nrnDelete(&xx, r); 401 if (!nrnIsOne(ui, r)) { 402 #ifdef CF_DEB 403 Print("Scaling\n"); 404 #endif 405 number uii = nrnInvers(ui, r); 406 nrnDelete(&ui, r); 407 ui = uii; 408 int_number uu = (int_number)omAllocBin(gmp_nrz_bin); 409 mpz_init_set(uu, (int_number)ui); 410 mpz_mul(bu, bu, uu); 411 mpz_mul(bv, bv, uu); 412 mpz_clear(uu); 413 omFreeBin(uu, gmp_nrz_bin); 414 } 415 nrnDelete(&ui, r); 416 #ifdef CF_DEB 417 StringSetS("xgcd"); 418 nrnWrite(xx= (number)bs, r); 419 StringAppendS("*"); 420 nrnWrite(xx= (number)bu, r); 421 StringAppendS(" + "); 422 nrnWrite(xx= (number)bt, r); 423 StringAppendS("*"); 424 nrnWrite(xx= (number)bv, r); 425 Print("%s\n", StringEndS()); 426 #endif 427 428 mpz_mod(bs, bs, r->modNumber); 429 mpz_mod(bt, bt, r->modNumber); 430 mpz_mod(bu, bu, r->modNumber); 431 mpz_mod(bv, bv, r->modNumber); 432 *s = (number)bu; 433 *t = (number)bv; 434 *u = (number)bt; 435 *u = nrnNeg(*u, r); 436 *v = (number)bs; 437 return (number)erg; 438 } 439 325 440 326 441 BOOLEAN nrnIsZero(number a, const coeffs) … … 410 525 nrnDelete((number*) &gcd, NULL); 411 526 return (number)unit; 527 } 528 529 number nrnAnn(number k, const coeffs r) 530 { 531 int_number tmp = (int_number) omAllocBin(gmp_nrz_bin); 532 mpz_init(tmp); 533 mpz_gcd(tmp, (int_number) k, r->modNumber); 534 if (mpz_cmp_si(tmp, 1)==0) { 535 mpz_set_si(tmp, 0); 536 return (number) tmp; 537 } 538 mpz_divexact(tmp, r->modNumber, tmp); 539 return (number) tmp; 412 540 } 413 541 … … 508 636 } 509 637 510 static number nrnAnn(number b, const coeffs r) 511 { 512 int_number erg = (int_number)omAllocBin(gmp_nrz_bin); 513 mpz_init(erg); 514 mpz_tdiv_q(erg, (int_number)r->modNumber, (int_number)b); 515 return (number)erg; 638 /* CF: note that Z/nZ has (at least) two distinct euclidean structures 639 * 1st phi(a) := (a mod n) which is just the structure directly 640 * inherited from Z 641 * 2nd phi(a) := gcd(a, n) 642 * The 1st version is probably faster as everything just comes from Z, 643 * but the 2nd version behaves nicely wrt. to quotient operations 644 * and HNF and such. In agreement with nrnMod we imlement the 2nd here 645 * 646 * For quotrem note that if b exactly divides a, then 647 * min(v_p(a), v_p(n)) >= min(v_p(b), v_p(n)) 648 * so if we divide a and b by g:= gcd(a,b,n), then b becomes a 649 * unit mod n/g. 650 * Thus we 1st compute the remainder (similar to nrnMod) and then 651 * the exact quotient. 652 */ 653 number nrnQuotRem(number a, number b, number * rem, const coeffs r) 654 { 655 mpz_t g, aa, bb; 656 int_number qq = (int_number)omAllocBin(gmp_nrz_bin); 657 int_number rr = (int_number)omAllocBin(gmp_nrz_bin); 658 mpz_init(qq); 659 mpz_init(rr); 660 mpz_init(g); 661 mpz_init_set(aa, (int_number)a); 662 mpz_init_set(bb, (int_number)b); 663 664 mpz_gcd(g, bb, r->modNumber); 665 mpz_mod(rr, aa, g); 666 mpz_sub(aa, aa, rr); 667 mpz_gcd(g, aa, g); 668 mpz_div(aa, aa, g); 669 mpz_div(bb, bb, g); 670 mpz_div(g, r->modNumber, g); 671 mpz_invert(g, bb, g); 672 mpz_mul(qq, aa, g); 673 if (rem) 674 *rem = (number)rr; 675 else { 676 mpz_clear(rr); 677 omFreeBin(rr, gmp_nrz_bin); 678 } 679 mpz_clear(g); 680 mpz_clear(aa); 681 mpz_clear(bb); 682 return (number) qq; 516 683 } 517 684 … … 554 721 } 555 722 723 #if SI_INTEGER_VARIANT==3 724 number nrnMapZ(number from, const coeffs /*src*/, const coeffs dst) 725 { 726 int_number erg = (int_number)omAllocBin(gmp_nrz_bin); 727 if (n_Z_IS_SMALL(from)) 728 mpz_init_set_si(erg, SR_TO_INT(from)); 729 else 730 mpz_init_set(erg, (int_number) from); 731 mpz_mod(erg, erg, dst->modNumber); 732 return (number)erg; 733 } 734 #elif SI_INTEGER_VARIANT==2 735 556 736 number nrnMapZ(number from, const coeffs src, const coeffs dst) 557 737 { … … 563 743 return nrnMapGMP(from,src,dst); 564 744 } 745 #endif 565 746 566 747 number nrnMapQ(number from, const coeffs src, const coeffs dst) … … 578 759 if ((src->rep==n_rep_gmp) && nCoeff_is_Ring_Z(src)) 579 760 { 580 return nrnMap GMP;761 return nrnMapZ; 581 762 } 582 763 if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Ring_Z(src)*/) … … 674 855 nrnSetExp(m, r); 675 856 assume (r->modNumber != NULL); 676 if (mpz_cmp_ui(r->modNumber,2) <= 0) 677 WarnS("nrnInitExp failed (m in Z/m too small)"); 857 //CF: in geenral, the modulus is computed somewhere. I don't want to 858 // check it's size before I construct the best ring. 859 // if (mpz_cmp_ui(r->modNumber,2) <= 0) 860 // WarnS("nrnInitExp failed (m in Z/m too small)"); 678 861 } 679 862 -
libpolys/coeffs/rmodulon.h
r9a6f8c1 rfe99ed 33 33 BOOLEAN nrnIsUnit (number a, const coeffs r); 34 34 number nrnGetUnit (number a, const coeffs r); 35 number nrnAnn (number a, const coeffs r); 35 36 number nrnDiv (number a, number b, const coeffs r); 36 37 number nrnMod (number a,number b, const coeffs r); … … 45 46 number nrnGcd (number a,number b, const coeffs r); 46 47 number nrnExtGcd (number a, number b, number *s, number *t, const coeffs r); 48 number nrnXExtGcd (number a, number b, number *s, number *t, number *u, number *v, const coeffs r); 49 number nrnQuotRem (number a, number b, number *s, const coeffs r); 47 50 nMapFunc nrnSetMap (const coeffs src, const coeffs dst); 48 51 #define nrnWrite nrzWrite
Note: See TracChangeset
for help on using the changeset viewer.