Changeset 31e857 in git for kernel/rmodulon.cc
- Timestamp:
- Feb 1, 2008, 11:31:44 AM (16 years ago)
- Branches:
- (u'spielwiese', '8e0ad00ce244dfd0756200662572aef8402f13d5')
- Children:
- 60d118332f6eec4e3ce8410bb77c08ca9711d1a3
- Parents:
- 8e1c4e6b390f61262e5bb20f254ac6e6c5c1d8b1
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/rmodulon.cc
r8e1c4e r31e857 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: rmodulon.cc,v 1.1 3 2008-01-31 16:13:55wienand Exp $ */4 /* $Id: rmodulon.cc,v 1.14 2008-02-01 10:31:44 wienand Exp $ */ 5 5 /* 6 6 * ABSTRACT: numbers modulo n … … 23 23 24 24 typedef MP_INT *int_number; 25 omBin gmp_bin = omGetSpecBin(sizeof(MP_INT)); 25 26 26 27 int_number nrnModul = NULL; … … 29 30 unsigned long long nrnBase = 0; 30 31 31 32 32 /* 33 33 * create a number from int … … 35 35 number nrnInit (int i) 36 36 { 37 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin37 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 38 38 mpz_init_set_si(erg, i); 39 39 mpz_mod(erg, erg, nrnModul); … … 44 44 { 45 45 mpz_clear((int_number) *a); 46 omFree ((ADDRESS) *a);46 omFreeBin((ADDRESS) *a, gmp_bin); 47 47 } 48 48 … … 60 60 number nrnMult (number a, number b) 61 61 { 62 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin62 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 63 63 mpz_init(erg); 64 64 mpz_mul(erg, (int_number) a, (int_number) b); … … 69 69 void nrnPower (number a, int i, number * result) 70 70 { 71 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin71 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 72 72 mpz_init(erg); 73 73 mpz_powm_ui(erg, (int_number) a, i, nrnModul); … … 77 77 number nrnAdd (number a, number b) 78 78 { 79 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin79 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 80 80 mpz_init(erg); 81 81 mpz_add(erg, (int_number) a, (int_number) b); … … 86 86 number nrnSub (number a, number b) 87 87 { 88 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin88 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 89 89 mpz_init(erg); 90 90 mpz_sub(erg, (int_number) a, (int_number) b); … … 95 95 number nrnNeg (number c) 96 96 { 97 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin97 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 98 98 mpz_init(erg); 99 99 mpz_sub(erg, nrnModul, (int_number) c); … … 103 103 number nrnInvers (number c) 104 104 { 105 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin105 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 106 106 mpz_init(erg); 107 107 mpz_invert(erg, (int_number) c, nrnModul); … … 128 128 number nrnGcd (number a,number b,ring r) 129 129 { 130 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 131 mpz_init(erg); 132 if (a == NULL) a = (number) nrnModul; 133 if (b == NULL) b = (number) nrnModul; 134 mpz_gcd(erg, (int_number) a, (int_number) b); 135 mpz_gcd(erg, erg, nrnModul); 130 if ((a == NULL) && (b == NULL)) return nrnInit(0); 131 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 132 mpz_init_set(erg, nrnModul); 133 if (a != NULL) mpz_gcd(erg, erg, (int_number) a); 134 if (b != NULL) mpz_gcd(erg, erg, (int_number) b); 136 135 return (number) erg; 137 136 } … … 140 139 number nrnGcd3 (number a,number b, number c,ring r) 141 140 { 142 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin141 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 143 142 mpz_init(erg); 144 143 if (a == NULL) a = (number) nrnModul; … … 158 157 number nrnExtGcd (number a, number b, number *s, number *t) 159 158 { 160 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin161 int_number bs = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin162 int_number bt = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin159 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 160 int_number bs = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 161 int_number bt = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 163 162 mpz_init(erg); 164 163 mpz_init(bs); … … 212 211 number nrnGetUnit (number k) 213 212 { 214 number unit = nrnIntDiv(k, nrnGcd(k, 0, currRing)); 215 number gcd = nrnGcd(unit, 0, currRing); 216 if (!nrnIsOne(gcd)) 217 { 218 number tmp = nrnMult(unit, unit); 219 number gcd_new = nrnGcd(tmp, 0, currRing); 220 while (!nrnEqual(gcd_new, gcd)) 213 int_number unit = (int_number) nrnGcd(k, 0, currRing); 214 mpz_tdiv_q(unit, (int_number) k, unit); 215 int_number gcd = (int_number) nrnGcd((number) unit, 0, currRing); 216 if (!nrnIsOne((number) gcd)) 217 { 218 int_number ctmp; 219 // tmp := unit^2 220 int_number tmp = (int_number) nrnMult((number) unit,(number) unit); 221 // gcd_new := gcd(tmp, 0) 222 int_number gcd_new = (int_number) nrnGcd((number) tmp, 0, currRing); 223 while (!nrnEqual((number) gcd_new,(number) gcd)) 221 224 { 222 nrnDelete(&gcd, NULL); 225 // gcd := gcd_new 226 ctmp = gcd; 223 227 gcd = gcd_new; 224 tmp = nrnMult(tmp, unit); 225 gcd_new = nrnGcd(tmp, 0, currRing); 228 gcd_new = ctmp; 229 // tmp := tmp * unit 230 mpz_mul(tmp, tmp, unit); 231 mpz_mod(tmp, tmp, nrnModul); 232 // gcd_new := gcd(tmp, 0) 233 mpz_gcd(gcd_new, tmp, nrnModul); 226 234 } 227 unit = nrnAdd(unit, nrnIntDiv(0, gcd_new)); 228 nrnDelete(&gcd_new, NULL); 229 } 230 nrnDelete(&gcd, NULL); 231 return unit; 235 // unit := unit + nrnModul / gcd_new 236 mpz_tdiv_q(tmp, nrnModul, gcd_new); 237 mpz_add(unit, unit, tmp); 238 mpz_mod(unit, unit, nrnModul); 239 nrnDelete((number*) &gcd_new, NULL); 240 nrnDelete((number*) &tmp, NULL); 241 } 242 nrnDelete((number*) &gcd, NULL); 243 return (number) unit; 232 244 } 233 245 234 246 BOOLEAN nrnDivBy (number a,number b) 235 247 { 236 number bs = nrnIntDiv(b, nrnGcd(a, b, NULL)); 248 number bs = nrnGcd(a, b, NULL); 249 mpz_tdiv_q((int_number) bs, (int_number) b, (int_number) bs); 237 250 bool res = nrnIsUnit(bs); 238 251 nrnDelete(&bs, NULL); … … 243 256 { 244 257 if (nrnEqual(a, b)) return 0; 245 if ( nrnDivBy(a,b)) return -1;246 if ( nrnDivBy(b,a)) return 1;258 if (mpz_divisible_p((int_number) a, (int_number) b)) return -1; 259 if (mpz_divisible_p((int_number) b, (int_number) a)) return 1; 247 260 return 2; 248 261 } … … 251 264 { 252 265 if (a == NULL) a = (number) nrnModul; 253 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin266 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 254 267 mpz_init(erg); 255 268 if (mpz_divisible_p((int_number) a, (int_number) b)) … … 261 274 { 262 275 int_number gcd = (int_number) nrnGcd(a, b, NULL); 263 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin264 mpz_init(erg);265 276 mpz_divexact(erg, (int_number) b, gcd); 266 277 if (!nrnIsUnit((number) erg)) … … 269 280 WarnS("Result is zero."); 270 281 mpz_set_ui(erg, 0); 271 mpz_clear(gcd); 272 omFree(gcd); 282 nrnDelete((number*) &gcd, NULL); 273 283 return (number) erg; 274 284 } 275 int_number tmp = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 276 mpz_init(tmp); 277 tmp = (int_number) nrnInvers((number) erg); 285 // a / gcd(a,b) * [b / gcd (a,b)]^(-1) 286 int_number tmp = (int_number) nrnInvers((number) erg); 278 287 mpz_divexact(erg, (int_number) a, gcd); 279 288 mpz_mul(erg, erg, tmp); 280 mpz_clear(gcd); 281 omFree(gcd); 282 mpz_clear(tmp); 283 omFree(tmp); 289 nrnDelete((number*) &gcd, NULL); 290 nrnDelete((number*) &tmp, NULL); 284 291 mpz_mod(erg, erg, nrnModul); 285 292 return (number) erg; … … 289 296 number nrnIntDiv (number a,number b) 290 297 { 291 int_number erg = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin298 int_number erg = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 292 299 mpz_init(erg); 293 300 if (a == NULL) a = (number) nrnModul; … … 320 327 if (nrnModul != NULL) 321 328 { 322 mpz_clear(nrnModul); 323 omFree(nrnModul); 324 mpz_clear(nrnMinusOne); 325 omFree(nrnMinusOne); 326 } 327 nrnModul = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 329 nrnDelete((number*) &nrnModul, NULL); 330 nrnDelete((number*) &nrnMinusOne, NULL); 331 } 332 nrnModul = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 328 333 mpz_init(nrnModul); 329 334 mpz_set_ull(nrnModul, nrnBase); 330 335 mpz_pow_ui(nrnModul, nrnModul, nrnExponent); 331 336 332 nrnMinusOne = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin337 nrnMinusOne = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 333 338 mpz_init(nrnMinusOne); 334 339 mpz_sub_ui(nrnMinusOne, nrnModul, 1); … … 403 408 char * nrnRead (char *s, number *a) 404 409 { 405 int_number z = (int_number) omAlloc (sizeof(MP_INT)); // evtl. spaeter mit bin410 int_number z = (int_number) omAllocBin(gmp_bin); // evtl. spaeter mit bin 406 411 { 407 412 s = nlCPEatLongC(s, z);
Note: See TracChangeset
for help on using the changeset viewer.