Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
/* floating-point Newton, with inversion in 3M(n) */
#include
#include
#include
#include "gmp.h"
#include "gmp-impl.h"
#include "longlong.h"
#define ZERO (mp_limb_t) 0
#define ONE (mp_limb_t) 1
void
mpn_print (mp_ptr A, mp_size_t n)
{
int j;
for (j=0; j
#include
int
cputime ()
{
struct rusage rus;
getrusage (0, &rus);
return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
}
int
main (int argc, char *argv[])
{
mp_size_t n = atoi (argv[1]), i, j, k;
mp_ptr qp, rp, dp, tp, qp2, rp2;
mp_limb_t cy;
pid_t pid;
int st;
k = (argc <= 2) ? 1 : atoi(argv[2]);
qp = malloc (n * sizeof (mp_limb_t));
qp2 = malloc (n * sizeof (mp_limb_t));
rp = malloc (n * sizeof (mp_limb_t));
rp2 = malloc (2 * n * sizeof (mp_limb_t));
dp = malloc (n * sizeof (mp_limb_t));
tp = malloc (2 * n * sizeof (mp_limb_t));
pid = getpid ();
printf ("Seed=%lu\n", pid);
srand48 (pid);
for (i = 0; i < n; i++)
dp[i] = lrand48 ();
dp[n - 1] |= GMP_NUMB_HIGHBIT;
st = cputime ();
for (i = 0; i < k; i++)
{
#ifdef CHECK
// printf ("Test %lu\n", i);
for (j = 0; j < n; j++)
dp[j] = lrand48 ();
dp[n - 1] |= GMP_NUMB_HIGHBIT;
#endif
mpn_invert2 (qp, dp, n);
#ifdef CHECK
if (test_invert2 (qp, dp, n) == 0)
{
fprintf (stderr, "test_invert2 failed at i=%lu\n", i);
printf ("A:="); mpn_print (dp, n);
printf ("X:=B^%lu", n); mpn_print (qp, n);
exit (1);
}
#endif
}
printf ("mpn_invert2 took %dms\n", cputime () - st);
// printf ("xp="); mpn_print (qp, n);
MPN_ZERO (rp2, 2 * n);
rp2[2 * n - 1] = GMP_LIMB_HIGHBIT;
st = cputime ();
for (i = 0; i < k; i++)
{
MPN_ZERO (rp2, 2 * n);
rp2[2 * n - 1] = GMP_LIMB_HIGHBIT;
mpn_divrem (qp2, 0, rp2, 2 * n, dp, n);
}
printf ("mpn_divrem took %dms\n", cputime () - st);
free (qp);
free (rp);
free (dp);
free (tp);
return 0;
}
#endif