﻿ Furtwangler's theorem
```/*****************************************************************************/
/*									     */
/*  FACTOR A, B, A-B, AND A+B						     */
/*  11/25/06 (dkc)							     */
/*									     */
/*  Input to this program is a pair of (a,b) values ((a1,b1) and (a2,b2)).   */
/*  A third (a,b) value is generated from (b1,b2).  These (a,b) values	     */
/*  correspond to different representations of T**p.  a, b, a-b, and a+b     */
/*  are factored for each (a,b) value.					     */
/*									     */
/*  Note: a-b and a+b are switched for [(a**p-b**p)/(a-b)] (the third (a,b)  */
/*  value).								     */
/*									     */
/*****************************************************************************/
#include <stdio.h>
#include <math.h>
#include "table10.h"
int main ()
{
int insize=91;
unsigned int input[91*2]={
0x12b4,     0x1139,
0x12b4,      0x17b,
0x125b,      0xd82,
0x125b,      0x4d9,
0xfd1,      0xd01,
0xfd1,      0x2d0,
0xf0a,      0xa43,
0xf0a,      0x4c7,
0xec3,      0xd48,
0xec3,      0x17b,
0xeb3,      0xbf4,
0xeb3,      0x2bf,
0xe7d,      0x7a9,
0xe7d,      0x6d4,
0xd26,      0xcdd,
0xd26,       0x49,
0xd03,      0xa8d,
0xd03,      0x276,
0xc83,      0x7f1,
0xc83,      0x492,
0xbe3,      0xa10,
0xbe3,      0x1d3,
0xbd0,      0x827,
0xbd0,      0x3a9,
0xa9f,      0x7bc,
0xa9f,      0x2e3,
0xa57,      0x8db,
0xa57,      0x17c,
0x959,      0x56a,
0x959,      0x3ef,
0x8a5,      0x61f,
0x8a5,      0x286,
0x86f,      0x69b,
0x86f,      0x1d4,
0x762,      0x71b,
0x762,       0x47,
0x751,      0x492,
0x751,      0x2bf,
0x73d,      0x532,
0x73d,      0x20b,
0x71c,      0x709,
0x71c,       0x13,
0x666,      0x3f1,
0x666,      0x275,
0x56b,      0x374,
0x56b,      0x1f7,
0x4ec,      0x3b9,
0x4ec,      0x133,
0x4b7,      0x265,
0x4b7,      0x252,
0x4a6,      0x397,
0x4a6,      0x10f,
0x425,      0x318,
0x425,      0x10d,
0x3ef,      0x370,
0x3ef,       0x7f,
0x385,      0x2cf,
0x385,       0xb6,
0x2f5,      0x276,
0x2f5,       0x7f,
0x2bf,      0x1e7,
0x2bf,       0xd8,
0x275,      0x17a,
0x275,       0xfb,
0x21c,      0x169,
0x21c,       0xb3,
0x208,      0x1c1,
0x208,       0x47,
0x1b1,      0x143,
0x1b1,       0x6e,
0x143,       0xc5,
0x143,       0x7e,
0x134,      0x121,
0x134,       0x13,
0xfc,       0xb5,
0xfc,       0x47,
0xc7,       0x6d,
0xc7,       0x5a,
0xa3,       0x6b,
0xa3,       0x38,
0x5a,       0x49,
0x5a,       0x11,
0x59,       0x46,
0x59,       0x13,
0x35,       0x24,
0x35,       0x11,
0x25,       0x14,
0x25,       0x11,
0x13,       0x12,
0x13,        0x1,
0x2,	    0x1};

int tsize=551; // prime look-up table size
int h,i,j,k,m;
int a,b,c,d;
int save[100];
FILE *Outfp;
Outfp = fopen("out6c.dat","w");
/*******************/
/*  factor input   */
/*******************/
for (h=0; h<insize; h+=2) {
/******************/
/*  first pair	  */
/******************/
a=input[2*h];
b=input[2*h+1];
c=a+b;
d=a-b;
fprintf(Outfp," %#8x %#8x  ",a,b);
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>a)
break;
if ((a/j)*j!=a)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
a=a/j;
if ((a/j)*j!=a)
break;
}
}
if (a!=1) {
save[m]=a;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
fprintf(Outfp,"  ");
if (b==1)
fprintf(Outfp,"%d",b);
else {
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>b)
break;
if ((b/j)*j!=b)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
b=b/j;
if ((b/j)*j!=b)
break;
}
}
if (b!=1) {
save[m]=b;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
}
fprintf(Outfp,"  ");
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>c)
break;
if ((c/j)*j!=c)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
c=c/j;
if ((c/j)*j!=c)
break;
}
}
if (c!=1) {
save[m]=c;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
fprintf(Outfp,"  ");
if (d==1)
fprintf(Outfp,"%d",d);
else {
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>d)
break;
if ((d/j)*j!=d)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
d=d/j;
if ((d/j)*j!=d)
break;
}
}
if (d!=1) {
save[m]=d;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
}
fprintf(Outfp,"\n");
/******************/
/*  second pair   */
/******************/
a=input[2*h];
b=a-input[2*h+1];
if (a<b) {
c=a;
a=b;
b=c;
}
c=a+b;
d=a-b;
fprintf(Outfp," %#8x %#8x  ",a,b);
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>a)
break;
if ((a/j)*j!=a)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
a=a/j;
if ((a/j)*j!=a)
break;
}
}
if (a!=1) {
save[m]=a;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
fprintf(Outfp,"  ");
if (b==1)
fprintf(Outfp,"%d",b);
else {
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>b)
break;
if ((b/j)*j!=b)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
b=b/j;
if ((b/j)*j!=b)
break;
}
}
if (b!=1) {
save[m]=b;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
}
fprintf(Outfp,"  ");
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>c)
break;
if ((c/j)*j!=c)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
c=c/j;
if ((c/j)*j!=c)
break;
}
}
if (c!=1) {
save[m]=c;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
fprintf(Outfp,"  ");
if (d==1)
fprintf(Outfp,"%d",d);
else {
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>d)
break;
if ((d/j)*j!=d)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
d=d/j;
if ((d/j)*j!=d)
break;
}
}
if (d!=1) {
save[m]=d;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
}
fprintf(Outfp,"\n");
/******************/
/*  third pair	  */
/******************/
b=input[2*h+1];
a=input[2*h]-b;
if (a<b) {
c=a;
a=b;
b=c;
}
c=a-b;	       // switch a-b and a+b
d=a+b;	       //
fprintf(Outfp," %#8x %#8x  ",a,b);
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>a)
break;
if ((a/j)*j!=a)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
a=a/j;
if ((a/j)*j!=a)
break;
}
}
if (a!=1) {
save[m]=a;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
fprintf(Outfp,"  ");
if (b==1)
fprintf(Outfp,"%d",b);
else {
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>b)
break;
if ((b/j)*j!=b)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
b=b/j;
if ((b/j)*j!=b)
break;
}
}
if (b!=1) {
save[m]=b;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
}
fprintf(Outfp,"  ");
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>c)
break;
if ((c/j)*j!=c)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
c=c/j;
if ((c/j)*j!=c)
break;
}
}
if (c!=1) {
save[m]=c;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
fprintf(Outfp,"  ");
if (d==1)
fprintf(Outfp,"%d",d);
else {
m=0;
for (i=0; i<tsize; i++) {
j=table[i];
if (j*j>d)
break;
if ((d/j)*j!=d)
continue;
for (k=0; k<100; k++) {
save[m]=j;
m=m+1;
d=d/j;
if ((d/j)*j!=d)
break;
}
}
if (d!=1) {
save[m]=d;
m=m+1;
}
if (m==1)
fprintf(Outfp,"%d",save[0]);
else {
for (i=0; i<m-1; i++) {
fprintf(Outfp,"%d*",save[i]);
}
fprintf(Outfp,"%d",save[m-1]);
}
}
fprintf(Outfp,"\n");
fprintf(Outfp,"\n");
}
fprintf(Outfp,"\n");
fclose(Outfp);
return(0);
}
```