/*****************************************************************************/
/* */
/* FACTOR (a**p + b**p)/(a + b) */
/* 11/03/06 (dkc) */
/* */
/* This C program finds a and b such that (a**p + b**p)/(a + b) is a cube */
/* or p times a cube. The "weak" Furtwangler conditions must be fulfilled. */
/* p is set to 3. */
/* */
/* Note: The maximum value of d**2-d*e+e**2 is (3/4)*d**2 if d is even or */
/* (3/4)*(d**2-1)+1 if d is odd. */
/* */
/*****************************************************************************/
#include <math.h>
#include <stdio.h>
#include "table0a.h"
unsigned int lmbd(unsigned int mode, unsigned int a);
void sum(unsigned int *addend, unsigned int *augend);
void bigprod(unsigned int a, unsigned int b, unsigned int c, unsigned int *p);
void quotient(unsigned int *a, unsigned int *b, unsigned int);
void midprod(unsigned int a, unsigned int b, unsigned int *output);
unsigned int dloop(unsigned int a, unsigned int b, unsigned int c,
unsigned int d, unsigned int *e);
int main ()
{
unsigned int dbeg=1000000; // starting "a" value
unsigned int tflag=0; // leave set to 0
extern unsigned short table3[];
extern unsigned int output[];
extern unsigned int error[];
extern unsigned int d;
extern unsigned int e;
unsigned int t3size=2556;
unsigned int outsiz=1999*3;
unsigned int n=0;
unsigned int i,j,k,l;
unsigned int T[2],V[2],X[3];
double croot2,croot4;
FILE *Outfp;
Outfp = fopen("output.dat","w");
croot2=1.259921;
croot4=1.587401;
/*****************************************/
/* find minimum index into look-up table */
/*****************************************/
midprod(dbeg, dbeg, V);
bigprod(V[0], V[1], 3, X);
V[0]=X[1];
V[1]=X[2];
quotient(V, V, 4);
if (tflag!=0) {
T[0]=0;
T[1]=1;
quotient(V, V, 7);
sum(T, V);
quotient(V, V, 7);
sum(T, V);
quotient(V, V, 7);
sum(T, V);
if (tflag==2) {
quotient(V, V, 7);
sum(T, V);
quotient(V, V, 7);
sum(T, V);
quotient(V, V, 7);
sum(T, V);
}
}
if (V[0]==0)
l = 32 - lmbd(1, V[1]);
else
l = 64 - lmbd(1, V[0]);
j=l-(l/3)*3;
l=l/3;
l = 1 << l;
if (j==1)
l=(int)(((double)(l))*croot2);
if (j==2)
l=(int)(((double)(l))*croot4);
l=l+1;
if (l>table3[t3size-1]) {
error[0]=5;
goto bskip;
}
else {
k=0;
for (i=0; i<t3size; i++) {
if (table3[i] < l) k=i;
else break;
}
}
/***********************************/
/* factor (d**p + e**p)/(d + e) */
/***********************************/
d=0;
e=0;
error[0]=0; // clear error array
n=dloop(dbeg, k, n, outsiz, output);
bskip:
output[n]=0xffffffff;
fprintf(Outfp," count=%d \n",(n+1)/3);
for (i=0; i<(n+1)/3; i++)
fprintf(Outfp," %#10x %#10x %#10x \n",output[3*i],output[3*i+1],
output[3*i+2]);
fclose(Outfp);
return(0);
}