Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par C.Ret »

C.Ret a écrit : 27 août 2021 23:36Il ne me reste plus qu'à déterminer les réparations des premiers chiffres significatifs pour des produits de quatre, cinq, six, ... variables!
C'est ce que j'ai fait à l'aide d'un petit programme sur mon HP Prime:

Code : Tout sélectionner

EXPORT MPO103(n,s)                                    //  n: de 0 à n-1 multiplication
BEGIN                                                 //  s: nombre de répétition pour chaque produit
 M0:=MAKEMAT(0,n,9);
 LOCAL d,i,j,k,p;                                     // M0: n lignes x 9 colones
 L0:=MAKELIST(LOG(1+1/i),i,1,9);                      // L0: 9 éléments proportion Benford 
 FOR i FROM 1 TO n DO
    FOR j FROM 1 TO s DO                              
       p:=1; FOR k FROM 1 TO i DO p:=RANDOM()*p END;  // Effectue (i-1) multiplications par variable aléatoire
       d:=IP(MANT(p)); M0(i,d):=1+M0(i,d);            // Incrémente compteur corrspondant dans matrice MO
    END;
 END;
END;
Et j'observe quelque chose de très surprenant :
MPO103 - Graph1.gif
MPO103 - Graph1.gif (51.65 Kio) Vu 5704 fois
En fait, en effectuant un nombre croissant de multiplications par une variable aléatoire uniformément répartie sur l'intervalle ] 0 ; 1 ], on obtient très rapidement, c'est à dire à peu près dès cinq multiplications, une répartition selon la loi de Benford.



Afin que vous puissiez écrire votre propre code simulant N tirages de trois nombres aléatoire uniformément répartis A,B et C, je vous donne une copie de la matrice M0 résultant de mon petit code ainsi que la liste L0 des proportions attendues selon la Loi de distribution de Benford:

Code : Tout sélectionner

998353	999392	998749	999306	1001533	999324	1001386	1001458	1000499	
2172850	1648833	1308084	1057676	854890	687232	544721	417800	307914	
2704428	1691614	1187832	888606	694624	564625	476243	415767	376261	
2769239	1604698	1113724	852434	691805	586080	513112	455911	412997	
2725315	1576870	1113835	865764	710124	603823	523928	464910	415431	
2705507	1581865	1123954	873208	713796	605117	523875	459437	413241	
2707809	1584595	1125580	874922	711080	602915	521825	459497	411777	
2708428	1584935	1125435	872529	713116	601918	522840	460279	410520	
2707987	1585887	1123462	871304	713386	602901	522662	460725	411686	
2712044	1583674	1123262	871374	712786	603566	521370	460063	411861	
2712010	1582126	1123174	872027	713021	602804	521962	460465	412411	
2711168	1584933	1125409	871319	712537	602183	521446	460074	410931	
2707733	1585574	1124283	871295	713197	603304	520624	461616	412374	
2708299	1583767	1125115	871874	711647	603407	522461	460320	413110	
2709123	1582664	1125609	873581	712777	603144	520922	460361	411819	
2707629	1584996	1125826	872541	712507	602810	521350	460756	411585	
2709063	1584130	1125536	871730	713833	601488	521705	460816	411699	
2709525	1582738	1125848	872429	712550	602264	523382	459773	411491	
2710365	1583257	1124531	872049	713827	601112	521196	461609	412054	
2708417	1586192	1124682	871474	711620	603362	522135	460451	411667	
2708100	1584469	1122620	874262	712679	602856	522340	460843	411831	
2709841	1584116	1121904	872801	713352	603427	522465	459940	412154	
2708778	1583330	1123652	873516	712565	602156	522173	461512	412318	
2707781	1584788	1122994	872386	712923	603322	523431	460566	411809	
2707751	1584947	1125315	872104	714434	603425	522020	458641	411363	
2710887	1584278	1124441	872354	711898	601861	521620	460387	412274	
2708635	1584562	1123818	872935	712541	603429	521493	460065	412522	
2708803	1582040	1125890	871516	712521	603668	522599	460694	412269	
2710514	1583904	1124557	871957	711737	602786	521457	461146	411942	
2711192	1585907	1124501	871695	711526	601760	521933	460879	410607	
2709286	1584334	1124384	872789	712971	602877	521222	460748	411389	
2709904	1584966	1123232	872480	713425	601981	520952	461377	411683	
2707658	1586978	1123110	871730	712065	603722	522405	460486	411846	
2710162	1583349	1123266	873251	711382	603120	522483	461413	411574	
2707264	1586182	1123233	872950	714111	602993	521314	459881	412072	
2709769	1584816	1124301	872409	711834	602556	521964	461363	410988	
2711093	1584282	1125077	872026	712244	602274	521047	459812	412145	
2711709	1584366	1124254	872503	711571	602762	521916	459307	411612	
2710407	1585231	1123679	871420	711599	602625	522774	460561	411704	
2708309	1583966	1124087	871952	712768	603345	522539	460371	412663	

