1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| program testgmp;
uses gmp, gpc,dos;
(* dos pour caculer le temps d'exécution *)
const
CMax = 100000;
var
s : mpz_t;
Etape : mpz_t;
Altitude : mpz_t;
r : pchar;
et : pchar;
alt : pchar;
v : word;
nb : word;
nk : word;
heure, heure1, minute, minute1, seconde, seconde1, centieme, centieme1 : word ;// Chrono
begin
writeln('Programme testant la conjecture de Syracuse');
writeln;writeln('Combien de test(s) voulez vous faire?');writeln;
writeln('Choisissez entre 1 et ',(high(word)));writeln;
writeln('Pour stopper le programme en cours d''execution c''est [CTRL]+[C]');writeln;
writeln('[Disclaimer] : Ecolo prefere de petits nombres');
readln(v);
while (v < 1) or (v >high(word)) do
begin
writeln;writeln('Lire l''enonce!, au lieu de faire le zouave');writeln;
writeln;writeln('Combien de test(s) voulez vous faire?');writeln;
writeln('Choisissez entre 1 et ',(high(word)));writeln;
writeln('Pour stopper le programme en pleine execution c''est [CTRL]+[C]');writeln;
readln(v);
end;
{/elihw}
writeln;writeln('Nous allons boucler ', v,' fois la conjecture ');
writeln('Il nous faut un nombre pas trop grand compris entre 1 et ',CMax);
writeln('afin de randomiser aleatoirement cet essai, (entre 500 et 2000 c''est top)');
readln(nb);
while (nb < 1) or (nb > CMax) do
begin
writeln('Nous allons boucler ', v,' fois la conjecture ');
writeln('Il nous faut un nombre pas trop grand compris entre 1 et ', CMax);
writeln('afin de randomiser un essai');
readln(nb)
end;
{/Elihw}
repeat
begin
gettime(heure ,minute ,seconde, centieme);
mpz_init(s); // Initialisation de s
mpz_init(Etape); // Initialisation de Etape
mpz_init(Altitude); // Initialisation de Altitude
nk := random(nb); //Random traditionnel
mpz_random2(s,nk); // MPZ_RANDOM ET MPZ_RANDOM2 sont pourris, ils renvoient le meme nombre
mpz_mul(s,s,s); // Multiplier s par s
//mpz_add_ui(Etape,Etape,0); // Affectation Etape à 0
mpz_add(Altitude,Altitude,s);// Affectation Altitude à s
(* La verite est ailleurs Scully *)
r := mpz_get_str(nil,10,s); //s est affiche en pointeur de char 'r'
while (mpz_cmp_ui (s, 1) = 1) do // Tant que la comparaison s est différent de 1 est vrai
begin
if (mpz_fdiv_ui(s,2) = 0) then //Test si s div 2 vaut 0
begin
mpz_tdiv_q_ui(s,s,2); // Division de s par 2
mpz_add_ui(Etape,Etape,1);
if (mpz_cmp_ui (s, 1) = 0) then //Si s vaut 1 on s'arrete (Conjecture de collatz juste)
begin
writeln(' Conjecture pour [',r,'], bouclee avec succes ');
writeln;break; // fin de programme
end;
{fi}
end
else
begin
mpz_mul_ui(s,s,3); // S prend la multiplication de S et 3
mpz_add_ui(s,s,1); // S prend l'addition de S et 1
if ((mpz_cmp(s,Altitude)) = 1) then // Comparaison de S et Altitude
begin
mpz_set(Altitude,s); //Si S est plus grand, Altitude prend S
alt := mpz_get_str(nil,10,s); // Alt récupère S
end;
{/fi}
mpz_add_ui(Etape,Etape,1);
end;
{fi}
end;
{elihw}
gettime (heure1, minute1, seconde1, centieme1);
writeln('Gettime debut ',heure,' h ', minute,' min ', seconde,' sec ',centieme,' cent/sec');
writeln('Gettime Fin ',heure1,' h ', minute1,' min ', seconde1,' sec ',centieme1,' cent/sec');
et := mpz_get_str(nil,10,Etape);
writeln('Ce vol comporte ',et,' etapes');writeln;
alt := mpz_get_str(nil,10,Altitude);writeln;
writeln('L''Altitude Maximale est de ',alt);writeln;
dec(v);
end
until
(v < 1);
{/taeper}
mpz_clear(s); // désallocation de mémoire s
mpz_clear(Etape) ; // Désallocation de mémoire Etape
mpz_clear(Altitude); // Désallocation de mémoire Altitude
writeln;writeln('Ecolo vous remercie et vous demande ');
writeln('d''utiliser des processeurs Atom ou ARM de moins de 10Watt');
end. // Fin |
Partager