Changeset 12ea9d in git
- Timestamp:
- Jan 30, 2008, 5:14:25 PM (15 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a657104b677b4c461d018cbf3204d72d34ad66a9')
- Children:
- af378f726d1e5204f8934b4281bd84a2d50ab8ed
- Parents:
- 122981d0e106581ee4b7623ee3c76393fef4568a
- Location:
- kernel
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/numbers.cc
r122981 r12ea9d 2 2 * Computer Algebra System SINGULAR * 3 3 *****************************************/ 4 /* $Id: numbers.cc,v 1.1 1 2007-07-03 14:45:57 SingularExp $ */4 /* $Id: numbers.cc,v 1.12 2008-01-30 16:14:24 wienand Exp $ */ 5 5 6 6 /* … … 147 147 /*----------------------ring Z / n----------------*/ 148 148 else if (rField_is_Ring_ModN(r)) 149 { 150 nrnSetExp(c, r); 151 } 152 #endif 153 #ifdef HAVE_RINGMODN 154 /*----------------------ring Z / n----------------*/ 155 else if (rField_is_Ring_PtoM(r)) 149 156 { 150 157 nrnSetExp(c, r); … … 370 377 #ifdef HAVE_RINGMODN 371 378 /* -------------- Z/n ----------------------- */ 372 else if (rField_is_Ring_ModN(r)) 379 else if (rField_is_Ring_ModN(r) || rField_is_Ring_PtoM(r) 380 ) 373 381 { 374 382 nrnInitExp(c,r); -
kernel/ring.cc
r122981 r12ea9d 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: ring.cc,v 1.7 1 2008-01-30 09:01:38wienand Exp $ */4 /* $Id: ring.cc,v 1.72 2008-01-30 16:14:24 wienand Exp $ */ 5 5 6 6 /* … … 277 277 #endif 278 278 #ifdef HAVE_RINGMODN 279 if (rField_is_Ring_ModN(r)) Print("Z/% d\n", r->ringflaga);279 if (rField_is_Ring_ModN(r)) Print("Z/%llu\n", r->ringflaga); 280 280 #endif 281 281 #ifdef HAVE_RING2TOM 282 if (rField_is_Ring_2toM(r)) Print("Z/2^% d\n", r->ringflagb);282 if (rField_is_Ring_2toM(r)) Print("Z/2^%llu\n", r->ringflagb); 283 283 #endif 284 #ifdef HAVE_RING PTOM285 if (rField_is_Ring_PtoM(r)) Print("Z/% d^%d\n", r->ringflaga, r->ringflagb);284 #ifdef HAVE_RINGMODN 285 if (rField_is_Ring_PtoM(r)) Print("Z/%llu^%u\n", r->ringflaga, r->ringflagb); 286 286 #endif 287 287 } -
kernel/ring.h
r122981 r12ea9d 7 7 * ABSTRACT - the interpreter related ring operations 8 8 */ 9 /* $Id: ring.h,v 1.2 3 2007-07-19 11:54:50 SingularExp $ */9 /* $Id: ring.h,v 1.24 2008-01-30 16:14:25 wienand Exp $ */ 10 10 11 11 /* includes */ … … 98 98 inline BOOLEAN rField_is_Ring_ModN(ring r=currRing) 99 99 { return (r->ringtype == 2); } 100 #endif 101 102 #ifdef HAVE_RINGPTOM 100 103 101 inline BOOLEAN rField_is_Ring_PtoM(ring r=currRing) 104 102 { return (r->ringtype == 3); } -
kernel/rmodulon.cc
r122981 r12ea9d 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: rmodulon.cc,v 1. 9 2008-01-30 13:03:41wienand Exp $ */4 /* $Id: rmodulon.cc,v 1.10 2008-01-30 16:14:25 wienand Exp $ */ 5 5 /* 6 6 * ABSTRACT: numbers modulo n … … 24 24 typedef MP_INT *int_number; 25 25 26 int_number nrnModul; 27 int_number nrnMinusOne; 28 29 // int_number nrnModul; 30 // int_number nrnMinusOne; 26 int_number nrnModul = NULL; 27 int_number nrnMinusOne = NULL; 28 unsigned long nrnExponent = 0; 29 unsigned long long nrnBase = 0; 31 30 32 31 /* … … 90 89 mpz_pow_ui(erg, (int_number) a, i); 91 90 mpz_mod(erg, erg, nrnModul); 91 // int_number tmp = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 92 // mpz_init(tmp); 93 // mpz_clear(erg); 94 // omFree(erg); 95 // erg = tmp; 92 96 *result = (number) erg; 93 97 } … … 205 209 if (!nrnIsUnit((number) erg)) 206 210 { 207 WarnS("Division by non divisible element.");211 WarnS("Division not possible, even by cancelling zero divisors."); 208 212 WarnS("Result is zero."); 213 mpz_set_ui(erg, 0); 214 mpz_clear(gcd); 215 omFree(gcd); 216 return (number) erg; 209 217 } 210 gcd = (int_number) nrnInvers((number) erg); 218 int_number tmp = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 219 mpz_init(tmp); 220 tmp = (int_number) nrnInvers((number) erg); 211 221 mpz_divexact(erg, (int_number) a, gcd); 212 mpz_mul(erg, erg, gcd);222 mpz_mul(erg, erg, tmp); 213 223 mpz_clear(gcd); 214 224 omFree(gcd); 225 mpz_clear(tmp); 226 omFree(tmp); 215 227 mpz_mod(erg, erg, nrnModul); 216 228 return (number) erg; … … 228 240 number nrnInvers (number c) 229 241 { 230 number s; 231 number t; 232 number k; 233 /* 234 * Give the largest non unit k, such that a = x * k, b = y * k has 235 * a solution and r, s, s.t. k = s*a + t*b 236 */ 237 k = nrnExtGcd((number) nrnModul, c, &s, &t); 238 if (!nrnIsOne((number) k)) 239 { 240 WarnS("Non invertible element."); 241 return nrnInit(0); //TODO 242 } 243 mpz_clear((int_number) k); 244 omFree((ADDRESS) k); 245 mpz_clear((int_number) s); 246 omFree((ADDRESS) s); 247 return (number) t; 242 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 243 mpz_init(erg); 244 mpz_invert(erg, (int_number) c, nrnModul); 245 return (number) erg; 248 246 } 249 247 … … 266 264 */ 267 265 266 void mpz_set_ull(int_number res, unsigned long long xx) 267 { 268 unsigned long h = xx >> 32; 269 mpz_set_ui (res, h); 270 mpz_mul_2exp (res, res, 32); 271 mpz_add_ui (res, res, (unsigned long) xx); 272 } 273 268 274 void nrnSetExp(int m, ring r) 269 275 { 270 nrnModul = (int_number) nrnInit(m); 276 if ((nrnBase == r->ringflaga) && (nrnExponent == r->ringflagb)) return; 277 nrnBase = r->ringflaga; 278 nrnExponent = r->ringflagb; 279 if (nrnModul != NULL) 280 { 281 mpz_clear(nrnModul); 282 omFree(nrnModul); 283 mpz_clear(nrnMinusOne); 284 omFree(nrnMinusOne); 285 } 286 nrnModul = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 287 mpz_init(nrnModul); 288 mpz_set_ull(nrnModul, nrnBase); 289 mpz_pow_ui(nrnModul, nrnModul, nrnExponent); 290 271 291 nrnMinusOne = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 272 292 mpz_init(nrnMinusOne); 273 293 mpz_sub_ui(nrnMinusOne, nrnModul, 1); 274 275 // PrintS("Modul: ");276 // Print("%d\n", nrnModul);277 294 } 278 295 279 296 void nrnInitExp(int m, ring r) 280 297 { 281 nrnModul = (int_number) nrnInit(m); 282 nrnMinusOne = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 283 mpz_init(nrnMinusOne); 284 mpz_sub_ui(nrnMinusOne, nrnModul, 1); 285 if (m < 2) 298 nrnSetExp(m, r); 299 if (mpz_cmp_ui(nrnModul,2) <= 0) 286 300 { 287 301 WarnS("nInitChar failed"); -
kernel/structs.h
r122981 r12ea9d 4 4 * Computer Algebra System SINGULAR * 5 5 ****************************************/ 6 /* $Id: structs.h,v 1.4 1 2007-11-09 11:29:44 SingularExp $ */6 /* $Id: structs.h,v 1.42 2008-01-30 16:14:25 wienand Exp $ */ 7 7 /* 8 8 * ABSTRACT … … 550 550 #ifdef HAVE_RINGS 551 551 unsigned int ringtype; /* cring = 0 => coefficient field, cring = 1 => coeffs from Z/2^m */ 552 unsigned long ringflaga;553 unsigned intringflagb;552 unsigned long long ringflaga; 553 unsigned long ringflagb; 554 554 #endif 555 555 int ref; /* reference counter to the ring */
Note: See TracChangeset
for help on using the changeset viewer.