Code : Tout sélectionner

0.301029995664	0.176091259056	0.124938736607	9.69100130081ᴇ−2	7.91812460476ᴇ−2	6.69467896319ᴇ−2	5.79919469788ᴇ−2	5.11525224474ᴇ−2	4.57574905602ᴇ−2

Voilà, j'ai calculé jusqu'à pus de quarante multiplications sur neuf millions de tirages pour me rendre compte que la distribution est rapidement celle de Benford. Que de temps perdu et de calculs inutiles !

Mais je n'ai trouvé nulle part de publication de ces résultats pourtant fort intéressants.

Nous allons voir qui fera donc le simulateur des tirages demandés par dprtl le plus court et le plus rapide !
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
phm
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1361
Enregistré le : 08 avr. 2016 18:36
Localisation : Est Parisien

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par phm »

très beau graphe,
le sujet est intéressant :D
HEWLETT-PACKARD : The best
CANON
X-07 X-730 X-711 XR-100 XM-101 XP-110F XP-120F XP-130F XP-140

AMSTRAD CPC-464 CPC-6128 ATARI STF DAI Indata
Avatar du membre
Pocket
Administrateur
Administrateur
Messages : 5941
Enregistré le : 24 mai 2002 16:55
Localisation : Toulouse
Contact :

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par Pocket »

Salut,

Bon, intuitivement j'avais trouvé le bon chiffre majoritaire, mais mal estimé son pourcentage ;)

A+
Pocket, voit tout, sait tout, lit l'avenir dans les entrailles d'une base phpBB ...
Image
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par zpalm »

bernouilli92 a écrit : 26 août 2021 17:44 Je pense que la répartition doit être similaire à la répartition des chiffres dans les nombres de 1 à N.
Le 1 est beaucoup plus fréquent que le 2 qui est plus fréquent que le 3 etc.
Je crois que c’est la loi de Benford qui s’applique ici aussi.
Une belle vidéo ludique d'Arte sur la loi de Benford: https://youtu.be/wS1Tsj_fl5o
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par caloubugs »

Sympa ce petit MPO.

