IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres IDE Pascal Discussion :

Unite GMP pour conjecture de Collatz [GNU Pascal]


Sujet :

Autres IDE Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Unite GMP pour conjecture de Collatz
    Bonjour,

    Je suis pas très avancé en Pascal, on vient de faire les records et on va attaquer pour Pâques les pointeurs (indulgence power).

    Je veux implémenter trois fonctions :
    une division naturelle,
    une multiplication,
    et une addition
    dans une longue boucle (plusieurs mois de full CPU sous RedHat) et/ou quelques decennies en mode réel sous Ms-Dos 6.22
    En Pascal mode de compatibilité Delphi, j'arrive plus ou moins avec une source très dépouillée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    program collatz;
    {$MODE DELPHI}
     
    function EtapeMax (var u : QWORD; var r : QWORD):QWORD;
    // u doit être le dernier élément que l'on analysé
    // r est le nouvel élèment du vol à soumettre
    	begin
    		if u > r then
    			result := u
    		else
    			result := r
    	end; // Fin de la fonction EtapeMax
     
    var
     
    	 PasAvant : QWORD = 5; // Les cinq premiers nombres ne sont pas significatif de la conjecture
    	 pasApres : QWORD = high(qword);	// 18446744073709551615
    	 i : QWORD;  
    	 x : QWORD; // Le nombre Max calculable et débordable n'est pas encore calculé	
    	 Etape : integer; // Compteur des étapes du vol ex : pour x := 7 ==> 16 étapes
    	 // 7 -> 22 -> 11 -> 34 -> 17 -> 52 -> 26 -> 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
    	 Altitude : QWORD;  // Servant à donner l'altitude maximum du vol ex : pour x := 7 ==>
    	 //  Altitude max : 52	
      debordermin : qword;
      debordermax : qword;
     
     
     
    begin	
    			debordermin := low(qword);
    			debordermax := ((high(qword) div 3) - 100000000); // précaution contre le débordement
    			i := PasAvant;
    			while (i <= PasApres) and (i <> 0) do			
    			begin
    				inc(i);
    				Etape := 0; // Etape commence par 0 
    				Altitude := 0; // Altitude comme par 0
    				x := i;	
    				write('<<',x:38,'>>'); // Affichage du nombre à calculer en qword ça en fait des chiffres, formatage en :38 spécial
    				while (x <> 1) do
    					begin
    						if ((x MOD 2) = 0) then // Pair
    							begin
    								x := x div 2;								
    								inc(etape);
    								write('[',x,']');
    									// Pas de if x <=0 then readln(); //Impossible d'avoir 0 même avec un débordement dans l'évaluation if ((x MOD 2) = 0)								
    							end
    						else
    							if ((x MOD 2) <> 0) then // Impair faut toujours surveiller les impairs
    								begin
    									x := (x * 3) + 1;									
    									Altitude := EtapeMax(Altitude,x);
    									inc(Etape);														
    									write('[',x,']');
    									if (x >= debordermax-5) or (x = debordermin) then	//Attention intervalles donc expressions booleennes différentes de type integer !!									
        									readln() // On arrête l'élèment du vol qui a débordé ==> Un mandat d'array ((:
    								end;
    					end;
    				writeln();
     
     
    				writeln('Nombre <<',i:10,'>>');
    				writeln('Vol de <<',i:10,'>> est egal a ',Etape);
    				writeln('Altitude Maximale de <<',i:10,'>> vaut : ',Altitude);				
    				writeln();
    				writeln();				 		
    			end
    	end.
    1.Je voudrais utiliser les unites GMP et GPC,
    (J'ai installé GPC via apt-get donc l'unité GMP est installé)
    2. Je voudrais compiler avec gpc --automake masource.pas
    3. Comment utiliser l'unité GMP et les entiers avec mpz
    Faut lire la source gmp.pas mais elle est fort peu loquace, ça ressemble à du Stallman
    4. Comment initialiser et affecter proprement mes variables?
    5. Quand détruire l'initialisation (ou l'allocation) ?
    6. Comment faire l'addition, la division naturelle et la multiplication.
    7. Y a t 'il moyen de faire la conjecture de Collatz avec l'unité GMP?

    Merci de votre aide, car je rame comme un bleu.

    J'ai commencé et c'est pas top, c'est rempli d'erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    program testgmp;
    uses gmp, gpc;
    var
    	k : mpz_t;
    	r : mpz_t;	
    	s : word = high(word)-1;
    	ptp : mpz_t;
    	pti : mpz_t;
     
     
     
    begin
    	mpz_init(k);  //Initialisation de k 
    	mpz_init(r);  //Initialisation de r
    	mpz_init(ptp);
    	mpz_init(pti);
    	k := mpz_set(k,1); // Affectation de 1 à k
    	r := mpz_set(r,100); // Affectation de 1000000000000000000 à r
    	ptp := mpz_set(ptp,2); // Affectation a 2 car Si pair diviser par 2
    	pti := mpz_set(pti,3);// Affectation a 3 car Si impair fois 3
    		while (s <> 1) do
    		begin
    			if mpz_mod(s,ptp,0) then
    				begin
    					mpz_divexact(s,ptp,s);
    					gmp_print('ok');
    				end
    			else
    				begin
    					mpz_mul(s,pti,s);
    					gmp_print('nok')
    				end;
    			{fi}		
    		end;
    	inc(k);
    	{elihw}
     
    end. // Fin

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 17
    Points
    17
    Par défaut [Resolu]Unite GMP et conjecture de Collatz
    J'ai essayé de boucler le programme, qui est ici et qui à l'air de tourner sous Linux, sous Windows j'ai un message du type 'programme trop gros pour être mis en mémoire'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    program testgmp;
    uses gmp, gpc;
     
    var
    	k : mpz_t;	
    	s : mpz_t;
    	ptp : mpz_t;
    	pti : mpz_t;
    	zero : mpz_t;
    	r :  pchar;	
    	n : word;
    begin
    	randomize;
    	mpz_init(k);  //Initialisation de k 
    	mpz_init(s); // Initialisation de s
    	mpz_init(ptp); //initialisation de ptp
    	mpz_init(pti); // Initialisation de pti
    	mpz_init(zero); // Initialisation de zero
    	mpz_set_ui(k,1); // Affectation de 1 à k
    	mpz_set_ui(ptp,2); // Affectation de 2 à ptpcar Si pair diviser par 2
    	mpz_set_ui(pti,3);// Affectation de 3 à pti car Si impair fois 3
    	mpz_set_ui(zero,0); // Affectation de 0 à zero
    	n := random (high(word))+1; // on randomise n avec un random de high(word) 4294967295
      mpz_set_ui(s,n); // Affectation de n à s
      mpz_mul_ui(s,s,1298372543); // S prend la multiplication de S et 1298372543 // Un super chiffre de dingue 
      mpz_mul_ui(s,s,3452738921); // S prend la multiplication de S et 3452738921 // Un numberzilla
      mpz_mul_ui(s,s,1790452371); // S prend la multiplication de S et 1790452371 // Un hypernumberzilla
      r := mpz_get_str(nil,10,s); //s est affiche en pointeur de char 'r'
      writeln('La limite d''un word est = ',high(word));    
      writeln('Bouclage de ',r,' avec la conjecture de Collatz');
      readln;  
    			while (mpz_cmp(k,s) <> 0) or (mpz_cmp_ui (s, 1) = 1)  do // Tant que la comparaison de k et s est vrai et que s est différent de 1
    				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
    							r := mpz_get_str(nil,10,s); //s est affiche en pointeur de char 'r'
    							write('[',r,']');
    							if (mpz_cmp_ui (s, 1) = 0) then //Si s vaut 1 on s'arrete (Conjecture de collatz juste) 
    								begin
    									writeln('Stop 1 ok ');
    									readln;readln;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
    							r := mpz_get_str(nil,10,s); //s est affiche en pointeur de char 'r'
    							write('[',r,']'); // On ecrit le pointeur r
    						end;
    					{fi}					
    				end;
    			{elihw}	
    		mpz_clear(s); // désallocation de mémoire s
    		mpz_clear(k);  // désallocation de mémoire k
    		mpz_clear(ptp); // désallocation de mémoire ptp
    		mpz_clear(pti);// désallocation de mémoire pti
    		mpz_clear(zero);// désallocation de mémoire zero
    end. // Fin
    j'ai compilé avec gnu pascal compiler car les unités gmp et gpc y sont et la directive utilisée est

    gpc --cstrings-as-strings --automake testgmp.pas -o collatz

    Je me suis aidé de ces explications :
    http://gala.univ-perp.fr/~cnegre/Ens...TD4-crypto.pdf
    http://gmplib.org/gmp-man-4.2.4.pdf

    Si vous voyez des optimisations à y faire , je suis preneur...
    Merci

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Nettoyage:
    Il y avait 4 variables non utilisées
    (k, ptp ,pti ,zero)
    De plus l'appel de writeln constamment afin d'afficher la variable r de type pchar peut à la longue entrainer une saturation de mémoire
    (Ram à 94% d'occupation dans un cas extrême)

    Donc, on utilise moins de writeln dans ce programme ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    program testgmp;
    uses gmp, gpc;
     
    var
    	s : mpz_t;
    	r :  pchar;	
    	n : word;
    	v : word;
     
    begin
    	writeln;writeln('Donnez un chiffre qui bouclera autant de fois une conjecture de Collatz');writeln;
    	writeln('Donnez un chiffre estime entre 2 et',(high(word)-1));writeln;
    	writeln('Stopper le programme c''est [CTRL]+[C]');
    	readln(v);
    	while (v < 2) or (v >(high(word)-1)) do
    		begin
    			writeln;writeln('Lire l''enonce!, au lieu de faire le zouave');
    			writeln;writeln('Donnez un chiffre qui bouclera autant de fois une conjecture de Collatz');writeln;
    			writeln('Donnez un chiffre estime entre 2 et',(high(word)-1));writeln;
    			writeln('Stopper le programme c''est [CTRL]+[C]');
    			readln(v);
    		end;
    	{/elihw}
    	repeat 
    		begin
    			randomize;
    			mpz_init(s); // Initialisation de s
    			n := random(high(word)); // on randomise n avec un random de high(word) 4294967295
      		mpz_set_ui(s,n); // Affectation de n à s
     			mpz_mul_ui(s,s,1298372543); // S prend la multiplication de S et 1298372543 // Un super chiffre de dingue 
     			mpz_mul_ui(s,s,3452738921); // S prend la multiplication de S et 3452738921 // Un hypernombre
     			mpz_mul_ui(s,s,1790452371); // S prend la multiplication de S et 1790452371 // Un giganombre
     			mpz_mul(s,s,s); // S prend la multiplication de S et de S // Un un numberzilla
     			r := mpz_get_str(nil,10,s); //s est affiche en pointeur de char 'r' 
    			while (mpz_cmp_ui (s, 1) <> 0)  do // Tant que s est différent de 1
    				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
    							if (mpz_cmp_ui (s, 1) = 0) then //Si s vaut 1 on s'arrete (Conjecture de collatz juste) 
    								begin
    									writeln;writeln('conjecture ok pour ', r);
    									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
    						end;
    					{fi}
    				end;
    			{elihw}
    			dec(v);		
    		end
    	until 
    		(v < 1);
    	{/taeper}	
    	mpz_clear(s); // désallocation de mémoire s
    end. // Fin
    Donnez un chiffre qui bouclera autant de fois une conjecture de Collatz

    Donnez un chiffre estime entre 2 et4294967294

    Stopper le programme c'est [CTRL]+[C]
    3

    conjecture ok pour 638852175410814332956235657397798135467861268761072147111482026273393834201

    conjecture ok pour 1145347388060210919708887810711382726788183379377266982435996027787803187249

    conjecture ok pour 302424201078030797799680217111163990087577390004934907557765693753747212489
    Edit:
    Sans writeln, on peut faire des numberzilla:
    Code Au début : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    n := random(high(word)); // on randomise n avec un random de high(word) 4294967295
      		mpz_set_ui(s,n); // Affectation de n à s
     			mpz_mul_ui(s,s,1298372543); // S prend la multiplication de S et 1298372543 // Un super chiffre de dingue 
     			mpz_mul_ui(s,s,3452738921); // S prend la multiplication de S et 3452738921 // Un hypernombre
     			mpz_mul_ui(s,s,1790452371); // S prend la multiplication de S et 1790452371 // Un giganombre
     			mpz_mul(s,s,s); // S prend la multiplication de S par S // 
     			mpz_mul(s,s,s); // S prend la multiplication de S par S // 
     			mpz_mul(s,s,s); // S prend la multiplication de S par S //
     			mpz_mul(s,s,s); // S prend la multiplication de S par S //
     			mpz_mul(s,s,s); // S prend la multiplication de S par S //
     			mpz_mul(s,s,s); // S prend la multiplication de S par S //
     			mpz_mul(s,s,s); // S prend la multiplication de S par S //
     			mpz_mul(s,s,s); // S prend la multiplication de S par S //

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    conjecture ok pour 29281076476865402103135655533991664098473259454858114885616617823006974126831790096558060290980486087244290097955806882034447329897909508363046225364691826548535140030221284087569866647343266533174897074378502055689861723663328411366768026837776679050527721100441879051135166367244171937469359992904364189201069981219422626322076856922531412973609857053715251174315883647455907547141884327468991778280081745718222301810690675804669305220523835808067051175837865153186365388616962377755594989261507189025732550163551534582877319692819639357750265943381693464351896792458494670133667739575942090537164496451705864981309891393127236115002621797946848547496643992326053383062427959238984691915737972025944919019355012501928459205786329906755392800526290728444153218504690057650213976795283344345712376593674486076412887296403341590645500657850865170855379479591279249309731301139600427666623625954351775233378462437688971705910262543699305453915221082399035421608871318314126194801248737017461925976807657575551641848073788869978601735110002914347289345988197235477074456608832433464109948687739731023248467209939819062840071216104070827315618461730911741630649917835962000045344256227695458307267699090162394096992907275294632320301436668761915538340248712486203965605350290131269789668383087451300764993045125361277578665315447162520522695518023963277711687204090612314314834571225578835282813580992704970481072941241986468660382092398237505462552252525707294009451171625428305416188155456920345179327911519993368957709844521938529094795526708188269656248613518912629017887675825758679104306980505836780580696035556878795092448801254074931214107798267186734392640924585835217845037291189361741848873591568300038871539582965050274600751431909726728441480187085994251941877848256692884927569675354988344453243180787399388799421757875518511693825213851251810080998807111430776718338854154386088275397449716476825171029858699000139514805809092352288505449794416703478961279026167513009677365893581719254049929095186029675659319301339818005200001717136139590927958107779397030446892349571276613181389955675856004370706085119907534664758465159023793307680045603275531545153333247085207576956751580601961337703051977104094515839795484552049703639994883463355341558619140555783700210606506472392166593930353198060629050505846801548911495035850494187808629577472503381431353998442786580874678947604712877784610235464064500413303914183484663163607343341627432081019400339127830031069995348564914172985553241883220318888964513580322203601831155957385366405543874358707001228779548176652249218673532735752811967102830347080918431393477309215831913194127740581875127006792731566162540926976395036990690944111872475945826840721537965952996786216481182648283176797881725135592582743603686161424145116331162276863165105771639749254010901761806407950495219162912658199210864870559081871050883333215564226031384450247756163328421795211777207466423297772809818019578520575768730559206134878811168364018448191171468602316797479087120799933526110501006721524046901103303423314346053662350297966399066293345892489563224286030461336599951492435135665295742491275921473966747136674144802413704626659530484037556952892812885531843963022253867840157616355344785813631171934202917803551411064113427017891207842466728926299557769550127688571203725034637299973387421032435261839072129763767445101804204648408220261279492276657096195218461885938392133275646021662047014861090917037086390190059383436735177323576348738042671254727763815019648395296027242125013401072468610600318335788834268672970112677680644646515466125102944809305447389046734542834512630831166218829054358876651178925130686476750166599224264579500838373489690524505017167858655989990049973074409468425437899942496298568615797144350876451664846158296355519354026256408816373229238820256140022750946938595859213770056985378526887845496220496592366448599858144673994320717035113877277455144002329850974219022422812033211852011471982510193649007982361494754784300390020362703218550162947030503946093269451014806154861289746160027487307545147814060463217104611628619517349900683510487803059250584418206722911495105862661071363757839704919804849173699127155961510959330326499958436751294280949677368297046143399048157480581953812092998751469703565735786282828748457459173676458928843191890796092278684090575166653827815007285130384684338493230885162922252791846061100405673448407056203770080780595690898872344643370428526427719545217414533816645402921883849907258760157140405982030885111405667248361291065935024182026185746973746580086513911581144660671408335879332006056472954955474068710777885320062632814032390930702250235342393129949890386388941616094985610776802944956259143082287720626951313868970472222941253893502259402624805025892213948150131272356095018662334371343237207220646526300860849271362345956717931282460921713324357071950625624428569714357110720329874113795781695883482458214335923396847494236309412292832155403788545001840253053978034561085842230555606587283334305548957885379255186154323906573118192722044743207872916180229752221538468649694972025041509986401092432358575570717636519796103780853048536038719808709627464996332156850646103987833817194103283095988198111330315303828304144420350426575950082888366320005706235688154653830536132169660812534121264222296404112060528173062367746969804889179354747576763329653323766794952800073888171413084730268232802362901776184501061028875711822342537945851771948229416622337106825887362319523774856052381650522932424154919098407512685894038755671786797800953379003747110502810936019963264724645201734279122085385776031233542038437947828181538611921191159334716021001214102806595204415700219783236360360099248593540283686864213885341339017064705393142666453767515857575411485308392776646262239878221082012632064124623740785104566237040350752939349026865605142757962900497979996390784825904910089455864730025576008967998444874809547059805604232300538628110414921716982955142989634662271396946221828511546227825467648983850144846550716544078850145080186425711543492614464597826508683815284764366256647646562596120446685227178886639635011483433534598875731010245621444298692764453188779206830801611125120852409051870368060983625063758833876073539553674524171461270990810946166898687734382456026245463398141651959783216706334123618608889374646358543257621586915512276884646932667711781580880889615161440159130030453490854887329895452133382194831361349679548464347190637934495363098734057706530469381485723836547362716903216360172543849315092929401972826430375088248664318868102084259702340402770413323173032256091369617314929314958214970347794020815268244563197738341226610233501779594615179115820100980512974092138755800132757296686650859711338022881545033598537401410740437093762792798535197737928172799876324220057228623576405669212686372867722142626115066779626840668859470736468856498313819182835791789982820092900727431696717955410882440702253780543508371401328987114456569481306623955333457300250955188544759576888981145080294326131486189509228147533115328489901108959550815768739506579948007460678522475273513223987078993648916218419552749989769376939616487047458707626245846053545721434419244774807911917582702223384910564052846263215411592087199231700365508231866902927914775334205117799758276491078308075682665533638972650514072165396178619890517374849203868114380887722494271608447367023088426398480581047227154765709565283192602343521973528061574686075820383397054583103854635315087467262676370498224046068984009168699144529397687530819715661697833180653712227105455774093725946108778541654871138857735761266984659234813733469899346286714071420704349379817493821305467630888841831944398341363378244085174892197394292383069586769101129106564436726355108504509885586046371376133439937220721975940780024041808017537181412628648561158637704697566998322203027134344700628293728898423126477365817932689109898656671096091038572320101668789622342014212752813313013302230279464930744800730925682649983039714008391155939199127305002092707094920874329082627752614834861173989898146410352815126794358425571683001850487856186778744296899302550322853954058856036817952517792734073988147506372299375841671590328533661222534783920733642675307326383386102997399987005339577306677254407998142046675061985597260024379899436877717940237369749630239071911795370828527402131214906298897659693908040424637505453943728441256175085487741052572632784116341733488324223028531099925740581506157144202580404278157957531310997677718295151822392723003913798037055608528887088789142644152547750888585793045240234161535477351054537414020941278264355444406817136642273247258929654282446125121476959861124699385669101168721950500790909314374594555342981627481968591152364594701502131846877045370965796491627560127009312994311298444888065715121527902847623865230119593593252163506242247742895297528198595400251791080565378686938489658491179211911805596759353459107486064607923667409230386823535686532056770313142627963863453110662119138734095976362975697942739974367921819395279097785291728528793923367212426952279371241490773546341021118206997852614748686577208820400917094685936114789340417592270069514105647807444163779836444261170861759655781528555550977516496602240795939968591255242959165927593147189044305233411526934996121169166336

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Impressionnant... Tu as des chiffres pour la durée de traitement, en donnant la configuration utilisée ?
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Pour un chiffre de de 19166 caractères numériques, ==> testgmp.pdf
    Il aura fallu 11 secondes et 33 centièmes pour boucler.
    Gettime debut 16 h 30 min 42 sec 58 cent/sec
    Gettime Fin 16 h 30 min 53 sec 91 cent/sec
    La bécane est un HP 6910P sous Ubuntu 8.04
    cat /proc/cpuinfo
    processor : 0
    vendor_id : GenuineIntel
    cpu family : 6
    model : 15
    model name : Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz
    stepping : 11
    cpu MHz : 800.000
    cache size : 4096 KB
    ... /etc/etc/
    processor : 1
    kif kif que processor : 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    program testtempsgmp;
    uses gmp, gpc,dos;
    (* dos pour caculer le temps d'exécution *)
     
    var	
    	s : mpz_t;
    	k : mpz_t;
    	r : pchar;	
    	n : word;
    	v : word;  
    	heure, heure1, minute, minute1, seconde, seconde1, centieme, centieme1 : word ;// Chrono
    begin
    	writeln;writeln('Donnez un chiffre qui bouclera autant de fois une conjecture de Collatz');writeln;
    	writeln('Donnez un chiffre estime entre 1 et',(high(word)));writeln;
    	writeln('Stopper le programme c''est [CTRL]+[C]');
    	v := 1;
    	//readln(v);
    	while (v < 1) or (v >high(word)) do
    		begin
    			writeln;writeln('Lire l''enonce!, au lieu de faire le zouave');
    			writeln;writeln('Donnez un chiffre qui bouclera autant de fois une conjecture de Collatz');writeln;
    			writeln('Donnez un chiffre estime entre 1 et',(high(word)));writeln;
    			writeln('Stopper le programme c''est [CTRL]+[C]');
    			readln(v);
    		end;
    	{/elihw}
    	repeat 
    		begin
    			gettime(heure ,minute ,seconde, centieme);
    			randomize;  
    			mpz_init(s); // Initialisation de s
    			n := random (high(word))+ 1; // on randomise n avec un random de high(word) 4294967295	
      		mpz_set_ui(s,n); // Affectation de n à s
      		mpz_mul_ui(s,s,1298372543); // S prend la multiplication de S et 1298372543 // Un super chiffre de dingue 
     			mpz_mul_ui(s,s,3452738921); // S prend la multiplication de S et 3452738921 // Un hypernombre
     			mpz_mul_ui(s,s,1790452371); // S prend la multiplication de S et 1790452371 // Un giganombre
     			mpz_mul(s,s,s); // S prend la multiplication de S par S // 
     			mpz_mul(s,s,s); // S prend la multiplication de S par S // 
     			mpz_mul(s,s,s); // S prend la multiplication de S par S //
     			mpz_mul(s,s,s); // S prend la multiplication de S par S // 
     			mpz_mul(s,s,s); // S prend la multiplication de S par S // 
     			mpz_mul(s,s,s); // S prend la multiplication de S par S //
     			mpz_mul(s,s,s); // S prend la multiplication de S par S // 
     			mpz_mul(s,s,s); // S prend la multiplication de S par S // 
     			mpz_mul(s,s,s); // S prend la multiplication de S par 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
    					//gettime(heure ,minute ,seconde, centieme);
    					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
    							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
    						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');			
    		dec(v);		
    		end
    	until 
    		(v < 1);
    	{/taeper}	
    		mpz_clear(s); // désallocation de mémoire s
    end. // Fin

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Voici une possible version finie sur le test de la conjecture de Collatz
    Le programme calcule :
    • le plus grand nombre obtenu dans la suite qui est appelé l'altitude maximale du vol

    • le nombre d'étapes avant d'obtenir 1 est appelé la durée du vol.

    • Le programme vérifie par la même occasion que la conjecture soit vraie.


    Avec un nombre de 11025 caractères numériques par exemple

    Voir le resultat de programme gmp11000.pdf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    La seule chose où il faut une précieuse aide est insérer un type chaine de caracteres ou cstring ou pchar en parametre de lecture de variable
    avec : function mpz_set_str (var Dest: mpz_t; Src: CString; Base: CInteger): CInteger;

    J'ai essayé un string reconvertie en cstring, un pchar reconvertie en cstring, un string[n] et impossible.
    Si il y a des pistes, merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. WinGraph : Unité graphique pour Free Pascal et Delphi
    Par forum dans le forum Outils à télécharger
    Réponses: 7
    Dernier message: 08/07/2012, 17h35
  2. [Lazarus] [SVN] Où se trouve l'unité dateutils pour utiliser EncodeDateTime
    Par dav999 dans le forum Lazarus
    Réponses: 6
    Dernier message: 18/11/2010, 11h34
  3. Réponses: 2
    Dernier message: 26/03/2007, 16h07
  4. Problème unit CRT pour Faire du Pascal avec Delphi
    Par alexmorel dans le forum Débuter
    Réponses: 4
    Dernier message: 01/06/2004, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo