Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

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

Répondre
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par Gilles59 »

Image
François Viète, d'après Daniel ou Jean Rabel
Source wikipédia

François Viète est un mathématicien français, né à Fontenay-le-Comte (Vendée) en 1540 et mort à Paris le 23 février 1603.
Il fut le premier à proposer une expression exacte du nombre PI, expression remarquable et assez fascinante :

Image

Il me plait à l'imaginer il y a 430 ans, la plume à la main, passer de nombreuses heures à calculer et recalculer encore cette formule.

Vous l'avez compris, le challenge est d'utiliser votre pocket préféré, même (et même surtout) très ancien, pour trouver le résultat de cette formule après un nombre paramétrable d'itérations (*) en veillant, comme le veut la tradition, à ne pas utiliser le moindre octet (et même demi-octet !) inutile.

(*) EDIT :j'ai remplacé 10 'itérations' par un "nombre paramétrable d'itérations" (sur la pile ou autre moyen de saisie : Viete(10) par ex.). Cela permettra de voir la rapidité ou pas de la convergence et autres subtilités.
Par itération il faut comprendre le nombre d'élément de la forme 1/Racine-Carrée() dans la formule.

( Sommaire des MPO )
Modifié en dernier par Gilles59 le 05 nov. 2014 23:25, modifié 7 fois.
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
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Calculons Pi comme Viète

Message par Marge »

Mais voilà un MPO qui ne dit pas son nom ! De tête, heu, 2 divisé par 1,414... d'accord, je vais demander à mon fils. :arrow:
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Calculons Pi comme Viète

Message par zpalm »

Allez, un premier jet vite fait sur 41C en 16 pas (35 ans c'est assez ancien ? je n'ai pas sorti la WP 34S, pas assez ancienne..) :

Code : Tout sélectionner

01 LBL"VIETE
02 10
03 ENTER
04 2
05 ENTER
06 0
07 LBL 00
08 2
09 ST* Z
10 +
11 SQRT
12 ST/ Y
13 DSE Z
14 GTO 00
15 RDN
16 END
Et le résultat après 10 itérations : le voici.

Ceci fait, maintenant j'ai un doute : que représentent 10 itérations ? Mon programme n'en fait il pas 11?
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5229
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Calculons Pi comme Viète

Message par bernouilli92 »

Voici ma proposition en RPL :

Code : Tout sélectionner

<< 
  2 0 
  1 9 START 
    2 + SQRT 2 OVER / ROT * SWAP
  NEXT DROP
>>
Il faut remplacer SQRT par le symbole racine carrée.
Total : 50 octets

On doit pouvoir battre des records de taille avec la wp34s.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Calculons Pi comme Viète

Message par tyann »

Bonjour à tous
Une version pour la Ti 66.

Code : Tout sélectionner

000	2
001	STO
002	01
003	√x
004	STO
005	00
006	9
007	STO
008	02
009	2
010	/
011	RCL
012	00
013	=
014	PRD
015	01
016	RCL
017	00
018	+
019	2
020	=
021	√x
022	STO
023	00
024	DSZ
025	02
026	00
027	09
028	RCL
029	01
030	R/S
Résultat :3.141587725 en 15 sec.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
jvernet
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7958
Enregistré le : 24 mai 2002 09:57
Localisation : France 69
Contact :

Re: Calculons Pi comme Viète

Message par jvernet »

Ressorti ma 7500G:

Code : Tout sélectionner

?->M
2->X
SQR(X)->Y
Lbl 1
X*2/Y->X
SQR(2+Y)->Y
Dsz M:Goto 1
X¤
Ou SQR est le signe racine, et ¤ le signe triangle "Display"

marrant, je n'avais pas reprogrammé cette machine depuis au moins 20 ans, et la syntaxe reste. Bon, elle est pas bien evoluée.


41 pas.
"l'ordinateur et l'homme sont les deux opposés les plus intégraux qui existent. L'homme est lent, peu rigoureux et très intuitif. L'ordinateur est super rapide, très rigoureux et complètement con."
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Calculons Pi comme Viète

Message par zpalm »

bernouilli92 a écrit :On doit pouvoir battre des records de taille avec la wp34s.
J’arrive à 12 pas (24 octets):

Code : Tout sélectionner

01 LBL A
02 #009
03 0
04 NEXTP
05 2
06 STO* Y
07 RCL+ L
08 SQRT
09 / 
10 DSZ Y
11 BACK 006
12 END
On peut encore gagner 1 pas (ce qui donne 11 pas / 22 octets) si on sort le nombre de boucles du programme, il faut alors lancer le programme par [9] [A] :

Code : Tout sélectionner

01 LBL A
02 0
03 NEXTP
04 2
05 STO* Y
06 RCL+ L
07 SQRT
08 / 
19 DSZ Y
10 BACK 006
11 END
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5229
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Calculons Pi comme Viète

Message par bernouilli92 »

C'est bien ce que je disais. En RPL, on est défavorisé quand on compte en octets, car chaque instruction fait 2,5 octets. En fait on devrait compter en nombre de pas. Après tout, il est fort probable qu'un pas sur wp34s prenne plus qu'un octet.
Du coup ma proposition fait 20 pas.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Calculons Pi comme Viète

Message par zpalm »

Un pas sur wp34s prend 2 octets, sur hp 41c c'est variable, la plupart des instructions sont sur 1 ou deux octets mais certaines font plus (labels alpha, nombres, chaines de caractères).
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: Calculons Pi comme Viète

