#include main () { int length; /* length of progression */ int maxbisq; /* largest bisquare */ char hit[20001]; /* which bisquares are present */ char ok[20001]; /* which bisquares are ok for starting */ int diff; /* current difference for searching */ int start; /* current starting point */ int look; /* current testing point */ int i, j, i2, temp, noteddiff; int nprog = 0; /* number of progressions */ fprintf (stderr, "Progression length: "); scanf ("%d", &length); fprintf (stderr, "Maximum value of bisquare: "); scanf ("%d", &maxbisq); /* no hits yet... */ for (i = 0; i <= maxbisq; i++) hit[i] = 0; for (i = 0; (i2=i*i) <= maxbisq; i++) { for (j = 0; (temp=i2+j*j) <= maxbisq; j++) hit[temp] = 1; } /* Searching for particular difference of `diff' */ for (diff = 1; diff <= maxbisq/(length-1)+1; diff++) { noteddiff = 0; for (i = 0; i < maxbisq; i++) ok[i] = hit[i]; /* `start' is the starting point */ for (start = 0; start <= maxbisq - diff*(length-1); start++) { if (ok[start] == 0) continue; for (look = start; look <= start+diff*(length-1); look += diff) { if (ok[look] == 0) { for ( ; look >= start; look -= diff) { ok[look] = 0; } goto NEXTSTART; } } if (!noteddiff) { printf ("\nDifferences of %d:\n", diff); noteddiff = 1; } nprog++; for (look = start; look <= start+diff*(length-1); look += diff) { printf ("%d ", look); } printf ("\n"); NEXTSTART:; } } printf ("\nThere are %d progressions.\n", nprog); }