|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 3231 (0xc9f)
Types: TextFile
Names: »primes.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/primes.c«
/* Copyright 1986 Gary Perlman */
/*LINTLIBRARY*/
#define NPRIMES 11 /* number of primes used to factor */
#define MAXPRIME 97 /* maximum prime whose log we have preset */
#define MAXTABLE 1000 /* maximum number whose log we can store */
#include "primes.h" /* defines of logs of primes up to MAXPRIME */
#ifndef MSDOS
static char sccsfid[] = "@(#) primes.c 5.0 (|stat) 12/22/86";
#endif
static int Primelist[] =
{
2, 3, 5, 7, 11, 13, 17,
19, 23, 29, 31, 37, 41, 43,
47, 53, 59, 61, 67, 71, 73,
79, 83, 89, 97
};
/*
natural logarithms of primes
zeros will never be used
later values will be filled in with values from log() function
*/
static double Logtable[MAXTABLE+1] =
{
/* 0- 9 */ 0.0, 0.0, LN_2, LN_3, 0.0, LN_5, 0.0, LN_7, 0.0, 0.0,
/* 10-19 */ 0.0, LN_11, 0.0, LN_13, 0.0, 0.0, 0.0, LN_17, 0.0, LN_19,
/* 20-29 */ 0.0, 0.0, 0.0, LN_23, 0.0, 0.0, 0.0, 0.0, 0.0, LN_29,
/* 30-39 */ 0.0, LN_31, 0.0, 0.0, 0.0, 0.0, 0.0, LN_37, 0.0, 0.0,
/* 40-49 */ 0.0, LN_41, 0.0, LN_43, 0.0, 0.0, 0.0, LN_47, 0.0, 0.0,
/* 50-59 */ 0.0, 0.0, 0.0, LN_53, 0.0, 0.0, 0.0, 0.0, 0.0, LN_59,
/* 60-69 */ 0.0, LN_61, 0.0, 0.0, 0.0, 0.0, 0.0, LN_67, 0.0, 0.0,
/* 70-79 */ 0.0, LN_71, 0.0, LN_73, 0.0, 0.0, 0.0, 0.0, 0.0, LN_79,
/* 80-89 */ 0.0, 0.0, 0.0, LN_83, 0.0, 0.0, 0.0, 0.0, 0.0, LN_89,
/* 90-99 */ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, LN_97, 0.0, 0.0
};
\f
/*FUNCTION logprime: return precomputed log of prime or call log function */
double
logprime (p)
int p;
{
double log ();
/* assert (p is prime) */
if (p >= 2 && p <= MAXPRIME)
return (Logtable[p]);
if (p <= MAXTABLE)
{
if (Logtable[p] == 0.0)
Logtable[p] = log ((double) p);
return (Logtable[p]);
}
return (log((double)p));
}
\f
/*FUNCTION dofactor: set arrays so for all i, small[i] * large[i] = i */
void
dofactor (small, large, i, n)
int *small; /* array of smaller divisors of numbers */
int *large; /* array of larger factors of numbers */
register
int i; /* start with this value */
int n; /* end with this value */
{
register int p;
for (; i <= n; i++)
{
small[i] = 1;
large[i] = i;
for (p = 0; p < NPRIMES && Primelist[p] < i; p++)
{
if (i % Primelist[p] == 0)
{
small[i] = Primelist[p];
large[i] = i / Primelist[p];
break;
}
}
}
#ifdef GENDIV
gendiv ("small", small, n);
gendiv ("large", small, n);
#endif GENDIV
}
\f
#ifdef CHECK_ROUNDING_ERRORS
#define pnum(x) printf ("%-20.20s %25.20lf\n", "x", x)
main ()
{
extern double exp (), log ();
int i;
double d;
for (i = 2; i <= MAXPRIME; i++)
if (Logtable[i] != 0.0)
{
d = i;
putchar ('\n');
printf ("%d\n", i);
pnum(Logtable[i]);
pnum(log(d));
pnum(exp(Logtable[i]));
pnum(exp(log(d)));
}
}
#endif CHECK_ROUNDING_ERRORS
#ifdef GENDIV
gendiv (name, array, n)
char *name;
int *array;
{
int i;
printf ("static %s = {", name);
for (i = 0; i < n; i++)
{
if (i % 10 == 0)
printf ("\n\t");
printf ("%3d, ", array[i]);
}
printf ("%3d\n\t};\n", array[n]);
}
#endif GENDIV