Changeset 226c28 in git
- Timestamp:
- Feb 21, 2009, 11:02:00 AM (14 years ago)
- Branches:
- (u'spielwiese', '0d6b7fcd9813a1ca1ed4220cfa2b104b97a0a003')
- Children:
- 59c445958ea9eeff400a858e69fea9959018518e
- Parents:
- d2f48833961a856dcfd3669df0f6f883f23efe6a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/LIB/aksaka.lib
rd2f488 r226c28 1 1 //CM, last modified 10.12.06 2 2 /////////////////////////////////////////////////////////////////////////////// 3 version="$Id: aksaka.lib,v 1. 2 2009-02-20 19:02:43Singular Exp $";3 version="$Id: aksaka.lib,v 1.3 2009-02-21 10:02:00 Singular Exp $"; 4 4 category="Teaching"; 5 5 info=" … … 39 39 " 40 40 { 41 number b,c,d; 42 c=m; 43 b=a; 44 d=1; 45 41 number b,c,d; 42 c=m; 43 b=a; 44 d=1; 46 45 while(c>=1) 47 46 { 48 if(b>n)49 47 if(b>n) 48 { 50 49 return(n+1); 51 } 52 50 } 53 51 if((c mod 2)==1) 54 { 55 d=d*b; 56 if(d>n) 57 { 58 return(n+1); 59 } 60 } 61 62 b=b^2; 63 c=intPart(c/2); 64 65 } 66 return(d) 52 { 53 d=d*b; 54 if(d>n) 55 { 56 return(n+1); 57 } 58 } 59 b=b^2; 60 c=intPart(c/2); 61 } 62 return(d) 67 63 } 68 64 example … … 85 81 int i=1; 86 82 poly g; 87 numbero=nrows(M);83 int o=nrows(M); 88 84 89 85 while(i<=o) 90 91 92 93 94 95 i=i+1;96 86 { 87 g=g+(leadcoef(M[i,1]) mod n)*var(1)^(i-1) ; 88 // umwandeln der Koeffizienten in numbers, 89 // Berechnung der Reste dieser numbers modulo n, 90 // poly mit neuen Koeffizienten wieder zusammensetzen 91 i++; 92 } 97 93 return(g); 98 94 } … … 111 107 " 112 108 { 113 ideal I= std(r);114 115 116 117 118 119 109 ideal I=r; 110 111 if(q==1){return(coeffmod(reduce(a,I),n));} 112 if((q mod 5)==0){return(coeffmod(reduce(powerpolyX(q/5,n,a,r)^5,I),n));} 113 if((q mod 4)==0){return(coeffmod(reduce(powerpolyX(q/4,n,a,r)^4,I),n));} 114 if((q mod 3)==0){return(coeffmod(reduce(powerpolyX(q/3,n,a,r)^3,I),n));} 115 if((q mod 2)==0){return(coeffmod(reduce(powerpolyX(q/2,n,a,r)^2,I),n));} 120 116 121 117 return(coeffmod(reduce(a*powerpolyX(q-1,n,a,r),I),n)); … … 143 139 " 144 140 { 145 146 141 number b,c,d,t,l; 142 int k; 147 143 // log2=logarithmus zur basis 2, 148 144 // log=natuerlicher logarithmus 149 b=100000000000000000000000000000000000000000000000000; 150 c=141421356237309504880168872420969807856967187537695; // c/b=sqrt(2) 151 d=69314718055994530941723212145817656807550013436026; // d/b=log(2) 152 153 //bringen x zunaechst zwischen 1/sqrt(2) und sqrt(2), so dass Reihe schnell 154 //konvergiert, berechnen dann Reihe bis 30. Summanden und letztendlich 155 //log2(x)=log(x)/log(2)=(log(x/2^j)+j*log(2))/log(2) für große x 156 //log2(x)=log(x)/log(2)=(log(x*2^j)-j*log(2))/log(2) für kleine x 157 158 number j=0; 159 160 if(x<(b/c)) 161 { 162 163 while(x<(b/c)) 164 { 165 x=x*2; 145 b=100000000000000000000000000000000000000000000000000; 146 c=141421356237309504880168872420969807856967187537695; // c/b=sqrt(2) 147 d=69314718055994530941723212145817656807550013436026; // d/b=log(2) 148 149 //bringen x zunaechst zwischen 1/sqrt(2) und sqrt(2), so dass Reihe schnell 150 //konvergiert, berechnen dann Reihe bis 30. Summanden und letztendlich 151 //log2(x)=log(x)/log(2)=(log(x/2^j)+j*log(2))/log(2) für große x 152 //log2(x)=log(x)/log(2)=(log(x*2^j)-j*log(2))/log(2) für kleine x 153 154 number j=0; 155 if(x<(b/c)) 156 { 157 while(x<(b/c)) 158 { 159 x=x*2; 160 j=j+1; 161 } 162 t=(x-1)/(x+1); 163 k=0; 164 l=0; 165 while(k<30) //fuer x*2^j wird Reihe bis k-tem Summanden berechnet 166 { 167 l=l+2*(t^(2*k+1))/(2*k+1); //l=log(x*2^j) nach k Summanden 168 k=k+1; 169 } 170 return((l*b/d)-j); //log2(x)=log(x*2^j)/log(2)-j wird ausgegeben 171 } 172 while(x>(c/b)) 173 { 174 x=x/2; 166 175 j=j+1; 167 } 168 176 } 169 177 t=(x-1)/(x+1); 170 178 k=0; 171 179 l=0; 172 while(k<30) //fuer x*2^j wird Reihe bis k-tem Summanden berechnet 173 { 174 l=l+2*(t^(2*k+1))/(2*k+1); //l=log(x*2^j) nach k Summanden 175 180 while(k<30) //fuer x/2^j wird Reihe bis k-tem Summanden berechnet 181 { 182 l=l+2*(t^(2*k+1))/(2*k+1); //l=log(x/2^j) nach k Summanden 176 183 k=k+1; 177 } 178 179 180 return((l*b/d)-j); //log2(x)=log(x*2^j)/log(2)-j wird ausgegeben 181 } 182 183 184 while(x>(c/b)) 185 { 186 x=x/2; 187 j=j+1; 188 } 189 190 t=(x-1)/(x+1); 191 k=0; 192 l=0; 193 194 while(k<30) //fuer x/2^j wird Reihe bis k-tem Summanden berechnet 195 { 196 l=l+2*(t^(2*k+1))/(2*k+1); //l=log(x/2^j) nach k Summanden 197 k=k+1; 198 } 199 200 return((l*b/d)+j); //hier wird log2(x)=log(x/2^j)/log(2)+j ausgegeben 184 } 185 return((l*b/d)+j); //hier wird log2(x)=log(x/2^j)/log(2)+j ausgegeben 201 186 } 202 187 example … … 213 198 " 214 199 { 215 poly f=var(1)^2-r; //Wurzel wird als Nullstelle eines Polys 216 //mit proc nt_solve genähert 217 218 def B=basering; 219 220 ring R=(real,40),var(1),dp; 221 222 poly g=imap(B,f); 223 list l=nt_solve(g,1.1); 224 number m=leadcoef(l[1][1]); 225 226 setring B; 227 number m1=imap(R,m); 228 return(m1); 200 poly f=var(1)^2-r; //Wurzel wird als Nullstelle eines Polys 201 //mit proc nt_solve genähert 202 def B=basering; 203 ring R=(real,40),var(1),dp; 204 poly g=imap(B,f); 205 list l=nt_solve(g,1.1); 206 number m=leadcoef(l[1][1]); 207 setring B; 208 return(imap(R,m)); 229 209 } 230 210 example … … 243 223 { 244 224 list l=PollardRho(r,5000,1); //bestimmen der Primfaktoren von r 245 246 int k; 247 number phi=r; 248 249 for(k=1;k<=size(l);k++) 250 { 251 phi=phi-phi/l[k]; //berechnen phi(r) mit Hilfe der 252 } //Primfaktoren und Eigenschaften der phi-Fktn 253 254 return(phi); 255 225 int k; 226 number phi=r; 227 for(k=1;k<=size(l);k++) 228 { 229 phi=phi-phi/l[k]; //berechnen phi(r) mit Hilfe der 230 } //Primfaktoren und Eigenschaften der phi-Fktn 231 return(phi); 256 232 } 257 233 example … … 281 257 282 258 while(b<=l) 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 259 { 260 a=1; 261 c=n; 262 263 while(c-a>=2) 264 { 265 m=intPart((a+c)/2); 266 p=schnellexpt(m,b,n); 267 268 if(p==n) 269 { 270 if(printlevel>=1){"es existieren Zahlen a,b>1 mit a^b=n"; 271 "a=";m;"b=";b;pause();} 272 return(e); 273 } 274 275 if(p<n) 276 { 277 a=m; 278 } 279 else 280 { 281 c=m; 282 } 283 } 284 b=b+1; 285 } 310 286 if(printlevel>=1){"es existieren keine Zahlen a,b>1 mit a^b=n";pause();} 311 287 return(f); … … 336 312 p=1; 337 313 338 if(n==2) 339 { 340 return(p); 341 } 342 343 344 if(printlevel>=1){"Beginn: Test ob a^b=n fuer a,b>1";pause();} 345 346 if(0==PerfectPowerTest(n)) // Schritt1 des ASK-Alg. 347 { 348 return(c); 349 } 350 351 if(printlevel>=1) 352 {"Beginn: Berechnung von r, so dass ord(n) in Z/rZ groesser log2(n)^2 "; 353 pause();} 354 355 number k,M,M2,b; 356 int r; // Zeile 526-542: Schritt 2 357 M=log2(n); // darin sind die Schritte 358 M2=intPart(M^2); // 3 und 4 integriert 359 r=2; 360 361 362 if(gcdN(n,r)!=1) //falls ggt ungleich eins, Teiler von n gefunden, 314 if(n==2) { return(p); } 315 if(printlevel>=1){"Beginn: Test ob a^b=n fuer a,b>1";pause();} 316 if(0==PerfectPowerTest(n)) // Schritt1 des ASK-Alg. 317 { return(c); } 318 if(printlevel>=1) 319 { 320 "Beginn: Berechnung von r, so dass ord(n) in Z/rZ groesser log2(n)^2 "; 321 pause(); 322 } 323 number k,M,M2,b; 324 int r; // Zeile 526-542: Schritt 2 325 M=log2(n); // darin sind die Schritte 326 M2=intPart(M^2); // 3 und 4 integriert 327 r=2; 328 329 if(gcdN(n,r)!=1) //falls ggt ungleich eins, Teiler von n gefunden, 363 330 // Schritt 3 des ASK-Alg. 364 331 { 365 332 if(printlevel>=1){"Zahl r gefunden mit r|n";"r=";r;pause();} 366 333 return(c); 367 } 368 369 if(r==n-1) // falls diese Bedingung erfüllt ist, ist 334 } 335 if(r==n-1) // falls diese Bedingung erfüllt ist, ist 370 336 // ggT(a,n)=1 für 0<a<=r, schritt 4 des ASK-Alg. 371 337 { 372 if(printlevel>=1){"ggt(r,n)=1 fuer alle 1<r<n";pause();} 373 return(p); 374 } 375 338 if(printlevel>=1){"ggt(r,n)=1 fuer alle 1<r<n";pause();} 339 return(p); 340 } 376 341 k=1; 377 342 b=1; 378 343 379 344 while(k<=M2) //Beginn des Ordnungstests für aktuelles r 380 { 381 b=((b*n) mod r); 382 383 if(b==1) //tritt Bedingung ein so gilt für aktuelles r,k: 384 //n^k=1 mod r 385 //tritt Bedingung ein, wird wegen k<=M2=intPart(log2(n)^2) 386 //r erhöht,k=0 gesetzt und Ordnung erneut untersucht 387 //tritt diese Bedingung beim größten k=intPart(log2(n)^2) 388 //nicht ein, so ist ord_r_(n)>log2(n)^2 und Schleife 389 //wird nicht mehr ausgeführt 390 { 391 if(r==2147483647) 392 { 393 string e="error: r überschreitet integer Bereich und darf 394 nicht als Grad eines Polynoms verwendet werden"; 395 return(e); 396 } 397 398 r=r+1; 399 400 if(gcdN(n,r)!=1) //falls ggt ungleich eins, Teiler von n gefunden, 401 //wird aufgrund von Schritt 3 des ASK-Alg. für 402 //jeden Kandidaten r getestet 403 { 404 if(printlevel>=1){"Zahl r gefunden mit r|n";"r=";r;pause();} 405 return(c); 406 } 407 408 if(r==n-1) //falls diese Bedingung erfüllt ist, 409 //ist n wegen Zeile 571 prim 410 //wird aufgrund von Schritt 4 des ASK-Alg. für 411 //jeden Kandidaten r getestet 412 { 413 if(printlevel>=1){"ggt(r,n)=1 fuer alle 1<r<n";pause();} 414 return(p); 415 } 416 417 k=0; //für neuen Kandidaten r, muss k für den 418 //Ordnungstest zurückgesetzt werden 419 } 420 421 k=k+1; 422 } 423 424 425 426 if(printlevel>=1) 427 {"Zahl r gefunden, so dass ord(n) in Z/rZ groesser log2(n)^2 "; 428 "r=";r;pause();} 429 430 431 432 number l=1; // Zeile 603-628: Schritt 5 433 poly f,g; // Zeile 618 überprüft Gleichungen für 434 // das jeweilige a 435 g=var(1)^r-1; 436 number grenze=intPart(wurzel(euler(r))*M); 437 438 if(printlevel>=1) 439 {"Beginn: Ueberpruefung ob (x+a)^n kongruent x^n+a mod (x^r-1,n) 440 fuer 0<a<=intPart(wurzel(phi(r))*log2(n))=";grenze;pause();} 441 442 while(l<=grenze) // 443 { 444 if(printlevel>=1){"a=";l;} 445 f=var(1)+l; 446 447 if(powerpolyX(n,n,f,g)!=(var(1)^(int((n mod r)))+l)) 448 { 449 if(printlevel>=1) 450 {"Fuer a=";l;"ist (x+a)^n nicht kongruent x^n+a mod (x^r-1,n)"; 451 pause();} 452 453 return(c); 454 } 455 456 l=l+1; 457 } 458 459 if(printlevel>=1) 345 { 346 b=((b*n) mod r); 347 if(b==1) //tritt Bedingung ein so gilt für aktuelles r,k: 348 //n^k=1 mod r 349 //tritt Bedingung ein, wird wegen k<=M2=intPart(log2(n)^2) 350 //r erhöht,k=0 gesetzt und Ordnung erneut untersucht 351 //tritt diese Bedingung beim größten k=intPart(log2(n)^2) 352 //nicht ein, so ist ord_r_(n)>log2(n)^2 und Schleife 353 //wird nicht mehr ausgeführt 354 { 355 if(r==2147483647) 356 { 357 string e="error: r überschreitet integer Bereich und darf 358 nicht als Grad eines Polynoms verwendet werden"; 359 return(e); 360 } 361 r=r+1; 362 if(gcdN(n,r)!=1) //falls ggt ungleich eins, Teiler von n gefunden, 363 //wird aufgrund von Schritt 3 des ASK-Alg. für 364 //jeden Kandidaten r getestet 365 { 366 if(printlevel>=1){"Zahl r gefunden mit r|n";"r=";r;pause();} 367 return(c); 368 } 369 if(r==n-1) //falls diese Bedingung erfüllt ist, 370 //ist n wegen Zeile 571 prim 371 //wird aufgrund von Schritt 4 des ASK-Alg. für 372 //jeden Kandidaten r getestet 373 { 374 if(printlevel>=1){"ggt(r,n)=1 fuer alle 1<r<n";pause();} 375 return(p); 376 } 377 378 k=0; //für neuen Kandidaten r, muss k für den 379 //Ordnungstest zurückgesetzt werden 380 } 381 k=k+1; 382 } 383 if(printlevel>=1) 384 { 385 "Zahl r gefunden, so dass ord(n) in Z/rZ groesser log2(n)^2 "; 386 "r=";r;pause(); 387 } 388 number l=1; // Zeile 603-628: Schritt 5 389 poly f,g; // Zeile 618 überprüft Gleichungen für 390 // das jeweilige a 391 g=var(1)^r-1; 392 number grenze=intPart(wurzel(euler(r))*M); 393 394 if(printlevel>=1) 395 {"Beginn: Ueberpruefung ob (x+a)^n kongruent x^n+a mod (x^r-1,n) 396 fuer 0<a<=intPart(wurzel(phi(r))*log2(n))=";grenze;pause(); 397 } 398 while(l<=grenze) // 399 { 400 if(printlevel>=1){"a=";l;} 401 f=var(1)+l; 402 if(powerpolyX(n,n,f,g)!=(var(1)^(int((n mod r)))+l)) 403 { 404 if(printlevel>=1) 405 {"Fuer a=";l;"ist (x+a)^n nicht kongruent x^n+a mod (x^r-1,n)"; 406 pause(); 407 } 408 return(c); 409 } 410 l=l+1; 411 } 412 if(printlevel>=1) 460 413 {"(x+a)^n kongruent x^n+a mod (x^r-1,n) fuer 0<a<wurzel(phi(r))*log2(n)"; 461 pause(); }462 463 return(p); // Schritt 6414 pause(); 415 } 416 return(p); // Schritt 6 464 417 } 465 418 example … … 469 422 ask(32003); 470 423 } 471
Note: See TracChangeset
for help on using the changeset viewer.