/******************************************************************************/ /* */ /* COMPUTE 3N+1 OR 3N-1 SEQUENCE */ /* 01/27/10 (dkc) */ /* */ /* This C program generates limbs where the first element of the limb is */ /* even, less than the order, and greater than the order over 2. The last */ /* element of the limb is odd and greater than the order/3. Only live limbs */ /* are generated. The limbs must have at least one element that is divisible*/ /* by 8. */ /* */ /* Note: This code is for the C64. */ /* */ /******************************************************************************/ #include <math.h> void add64(unsigned int *a, unsigned int *b); void sub64(unsigned int *c, unsigned int *d); void sub128(unsigned int *c, unsigned int *d); void add128(unsigned int *c, unsigned int *d); void shift(unsigned int a, unsigned int b, unsigned int shift, unsigned int *c); void mul64_32(unsigned int a0, unsigned int a2, unsigned int m0, unsigned int *product); unsigned int subr2(unsigned int A, unsigned int B, unsigned int *P); far int c=-1; // c far unsigned int lshift=32; // order shift far unsigned int l=22; // limb length far unsigned int p=63; // number of elements in e array far unsigned int a=9; // number of elements in sv far unsigned int b=63; // number of sequence vectors far unsigned int ho[1024]; // histogram of limb lengths far unsigned int he[200]; // histogram of sequence vectors far unsigned int dist[200]; // distribution of e values far unsigned int error[5]; // error array far unsigned int v[2*4096]; // sub-sequence arrays far unsigned int t[200]; far int num[15]={1,-1,7,5,-17,47,13,-217,295,-139,1909,1631,-3299, 13085,6487}; far unsigned int den[15]={4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384, 32768,65536}; far unsigned int len[15]={2,4,5,7,9,10,12,14,15,17,18,20,22,23,25}; far unsigned int y[40]={0,3,6,8,11, // B (invalid lengths) 13,16,19,21,24, // B 26,29,32,34,37, // B 39,42,44,47,50, // C 52,55,57,60,63, // C 65,68,70,73,75, // D 78,81,83,86,88, // D 91,94,96,99,101}; // D // far unsigned int z[1]={1202}; // length=12, live only // far unsigned int z[1]={3862}; // length=14, live only // far unsigned int z[2]={ // length=15, live only // 7724,5780}; // far unsigned int z[10]={ // length=17, live only // 24196,22738,18850,18364,16906,16258,14530,14476,13378,13018}; // far unsigned int z[10]={ // length=18, live only // 48392,45476,37700,36728,33812,32516,29060,28952,26756,26036}; // far unsigned int z[45]={ // length=20, live only // 149272,140524,136150,117196,114280,112822,105532,101644,101158,99700, // 97270,95326,91276,90952,86902,85606,84364,84148,82204,79990,79756,79774, // 77830,76372,75400,75382,75238,73780,71998,69406,68326,67462,66868,66652, // 63718,62494,62278,62260,60820,60550,57886,56446,55942,55366,50758}; far unsigned int z[63]={ // length=22, live only 456008,429764,416642,359780,351032,346658,324788,313124,311666,307292, 300002,294170,282020,281048,268898,265010,261284,260636,254804,248162, 247514,247460,241682,234392,234338,237308,233906,229532,225644,224186, 216410,213170,212522,210578,208796,208148,203288,199346,195674,195026, 194972,194540,190652,189842,181850,181418,178988,177530,177044,176018, 174290,173804,165866,163922,160682,160466,159980,159548,150098,147884, 146858,146426,134762}; // far unsigned int z[98]={ // length=23 // 912016,859528,833284,719560,702064,693316,649576,626248,623332,614584, // 600004,588340,570844,564040,562096,537796,530020,522568,521272,509608, // 496324,495028,494920,483364,477532,476488,474616,468784,468676,467812, // 459064,451288,450244,448372,432820,430876,426340,425044,421156,417592, // 416296,415324,407548,406576,398692,391348,390052,389944,389080,381304, // 380260,379684,373852,371512,368668,363700,362836,357976,355060,354088, // 352036,348580,347608,346204,345340,345268,337564,333604,331732,327844, // 327772,327196,321364,320932,319960,319096,314236,303868,302500,301528, // 300196,299548,296092,295768,293716,292852,281764,281116,276220,275356, // 275284,269524,268444,257788,252028,250012,247708,229276}; //far unsigned int sv[5*1]={ // length=12, live only // 1, 3, 1, 1, 1}; // 1202 //far unsigned int sv[6*1]={ // length=14, live only // 1, 3, 1, 1, 1, 1}; // 3862 //far unsigned int sv[6*2]={ // length=15, live only // 2, 3, 1, 1, 1, 1, // 7724 // 2, 1, 3, 1, 1, 1};// 5780 /* far unsigned int sv[7*10]={ // length=17, live only 2, 3, 1, 1, 1, 1, 1, // 24196 1, 4, 1, 1, 1, 1, 1, // 22738 1, 3, 2, 1, 1, 1, 1, // 18850 2, 1, 3, 1, 1, 1, 1, // 18364 1, 2, 3, 1, 1, 1, 1, // 16906 1, 3, 1, 2, 1, 1, 1, // 16258 1, 3, 1, 1, 2, 1, 1, // 14530 2, 1, 1, 3, 1, 1, 1, // 14476 1, 3, 1, 1, 1, 2, 1, // 13378 1, 2, 1, 3, 1, 1, 1};// 13018 */ /* far unsigned int sv[7*10]={ // length=18, live only 3, 3, 1, 1, 1, 1, 1, // 48392 2, 4, 1, 1, 1, 1, 1, // 45476 2, 3, 2, 1, 1, 1, 1, // 37700 3, 1, 3, 1, 1, 1, 1, // 36728 2, 2, 3, 1, 1, 1, 1, // 33812 2, 3, 1, 2, 1, 1, 1, // 32516 2, 3, 1, 1, 2, 1, 1, // 29060 3, 1, 1, 3, 1, 1, 1, // 28952 2, 3, 1, 1, 1, 2, 1, // 26756 2, 2, 1, 3, 1, 1, 1};// 26036 */ /* far unsigned int sv[8*45]={ // length=20, live only 3, 3, 1, 1, 1, 1, 1, 1, // 149272 2, 4, 1, 1, 1, 1, 1, 1, // 140524 1, 5, 1, 1, 1, 1, 1, 1, // 136150 2, 3, 2, 1, 1, 1, 1, 1, // 117196 3, 1, 3, 1, 1, 1, 1, 1, // 114280 1, 4, 2, 1, 1, 1, 1, 1, // 112822 2, 2, 3, 1, 1, 1, 1, 1, // 105532 2, 3, 1, 2, 1, 1, 1, 1, // 101644 1, 3, 3, 1, 1, 1, 1, 1, // 101158 2, 1, 4, 1, 1, 1, 1, 1, // 99700 1, 4, 1, 2, 1, 1, 1, 1, // 97270 1, 2, 4, 1, 1, 1, 1, 1, // 95326 2, 3, 1, 1, 2, 1, 1, 1, // 91276 3, 1, 1, 3, 1, 1, 1, 1, // 90952 1, 4, 1, 1, 2, 1, 1, 1, // 86902 1, 3, 2, 2, 1, 1, 1, 1, // 85606 2, 3, 1, 1, 1, 2, 1, 1, // 84364 2, 1, 3, 2, 1, 1, 1, 1, // 84148 2, 2, 1, 3, 1, 1, 1, 1, // 82204 1, 4, 1, 1, 1, 2, 1, 1, // 79990 1, 2, 3, 2, 1, 1, 1, 1, // 79774 2, 3, 1, 1, 1, 1, 2, 1, // 79756 1, 3, 1, 3, 1, 1, 1, 1, // 77830 2, 1, 2, 3, 1, 1, 1, 1, // 76372 3, 1, 1, 1, 3, 1, 1, 1, // 75400 1, 4, 1, 1, 1, 1, 2, 1, // 75382 1, 3, 2, 1, 2, 1, 1, 1, // 75238 2, 1, 3, 1, 2, 1, 1, 1, // 73780 1, 2, 2, 3, 1, 1, 1, 1, // 71998 1, 2, 3, 1, 2, 1, 1, 1, // 69406 1, 3, 1, 2, 2, 1, 1, 1, // 67462 1, 3, 2, 1, 1, 2, 1, 1, // 68326 2, 1, 3, 1, 1, 2, 1, 1, // 66868 2, 2, 1, 1, 3, 1, 1, 1, // 66652 1, 3, 2, 1, 1, 1, 2, 1, // 63718 1, 2, 3, 1, 1, 2, 1, 1, // 62494 1, 3, 1, 1, 3, 1, 1, 1, // 62278 2, 1, 3, 1, 1, 1, 2, 1, // 62260 2, 1, 2, 1, 3, 1, 1, 1, // 60820 1, 3, 1, 2, 1, 2, 1, 1, // 60550 1, 2, 3, 1, 1, 1, 2, 1, // 57886 1, 2, 2, 1, 3, 1, 1, 1, // 56446 1, 3, 1, 2, 1, 1, 2, 1, // 55942 1, 3, 1, 1, 2, 2, 1, 1, // 55366 1, 3, 1, 1, 2, 1, 2, 1}; // 50758 */ far unsigned int sv[9*63]={ // length=22, live only 3, 3, 1, 1, 1, 1, 1, 1, 1, // 456008 2, 4, 1, 1, 1, 1, 1, 1, 1, // 429764 1, 5, 1, 1, 1, 1, 1, 1, 1, // 416642 2, 3, 2, 1, 1, 1, 1, 1, 1, // 359780 3, 1, 3, 1, 1, 1, 1, 1, 1, // 351032 1, 4, 2, 1, 1, 1, 1, 1, 1, // 346658 2, 2, 3, 1, 1, 1, 1, 1, 1, // 324788 2, 3, 1, 2, 1, 1, 1, 1, 1, // 313124 1, 3, 3, 1, 1, 1, 1, 1, 1, // 311666 2, 1, 4, 1, 1, 1, 1, 1, 1, // 307292 1, 4, 1, 2, 1, 1, 1, 1, 1, // 300002 1, 2, 4, 1, 1, 1, 1, 1, 1, // 294170 2, 3, 1, 1, 2, 1, 1, 1, 1, // 282020 3, 1, 1, 3, 1, 1, 1, 1, 1, // 281048 1, 4, 1, 1, 2, 1, 1, 1, 1, // 268898 1, 3, 2, 2, 1, 1, 1, 1, 1, // 265010 2, 3, 1, 1, 1, 2, 1, 1, 1, // 261284 2, 1, 3, 2, 1, 1, 1, 1, 1, // 260636 2, 2, 1, 3, 1, 1, 1, 1, 1, // 254804 1, 4, 1, 1, 1, 2, 1, 1, 1, // 248162 1, 2, 3, 2, 1, 1, 1, 1, 1, // 247514 2, 3, 1, 1, 1, 1, 2, 1, 1, // 247460 1, 3, 1, 3, 1, 1, 1, 1, 1, // 241682 2, 1, 2, 3, 1, 1, 1, 1, 1, // 237308 3, 1, 1, 1, 3, 1, 1, 1, 1, // 234392 1, 4, 1, 1, 1, 1, 2, 1, 1, // 234338 1, 3, 2, 1, 2, 1, 1, 1, 1, // 233906 2, 1, 3, 1, 2, 1, 1, 1, 1, // 229532 2, 1, 1, 4, 1, 1, 1, 1, 1, // 225644 1, 2, 2, 3, 1, 1, 1, 1, 1, // 224186 1, 2, 3, 1, 2, 1, 1, 1, 1, // 216410 1, 3, 2, 1, 1, 2, 1, 1, 1, // 213170 1, 2, 1, 4, 1, 1, 1, 1, 1, // 212522 1, 3, 1, 2, 2, 1, 1, 1, 1, // 210578 2, 1, 3, 1, 1, 2, 1, 1, 1, // 208796 2, 2, 1, 1, 3, 1, 1, 1, 1, // 208148 3, 1, 1, 1, 1, 3, 1, 1, 1, // 203288 1, 3, 2, 1, 1, 1, 2, 1, 1, // 199346 1, 2, 3, 1, 1, 2, 1, 1, 1, // 195674 1, 3, 1, 1, 3, 1, 1, 1, 1, // 195026 2, 1, 3, 1, 1, 1, 2, 1, 1, // 194972 2, 1, 1, 3, 2, 1, 1, 1, 1, // 194540 2, 1, 2, 1, 3, 1, 1, 1, 1, // 190652 1, 3, 1, 2, 1, 2, 1, 1, 1, // 189842 1, 2, 3, 1, 1, 1, 2, 1, 1, // 181850 1, 2, 1, 3, 2, 1, 1, 1, 1, // 181418 2, 1, 1, 2, 3, 1, 1, 1, 1, // 178988 1, 2, 2, 1, 3, 1, 1, 1, 1, // 177530 2, 2, 1, 1, 1, 3, 1, 1, 1, // 177044 1, 3, 1, 2, 1, 1, 2, 1, 1, // 176018 1, 3, 1, 1, 2, 2, 1, 1, 1, // 174290 2, 1, 1, 3, 1, 2, 1, 1, 1, // 173804 1, 2, 1, 2, 3, 1, 1, 1, 1, // 165866 1, 3, 1, 1, 1, 3, 1, 1, 1, // 163922 1, 2, 1, 3, 1, 2, 1, 1, 1, // 160682 1, 3, 1, 1, 2, 1, 2, 1, 1, // 160466 2, 1, 1, 3, 1, 1, 2, 1, 1, // 159980 2, 1, 2, 1, 1, 3, 1, 1, 1, // 159548 1, 3, 1, 1, 1, 2, 2, 1, 1, // 150098 2, 1, 1, 2, 1, 3, 1, 1, 1, // 147884 1, 2, 1, 3, 1, 1, 2, 1, 1, // 146858 1, 2, 2, 1, 1, 3, 1, 1, 1, // 146426 1, 2, 1, 2, 1, 3, 1, 1, 1};// 134762 /* far unsigned int sv[9*98]={ // length=23, live only 4, 3, 1, 1, 1, 1, 1, 1, 1, // 912016 3, 4, 1, 1, 1, 1, 1, 1, 1, // 859528 2, 5, 1, 1, 1, 1, 1, 1, 1, // 833284 3, 3, 2, 1, 1, 1, 1, 1, 1, // 719560 4, 1, 3, 1, 1, 1, 1, 1, 1, // 702064 2, 4, 2, 1, 1, 1, 1, 1, 1, // 693316 3, 2, 3, 1, 1, 1, 1, 1, 1, // 649576 3, 3, 1, 2, 1, 1, 1, 1, 1, // 626248 2, 3, 3, 1, 1, 1, 1, 1, 1, // 623332 3, 1, 4, 1, 1, 1, 1, 1, 1, // 614584 2, 4, 1, 2, 1, 1, 1, 1, 1, // 600004 2, 2, 4, 1, 1, 1, 1, 1, 1, // 588340 2, 1, 5, 1, 1, 1, 1, 1, 1, // 570844 3, 3, 1, 1, 2, 1, 1, 1, 1, // 564040 4, 1, 1, 3, 1, 1, 1, 1, 1, // 562096 2, 4, 1, 1, 2, 1, 1, 1, 1, // 537796 2, 3, 2, 2, 1, 1, 1, 1, 1, // 530020 3, 3, 1, 1, 1, 2, 1, 1, 1, // 522568 3, 1, 3, 2, 1, 1, 1, 1, 1, // 521272 3, 2, 1, 3, 1, 1, 1, 1, 1, // 509608 2, 4, 1, 1, 1, 2, 1, 1, 1, // 496324 2, 2, 3, 2, 1, 1, 1, 1, 1, // 495028 3, 3, 1, 1, 1, 1, 2, 1, 1, // 494920 2, 3, 1, 3, 1, 1, 1, 1, 1, // 483364 2, 1, 4, 2, 1, 1, 1, 1, 1, // 477532 3, 3, 1, 1, 1, 1, 1, 2, 1, // 476488 3, 1, 2, 3, 1, 1, 1, 1, 1, // 474616 4, 1, 1, 1, 3, 1, 1, 1, 1, // 468784 2, 4, 1, 1, 1, 1, 2, 1, 1, // 468676 2, 3, 2, 1, 2, 1, 1, 1, 1, // 467812 3, 1, 3, 1, 2, 1, 1, 1, 1, // 459064 3, 1, 1, 4, 1, 1, 1, 1, 1, // 451288 2, 4, 1, 1, 1, 1, 1, 2, 1, // 450244 2, 2, 2, 3, 1, 1, 1, 1, 1, // 448372 2, 2, 3, 1, 2, 1, 1, 1, 1, // 432820 2, 1, 3, 3, 1, 1, 1, 1, 1, // 430876 2, 3, 2, 1, 1, 2, 1, 1, 1, // 426340 2, 2, 1, 4, 1, 1, 1, 1, 1, // 425044 2, 3, 1, 2, 2, 1, 1, 1, 1, // 421156 3, 1, 3, 1, 1, 2, 1, 1, 1, // 417592 3, 2, 1, 1, 3, 1, 1, 1, 1, // 416296 2, 1, 4, 1, 2, 1, 1, 1, 1, // 415324 2, 1, 2, 4, 1, 1, 1, 1, 1, // 407548 4, 1, 1, 1, 1, 3, 1, 1, 1, // 406576 2, 3, 2, 1, 1, 1, 2, 1, 1, // 398692 2, 2, 3, 1, 1, 2, 1, 1, 1, // 391348 2, 3, 1, 1, 3, 1, 1, 1, 1, // 390052 3, 1, 3, 1, 1, 1, 2, 1, 1, // 389944 3, 1, 1, 3, 2, 1, 1, 1, 1, // 389080 3, 1, 2, 1, 3, 1, 1, 1, 1, // 381304 2, 3, 2, 1, 1, 1, 1, 2, 1, // 380260 2, 3, 1, 2, 1, 2, 1, 1, 1, // 379684 2, 1, 4, 1, 1, 2, 1, 1, 1, // 373852 3, 1, 3, 1, 1, 1, 1, 2, 1, // 371512 2, 1, 3, 2, 2, 1, 1, 1, 1, // 368668 2, 2, 3, 1, 1, 1, 2, 1, 1, // 363700 2, 2, 1, 3, 2, 1, 1, 1, 1, // 362836 3, 1, 1, 2, 3, 1, 1, 1, 1, // 357976 2, 2, 2, 1, 3, 1, 1, 1, 1, // 355060 3, 2, 1, 1, 1, 3, 1, 1, 1, // 354088 2, 3, 1, 2, 1, 1, 2, 1, 1, // 352036 2, 3, 1, 1, 2, 2, 1, 1, 1, // 348580 3, 1, 1, 3, 1, 2, 1, 1, 1, // 347608 2, 1, 4, 1, 1, 1, 2, 1, 1, // 346204 2, 1, 2, 3, 2, 1, 1, 1, 1, // 345340 2, 2, 3, 1, 1, 1, 1, 2, 1, // 345268 2, 1, 3, 1, 3, 1, 1, 1, 1, // 337564 2, 3, 1, 2, 1, 1, 1, 2, 1, // 333604 2, 2, 1, 2, 3, 1, 1, 1, 1, // 331732 2, 3, 1, 1, 1, 3, 1, 1, 1, // 327844 2, 1, 4, 1, 1, 1, 1, 2, 1, // 327772 2, 1, 3, 2, 1, 2, 1, 1, 1, // 327196 2, 2, 1, 3, 1, 2, 1, 1, 1, // 321364 2, 3, 1, 1, 2, 1, 2, 1, 1, // 320932 3, 1, 1, 3, 1, 1, 2, 1, 1, // 319960 3, 1, 2, 1, 1, 3, 1, 1, 1, // 319096 2, 1, 2, 2, 3, 1, 1, 1, 1, // 314236 2, 1, 2, 3, 1, 2, 1, 1, 1, // 303868 2, 3, 1, 1, 2, 1, 1, 2, 1, // 302500 3, 1, 1, 3, 1, 1, 1, 2, 1, // 301528 2, 3, 1, 1, 1, 2, 2, 1, 1, // 300196 2, 1, 3, 2, 1, 1, 2, 1, 1, // 299548 2, 1, 3, 1, 2, 2, 1, 1, 1, // 296092 3, 1, 1, 2, 1, 3, 1, 1, 1, // 295768 2, 2, 1, 3, 1, 1, 2, 1, 1, // 293716 2, 2, 2, 1, 1, 3, 1, 1, 1, // 292852 2, 3, 1, 1, 1, 2, 1, 2, 1, // 281764 2, 1, 3, 2, 1, 1, 1, 2, 1, // 281116 2, 1, 2, 3, 1, 1, 2, 1, 1, // 276220 2, 1, 3, 1, 1, 3, 1, 1, 1, // 275356 2, 2, 1, 3, 1, 1, 1, 2, 1, // 275284 2, 2, 1, 2, 1, 3, 1, 1, 1, // 269524 2, 1, 3, 1, 2, 1, 2, 1, 1, // 268444 2, 1, 2, 3, 1, 1, 1, 2, 1, // 257788 2, 1, 2, 2, 1, 3, 1, 1, 1, // 252028 2, 1, 3, 1, 2, 1, 1, 2, 1, // 250012 2, 1, 3, 1, 1, 2, 2, 1, 1, // 247708 2, 1, 3, 1, 1, 2, 1, 2, 1};// 229276 */ int main () { // // unsigned int d,e,f,g,h,i,j,n,count,first,savee,flag; // indices int del; unsigned int D[2],I[2],T[2],U[2],V[2],W[2],X[2],Y[2],Z[2]; unsigned int A[3],B[4],C[4]; if (c==1) { W[0]=0; // load 1 W[1]=1; } else { W[0]=0xffffffff; // load -1 W[1]=0xffffffff; } for (i=0; i<1024; i++) // clear histogram of limb lengths ho[i]=0; for (i=0; i<200; i++) { // clear histogram of e values he[i]=0; dist[i]=0; } for (i=0; i<5; i++) error[i]=0; h=0; // clear limb count if (lshift<32) { // compute order/3 X[0]=0; X[1]=1<<lshift; } else { if (lshift!=32) X[0]=1<<(lshift-32); else X[0]=1; X[1]=0; } Z[0]=X[0]; Z[1]=X[1]; add64(Z, Z); add64(X, Z); // order=(1<<lshift)*3 I[0]=Z[0]; // i=order I[1]=Z[1]; shift(Z[0], Z[1], 1, D); // save order/2 // // LIVE LIMBS (ending in an odd natural number) // aloop: V[0]=I[0]; // load k V[1]=I[1]; flag=subr2(V[0], V[1], T); if (flag==1) goto mskip; g=0; // clear segment count v[0]=V[0]; // save sequence value v[1]=V[1]; n=1; // element count while ((V[1]&1)==0) { shift(V[0], V[1], 1, V); v[2*n]=V[0]; v[2*n+1]=V[1]; n=n+1; // increment number of terms in sequence } for (j=1; j<100000; j++) { if ((V[0]==0)&&(V[1]==1)) goto mskip; if (c==-1) { U[0]=0; U[1]=5; sub64(V, U); if ((U[0]|U[1])==0) goto mskip; U[0]=0; U[1]=7; sub64(V, U); if ((U[0]|U[1])==0) goto mskip; U[0]=0; U[1]=17; sub64(V, U); if ((U[0]|U[1])==0) goto mskip; U[0]=0; U[1]=25; sub64(V, U); if ((U[0]|U[1])==0) goto mskip; U[0]=0; U[1]=37; sub64(V, U); if ((U[0]|U[1])==0) goto mskip; U[0]=0; U[1]=55; sub64(V, U); if ((U[0]|U[1])==0) goto mskip; U[0]=0; U[1]=41; sub64(V, U); if ((U[0]|U[1])==0) goto mskip; U[0]=0; U[1]=61; sub64(V, U); if ((U[0]|U[1])==0) goto mskip; U[0]=0; U[1]=91; sub64(V, U); if ((U[0]|U[1])==0) goto mskip; } flag=subr2(V[0], V[1], T); // check if 3 divides k if (flag==1) goto mskip; U[0]=X[0]; // check if k>(order/3) U[1]=X[1]; sub64(V, U); if ((U[0]&0x80000000)==0) goto lskip; U[0]=V[0]; U[1]=V[1]; add64(V, V); add64(U, V); add64(W, V); // next sequence value U[0]=Z[0]; // check if k>order U[1]=Z[1]; sub64(V, U); if ((U[0]&0x80000000)==0) goto mskip; if ((V[0]&0xc0000000)!=0) goto mskip; // check for overflow if ((V[1]&0x7)==0) g=g+1; // increment primary connection point count v[2*n]=V[0]; // save sequence value v[2*n+1]=V[1]; n=n+1; // increment element count while ((V[1]&1)==0) { shift(V[0], V[1], 1, V); v[2*n]=V[0]; // save sequence value v[2*n+1]=V[1]; n=n+1; // increment number of terms in sequence if (n>4095) { error[0]=1; goto mskip; } } } goto mskip; // // check array // lskip: if (g==0) // skip segment counts of zero goto mskip; h=h+1; if (n<1024) ho[n]=ho[n]+1; else { error[0]=2; goto zskip; } if (n<12) { error[0]=3; goto zskip; } if (n!=l) // check for specified limb length goto mskip; U[0]=v[2*n-2]; U[1]=v[2*n-1]; T[0]=U[0]; T[1]=U[1]; add64(U, U); add64(T, U); add64(W, U); shift(U[0], U[1], 1, U); T[0]=v[0]; T[1]=v[1]; sub64(T, U); for (f=0; f<15; f++) { if (n==len[f]) { if (num[f]>0) mul64_32(v[0], v[1], num[f], A); else mul64_32(v[0], v[1], -num[f], A); B[0]=0; B[1]=A[0]; B[2]=A[1]; B[3]=A[2]; mul64_32(U[0], U[1], den[f], A); C[0]=0; C[1]=A[0]; C[2]=A[1]; C[3]=A[2]; if (num[f]>0) sub128(B, C); else { add128(B, C); B[0]=0; B[1]=0; B[2]=0; B[3]=0; sub128(B, C); } del=(int)C[3]; for (e=0; e<p; e++) { if (del==c*(int)z[e]) { savee=z[e]; dist[e]=dist[e]+1; goto bskip; } } error[0]=5; error[1]=savee; goto zskip; // // COMPUTE SEQUENCE VECTOR // bskip: Y[0]=v[0]; Y[1]=v[1]; count=0; while ((Y[1]&1)==0) { count=count+1; shift(Y[0], Y[1], 1, Y); } t[0]=count; f=1; first=1; U[0]=v[2*n-2]; U[1]=v[2*n-1]; sub64(Y, U); while ((U[0]|U[1])!=0) { if ((Y[1]&1)==0) { shift(Y[0], Y[1], 1, Y); count=count+1; } else { U[0]=Y[0]; U[1]=Y[1]; add64(Y, U); add64(U, Y); add64(W, Y); if (first==0) { t[f]=count; f=f+1; if (f>200) { error[0]=6; goto zskip; } } else first=0; count=0; } U[0]=v[2*n-2]; U[1]=v[2*n-1]; sub64(Y, U); } t[f]=count; f=f+1; if (f!=a) { error[0]=7; goto zskip; } for (d=0; d<b; d++) { for (j=0; j<a; j++) { if (t[j]!=sv[j+a*d]) goto eskip; } he[d]=he[d]+1; goto mskip; eskip: j=0; } error[0]=8; goto zskip; } } mskip: T[0]=0xffffffff; T[1]=0xfffffffe; add64(T, I); // i=i-2 T[0]=D[0]; // load order/2 T[1]=D[1]; sub64(I, T); // compare i to order/2 if ((T[0]!=0)||(T[1]!=0)) goto aloop; // // check for valid lengths // for (i=0; i<40; i++) { if (ho[y[i]]!=0) { error[0]=9; goto zskip; } } shift(X[0], X[1], 4, T); // order/48 error[1]=T[1]/3; error[2]=h; zskip: n=0; return(0); }