﻿ /*******************************
```/******************************************************************************/
/*									      */
/*  COMPUTE 3N+1 SEQUENCE (tree for k>28, more efficient algorithm,	      */
/*			   several passes required)			      */
/*  01/15/10 (dkc)							      */
/*									      */
/*  This C program is for the C64.  The maximum limb length is 33.	      */
/*									      */
/******************************************************************************/
#include <math.h>
void sub64(unsigned int *a, unsigned int *b);
void add64(unsigned int *a, unsigned int *b);
void shift(unsigned int a, unsigned int b, unsigned int c, unsigned int *s);
void mul64_32(unsigned int a, unsigned int b, unsigned int c, unsigned int *d);
unsigned int subr2(unsigned int A, unsigned int B, unsigned int *P);
far unsigned int s[2097152];		 // duplicate array, size=(order/12)/32
far unsigned int ho[256];		 // histogram of limb lengths
far unsigned int he[66];		 // histogram of sequence vectors
far unsigned int v[13]; 		 // sequence vector
far unsigned int error[5];		 // error
far unsigned int maxy[66*2];		 // maximum y value array
far unsigned int g;			 // counter

far unsigned int l=33;			 // limb length
far unsigned int a=13;			 // length of sequence vector
far unsigned int b=66;			 // number of sequence vectors