Un petit programme en 26 lignes sur HP15C, sachant que je n'ai pas d'accès à la mantisse en direct (où alors on m'aurait caché ça depuis 35 ans 8O ).

Code : Tout sélectionner

001 - f LBL A
      f CLEAR REG
      STO 0
      f LBL 0
      f DSE 0
006 - GTO 1
      g RTN
      f LBL 1
      f RAN #
      f RAN #
011 - f RAN #
      *
      *
      ENTER
      g LOG
016 - g INT
      g ABS
      1
      +
      10^x (remarque : ça ne marche pas si le résultat est exactement une puissance négative de 10, mais le risque que ça arrive... Au cas présent on trouve alors 10 et non 1, il suffit de voir au cas où s'il y a un nombre > 0 dans RCL.0).
021 - *
      g INT
      STO I
      1
      STO + (i)
026 - GTO 0
En faisant 100 000 boucles, sur un émulateur bien sûr (sur la machine elle-même je ne suis pas sûr qu'on y arriverait avec un seul jeu de piles qui pourtant tiennent très longtemps :? . Je vais faire un test de rapidité tiens et estimer le temps sur la vraie...), je retrouve des valeurs très proches (30,2 % par exemple pour les nombres commençant par 1).
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par caloubugs »

Un petit test sur la vraie 15C et une simulation de 100 000 itérations prendrait un peu plus de 3 jours (seulement tiens...)

Sinon, j'ai fait n'importe quoi au niveau des boucles malgré tout, la décrémentation doit se faire après une première itération et non dès le départ, et ici si l'on demande 100 boucles, en fait on ne va faire que 99 "tirages". Pfff, l'erreur du gros débutant.

Le code corrigé et en plus c'est plus court (24 pas, 2 de gagnés et un label de moins) et plus simple :

Code : Tout sélectionner

001 - f LBL A
      f CLEAR REG
      STO 0
      f LBL 0
      f RAN #
006 - f RAN #
      f RAN #
      *
      *
      ENTER
011 - g LOG // Tout ça jusqu'au pas 017 pour récupérer le premier chiffre de la mantisse...
      g INT
      g ABS
      1
      +
016 - 10^x
      *
      g INT
      STO I
      1
021 - STO + (i)
      f DSE 0
      GTO 0
      g RTN
Par contre, même s'il y a peu de pas, ça ne peut pas tenir dans une TI57LCD... Faut que je regarde cela pour une TI62 Galaxy. Je trouve toujours rigolo de faire tourner des trucs interminables sur des machines très limitées. :twisted:
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par C.Ret »

Ah! Oui justement j'étais en train de chercher pourquoi le DSE était placé au-dessus de la boucle. Je cherchais (en vain) une astuce.

Sinon, 3 jours sur une HP-15C, les piles tiendront facilement :) pas rapide mais économe l'HP-15C :tongue:


Sinon pour extraire plus rapidement le chiffre significatif il n'y a pas besoin de le calculer exactement; on peut économiser l'INT car même en laissant la partie fractionnaire, le bon registre sera incrémenté :
Bon, je pense que ce petit perfectionnement n'est qu'un détail et qu'il faudra toujours au moins 3 jours de fonctionnement continu pour obtenir un résultat statistiquement significatif.

Code : Tout sélectionner

001- CLEAR REG  STO 0  
003- LBL 0
004-   RAN#  RAN#  *  RAN#  * STO I  LOG  1  -  INT  10^x  STO/I  1  STO+(i)
018- DSE 0  GTO 0
Penser à placer des piles neuves puis saisir le code.
En mode RUN, taper g RTN pour réinitialiser le pointeur au début du programme.
Saisir le nombre de tirages à effectuer 1000000 et pressez R/S.
Comme pour le code initial, les comptages seront mémorisés dans les registres R1 à R9.
Avec un peu de chance les comptages seront terminés avant février 2022 (si les piles tiennent - éviter donc les piles low-cost acheté l'année dernière par correspondance chez ALI-BABA).

P.S.: J'ai chronométré 4'02" pour 100 tirages et les résultats suivants : #1:33% #2:13% #3:23% #4:8% #5:2% #6:9% #7:5% #8:4% #9:3%
Puis environ 43' pour 1000 tirages donnant les résutats suivants : #1:30.8% #2:17.2% #3:15.5% #4:10.5% #5:6.4% #6:5.9% #7:4.9% #8:3.9% #9:4.9%


Concernant la TI-57 LCD c'est vrai que ce problème est un peu trop complexe pour ses (très limitées) capacités. Outre le fait qu'elle n'a pas assez de RAM pour un tel programme et une dizaine de registres. Il n'y a pas non plus d'adressage indirecte !
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par caloubugs »

Ah, merci pour tes optimisations, surtout sur l'utilisation du LOG où je perds bêtement du temps à prendre la valeur absolue pour multiplier derrière (alors qu'il suffit simplement de diviser). Sans compter l'astuce avec le registre I. Joli et un gain de plus de 10 % de perf quand même. Je me rends compte que j'ai toujours évité de bidouiller ce registre qui n'est rien d'autre qu'une mémoire.

Et tenter l'aventure avec 1 million de tirages, faut en effet avoir confiance dans ses piles. Je ne sais pas comment ça se passe d'ailleurs si la caltoche s'arrête en plein vol... Mais il me semble que si on interrompt le processus en cours de route pour changer les piles avant que le jeu soit totalement épuisé, on peut reprendre le traitement ensuite normalement sans perte d'info (et en faisant le changement de piles assez vite).

Je vais voir si c'est jouable sur la 62 galaxy, qui est marrante car on voit le programme s'exécuter à l'écran tellement c'est lent. Ca me fait penser aux vieilles machines à tube à Gégé, comme si elles avaient un côté plus humain. :P
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par caloubugs »

Bon, les TI, c'est pas génial.

Déjà, les 62, 65 par exemple n'ont pas d'adressage indirect (vu leur petite mémoire, c'est pas forcément surprenant).

Par contre, je l'avais oublié, mais l'absence d'un générateur de nombre aléatoire par exemple sur la 66 c'est quand même handicapant. Le générateur est un programme dans la Master Library des 58/59, donc non repris ici. Tu parles d'une modernisation, TI s'était quand même un peu moqué du monde à l'époque :tongue: . Bref, j'ai réintégré le générateur à congruence linéaire qui marche bien avec 10 chiffres.

Le "petit" prog sur la 66 bat forcément des records de lenteur : 13'50" pour 100 itérations ! Presque 10 jours pour 100 000 et plus de 8 secondes par itération ! : comme il faut environ 100 lignes de code à exécuter pour chaque itération, on atteint la vitesse faramineuse d'environ 12 lignes/seconde, on peut quasiment suivre ça à la main.
Faut saisir la graine du générateur en STO10 (après avoir fait un CMS pour nettoyer les mémoires) avant de saisir le nombre d'itérations et exécuter par A.

Code : Tout sélectionner

000 - LBL
      RCL
      RCL
      10
      *
005 - 9
      8
      2
      1
      +
010 - .
      2
      1
      1
      3
015 - 2
      7
      =
      INV
      INT
020 - STO
      10
      RTN
      LBL
      A
025 - STO
      00
      LBL
      SUM
      SBR
030 - RCL
      STO
      11
      SBR
      RCL
035 - PRD
      11
      SBR
      RCL
      PRD
040 - 11
      RCL
      11
      LOG
      -
045 - 1
      =
      INT
      INV
      LOG
050 - INV
      PRD
      11
      1
      SM* //SUM Ind 11
055 - 11
      DSZ
      00
      SUM
059 - RST
En plus, c'est ch**** à concevoir avec ces instructions sur 2 lignes quand il faut manipuler le programme. Un vrai bonheur.

Mais bon, il y a bien quelqu'un qui va réussir à m'optimiser ça !
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par C.Ret »

caloubugs a écrit : 01 déc. 2021 16:40Bon, les TI, c'est pas génial.
Mais si ! C'est juste un peu plus difficile d'en extraire un jus très concentré.
Mais c'est justement cette difficulté qui pimente le jeu.
caloubugs a écrit : 01 déc. 2021 16:40Par contre, je l'avais oublié, mais l'absence d'un générateur de nombre aléatoire par exemple sur la 66 c'est quand même handicapant. Le générateur est un programme dans la Master Library des 58/59, donc non repris ici. Tu parles d'une modernisation, TI s'était quand même un peu moqué du monde à l'époque :tongue: .
Oui, c'est comme les TI-57 LCD qui sont deux fois moins puissantes et bien moins rapides que les TI-57 plus anciennes, ce qui en fait fait des machines très décevantes.

N'ayant pas de TI-66, je vais utiliser ma programmable 58 à mémoire continue qui est bien naturellement munie de sa bibliothèque de base (car le module Master Library y est inséré depuis toujours).
caloubugs a écrit : 01 déc. 2021 16:40Mais bon, il y a bien quelqu'un qui va réussir à m'optimiser ça !
C'est pas gagné !
Bon, ma TI58c est la seule machine de ma collection qui ne "merge" pas les instructions sur un seul pas de programme. En général, chaque instruction fait un pas, mais certaines instructions peuvent en faire jusqu'à 6 ou 7 octets surtout si l'on utilise l'adressage direct.

J'ai donc immédiatement pris l'habitude de présenter mes codes en "regroupant" les pas d'une même instruction. C'est un peu plus lisible. Bien que peu conforme aux listings traditionnels. Mais cela m'aide énormément, car j'ai trop pris l'habitude des machines plus récentes.

Voici donc le code de caloubugs présenté en regroupant les instructions et en indentant les boucles:

Code : Tout sélectionner

000 - LBL RCL
002 -   RCL 10   *   9821   +   .211327   =   INV INT   STO 10
022 - RTN

023 - LBL A
025 -   STO 00
027 -   LBL SUM
029 -     SBR RCL   STO 11   SBR RCL   PRD 11   SBR RCL   PRD 11
041-      RCL 11   LOG   -   1   =   INT   INV LOG   INV PRD 11
053-       1   SM* 11
056-    DSZ 00 SUM
059 - RTN
C'est plus lisible, mais évidemment, sur la machine, quand il faut composer ou éditer le code, c'est un octet après l'autre. Au moins cela a l'avantage de permettre la composition de codes semi-synthétiques plus facilement.

Adaptation:
Bon, adaptons aux Ti58/Ti59 munies de la bibliothèque de programme de base (Master Library Module) dont le ML-15 a le bon goût de contenir un générateur de nombres pseudo-aléatoires comme le rappelle caloubug dans son post.

Nous pouvons donc nous abstenir de composer le sous-programme générateur à congruence linéaire.
Bien.
Mais!
Eh! Oui, il y a un Mêê.

Le sous-programme ML-15 utilise les registres R01 à R11 :

Code : Tout sélectionner

R₀₀                    R₀₅   ∑ x²             R₁₀   A,̅x              R₁₅
R₀₁   ∑ y              R₀₆   ∑ xy             R₁₁   B,σ              R₁₆
R₀₂   ∑ y²             R₀₇   Utilisé          R₁₂                    R₁₇
R₀₃   N                R₀₈   Utilisé          R₁₃                    R₁₈
R₀₄   ∑ x              R₀₉   Nombre-source    R₁₄                    R₁₉


Il va donc falloir déplacer les registres de comptage afin d'éviter les interférences entre les registres utilisés par le module et le programme principal.

Par chance, R₀₀ reste disponible et sert donc de compteur d'itération comme dans le code de caloubug.
Par contre les registres de comptage R₀₁ à R₀₉ ainsi que le registre d'indirection R₁₁ sont déplacés.

Pour plus de clarté dans l'expression des résultats, les comptages sont mémorisés dans les registres R₁₁ à R₁₉.
Le registre d'indirection utilisé est R₂₉ mais j'aurais tout aussi bien pu utiliser R₁₀. Les seuls registres à ne surtout pas utiliser sont les registres R₀₇, R₀₈ et R₀₉.

Il faut donc au minimum 30 registres et donc la partition de la mémoire minimale est 3 Op 17 affichant 239.29 ; soit un maximum de 230 pas de programme et 30 registres.

Il faudra avant la première utilisation initialiser le générateur de nombre pseudo aléatoires (module ML-15).
Dans la version adaptée et optimisée, cela sera fait en dehors du programme. Je n'utilise donc pas le Label A dans mes codes afin d'éviter toute confusion avec le Label A utilisé par le module ML-15. Les tirages des nombres pseudo aléatoires seront fait par le sous-programme SBR D.MS du module Pgm-15 comme indiqué dans la documentation de la bibliothèque de base page 52, sequence 13:
MPO 103  Mode emploi Générateur de Nombres Aleatoires.png
MPO 103 Mode emploi Générateur de Nombres Aleatoires.png (63.11 Kio) Vu 3073 fois
Comme j'utilise les registres R₁₁ à R₁₉, il ne faudra donc pas utiliser les fonctions de génération de distribution normale ou d'équirépartition du module.

Code : Tout sélectionner

000 42 00                   STO 0
002 76 44                   Lbl SUM
004  36 15 71 88 65           Pgm 15 SBR D.MS   ×
009  36 15 71 88 65           Pgm 15 SBR D.MS   ×
014  36 15 71 88 95 42 29     Pgm 15 SBR D.MS   =   STO 29
021  28 59 22 28 22 49 29     log   Int   10^x   INV Prd 29
028  01 00 49 29 44 29        10   Prd 29   SUM 29
034  01 74 29                  1   SUM(29) 
037 97 00 44                Dsz 0 SUM
040 92                      RTN
Utilisation:
  1. Vérifier que la partition mémoire dispose de 30 registres ( R₀₀ à R₂₉ ). A défaut modifier par 3 Op 17 qui affichera 239.29
  2. Saisir le code ci-dessus.
  3. Remettre à zéro les registres mémoire: 2nd CMs
  4. Initialiser le générateur de nombre pseudo aléatoire de la bibliothèque de base : 2nd Prgm 15 2nd E'
  5. Saisir un Nombre Source : xxxxx E qui affichera ce nombre.
  6. Saisir le nombre de tirages souhaités et lancer le code: nnnnnn RST R/S

    Les comptages s'accumulent à chaque exécution dans les registres R₁₁ à R₁₉.
La dernière étape peut être répétée à loisir afin d'accumuler les comptages au fur et à mesure.

L'avantage du reset (RST) est que l'on sort du module Pgrm 15, l'utilisation d'un Lbl A dans mon code aurait été une source d'ennuis car aurait lancé le label correspondant du module.

Pour 100 tirages, ma Ti58c met exactement 10'02". C'est à peine plus rapide qu'une Ti66 !

Exemple:
2nd CMs
2nd Prgm 15 2nd E'
145789 E
1000 RST R/S
~~ 39 min ~~
RCL 11 = 311. (31.1%)
RCL 12 = 194. (19.4%)
RCL 13 = 120. (12.0%)
RCL 14 = 101. (10.1%)
RCL 15 = 79. (7.9%)
RCL 16 = 71. (7.1%)
RCL 17 = 55. (5.5%)
RCL 18 = 36. (3.6%)
RCL 19 = 33. (3.3%)

Conclusion:

On obtient rapidement (moins d'une heure pour 1000 tirages) une distribution très proche de celle attendue (Distribution de Benford), le générateur semble donc bien fonctionner.

Cette version pout TI58/TI59 est l'adaptation la plus fidèle au code de Caloubug tout en utilisant le générateur de nombres pseudo aléatoires présent dans la bibliothèque de base (module ML-15).

Par contre, je ne suis pas satisfait de cette optimisation; une partie des registres interfèrent avec ceux utilisés par le module ML-15 et surtout je ne tire pas parti des capacités du module. Il pourrait être intéressant de pouvoir utiliser pleinement le générateur proposé pour simplifier le code et savoir si son exécution peut être accélérée.


Je propose donc l'optimisation suivante:
Utilisation:
  1. Vérifier que la partition mémoire dispose de 30 registres ( R₀₀ à R₂₉ ). A défaut modifier par 3 Op 17 qui affichera 239.29
  2. Saisir le code optimisé ci-dessous.

    Code : Tout sélectionner

    000 42 00                                      STO 0
    002 76 44                                      Lbl SUM
    004 36 15 13 65 36 15 13 65 36 15 13 95 42 13    Pgm 15 C  ×  Pgm 15 C  ×  Pgm 15 C  =  STO 13
    017 43 12 74 13                                  1  SUM(13) 
    021 97 00 44                                   Dsz 0 SUM
    024 92                                         RTN
    
  3. Remettre à zéro les registres: 2nd CMs
  4. Initialiser le générateur de nombre pseudo aléatoire de la bibliothèque de base : 2nd Prgm 15 2nd E'
  5. Saisir un Nombre Source: xxxxx E ce qui affichera ce nombre.
  6. Définir les limites inférieures et supérieur du générateur aléatoire en tapant: 2.7589 A et 3.1072 B
  7. Saisir le nombre de tirages souhaités et lancer le code: nnnn RST R/S

    Les comptages s'accumulent à chaque exécution dans les registres R₂₁ à R₂₉ .
La dernière étape peut être répétée à loisir afin d'accumuler les comptages au fur et à mesure.
Après chaque série d'accumulations, la qualité de la distribution peut être mesurée par sa moyenne et son écart-type: respectivement 2nd ̅x et INV 2nd σ (touche 6).


Est-ce aussi rapide ?
Cela suit-il toujours la Loi de Bentford ?
Que se passe-t-il lorsque l'on utilise une distribution initiale normale au lieu de la distribution uniforme (en remplaçant, en tout ou en partie, C par C' aux pas 019, 023 et 027) ?
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit Optimisez n°103 : A*B*C vérification d’une loi contre-intuitive

Message par Gilles59 »

Bonsoir,
j'ai adapté le programme RPL de c.Ret en newRPL

Code : Tout sélectionner

«
  9 0 CON AXL 
  1 ROT START
    RAND RAND RAND * * MANT DUP2 GET 1 + PUT 
  NEXT
  DUP ΣLIST / 100 * 
»
L'affichage du nombre de décimales voulu se fait en tapant ON & 0..9 (Par ex ON et 3 en même temps fixe 3 décimales ...)

Sur HP50g hardware 100.000 boucles s'exécutent en 12,7 sec : 100000 'MPO' TEVAL
{ 30.4 18.79 13.23 9.8 7.53 6.14 5.32 4.58 4.22 }

Sur le PC 10 millions de boucles d'exécutent en 13,4 sec : (le ratio entre ma HP50 et mon PC est de 1 à 100, aucune émulation la version PC du newRPL est une version compilée pour PC)
{ 30.06 18.82 13.18 9.86 7.72 6.27 5.3 4.62 4.18 }

100 millions de boucles sur PC, en 120 sec, ça ne change plus grand chose :
{ 30.06293 18.80952 13.19835 9.8627 7.7169 6.2753 5.29172 4.6149 4.16769 }

A noter que le newRPL fonctionne sur la prime G1 et vu le processeur ca doit tourner bien plus vite que sur HP50

PS : la commande CRNM ne fonctionne pas de la même façon pour les vecteurs en RPL et newRPL : signalé à l'auteur. Je travaille donc en liste plutot qu'avec un tableau. la commande AXL transforme un tableau en liste et inversement. Premiere fois que j'utilise la commande MANT, merci c.Ret ;D
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Répondre

Retourner vers « Tous les Pockets »