/*****************************************************************************/
/* */
/* 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=43;
unsigned int input[4*43]={
0x2394, 0x141d, 0x18d, 0,
0x2394, 0xf77, 0x18d, 0,
0x1fa5, 0x1c79, 0x10f, 0,
0x1fa5, 0x32c, 0x10f, 1,
0x1e4d, 0x1b12, 0x17b, 0,
0x1e4d, 0x33b, 0x17b, 0,
0x1693, 0x12fd, 0x133, 0,
0x1693, 0x396, 0x133, 0,
0x1474, 0x1115, 0xc7, 1,
0x1474, 0x35f, 0xc7, 1,
0x140a, 0xb9b, 0x10f, 0,
0x140a, 0x86f, 0x10f, 0,
0x125b, 0xd82, 0xb5, 1,
0x125b, 0x4d9, 0xb5, 0,
0xec3, 0xd48, 0xa3, 1,
0xec3, 0x17b, 0xa3, 0,
0xc83, 0x7f1, 0xc7, 0,
0xc83, 0x492, 0xc7, 0,
0xa9f, 0x7bc, 0xb5, 0,
0xa9f, 0x2e3, 0xb5, 0,
0xa57, 0x8db, 0x7f, 0,
0xa57, 0x17c, 0x7f, 1,
0x959, 0x56a, 0xa3, 0,
0x959, 0x3ef, 0xa3, 0,
0x8a5, 0x61f, 0x6d, 0,
0x8a5, 0x286, 0x6d, 1,
0x666, 0x3f1, 0x7f, 0,
0x666, 0x275, 0x7f, 0,
0x4ec, 0x3b9, 0x6d, 0,
0x4ec, 0x133, 0x6d, 0,
0x4a6, 0x397, 0x49, 1,
0x4a6, 0x10f, 0x49, 1,
0x2bf, 0x1e7, 0x49, 0,
0x2bf, 0xd8, 0x49, 0,
0x1b1, 0x143, 0x25, 0,
0x1b1, 0x6e, 0x25, 1,
0xfc, 0xb5, 0x25, 0,
0xfc, 0x47, 0x25, 0,
0xa3, 0x6b, 0x13, 0,
0xa3, 0x38, 0x13, 1,
0x5a, 0x49, 0x13, 0,
0x5a, 0x11, 0x13, 0,
0x2, 0x1, 0x13, 1};
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("out28c.dat","w");
/*******************/
/* factor input */
/*******************/
for (h=0; h<insize; h+=2) {
/******************/
/* first pair */
/******************/
a=input[4*h];
b=input[4*h+1];
c=a+b;
d=a-b;
fprintf(Outfp,"%#4x %d %#8x %#08x ",input[4*h+2],input[4*h+3],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[4*h];
b=a-input[4*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[4*h+1];
a=input[4*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);
}