/* spect.c -- the spectral test */
/*
Copyright 1999 Free Software Foundation , Inc .
This file is part of the GNU MP Library test suite .
The GNU MP Library test suite is free software ; you can redistribute it
and / or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation ; either version 3 of the License ,
or ( at your option ) any later version .
The GNU MP Library test suite is distributed in the hope that it will be
useful , but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU General
Public License for more details .
You should have received a copy of the GNU General Public License along with
the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
/* T is upper dimension. Z_A is the LC multiplier, which is
relatively prime to Z_M , the LC modulus . The result is put in
rop[] with v[t] in rop[t-2]. */
/* BUGS: Due to lazy allocation scheme, maximum T is hard coded to MAXT. */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include "gmpstat.h"
int g_debug =
0 ;
int
main (
int argc,
char *argv[])
{
const char usage[] =
"usage: spect [-d] a m n\n" ;
int c;
unsigned int n;
mpz_t a, m;
mpf_t res[GMP_SPECT_MAXT], res_min[GMP_SPECT_MAXT], f_tmp;
int f;
mpz_init (a);
mpz_init (m);
for (f =
0 ; f < GMP_SPECT_MAXT; f++)
{
mpf_init (res[f]);
mpf_init (res_min[f]);
}
mpf_init (f_tmp);
mpf_set_ui (res_min[
0 ],
32768 );
/* 2^15 */
mpf_set_ui (res_min[
1 ],
1024 );
/* 2^10 */
mpf_set_ui (res_min[
2 ],
256 );
/* 2^8 */
mpf_set_ui (res_min[
3 ],
64 );
/* 2^6 */
mpf_set_ui (res_min[
4 ],
32 );
/* 2^5 */
while ((c = getopt (argc, argv,
"dh" )) != -
1 )
switch (c)
{
case 'd' :
/* debug */
g_debug++;
break ;
case 'h' :
default :
fputs (usage, stderr);
exit (
1 );
}
argc -= optind;
argv += optind;
if (argc <
3 )
{
fputs (usage, stderr);
exit (
1 );
}
mpz_set_str (a, argv[
0 ],
0 );
mpz_set_str (m, argv[
1 ],
0 );
n = (
unsigned int ) atoi (argv[
2 ]);
if (n +
1 > GMP_SPECT_MAXT)
n = GMP_SPECT_MAXT +
1 ;
spectral_test (res, n, a, m);
for (f =
0 ; f < n -
1 ; f++)
{
/* print v */
printf (
"%d: v = " , f +
2 );
mpf_out_str (stdout,
10 ,
4 , res[f]);
#ifdef PRINT_RAISED_BY_TWO_AS_WELL
printf (
" (^2 = " );
mpf_mul (f_tmp, res[f], res[f]);
mpf_out_str (stdout,
10 ,
4 , f_tmp);
printf (
")" );
#endif /* PRINT_RAISED_BY_TWO_AS_WELL */
/* print merit */
printf (
" m = " );
merit (f_tmp, f +
2 , res[f], m);
mpf_out_str (stdout,
10 ,
4 , f_tmp);
if (mpf_cmp (res[f], res_min[f]) <
0 )
printf (
"\t*** v too low ***" );
if (mpf_get_d (f_tmp) < .
1 )
printf (
"\t*** merit too low ***" );
puts (
"" );
}
mpz_clear (a);
mpz_clear (m);
for (f =
0 ; f < GMP_SPECT_MAXT; f++)
{
mpf_clear (res[f]);
mpf_clear (res_min[f]);
}
mpf_clear (f_tmp);
return 0 ;
}
void
debug_foo()
{
if (
0 )
{
mpz_dump (
0 );
mpf_dump (
0 );
}
}
Messung V0.5 in Prozent C=95 H=94 G=94
¤ Dauer der Verarbeitung: 0.2 Sekunden
¤
*© Formatika GbR, Deutschland