//far unsigned int sv[1*1]={		 // length=2, live only
// 1};
//far unsigned int sv[2*1]={		 // length=4, live only
// 1, 1};
//far unsigned int sv[3*1]={		 // length=7, live only
// 1, 2, 1};
//far unsigned int sv[4*1]={		 // length=9, live only
// 1, 2, 1, 1};
//far unsigned int sv[5*2]={		 // length=12, live only
// 1, 2, 2, 1, 1,   // 986
// 1, 2, 1, 2, 1};  // 842
//far unsigned int sv[6*2]={		 // length=14, live only
// 1, 2, 2, 1, 1, 1,   // 3214
// 1, 2, 1, 2, 1, 1};  // 2782
//far unsigned int sv[7*5]={		 // length=17, live only
// 1, 2, 2, 2, 1, 1, 1,   // 14314
// 1, 2, 2, 1, 2, 1, 1,   // 12586
// 1, 2, 2, 1, 1, 2, 1,   // 11434
// 1, 2, 1, 2, 2, 1, 1,   // 11290
// 1, 2, 1, 2, 1, 2, 1};  // 10138
//far unsigned int sv[8*5]={		 // length=20, live only
// 1, 2, 2, 2, 2, 1, 1, 1,   // 61630
// 1, 2, 2, 2, 1, 2, 1, 1,   // 54718
// 1, 2, 2, 2, 1, 1, 2, 1,   // 50110
// 1, 2, 2, 1, 2, 2, 1, 1,   // 49534
// 1, 2, 2, 1, 2, 1, 2, 1};  // 44926
//far unsigned int sv[9*9]={		 // length=22, live only
// 1, 2, 2, 2, 2, 1, 1, 1, 1,	// 193082
// 1, 2, 2, 2, 1, 2, 1, 1, 1,	// 172346
// 1, 2, 2, 2, 1, 1, 2, 1, 1,	// 158522
// 1, 2, 2, 1, 2, 2, 1, 1, 1,	// 156794
// 1, 2, 1, 2, 2, 2, 1, 1, 1,	// 145130
// 1, 2, 2, 1, 2, 1, 2, 1, 1,	// 142970
// 1, 2, 2, 1, 1, 2, 2, 1, 1,	// 132602
// 1, 2, 1, 2, 2, 1, 2, 1, 1,	// 131306
// 1, 2, 1, 2, 1, 2, 2, 1, 1};	// 120938
/* far unsigned int sv[10*19]={ 	     // length=25, live only
1, 2, 2, 2, 2, 2, 1, 1, 1, 1,   // 811694
1, 2, 2, 2, 2, 1, 2, 1, 1, 1,   // 728750
1, 2, 2, 2, 2, 1, 1, 2, 1, 1,   // 673454
1, 2, 2, 2, 1, 2, 2, 1, 1, 1,   // 666542
1, 2, 2, 2, 2, 1, 1, 1, 2, 1,   // 636590
1, 2, 2, 1, 2, 2, 2, 1, 1, 1,   // 619886
1, 2, 2, 2, 1, 2, 1, 2, 1, 1,   // 611246
1, 2, 1, 2, 2, 2, 2, 1, 1, 1,   // 584894
1, 2, 2, 2, 1, 2, 1, 1, 2, 1,   // 574382
1, 2, 2, 2, 1, 1, 2, 2, 1, 1,   // 569774
1, 2, 2, 1, 2, 2, 1, 2, 1, 1,   // 564590
1, 2, 2, 2, 1, 1, 2, 1, 2, 1,   // 532910
1, 2, 1, 2, 2, 2, 1, 2, 1, 1,   // 529598
1, 2, 2, 1, 2, 2, 1, 1, 2, 1,   // 527726
1, 2, 2, 1, 2, 1, 2, 2, 1, 1,   // 523118
1, 2, 1, 2, 2, 2, 1, 1, 2, 1,   // 492734
1, 2, 1, 2, 2, 1, 2, 2, 1, 1,   // 488126
1, 2, 2, 1, 2, 1, 2, 1, 2, 1,   // 486254
1, 2, 1, 2, 2, 1, 2, 1, 2, 1};  // 451262 */
/* far unsigned int sv[11*23]={ 	    // length=27, live only
1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,   // 2500618
1, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1,   // 2251786
1, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1,   // 2085898
1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 1,   // 2065162
1, 2, 2, 2, 2, 1, 1, 1, 2, 1, 1,   // 1975306
1, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1,   // 1925194
1, 2, 2, 2, 1, 2, 1, 2, 1, 1, 1,   // 1899274
1, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1,   // 1820218
1, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1,   // 1788682
1, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1,   // 1774858
1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 1,   // 1759306
1, 2, 2, 2, 1, 1, 2, 1, 2, 1, 1,   // 1664266
1, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1,   // 1654330
1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1,   // 1648714
1, 2, 2, 1, 2, 1, 2, 2, 1, 1, 1,   // 1634890
1, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1,   // 1543738
1, 2, 2, 1, 1, 2, 2, 2, 1, 1, 1,   // 1541578
1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 1,   // 1529914
1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1,   // 1524298
1, 2, 1, 2, 1, 2, 2, 2, 1, 1, 1,   // 1436602
1, 2, 2, 1, 1, 2, 2, 1, 2, 1, 1,   // 1430986
1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1,   // 1419322
1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 1};  // 1326010 */
/* far unsigned int sv[12*66]={ 	    // length=30, live only
1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,	 // 10356766
1, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1,	 // 9361438
1, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1,	 // 8697886
1, 2, 2, 2, 2, 1, 2, 2, 1, 1, 1, 1,	 // 8614942
1, 2, 2, 2, 2, 2, 1, 1, 1, 2, 1, 1,	 // 8255518
1, 2, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1,	 // 8055070
1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 1,	 // 7960606
1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, 1,	 // 7951390
1, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1,	 // 7635166
1, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1,	 // 7509022
1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1,	 // 7453726
1, 2, 2, 2, 1, 2, 2, 1, 2, 1, 1, 1,	 // 7391518
1, 2, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1,	 // 7320238
1, 2, 2, 2, 2, 1, 2, 1, 1, 1, 2, 1,	 // 7214110
1, 2, 2, 2, 2, 1, 1, 2, 1, 2, 1, 1,	 // 7011358
1, 2, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1,	 // 6971614
1, 2, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1,	 // 6949150
1, 2, 2, 2, 1, 2, 1, 2, 2, 1, 1, 1,	 // 6893854
1, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1,	 // 6716446
1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1,	 // 6679582
1, 2, 1, 2, 2, 2, 2, 1, 2, 1, 1, 1,	 // 6656686
1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 1,	 // 6654238
1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1,	 // 6529246
1, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1, 1,	 // 6520606
1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 1, 1,	 // 6473950
1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1,	 // 6451486
1, 2, 2, 2, 2, 1, 1, 1, 2, 1, 2, 1,	 // 6384670
1, 2, 2, 1, 2, 2, 2, 1, 1, 1, 2, 1,	 // 6234334
1, 2, 1, 2, 2, 2, 2, 1, 1, 2, 1, 1,	 // 6214318
1, 2, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1,	 // 6159022
1, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1,	 // 6156574
1, 2, 2, 2, 1, 2, 1, 1, 2, 2, 1, 1,	 // 6119710
1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1, 1,	 // 6100702
1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 1,	 // 6078238
1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1,	 // 6031582
1, 2, 1, 2, 2, 2, 2, 1, 1, 1, 2, 1,	 // 5919406
1, 2, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1,	 // 5824798
1, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1,	 // 5820766
1, 2, 1, 2, 2, 1, 2, 2, 2, 1, 1, 1,	 // 5785774
1, 2, 2, 2, 1, 1, 2, 2, 1, 1, 2, 1,	 // 5783326
1, 2, 2, 2, 1, 1, 2, 1, 2, 2, 1, 1,	 // 5746462
1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1,	 // 5736670
1, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 1,	 // 5716654
1, 2, 2, 1, 2, 2, 1, 1, 2, 2, 1, 1,	 // 5699806
1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 1,	 // 5658334
1, 2, 1, 2, 1, 2, 2, 2, 2, 1, 1, 1,	 // 5505838
1, 2, 2, 2, 1, 1, 2, 1, 2, 1, 2, 1,	 // 5451550
1, 2, 1, 2, 2, 2, 1, 2, 1, 1, 2, 1,	 // 5421742
1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1,	 // 5404894
1, 2, 1, 2, 2, 2, 1, 1, 2, 2, 1, 1,	 // 5384878
1, 2, 2, 1, 1, 2, 2, 2, 1, 2, 1, 1,	 // 5378398
1, 2, 2, 1, 2, 1, 2, 2, 1, 1, 2, 1,	 // 5363422
1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1,	 // 5343406
1, 2, 2, 1, 2, 1, 2, 1, 2, 2, 1, 1,	 // 5326558
1, 2, 1, 2, 2, 2, 1, 1, 2, 1, 2, 1,	 // 5089966
1, 2, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1,	 // 5083486
1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 1, 1,	 // 5063470
1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1,	 // 5048494
1, 2, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1,	 // 5046622
1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,	 // 5031646
1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 1,	 // 5011630
1, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 1,	 // 4768558
1, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 1,	 // 4751710
1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1,	 // 4731694
1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1,	 // 4716718
1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1};  // 4436782 */
far unsigned int sv[13*66]={ 	    // length=33, live only
1,2,2,2,2,2,2,2,1,1,1,1,1,  // 42489946
1,2,2,2,2,2,2,1,2,1,1,1,1,  // 38508634
1,2,2,2,2,2,2,1,1,2,1,1,1,  // 35854426
1,2,2,2,2,2,1,2,2,1,1,1,1,  // 35522650
1,2,2,2,2,2,2,1,1,1,2,1,1,  // 34084954
1,2,2,2,2,1,2,2,2,1,1,1,1,  // 33283162
1,2,2,2,2,2,2,1,1,1,1,2,1,  // 32905306
1,2,2,2,2,2,1,2,1,2,1,1,1,  // 32868442
1,2,2,2,1,2,2,2,2,1,1,1,1,  // 31603546
1,2,2,2,2,2,1,2,1,1,2,1,1,  // 31098970
1,2,2,2,2,2,1,1,2,2,1,1,1,  // 30877786
1,2,2,2,2,1,2,2,1,2,1,1,1,  // 30628954
1,2,2,1,2,2,2,2,2,1,1,1,1,  // 30343834
1,2,2,2,2,2,1,2,1,1,1,2,1,  // 29919322
1,2,2,2,2,2,1,1,2,1,2,1,1,  // 29108314
1,2,2,2,1,2,2,2,1,2,1,1,1,  // 28949338
1,2,2,2,2,1,2,2,1,1,2,1,1,  // 28859482
1,2,2,2,2,1,2,1,2,2,1,1,1,  // 28638298
1,2,2,2,2,2,1,1,2,1,1,2,1,  // 27928666
1,2,2,2,2,2,1,1,1,2,2,1,1,  // 27781210
1,2,2,1,2,2,2,2,1,2,1,1,1,  // 27689626
1,2,2,2,2,1,2,2,1,1,1,2,1,  // 27679834
1,2,2,2,1,2,2,2,1,1,2,1,1,  // 27179866
1,2,2,2,2,1,1,2,2,2,1,1,1,  // 27145306
1,2,2,2,1,2,2,1,2,2,1,1,1,  // 26958682
1,2,2,2,2,1,2,1,2,1,2,1,1,  // 26868826
1,2,2,2,2,2,1,1,1,2,1,2,1,  // 26601562
1,2,2,2,1,2,2,2,1,1,1,2,1,  // 26000218
1,2,2,1,2,2,2,2,1,1,2,1,1,  // 25920154
1,2,2,1,2,2,2,1,2,2,1,1,1,  // 25698970
1,2,2,2,2,1,2,1,2,1,1,2,1,  // 25689178
1,2,2,2,2,1,2,1,1,2,2,1,1,  // 25541722
1,2,2,2,1,2,1,2,2,2,1,1,1,  // 25465690
1,2,2,2,2,1,1,2,2,1,2,1,1,  // 25375834
1,2,2,2,1,2,2,1,2,1,2,1,1,  // 25189210
1,2,2,1,2,2,2,2,1,1,1,2,1,  // 24740506
1,2,2,2,2,1,2,1,1,2,1,2,1,  // 24362074
1,2,2,2,1,1,2,2,2,2,1,1,1,  // 24345946
1,2,2,1,2,2,1,2,2,2,1,1,1,  // 24205978
1,2,2,2,2,1,1,2,2,1,1,2,1,  // 24196186
1,2,2,2,2,1,1,2,1,2,2,1,1,  // 24048730
1,2,2,2,1,2,2,1,2,1,1,2,1,  // 24009562
1,2,2,1,2,2,2,1,2,1,2,1,1,  // 23929498
1,2,2,2,1,2,2,1,1,2,2,1,1,  // 23862106
1,2,2,2,1,2,1,2,2,1,2,1,1,  // 23696218
1,2,2,1,2,1,2,2,2,2,1,1,1,  // 23086234
1,2,2,2,2,1,1,2,1,2,1,2,1,  // 22869082
1,2,2,1,2,2,2,1,2,1,1,2,1,  // 22749850
1,2,2,2,1,2,2,1,1,2,1,2,1,  // 22682458
1,2,2,1,2,2,2,1,1,2,2,1,1,  // 22602394
1,2,2,2,1,1,2,2,2,1,2,1,1,  // 22576474
1,2,2,2,1,2,1,2,2,1,1,2,1,  // 22516570
1,2,2,1,2,2,1,2,2,1,2,1,1,  // 22436506
1,2,2,2,1,2,1,2,1,2,2,1,1,  // 22369114
1,2,2,1,2,1,2,2,2,1,2,1,1,  // 21316762
1,2,2,1,2,2,1,2,2,1,1,2,1,  // 21256858
1,2,2,2,1,1,2,2,1,2,2,1,1,  // 21249370
1,2,2,2,1,2,1,2,1,2,1,2,1,  // 21189466
1,2,2,1,2,2,2,1,1,2,1,2,1,  // 21422746
1,2,2,2,1,1,2,2,2,1,1,2,1,  // 21396826
1,2,2,1,2,2,1,2,1,2,2,1,1,  // 21109402
1,2,2,1,2,1,2,2,2,1,1,2,1,  // 20137114
1,2,2,2,1,1,2,2,1,2,1,2,1,  // 20069722
1,2,2,1,2,1,2,2,1,2,2,1,1,  // 19989658
1,2,2,1,2,2,1,2,1,2,1,2,1,  // 19929754
1,2,2,1,2,1,2,2,1,2,1,2,1}; // 18810010

