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
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

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

Message par gege »

Bonjour,
J'ai tapé un programme en multiprécision sur la Prime, le voici, librement inspiré du code Basic ici présenté :
Image

Voici le résultat :
Image
27 chiffres exacts avec 50 boucles.
G.E.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2918
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm »

@Charo: bien joué! J’ai mis un certain temps à comprendre comment ça marchait entre le BASIC et l'AER.

A propos d'AER, du coup j'ai ressorti ma Sharp EL-5030 et voici ce que ça donne en 43 octets pour la séquence d'instructions, plus 3 variables et le titre:

Code : Tout sélectionner

01:VIETE
M:f(C)=2=>A_0=>B|->√(2+B)=>B_Ax2÷B=>A_C-1=>C_C>0-Y->[<-|]A

Avec les conventions suivantes dans l’ordre d’apparition:
=>    : STO
_     : 2ndF 8 (espace)
|->   : 2ndF 0 (début de boucle)
-Y->[ : 2ndF 1 (début exécution si test précédent = YES)
<-|   : 2ndF . (retour au début de la boucle)
]     : 2ndF 1 (fin exécution YES)
On le lance avec [COMP], le programme affiche: C=? , on entre le nombre de boucles puis [COMP], le programme affiche ANS 1= puis le résultat: 3.141587725 pour 9 boucles.

PS: gege, tu peux faire des captures d'écrans de ta Prime avec le connectivity kit, c'est plus simple que de faire des photos d'écran...

EDIT: pas de connectivity kit pour la Sharp EL-5030 aussi voici des photos pour le programme qui tient sur 3 écrans (les symboles sont plus explicites):
Image Image Image
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

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

Message par gege »

Bonjour,
ok bien reçu bien reçu !

En C sur PC-G850 (bizarre que personne ne l'aie encore fait) :

Code : Tout sélectionner

10 main()
20 { int i; double a,b;
30   a=2; b=0;
40   for (i=0;i<20;++i)
50   { b=sqrt(2+b);
60     a=2*a/b; }
70 printf("pi~%f¥n",a);
80 return 0; }
159 octets et ça affiche : pi~3.141593, pas hyper glorieux, mais je ne me souviens plus comment afficher les doubles avec plus de chiffres (%lf ni %9f ne fonctionnent) ?

Hop, en "Forth" sur le simulateur en Basic sur le PC-G850 :

Code : Tout sélectionner

: viete 2 0 10 do 2 +
sqrt dup roll / 2 *
swap loop drop . ;
Si on tape viete, ça répond (lentement...) 3.141592346.
Cool !?
Désolé, il n'y a pas over sur mon baragouin local (j'ai déjà dû rajouter sqrt en catastrophe...).

Je vois le bô programme de C.Ret, alors en retournant sur la Prime on tape successivement :

Code : Tout sélectionner

xinit(7);xtostr(pi)
viete(60,7)
Et ça donne respectivement :
3.141592653589793238462643383279502884 et
3.141592653589793238462643383279502931
soit 33 chiffres exacts !

