V10/cmd/factor/factor.c
#include <math.h>
extern double modf();
#ifdef pdp11
#define setfps() ldfps(0240) /* double, chop */
#define ifdiv(d,n) if((n/d)*d==n)
#else
#define setfps()
#ifdef vax
#define ifdiv(d,n) junk = n/d;\
asm(" emodd _junk,$0,$0f1.0,r0,_junk");\
if(junk==0.)
#else
#define ifdiv(d,n) if(modf(n/d,&junk)==0.)
#endif
#endif
double wheel[] = {
2,10, 2, 4, 2, 4, 6, 2, 6, 4,
2, 4, 6, 6, 2, 6, 4, 2, 6, 4,
6, 8, 4, 2, 4, 2, 4, 8, 6, 4,
6, 2, 4, 6, 2, 6, 6, 4, 2, 4,
6, 2, 6, 4, 2, 4, 2,10,
};
double n;
double d;
double junk;
double s;
main(argc,argv)
char **argv;
{
extern double atof();
register double *wheelp;
if(argc>1)
n = atof(argv[1]);
setfps();
do {
if(argc<=1 && scanf("%lf",&n)<=0)
break;
if(n<=0)
break;
printf("%.0f\n",n);
s = sqrt(n) + 1;
try(2.);
try(3.);
try(5.);
try(7.);
d = 1.;
wheelp = &wheel[1];
for(;;) {
d += *wheelp;
ifdiv(d,n)
try(d);
if(++wheelp >= wheel + sizeof(wheel)/sizeof(*wheel)) {
wheelp = wheel;
if(d>s)
break;
}
}
if(n>1)
printf(" %.0f\n",n);
printf("\n");
} while(argc<=1);
return(0);
}
try(p)
double p;
{
static double quot;
while(modf(n/p,")==0) {
printf(" %.0f\n",p);
n = quot;
}
s = sqrt(n) + 1;
}