﻿ /*******************************
```/******************************************************************************/
/*									      */
/*  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[1]=1;
}
else {
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];
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[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(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];
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 {
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];
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;
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);
}
```