//far unsigned int z[1]={2};		   // length=2, live only
//far unsigned int z[1]={10};		   // length=4, live only
//far unsigned int z[1]={58};		   // length=7, live only
//far unsigned int z[1]={206};		   // length=9, live only
//far unsigned int z[2]={		   // length=12, live only
// 986,842};
//far unsigned int z[2]={		   // length=14, live only
// 2782,3214};
//far unsigned int z[5]={		   // length=17, live only
// 14314,11434,12586,10138,11290};
//far unsigned int z[5]={		   // length=20, live only
// 54718,49534,50110,44926,61630};
//far unsigned int z[9]={		   // length=22, live only
// 156794,158522,172346,193082,145130,142970,132602,131306,120938};
//far unsigned int z[19]={		   // length=25, live only
// 666542,532910,569774,574382,728750,611246,636590,673454,811694,619886,486254,
// 523118,527726,564590,451262,492734,584894,488126,529598};
//far unsigned int z[23]={		   // length=27, live only
// 1788682,1654330,2065162,1975306,2251786,1774858,1524298,1899274,1648714,
// 2500618,1925194,1541578,1326010,1634890,1419322,1759306,1529914,1543738,
// 1820218,1664266,1430986,2085898,1436602};
//far unsigned int z[66]={		   // length=30, live only
// 10356766,9361438,8697886,8614942,8255518,8055070,7960606,7951390,7635166,
// 7509022,7453726,7391518,7320238,7214110,7011358,6971614,6949150,6893854,
// 6716446,6679582,6656686,6654238,6529246,6520606,6473950,6451486,6384670,
// 6234334,6214318,6159022,6156574,6119710,6100702,6078238,6031582,5919406,
// 5824798,5820766,5785774,5783326,5746462,5736670,5716654,5699806,5658334,
// 5505838,5451550,5421742,5404894,5384878,5378398,5363422,5343406,5326558,
// 5089966,5083486,5063470,5048494,5046622,5031646,5011630,4768558,4751710,
// 4731694,4716718,4436782};
far unsigned int z[66]={		   // length=33, live only
38508634,35854426,35522650,34084954,33283162,32905306,32868442,31603546,
31098970,30877786,30343834,29919322,28949338,28859482,28638298,27928666,
27781210,27689626,27679834,27179866,27145306,26958682,26868826,26601562,
26000218,25920154,25698970,25689178,25541722,25465690,25189210,24740506,
24362074,24345946,24196186,24048730,24009562,23862106,23696218,23086234,
22869082,22749850,22682458,22602394,22576474,22436506,22369114,21422746,
21396826,21316762,21256858,21249370,21189466,21109402,20137114,20069722,
19989658,19929754,18810010,42489946,30628954,29108314,25375834,24205978,
23929498,22516570};
//
int main () {
unsigned int kay=32;			 // k
//
// kay=29, stage=1,3
// kay=30, stage=1,3,5,7
// kay=31, stage=1,3,5,7,9,11,13,15
// kay=32, stage=1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
// kay=33, stage=1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,
//		 45,47,49,51,53,55,57,59,61,63
//
unsigned int C[2],I[2],K[2],O[2],P[4],S[2],T[2],U[2],V[2],W[3],X[2],Y[2],Z[2];
unsigned int D[2],E[3],F[2],G[2],H[2],J[2];
unsigned int stage;			 // stage (odd)
unsigned int num[19]={1,1,7,5,17,47,13,217,295,139,1909,1631,3299,
13085,6487,46075,84997,7153,502829};
unsigned int den[19]={4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,
32768,65536,131072,262144,524288,2097152};
unsigned int len[19]={2,4,5,7,9,10,12,14,15,17,18,20,22,23,25,27,28,30,33};
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

for (i=0; i<a; i++)			 // clear sequence vector
v[i]=0;
error[0]=0;
error[1]=0;
error[2]=0;
error[3]=0;
error[4]=0;
for (i=0; i<256; i++)			 // clear histogram of lengths
ho[i]=0;
for (i=0; i<66; i++) {
he[i]=0;
maxy[2*i]=0;
maxy[2*i+1]=0;
}
g=0;					 // clear counter
if (kay<32) {				 // compute order
O[0]=0;
O[1]=1<<kay;
}
else {
if (kay!=32)
O[0]=1<<(kay-32);
else
O[0]=1;
O[1]=0;
}
Z[0]=O[0];				 // order/3
Z[1]=O[1];
T[0]=O[0];
T[1]=O[1];
shift(O[0], O[1], 1, X);		 // save order/2
/*********************/
/*  begin outer loop */
/*********************/
for (stage=1; stage<=31; stage+=2) {
shift(O[0], O[1], 1, I);		 // i=order/2
shift(O[0], O[1], 2, C);		 // loop count=order/4
for (i=0; i<2097152; i++)		 // clear duplicate array
s[i]=0;
//
// limbs ending in elements of A, B, C, and D
//
/*********************/
/*  begin outer loop */
/*********************/
aloop:
if ((I[1]&3)!=0)			 // check if 4 divides i
goto hskip;
shift(I[0], I[1], 2, T);		 // i/4
U[0]=0;
U[1]=2;
sub64(T, U); 			 // i-8
flag=subr2(U[0], U[1], P);		 // check if 12 divides i-8
if (flag!=0)
goto bskip;
hskip:
K[0]=I[0];				 // k=i;
K[1]=I[1];
flag=subr2(K[0], K[1], P);		 // check if 3 divides k
if (flag!=0)
T[0]=0;
T[1]=1;
sub64(K, T); 			 // k-1
flag=subr2(T[0], T[1], P);		 // check if 3 divides k-1
if (flag==0)
K[0]=P[0];				 // k=(k-1)/3
K[1]=P[1];
flag=subr2(K[0], K[1], P);		 // check if 3 divides k
if (flag!=0)
goto bskip;
/***********************/
/*  begin inner loop   */
/***********************/
bloop:
test=1;
T[0]=X[0];
T[1]=X[1];
sub64(K, T); 			 // k-order/2
if ((T[0]&0x80000000)==0)
test=0;
T[0]=0;
T[1]=1;
sub64(K, T); 			 // k-1
flag=subr2(T[0], T[1], P);		 // check if 3 divides k-1
if ((flag==0)&&(test==0))
if (flag!=0) {
K[0]=P[0];			 // k=(k-1)/3
K[1]=P[1];
flag=subr2(K[0], K[1], P);	 // check if 3 divide k
if (flag!=0)
goto bskip;
}
else
goto bloop;
/***********************/
/*  end inner loop     */
/***********************/
S[0]=K[0];				 // save starting element
S[1]=K[1];
n=1; 				 // set length
cloop:
if ((K[1]&1)==0) {
shift(K[0], K[1], 1, K);
n=n+1;				 // increment length
goto cloop;
}
for (j=1; j<1000000; j++) {		 // iterate until end of limb
T[0]=K[0];
T[1]=K[1];
Y[0]=0;
Y[1]=1;
T[0]=O[0];
T[1]=O[1];
sub64(Y, T);			 // h-order
if ((T[0]&0x80000000)!=0)
goto cskip;
if (kay<29) {
T[0]=Z[0];			 // order/3
T[1]=Z[1];
sub64(K, T);			 // k-(order/3)
U[0]=0;
U[1]=1;
sub64(T, U);			 // k-(order/3)-1
shift(U[0], U[1], 1, T);	 // t=((k-order/3))-1)/2
}
else {
T[0]=0;
T[1]=stage;
sub64(K, T);			 // k-stage
if ((T[1]&mask)!=0)		 // check if 2^x divides k-stage
goto bskip;
T[0]=Z[0];
T[1]=Z[1];
sub64(K, T);			 // k-(order/3)
U[0]=0;
U[1]=stage;
sub64(T, U);			 // k-(order/3)-stage
shift(U[0], U[1], kay-29+2, T);
}
t=T[1];
u=t-(t>>5)*32;			 // fractional portion of index
t=t>>5;				 // integer portion of index
if ((s[t]&mask)==0)		 // check if bit not set
s[t]=s[t]|mask;		 // set bit in array
goto bskip;
//
g=g+1;				 // increment counter
if (n<256)			 // check length
ho[n]=ho[n]+1;		 // histogram length
else {
error[0]=1;			 // set error
ho[0]=0xffffffff;		 // set flag
goto zskip;
}
if (n!=l) 			 // check length
goto bskip;
flag=subr2(S[0], S[1], P);	 // check if 3 divides m
goto bskip;
shift(Y[0], Y[1], 1, V);		 // h/2
sub64(S, V);			 // r=m-(h/2)
flagn=0;				 // check for negative r
if ((V[0]&0x80000000)!=0) {
D[0]=0;
D[1]=0;
sub64(D, V);
flagn=1;
}
for (f=0; f<19; f++) {
if (n==len[f]) {
mul64_32(S[0], S[1], num[f], W);
F[0]=W[1];
F[1]=W[2];
mul64_32(V[0], V[1], den[f], E);
G[0]=E[1];
G[1]=E[2];
if (flagn==0)
sub64(F, G);
else {
sub64(G, F);
G[0]=F[0];
G[1]=F[1];
}
if (G[0]!=0) {
error[0]=14;
error[1]=W[1];
error[2]=W[2];
error[3]=E[1];
error[4]=E[2];
goto zskip;
}
flag=0;
for (e=0; e<b; e++) {
if (G[1]==z[e]) {
flag=z[e];
goto fskip;
}
}
goto zskip;
fskip:	    if (l==2) {
v[0]=1;
f=1;
goto dskip;
}
H[0]=S[0];			 // save m
H[1]=S[1];
f=0;
if ((S[1]&1)==0) {
count=0;
while ((S[1]&1)==0) {
count=count+1;
shift(S[0], S[1], 1, S);
}
v[0]=count;
f=1;
}
first=1;
while ((S[0]!=K[0])||(S[1]!=K[1])) {
if ((S[1]&1)==0) {
shift(S[0], S[1], 1, S);
count=count+1;
}
else {
D[0]=S[0];
D[1]=S[1];
D[0]=0;
D[1]=1;
if (first==0) {
v[f]=count;
f=f+1;
if (f>a) {
error[0]=9;
error[1]=H[0];
error[2]=H[1];
error[3]=K[0];
error[4]=K[1];
goto zskip;
}
}
else
first=0;
count=0;
}
}
v[f]=count;
f=f+1;
dskip:	    if (f!=a) {
error[0]=10;
goto zskip;
}
for (d=0; d<b; d++) {
for (j=0; j<a; j++) {
if (v[j]!=sv[j+a*d])
goto eskip;
}
he[d]=he[d]+1;
J[0]=maxy[2*d];
J[1]=maxy[2*d+1];
sub64(H, J);
if ((J[0]&0x80000000)==0) {
maxy[2*d]=H[0];
maxy[2*d+1]=H[1];
}
goto bskip;
eskip:	       n=0;
}
error[1]=H[0];
error[2]=H[1];
error[3]=K[0];
error[4]=K[1];
goto zskip;
}
}
goto bskip;
cskip:
K[0]=Y[0];			 // k=h
K[1]=Y[1];
if ((K[1]&7)==0)			 // check if 8 divides k
goto bskip;
n=n+1;				 // increment length
dloop:
if ((K[1]&1)==0) {
shift(K[0], K[1], 1, K);	 // k=k>>1
n=n+1; 			 // increment length
goto dloop;
}
}
ho[0]=0xffffffff;
goto zskip;
bskip:
T[0]=0;
T[1]=2;
I[0]=T[0];				 // i=i+2
I[1]=T[1];
T[0]=0;
T[1]=1;
sub64(C,T);
C[0]=T[0];				 // loop count=loop count-1
C[1]=T[1];
if ((C[0]!=0)||(C[1]!=0))
goto aloop;
/*********************/
/*  end outer loop   */
/*********************/
}
/*********************/
/* end outer loop    */
/*********************/
for (i=0; i<40; i++) {
if (ho[y[i]]!=0) {
error[0]=13;
goto zskip;
}
}
zskip:
return(0);
}
```