Message par C.Ret »

bernouilli92 a écrit :Voici ma proposition en RPL :

Code : Tout sélectionner

<< 
  2 0 
  1 9 START 
    2 + SQRT 2 OVER / ROT * SWAP
  NEXT DROP
>>
Excellent, j'ai même eut du mal à comprendre.

J'ai dû créer une fonction SQRT pour mieux analyser est comprendre que le produit était fait dans le sens inverse :
... * 2/√(√(√2+2)+2) * 2/√(√2+2) * 2/√2 * 2


Pour ceux qui aimerait refaire pas à pas le calcul, je préconise d'utiliser la fonction SQRT suivante :

Code : Tout sélectionner

« → x « '√a' 2 x EXSUB » »
Cette fonction a l'avantage de ne pas évaluer la racine et d'utiliser l'affichage algébrique des RPL. Ainsi 2 SQRT s'affiche '√2' ce qui est bien plus lisible pour comprendre.


Maintenant que j'ai compris, je peux MPOiser le code de notre ami : j'en profite pour le para-métriser, le nombre d'"itérations" étant au niveau 1: de la pile, utiliser le code suivant pour obtenir l'estimation de PI par François Viète correspondante :

Code : Tout sélectionner

« 0 → n b
  « 2
    1 n START
       2 b 2 + √ DUP 'b' STO / *
    NEXT » » 
C'est le même principe que celui de notre ami Bernouilli mais en utilisant les registres sauvegardés (l'option LAST doit donc être activée sur son HP28/48/50) ce qui permet :
* d'éviter les mouvements de la pile
* faire le produit dans le sens de la formule donnée par Gilles59 (même si cela ne change rien numériquement - cela évite juste le ROT)
* le DROP final n'est plus nécessaire pour vider la pile du "pré-calcul de l'itération suivante" car la calculette laisse bien cachée dans son ventre le contenu des registres de la fonction LAST.

Par contre, il n’évite pas la répétition de tous ces 2, bien trop nombreux à mon avis pour un programme sérieusement optimisé.

La version non-paramétrique s'écrie :

Code : Tout sélectionner

 « 0 → b
  « 2
    1 9 START
       2 b 2 + √ DUP 'b' STO / *
    NEXT » » 
Juste histoire de comptabiliser les 1/2-octets, octets ou nombre de pas je ne sais pas comment faire efficacement sur mon HP-28S

P.S.: j'ai de plus en plus de mal à battre les RPL-istes de ce forum. Je rouille ??

J'oubliais de poster la version pour SHARp PC-1211 :

Code : Tout sélectionner

1:"V" AREAD N : B=0 : P=2 : FOR I=1 TO N : B=√(B+2) : P=2P/B : NEXT I : PRINT N,P : END
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: Calculons Pi comme Viète

Message par Gilles59 »

La première version que j'avais faite,
En entrée le nombre d'itération :

Code : Tout sélectionner

«
 2 1 ROT  FOR n
  2 0
  1 n START
   2 + √ 
  NEXT
  / *
 NEXT
»
56,5 octets, soit 6,5 de plus que celle de Bernouilli qui me semble difficilement améliorable en RPL!
Modifié en dernier par Gilles59 le 04 nov. 2014 23:42, modifié 1 fois.
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
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Calculons Pi comme Viète

Message par Gilles59 »

tyann a écrit :Bonjour à tous
Une version pour la Ti 66.

Résultat :3.141587725 en 15 sec.
Bravo ! tu m'as doublé, je voulais faire une version pour ce foudre de guerre :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
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Calculons Pi comme Viète

Message par Gilles59 »

C.Ret a écrit :
Juste histoire de comptabiliser les 1/2-octets, octets ou nombre de pas je ne sais pas comment faire efficacement sur mon HP-28S
Tu n'as pas la commande BYTES sur 28S ? Mettre le programme sur la pile puis BYTES...

Par contre tu sera je pense déçu car les sous-programmes intégrés entre << >> sont assez gourmands ....
Modifié en dernier par Gilles59 le 04 nov. 2014 23:45, modifié 1 fois.
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
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Calculons Pi comme Viète

Message par tyann »

Bonsoir à tous
Nouvelle version pour la Ti 66.
Les opérations en mémoire consommant 2 pas minimum,
je suis passé par le registre de test 't' accessible par
x<>t (x échange t) 1 pas.

Code : Tout sélectionner

000	2
001	√x
002	x<>t
003	9
004	STO
005	02
006	2
007	/
008	x<>t
009	STO
010	00
011	x
012	2
013	=
014	x<>t
015	RCL
016	00
017	+
018	2
019	=
020	√x
021	x<>t
022	DSZ
023	02
024	00
025	07
026	R/S
Soit 4 petits pas de gagnés.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Calculons Pi comme Viète

Message par zpalm »

Si l'on compte les octets la bonne vieille 41C s'en sort plutôt bien à égalité avec la WP 34S avec 24 octets malgré le label Alpha initial:

Code : Tout sélectionner

              Octets
01 LBL"V”       5
02 9            1
03 ENTER        1
04 2            1
05 ENTER        1
06 0            1
07 LBL 00       1
08 2            1
09 ST* Z        2
10 +            1
11 SQRT         1
12 ST/ Y        2
13 DSE Z        2
14 GTO 00       2
15 RDN          1
16 RTN          1
              -----
       Total:  24 octets
Répondre

Retourner vers « Tous les Pockets »