Pfouuu c'est le moment d'aller dormir (mais je vais d'abord lire le code de C.ret, miam !).
G.E.

EDIT : vraiment très sympa ce MPO.
C.ret, tu utilise Newton pour la racine carrée, bonne idée (moi aussi !). Le RPL est un peu complqué à comprendre...
Qui sortira le programme le plus exotique ? Quoi que Charo aie mis la barre très très haut !
:lol:
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2918
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm »

Sur Casio Pro fx-1 (ou fx-201p/202p), en 59 pas et 3 registres:

Code : Tout sélectionner

MAC:ENT0:1=K2:                    10 pas
ST#1:2=2+K2:2=2√:1=1xK2/2:        24 pas
0=0-K1:IF0=K0:2:2:1:              19 pas
ST#2:ANS1:                         6 pas
                           TOTAL: 59 pas
Il faut neuf secondes pour faire 9 boucles et afficher 3.141587733.
Avatar du membre
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5631
Enregistré le : 26 mars 2009 13:07
Localisation : Ile de France
Contact :

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

Message par ledudu »

zpalm a écrit :Sur Casio Pro fx-1.
Merci ! J'aurais fini par publier aussi sur cette machine.
Avatar du membre
jvernet
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7958
Enregistré le : 24 mai 2002 09:57
Localisation : France 69
Contact :

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

Message par jvernet »

gege a écrit : En C sur PC-G850 (bizarre que personne ne l'aie encore fait) :

Code : Tout sélectionner

10 main()
20 { int i; double a,b;
30   a=2; b=0;
40   for (i=0;i<20;++i)
50   { b=sqrt(2+b);
60     a=2*a/b; }
70 printf("pi~%f¥n",a);
80 return 0; }
159 octets e
Si, si j'avais commencé, mais un truc plus efficace à la sauce C. Pas fini.
"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
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

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

Message par Marge »

Xerxes a écrit :A shorter solution for the FX-180P series:

Code : Tout sélectionner

P1:

01  Min
02  KAC
03  2
04  Kin1

P2:

01  2
02  Kin*1
03  Kin+2
04  Kout2
05  SQRT
06  Kin/1
07  Kin2
08  1
09  M-
10  MR
11  x>0
12  Kout1

Very nice! How many bytes?
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 : 2918
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm »

Personne pour nous faire une version sur Compucorp ou Sharp PC-1300?
Avatar du membre
Xerxes
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 292
Enregistré le : 02 avr. 2007 13:41
Localisation : Allemagne
Contact :

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

Message par Xerxes »

Marge a écrit :Very nice! How many bytes?
4+12=16 bytes. The Kin+-*/ command uses one byte only.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

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

Message par C.Ret »

C'est avec ravissement que je parcours ce sujet et essaye, analyse et décortique les solutions proposées par chacun.

Certaines solutions et astuces de programmation sont surprenantes, mais exploitent bien les avantages et structures de nos machines.
Quelle plaisir de voir qu'il y a toujours des gens qui savent s'en servir et que la communauté en comprend les subtilités.
Un patrimoine précieux à ne pas perdre à l'heure du tout nimportequoi numérique et automatique.

Gilles59 a écrit :Une version RPL qui permet de générer la formule originale (symbolique) de Viete avec la profondeur souhaitée :

Code : Tout sélectionner

«
 2 '2/√2'
 0 9 START 
   * LAST NIP {'√2' '√(2+√2)'} ↓MATCH  DROP 
 NEXT
 *
»
[...]
→NUM donne la valeur numérique
Malheureusement, cette version ne marche pas sur mon système RPL antédiluvien. Il n'y a pas de *NIP*, ni de *MATCH*


Voici donc une version pour HP-28S:

Code : Tout sélectionner

AVIETE:
1:               n
« 2 '2/√2'                                       @ Initialisation de la boucle
  2 4 ROLL START                                 @ Boucle de 2 à n (n est donc le nombre de multiplications de la formule)   
    * LAST                                       @ Effectue la multiplication et sauvegarde les arguments
    3 ROT DROP                                   @ Prépare l'opération suivante et effectue le 'NIP' afin de ne laisser que le second facteur dans la pile
    DUP2 EXGET                                   @ Extrait le contenu de la racine du dénominateur du second facteur tout en préservant la formule
    2 + √                                        @ Ajoute 2 et calcule la racine (alternativement 2 SWAP + √ permet d'obtenir une
                                                 @ formule identique à celle de Gilles59)
    EXSUB                                        @ Réinsère le contenu de la racine au dénominateur
  NEXT
  * »                                            @ Effectue la dernière multiplication.
1:  '2*(2/√2)*(2/√(√2+2…
On entre la profondeur souhaitée au niveau 1:
ON exécute le code AVIETE décrit ci-dessus
→NUM donne la valeur numérique

IL s'agit du même algorithme que celui proposé par Gilles, mais sans utiliser le *MATCHing* inutile car, à chaque itération, le second facteur est de la forme '2/√…'. Le contenu de la racine à modifier est donc à chaque fois à la position 3 de l'expression algébrique. Un simple 3 EXGET / 3 EXSUB peut donc être utilisé.


C'est curieux, j'ai programmé mon HP28S pendant plus de vingt ans sans jamais avoir utilisé les possibilités des instructions EXSUB ou OBGET afin de "formater" les expressions algébriques à façon.
Il a fallu que je découvre et pratique les MPO et ce forum pour qu'enfin je comprenne leur intérêt et exploite leur puissance.
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
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

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

Message par babaorhum »

Bravo Xerxes,

Le programme le plus court, en 16 octets sur une fx-180p - je ne compte pas les mémoires en ce qui me concerne (débat sans fin ...).

J'ai aussi une solution récursive, qui change un peu, en programmant les 2 fonctions suivantes sur ma TI-92 :

Code : Tout sélectionner

un(n)
Func
when (n=0, √(2), √(2+un(n-1)))
EndFunc

viete(n)
Func
when (n=0, 2, viete(n-1)*2/un(n-1))
EndFunc
C'est assez lent, j'obtiens viete(19) = 3,14159265357 en 7,5 secondes. Mais ca marche !
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2918
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm »

babaorhum a écrit :Le programme le plus court, en 16 octets sur une fx-180p - je ne compte pas les mémoires en ce qui me concerne (débat sans fin ...).
Si on ne compte pas les mémoires, il y a une solution en 14 octets sur HP-15C :wink:
Avatar du membre
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

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

Message par babaorhum »

C'est vrai zpalm ...
Il va falloir que Gilles59 fasse le tableau comparatif des solutions et là il y a du boulot !!! des solutions, il y en a pleins - C.Ret a raison , il est très riche en solutions et en machines ce MPO !
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

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

Message par gege »

Bonjour,
la TI92 peut ralentir quand elle calcule de façon symbolique.
Il suffit de mettre un point décimal après tous les 2 dans le programme pour calculer en mode "approximatif".
G.E.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2918
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm »

Pour changer, une version sur Canon F-73P, une machine rarement présente dans les MPOs (pour de bonnes raisons d'ailleurs).

Sur cette machine la programmation est limitée, pas d’instruction DSZ ou DSE, pas d’opération directe sur les mémoires en dehors du M+ sur le registre de mémoire indépendant, il faut tout calculer à la main. De plus les branchements sont limités à +9/-9 pas, il faut donc ruser et ici le retour au début de la boucle se fait en trois sauts : 8 pas en arrière sur le test X>0 -8 (8 pas et non 9 pour ne pas tomber au milieu de l’instruction STO 1), puis 9 pas en arrière avec un GOTO -9, puis enfin 7 pas en arrière avec un GOTO -7, les 2 GOTO intermédiaires étant précédés chacun d’un GOTO 1 pour les sauter lors de l’exécution normale de la séquence d’instructions. Les GOTO aux pas 14, 15 et 23, 24 ne sont donc là que pour pallier à cette limitation des branchements.

Au total on arrive à 34 pas plus 3 registres utilisés. La F-73P n’est pas un foudre de guerre : 9 RUN donne 3.141587725 au bout de 15 secondes.

Code : Tout sélectionner

01   STO
02    2
03   2
04   STO
05    1
06   ON/C
07   SM
08   2
09   M+
10   RM
11   SQRT
12   SM
13   /
14   GOTO 1
15   GOTO –7
16   RCL
17    1
18   RV
19   +
20   =
21   STO
22    1
23   GOTO 1
24   GOTO -9
25   RCL
26    2
27   -
28   1
29   =
30   STO
31    2
32   X>0 -8
33   RCL
34    1
PS: au passage une petite particularité de la F-73P c’est la présence d’un interrupteur ON/OFF en plus des touches ON/C et OFF. La différence? Contrairement à la touche OFF l’interrupteur coupe physiquement l’alimentation, on perd donc le contenu de la mémoire y compris la mémoire programme, mais la machine ne consomme alors plus rien, utile pour le stockage de longue durée mais dangereux si on l'actionne par mégarde...
PS2: pour le manuel de la F-73P voir ICI.
Répondre

Retourner vers « Tous les Pockets »