Misez p'tit Optimisez n°89 : Algorithme de Brent

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 : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par C.Ret »

Il y a peu, dprtl a posté sur le forum et sur son blog l'adaptation d'une méthode d'analyse numérique pour la recherche de racine d'une fonction.


Cela m'a rappelé plein de souvenirs et j'ai retrouver quelques lignes de code.
J'ai aussi dû me replonger dans quelques manuels et documents pour retrouver les méthodologies et modes opératoires que j'avais pourtant utilisés bien des fois aux époques où trouver les solutions de f(x)=0 se faisait à la main en traçant des courbes sur du papier millimétré.

A l'époque, je ne me souciais pas de l'efficacité ou de la convergence des méthodes numériques que j'employais; le simple fait de faire cela électroniquement sans se salir les doigts avec le crayon trop gras sur le papier millimétré au quadrillage trop glacé était un vrai avantage et un gain de temps indéniable.

Mais, aujourd'hui, nous sommes tous contraint à encore plus d'efficacité et comme tout se fait numériquement, il nous faut bien se soucier de la qualité de la méthode de recherche. Cela est vrai dans nombre de domaines des sciences et de la vie quotidienne et donc aussi pour la recherche des racines d'une fonction même si cela ne fait plus partie de notre quotidien.

C'est en cherchant à comparer différentes méthodes de recherche de racines pour f(x) que je me suis rendu compte que j'étais, pour certaines méthodes, bien incapable de produire un code efficace. Et donc le tableau de comparaison que je m'apprêtais à publier illustrait plus mes maladresses et imperfections à retranscrire les différents algorithmes, qu'à comparer, comme je le souhaitais initialement, les performances dédites méthodes.

Parmi tous les algorithmes dont mes retranscriptions sont incertaines, il y en a un qui en son sein regroupe plusieurs méthodes avec lequel je suis très fâché.


Le but de cet MPO est, si vous en accepter le défit, de proposer pour votre calculatrice ou pocket préféré le meilleurs code possible afin de rechercher la racine d'une fonction par la méthode de Brent dont je donne ci-dessous l'algorithme en français sous forme de pseudo-code :

mpo 89 Algorithme de Brent.gif
mpo 89 Algorithme de Brent.gif (44.62 Kio) Vu 10296 fois
Evidemment, je vous laisse le choix d'organiser votre code et d'utiliser les Entrés/Saisies/Sorties selon la méthode que vous jugerez la plus efficace ou la plus adaptée aux caractéristiques de votre matériel.


Par défaut, nous rechercherons, comme l'a fait dprtl, la racine de la fonction f(x) = x^3 - 2.x - 5 qui a l'avantage d'être continue et définie sur tout l'ensemble des réels et ne possède qu'une seule racine réelle.
Mais, rien n'interdit d'envisager d'autres fonctions afin d'illustrer les avantages ou vanter les performances de votre code.

Mais, comme à notre habitude, vos codes ainsi exposés risqueront fort d'être MPOïsés par le collège d'experts et d'astucieux que l'on rencontre sur ce forum. Mais c'est le but, avoué pour une fois, et j'espère ainsi pouvoir publier bientôt un tableau décent de comparaison des méthodes.


Voilà, c'est uniquement numérique et donc adapté à tout les types de calculatrices ou pockets, même les plus anciens ou les plus lents (comme l'HP-15C ou le SHARP PC-1211). Il n'y aura donc pas d'excuses. La vitesse ne compte pas, seuls le nombres d'étapes de calcul, le nombre de fois où f(x) est évaluée et le nombre de tests effectués seront pris en considération.


Mais je sais, dès que c'est un peu compliqué, certaines marques pourtant vantées comme champions du monde n'apparaitront pas des ces lignes …
Modifié en dernier par C.Ret le 18 févr. 2019 08:07, modifié 1 fois.
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
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7147
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par gege »

Bonjour,
Alors je sais que je triche mais ce problème a fait l'objet d'un article dans la Gazette et je tape sur Prime :
deg3(1,0,-1,-5) qui renvoie les trois solutions instantanément, la réelle étant 2.09455148154...
Pas beau de tricher ! :-)
G.E.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par C.Ret »

C'est pas moi qui va contester, la gruge dans les MPO c'est comme cela que j'ai commencé.

Bon, je regrette, j'aurais dû imposer une autre fonction. J'avais hésité à faire une liste de fonctions en m'inspirant de celles trouvées dans les différents Modes d'Emplois et Manuels d'Application présents sur les étagères de ma bibliothèques : mais je me rends compte que toutes peuvent être résolues par les lecteurs de la gazette !

f(x) = x³ - 2x²- x +2 (SHARP POCKET COMPUTER APPLICATION MANUAL - p.14 - "Root determining calculation accordingtoNewton's method" P4-A-7)
f(x) = x³ + x² - x -1 ( CASIO PROGRAM LIBRARY fx601p/fx-602p - p.25 - "Solving an equation by the midpoint method" )
f(x) = x³ - x² - x + 3 (HEWLETT PACKARD - Advanced Scientific Calculator HP-28S - p.98 - Chapitre 8: Résolution d'équation - Recherche du zéro d'une expression )

Bon, il me faut donc faire preuve d'un peu d'imagination: envisageons par exemple la fonction suivante :
mpo 89  - Zéros avec x en radiants.gif
mpo 89 - Zéros avec x en radiants.gif (5.21 Kio) Vu 10236 fois
Et tâchoins de trouver les valeurs de x (exprimé en radiants) pour lesquelles elle s'annule !
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
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 463
Enregistré le : 27 janv. 2013 00:26
Localisation : Strasbourg
Contact :

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par dprtl »

C.Ret a écrit : 06 févr. 2019 08:02 Par défaut, nous rechercherons, comme l'a fait dprtl, la racine de la fonction f(x) = x^3 - 2.x - 5 qui a l'avantage d'être continue et définie sur tout l'ensemble des réels et ne possède qu'une seule racine réelle.
Mais, rien n'interdit d'envisager d'autres fonctions afin d'illustrer les avantages ou vante les performances de votre code.

Cette fameuse équation cubique f(x) = x^3 - 2.x - 5 est celle qu'Isaac Newton avait choisi en exemple en 1671 dans son ouvrage "De metodis fluxionum et serierum infinitarum" (De la méthode des fluxions et des suites infinies). Il sera traduit en français par Georges-Louis Leclerc de Buffon 69 ans plus tard (livre numérisé par Google, gratuit) :

Image


Quant à l'implémentation de l'algo de Brent, elle n'est pas inatteignable mais il faut un peu de temps : une denrée rare !
Avatar du membre
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 463
Enregistré le : 27 janv. 2013 00:26
Localisation : Strasbourg
Contact :

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par dprtl »

Ce "M.P.O" est un peu complexe pour être implémenté dans un programme de petite taille. Aussi surprenant que cela puisse paraître, la Casio FX-7500G est la calculette qui enregistre les statistiques de consultation les plus élevées sur mon blog ! Je l'ai donc choisie pour cette implémentation de la méthode de Brent. Et même si je possède la machine physique avec son clavier à membrane plutôt désagréable, j'ai préféré développer mon programme avec l'excellent émulateur de Piotr Piatek. La version Windows tourne parfaitement sous Linux avec Wine.

Parmi les limitations de cette machine, il semblerait que l'on ne puisse utiliser que des labels entre 0 et 9. Ceci restreint évidemment la complexité acceptable pour chaque programme ou sous-programme (numérotés de 0 à 9 eux aussi). Les variables que j'ai utilisées sont les suivantes :
  • A, B, C, D, S : décrites dans l'algorithme ci-dessus
  • E : variable temporaire
  • F : f(A)
  • G : f(B)
  • H : f(C)
  • N : compteur d'appels à f() (optionnel)
  • M : mflag
  • T : f(S)
  • X : variable temporaire
  • Y : f(X)
Voici le code à saisir dans le "Prog 0" ; la fonction dont on recherche les zéros :

Image

Le "Prog 1" contient l'algorithme de Brent en 349 pas :

Image

Le "Prog 2" est la fonction d'échange de A avec B :

Image

Le "Prog 3" sert à l'affichage du message d'erreur :

Image

Voici enfin un exemple de résultat, obtenu en N=20 itérations (20 calculs de f(X) en réalité) :

Image

Si vous souhaitez faire d'autres tests sans tout retaper, voici mes fichiers ram.bin et register.bin que vous pourrez recopier dans le répertoire de l'émulateur.
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 109
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par OlidaBel »

Déterrage de MPO il y a quelques jours (merci C.Ret , ou pas ? :D ).

Ce bon vieux Brent m'a occupé plus longtemps que prévu, ce fut ardu.
Le choix de machine s'est porté sur (le clone suisse de) la HP-15C.
Devant l'ampleur des travaux je me suis fait aider par le simulateur de HP-15C (https://hp-15c.homepage.t-online.de/).
Les nombreux bugs à détecter, l'interprétation de l'algorithme, les astuces à trouver pour gérer les enchaînements de tests imbriqués en ne cédant pas trop facilement à une inflation de LBL, et puis la lisibilité, misère 8O !

a priori, ça tourne (lentement).
Pour la 2ème fonction à résoudre donnée par C.Ret, le programme atteint 237 pas.
Disclaimer Sans doute à optimiser plus tard pour enlever des GSB d'évaluation f(x) inutiles, et peut-être un bug restant car avec l'exemple wikipedia (https://fr.wikipedia.org/wiki/M%C3%A9th ... nt#Exemple), l'itération 6 ne colle pas avec mon programme, à éclaircir :geek: ...
(!) mode RAD.
12 LBL
13 Registres
3 flags
(!)
Soyez gentils, je reprogramme ces machines RPN HP épisodiquement depuis quelques mois après plus de 25 ans d'arrêt :)
Je ne sais pas joindre le programme binaire (.15c) ou en page html plus facile à lire.

Code : Tout sélectionner

# ------------------------------------------------------------------------------
# HEWLETT·PACKARD 15C Simulator program
# Created with version 4.3.00
# ------------------------------------------------------------------------------
#T:Brent Solver
#D:Configuration
#D:fonction à définir en LBL 0
#D:stocker epsilon dans R6
#D:
#D:Utilisation
#D:A ENTER B GTO A
#L A:Brent
#L0:fonction
#L2:Boucle principale
#L3:sortie  + affichage B clignotant
#L4:calcul de s quadratique
#L5:Test IF dichotomie
#L6:calcul s dichotomie
#L7:sortie du IF dichotomie et calcul f(s)
#L8:test et SWAP A et B
#L9:fin erreur
#L10:LBL .0 : routine d'accumulation de TRUE, pour gérer une série de OR
#L11:LBL .1 : ELSE du IF f(A)f(s)<0
#R0:a
#R1:b
#R2:f(a)
#R3:f(b)
#R4:temp
#R5:c
#R6:epsilon
#R7:f(c)
#R8:s
#R9:f(s)
#R10:R.0 = d
#R11:R.1 = accumulateur de TRUE pour IF Dichotomie
#R12:R.2 = compteur decrémental de TRUE dans 2e et 2e tests du IF dicho
#F0:mflag
#F1:Test IF quadratique
#F2:Test IF dicho
# ------------------------------------------------------------------------------

   000 {             } 
   001 {    42 21 11 } f LBL A
   002 {       44  1 } STO 1
   003 {          34 } x↔y
   004 {       44  0 } STO 0
   005 {       32  0 } GSB 0
   006 {       44  2 } STO 2
   007 {       45  1 } RCL 1
   008 {       32  0 } GSB 0
   009 {       44  3 } STO 3
   010 {    45 20  2 } RCL × 2
   011 {    43 30  3 } g TEST x≥0
   012 {       22  9 } GTO 9
   013 {       32  8 } GSB 8
   014 {       45  0 } RCL 0
   015 {       44  5 } STO 5
   016 {    43  4  0 } g SF 0
   017 {    42 21  2 } f LBL 2
   018 {    43  5  1 } g CF 1
   019 {       45  1 } RCL 1
   020 {    45 30  0 } RCL − 0
   021 {       43 16 } g ABS
   022 {       45  6 } RCL 6
   023 {    43 30  7 } g TEST x>y
   024 {       22  3 } GTO 3
   025 {       45  3 } RCL 3
   026 {       43 20 } g x=0
   027 {       22  3 } GTO 3
   028 {    43  5  2 } g CF 2
   029 {       45  5 } RCL 5
   030 {       32  0 } GSB 0
   031 {       44  7 } STO 7
   032 {       45  2 } RCL 2
   033 {    43 30  5 } g TEST x=y
   034 {    43  4  2 } g SF 2
   035 {       45  3 } RCL 3
   036 {       45  7 } RCL 7
   037 {    43 30  5 } g TEST x=y
   038 {    43  4  2 } g SF 2
   039 {       32  4 } GSB 4
   040 {       45  3 } RCL 3
   041 {    45 30  2 } RCL − 2
   042 {          15 } 1/x
   043 {       45  1 } RCL 1
   044 {    45 30  0 } RCL − 0
   045 {          20 } ×
   046 {    45 20  3 } RCL × 3
   047 {          16 } CHS
   048 {    45 40  1 } RCL + 1
   049 {       44  8 } STO 8
   050 {    42 21  5 } f LBL 5
   051 {    43  5  2 } g CF 2
   052 {           0 } 0
   053 {    44 48  1 } STO .1
   054 {       45  0 } RCL 0
   055 {           3 } 3
   056 {          20 } ×
   057 {    45 40  1 } RCL + 1
   058 {           4 } 4
   059 {          10 } ÷
   060 {       45  8 } RCL 8
   061 {    43 30  8 } g TEST x<y
   062 {    43  4  2 } g SF 2
   063 {       45  1 } RCL 1
   064 {       45  8 } RCL 8
   065 {    43 30  7 } g TEST x>y
   066 {    43  4  2 } g SF 2
   067 {    32 48  0 } GSB .0
   068 {    43  5  2 } g CF 2
   069 {           3 } 3
   070 {    44 48  2 } STO .2
   071 {       45  8 } RCL 8
   072 {    45 30  1 } RCL − 1
   073 {       43 16 } g ABS
   074 {       45  1 } RCL 1
   075 {    45 30  5 } RCL − 5
   076 {       43 16 } g ABS
   077 {           2 } 2
   078 {          10 } ÷
   079 {       43 10 } g x≤y
   080 { 42  5 48  2 } f DSE .2
   081 {    43  6  0 } g F? 0
   082 { 42  5 48  2 } f DSE .2
   083 {           1 } 1
   084 {    45 48  2 } RCL .2
   085 {    43 30  5 } g TEST x=y
   086 {    43  4  2 } g SF 2
   087 {    32 48  0 } GSB .0
   088 {    43  5  2 } g CF 2
   089 {           3 } 3
   090 {    44 48  2 } STO .2
   091 {       45  8 } RCL 8
   092 {    45 30  1 } RCL − 1
   093 {       43 16 } g ABS
   094 {       45  5 } RCL 5
   095 { 45 30 48  0 } RCL − .0
   096 {       43 16 } g ABS
   097 {           2 } 2
   098 {          10 } ÷
   099 {       43 10 } g x≤y
   100 { 42  5 48  2 } f DSE .2
   101 {    43  6  0 } g F? 0
   102 { 42  6 48  2 } f ISG .2
   103 {           2 } 2
   104 {    45 48  2 } RCL .2
   105 {    43 30  5 } g TEST x=y
   106 {    43  4  2 } g SF 2
   107 {    32 48  0 } GSB .0
   108 {    45 48  1 } RCL .1
   109 {    43 30  1 } g TEST x>0
   110 {       22  6 } GTO 6
   111 {    43  5  0 } g CF 0
   112 {       22  7 } GTO 7
   113 { 42 21 48  0 } f LBL .0
   114 {           1 } 1
   115 {    43  6  2 } g F? 2
   116 { 44 40 48  1 } STO + .1
   117 {       43 32 } g RTN
   118 {    42 21  6 } f LBL 6
   119 {       45  0 } RCL 0
   120 {    45 40  1 } RCL + 1
   121 {           2 } 2
   122 {          10 } ÷
   123 {       44  8 } STO 8
   124 {    43  4  0 } g SF 0
   125 {    42 21  7 } f LBL 7
   126 {       45  8 } RCL 8
   127 {       32  0 } GSB 0
   128 {       44  9 } STO 9
   129 {       45  5 } RCL 5
   130 {    44 48  0 } STO .0
   131 {       45  1 } RCL 1
   132 {       44  5 } STO 5
   133 {       45  3 } RCL 3
   134 {       44  7 } STO 7
   135 {       45  2 } RCL 2
   136 {    45 20  9 } RCL × 9
   137 {    43 30  2 } g TEST x<0
   138 {    22 48  1 } GTO .1
   139 {       45  8 } RCL 8
   140 {       44  0 } STO 0
   141 {       45  9 } RCL 9
   142 {       44  2 } STO 2
   143 { 42 21 48  3 } f LBL .3
   144 {       32  8 } GSB 8
   145 {       45  0 } RCL 0
   146 {       45  1 } RCL 1
   147 {       22  2 } GTO 2
   148 { 42 21 48  1 } f LBL .1
   149 {       45  8 } RCL 8
   150 {       44  1 } STO 1
   151 {       45  9 } RCL 9
   152 {       44  3 } STO 3
   153 {    22 48  3 } GTO .3
   154 {    42 21  0 } f LBL 0
   155 {          36 } ENTER
   156 {          36 } ENTER
   157 {          36 } ENTER
   158 {           5 } 5
   159 {          10 } ÷
   160 {          16 } CHS
   161 {          12 } eˣ
   162 {          34 } x↔y
   163 {          11 } √x̅
   164 {          24 } COS
   165 {          20 } ×
   166 {          34 } x↔y
   167 {           4 } 4
   168 {          40 } +
   169 {       43 11 } g x²
   170 {          20 } ×
   171 {          16 } CHS
   172 {           1 } 1
   173 {          40 } +
   174 {       43 32 } g RTN
   175 {    42 21  8 } f LBL 8
   176 {       45  2 } RCL 2
   177 {       43 16 } g ABS
   178 {       45  3 } RCL 3
   179 {       43 16 } g ABS
   180 {       43 10 } g x≤y
   181 {       43 32 } g RTN
   182 {       45  1 } RCL 1
   183 {       44  4 } STO 4
   184 {       45  0 } RCL 0
   185 {       44  1 } STO 1
   186 {       45  4 } RCL 4
   187 {       44  0 } STO 0
   188 {       45  3 } RCL 3
   189 {       44  4 } STO 4
   190 {       45  2 } RCL 2
   191 {       44  3 } STO 3
   192 {       45  4 } RCL 4
   193 {       44  2 } STO 2
   194 {       43 32 } g RTN
   195 {    42 21  9 } f LBL 9
   196 {    43  4  9 } g SF 9
   197 {       43 32 } g RTN
   198 {    42 21  3 } f LBL 3
   199 {       45  1 } RCL 1
   200 {    43  4  9 } g SF 9
   201 {       43 32 } g RTN
   202 {    42 21  4 } f LBL 4
   203 {    43  6  2 } g F? 2
   204 {       43 32 } g RTN
   205 {       45  2 } RCL 2
   206 {    45 30  3 } RCL − 3
   207 {       45  2 } RCL 2
   208 {    45 30  7 } RCL − 7
   209 {          20 } ×
   210 {          15 } 1/x
   211 {    45 20  0 } RCL × 0
   212 {    45 20  3 } RCL × 3
   213 {    45 20  7 } RCL × 7
   214 {       44  8 } STO 8
   215 {       45  3 } RCL 3
   216 {    45 30  2 } RCL − 2
   217 {       45  3 } RCL 3
   218 {    45 30  7 } RCL − 7
   219 {          20 } ×
   220 {          15 } 1/x
   221 {    45 20  1 } RCL × 1
   222 {    45 20  2 } RCL × 2
   223 {    45 20  7 } RCL × 7
   224 {    44 40  8 } STO + 8
   225 {       45  7 } RCL 7
   226 {    45 30  2 } RCL − 2
   227 {       45  7 } RCL 7
   228 {    45 30  3 } RCL − 3
   229 {          20 } ×
   230 {          15 } 1/x
   231 {    45 20  5 } RCL × 5
   232 {    45 20  2 } RCL × 2
   233 {    45 20  3 } RCL × 3
   234 {    44 40  8 } STO + 8
   235 {       45  8 } RCL 8
   236 {    43  4  1 } g SF 1
   237 {       22  5 } GTO 5

# ------------------------------------------------------------------------------
Défi RPN relevé, j'ai dû réfléchir différemment avec ce matériel pour m'en sortir :pirat: .
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par C.Ret »

OlidaBel a écrit : 09 févr. 2022 22:09Défi RPN relevé, j'ai dû réfléchir différemment avec ce matériel pour m'en sortir :pirat: .
Bien joué, c'est à cela que servent les MPO, certains y trouveront du plaisir à programmer leur machines préférées qu'ils connaissent par cœur, d'autre trouveront une excuse pour utiliser leur vieux clou délaissé depuis des décennies et d'autres vont essayer une monture encore nouvelle et farouche ...

Le but inavoué des MPO est que chacun y trouve du plaisir, à dompter les problèmes rencontrés et exposer les solutions ou astuces envisagés.

C'est pour cela qu'il n'y a pas de limite de temps et que certains MPO sont régulièrement, ou non déterrés à diverses occasions ou sous de futiles prétextes.


Pour ma part, je vais vite sortir mon HP-15C de sa léthargie et essayer ton code sur une vraie HP-15C bien lente, juste pour le plaisir de la faire "courir" et voir s'égrainer les solutions sur son display uniquement numérique.
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.
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 109
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par OlidaBel »

Pour voir chaque étape , et donc insérer un R/S ou PSE, p.ex. en 147 avant la fin de boucle et le GTO 2.
J'ai nettoyé l'un ou l'autre GSB 0, mais il reste l'étape 6, non conforme avec l'exemple wikipedia, nom de djuu.
(je crois que ça tourne autour du ISG, je vais regarder après le souper :ugeek: )

Tu comptes tout retaper ? Bonne chance ;-)

Code : Tout sélectionner

# ------------------------------------------------------------------------------
# HEWLETT·PACKARD 15C Simulator program
# Created with version 4.3.00
# ------------------------------------------------------------------------------
#T:Brent Solver
#D:Configuration
#D:fonction à définir en <span class="HP15CfKey">LBL</span> 0
#D:stocker epsilon dans R6
#D:
#D:Utilisation
#D:A ENTER B <span class="HP15CfKey">GTO</span>A
#D:
#L-1:Brent
#L0:fonction
#L2:Boucle principale
#L3:sortie  + affichage B
#L4:calcul de s quadratique
#L5:Test IF dichotomie
#L6:calcul s dichotomie
#L7:sortie du IF dichotomie et calcul f(s)
#L8:test et SWAP A et B
#L9:fin erreur
#L10:LBL .0 : routine d'accumulation de TRUE, pour gérer une serie de OR
#L11:LBL .1 : ELSE du IF f(A)f(s)<0
#R0:a
#R1:b
#R2:f(a)
#R3:f(b)
#R4:temp
#R5:c
#R6:epsilon
#R7:f(c)
#R8:s
#R9:f(s)
#R10:R.0 = d
#R11:R.1 = accumulateur de TRUE pour IF Dichotomioe
#R12:R.2 = compteur decrémental de TRUE dans 2e et 2e tests du IF dicho
#F0:mflag
#F1:Test IF quadratique
#F2:Test IF dicho
# ------------------------------------------------------------------------------

   000 {             } 
   001 {    42 21 11 } f LBL A
   002 {       44  1 } STO 1
   003 {          34 } x↔y
   004 {       44  0 } STO 0
   005 {       32  0 } GSB 0
   006 {       44  2 } STO 2
   007 {       45  1 } RCL 1
   008 {       32  0 } GSB 0
   009 {       44  3 } STO 3
   010 {    45 20  2 } RCL × 2
   011 {    43 30  3 } g TEST x≥0
   012 {       22  9 } GTO 9
   013 {       32  8 } GSB 8
   014 {       45  0 } RCL 0
   015 {       44  5 } STO 5
   016 {       45  2 } RCL 2
   017 {       44  7 } STO 7
   018 {    43  4  0 } g SF 0
   019 {    42 21  2 } f LBL 2
   020 {    43  5  1 } g CF 1
   021 {       45  1 } RCL 1
   022 {    45 30  0 } RCL − 0
   023 {       43 16 } g ABS
   024 {       45  6 } RCL 6
   025 {    43 30  7 } g TEST x>y
   026 {       22  3 } GTO 3
   027 {       45  3 } RCL 3
   028 {       43 20 } g x=0
   029 {       22  3 } GTO 3
   030 {    43  5  2 } g CF 2
   031 {       45  7 } RCL 7
   032 {       45  2 } RCL 2
   033 {    43 30  5 } g TEST x=y
   034 {    43  4  2 } g SF 2
   035 {       45  3 } RCL 3
   036 {       45  7 } RCL 7
   037 {    43 30  5 } g TEST x=y
   038 {    43  4  2 } g SF 2
   039 {       32  4 } GSB 4
   040 {       45  3 } RCL 3
   041 {    45 30  2 } RCL − 2
   042 {          15 } 1/x
   043 {       45  1 } RCL 1
   044 {    45 30  0 } RCL − 0
   045 {          20 } ×
   046 {    45 20  3 } RCL × 3
   047 {          16 } CHS
   048 {    45 40  1 } RCL + 1
   049 {       44  8 } STO 8
   050 {    42 21  5 } f LBL 5
   051 {    43  5  2 } g CF 2
   052 {           0 } 0
   053 {    44 48  1 } STO .1
   054 {       45  0 } RCL 0
   055 {           3 } 3
   056 {          20 } ×
   057 {    45 40  1 } RCL + 1
   058 {           4 } 4
   059 {          10 } ÷
   060 {       45  8 } RCL 8
   061 {    43 30  8 } g TEST x<y
   062 {    43  4  2 } g SF 2
   063 {       45  1 } RCL 1
   064 {       45  8 } RCL 8
   065 {    43 30  7 } g TEST x>y
   066 {    43  4  2 } g SF 2
   067 {    32 48  0 } GSB .0
   068 {    43  5  2 } g CF 2
   069 {           3 } 3
   070 {    44 48  2 } STO .2
   071 {       45  8 } RCL 8
   072 {    45 30  1 } RCL − 1
   073 {       43 16 } g ABS
   074 {       45  1 } RCL 1
   075 {    45 30  5 } RCL − 5
   076 {       43 16 } g ABS
   077 {           2 } 2
   078 {          10 } ÷
   079 {       43 10 } g x≤y
   080 { 42  5 48  2 } f DSE .2
   081 {    43  6  0 } g F? 0
   082 { 42  5 48  2 } f DSE .2
   083 {           1 } 1
   084 {    45 48  2 } RCL .2
   085 {    43 30  5 } g TEST x=y
   086 {    43  4  2 } g SF 2
   087 {    32 48  0 } GSB .0
   088 {    43  5  2 } g CF 2
   089 {           3 } 3
   090 {    44 48  2 } STO .2
   091 {       45  8 } RCL 8
   092 {    45 30  1 } RCL − 1
   093 {       43 16 } g ABS
   094 {       45  5 } RCL 5
   095 { 45 30 48  0 } RCL − .0
   096 {       43 16 } g ABS
   097 {           2 } 2
   098 {          10 } ÷
   099 {       43 10 } g x≤y
   100 { 42  5 48  2 } f DSE .2
   101 {    43  6  0 } g F? 0
   102 { 42  6 48  2 } f ISG .2
   103 {           2 } 2
   104 {    45 48  2 } RCL .2
   105 {    43 30  5 } g TEST x=y
   106 {    43  4  2 } g SF 2
   107 {    32 48  0 } GSB .0
   108 {    45 48  1 } RCL .1
   109 {    43 30  1 } g TEST x>0
   110 {       22  6 } GTO 6
   111 {    43  5  0 } g CF 0
   112 {       22  7 } GTO 7
   113 { 42 21 48  0 } f LBL .0
   114 {           1 } 1
   115 {    43  6  2 } g F? 2
   116 { 44 40 48  1 } STO + .1
   117 {       43 32 } g RTN
   118 {    42 21  6 } f LBL 6
   119 {       45  0 } RCL 0
   120 {    45 40  1 } RCL + 1
   121 {           2 } 2
   122 {          10 } ÷
   123 {       44  8 } STO 8
   124 {    43  4  0 } g SF 0
   125 {    42 21  7 } f LBL 7
   126 {       45  8 } RCL 8
   127 {       32  0 } GSB 0
   128 {       44  9 } STO 9
   129 {       45  5 } RCL 5
   130 {    44 48  0 } STO .0
   131 {       45  1 } RCL 1
   132 {       44  5 } STO 5
   133 {       45  3 } RCL 3
   134 {       44  7 } STO 7
   135 {       45  2 } RCL 2
   136 {    45 20  9 } RCL × 9
   137 {    43 30  2 } g TEST x<0
   138 {    22 48  1 } GTO .1
   139 {       45  8 } RCL 8
   140 {       44  0 } STO 0
   141 {       45  9 } RCL 9
   142 {       44  2 } STO 2
   143 { 42 21 48  3 } f LBL .3
   144 {       32  8 } GSB 8
   145 {       45  0 } RCL 0
   146 {       45  1 } RCL 1
   147 {       22  2 } GTO 2
   148 { 42 21 48  1 } f LBL .1
   149 {       45  8 } RCL 8
   150 {       44  1 } STO 1
   151 {       45  9 } RCL 9
   152 {       44  3 } STO 3
   153 {    22 48  3 } GTO .3
   154 {    42 21  0 } f LBL 0
   155 {          36 } ENTER
   156 {          36 } ENTER
   157 {          36 } ENTER
   158 {           3 } 3
   159 {          40 } +
   160 {          34 } x↔y
   161 {           1 } 1
   162 {          30 } −
   163 {       43 11 } g x²
   164 {          20 } ×
   165 {       43 32 } g RTN
   166 {    42 21  8 } f LBL 8
   167 {       45  2 } RCL 2
   168 {       43 16 } g ABS
   169 {       45  3 } RCL 3
   170 {       43 16 } g ABS
   171 {       43 10 } g x≤y
   172 {       43 32 } g RTN
   173 {       45  1 } RCL 1
   174 {       44  4 } STO 4
   175 {       45  0 } RCL 0
   176 {       44  1 } STO 1
   177 {       45  4 } RCL 4
   178 {       44  0 } STO 0
   179 {       45  3 } RCL 3
   180 {       44  4 } STO 4
   181 {       45  2 } RCL 2
   182 {       44  3 } STO 3
   183 {       45  4 } RCL 4
   184 {       44  2 } STO 2
   185 {       43 32 } g RTN
   186 {    42 21  9 } f LBL 9
   187 {    43  4  9 } g SF 9
   188 {       43 32 } g RTN
   189 {    42 21  3 } f LBL 3
   190 {       45  1 } RCL 1
   191 {    43  4  9 } g SF 9
   192 {       43 32 } g RTN
   193 {    42 21  4 } f LBL 4
   194 {    43  6  2 } g F? 2
   195 {       43 32 } g RTN
   196 {       45  2 } RCL 2
   197 {    45 30  3 } RCL − 3
   198 {       45  2 } RCL 2
   199 {    45 30  7 } RCL − 7
   200 {          20 } ×
   201 {          15 } 1/x
   202 {    45 20  0 } RCL × 0
   203 {    45 20  3 } RCL × 3
   204 {    45 20  7 } RCL × 7
   205 {       44  8 } STO 8
   206 {       45  3 } RCL 3
   207 {    45 30  2 } RCL − 2
   208 {       45  3 } RCL 3
   209 {    45 30  7 } RCL − 7
   210 {          20 } ×
   211 {          15 } 1/x
   212 {    45 20  1 } RCL × 1
   213 {    45 20  2 } RCL × 2
   214 {    45 20  7 } RCL × 7
   215 {    44 40  8 } STO + 8
   216 {       45  7 } RCL 7
   217 {    45 30  2 } RCL − 2
   218 {       45  7 } RCL 7
   219 {    45 30  3 } RCL − 3
   220 {          20 } ×
   221 {          15 } 1/x
   222 {    45 20  5 } RCL × 5
   223 {    45 20  2 } RCL × 2
   224 {    45 20  3 } RCL × 3
   225 {    44 40  8 } STO + 8
   226 {       45  8 } RCL 8
   227 {    43  4  1 } g SF 1
   228 {       22  5 } GTO 5

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

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par C.Ret »

OlidaBel a écrit : 10 févr. 2022 19:09Tu comptes tout retaper ? Bonne chance ;-)

Code : Tout sélectionner

… 228 full merged keystrokes …
Une ou deux bières bien fraîches vont aider mes doigt à saisir tout cela. Ca tombe bien, aujourd'hui à l'usine j'ai surtout fais travailler mes jambes. Au tours des doigts ce soir. :mrgreen: :) :lol: :D
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.
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 109
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par OlidaBel »

En début d'itération 6 le programme donne bien le point s grâce à l'IL (Sécante) s=−2,95064.
c'est dans les tests suivants que ça déconne et on retombe dans la dichotomie, ce qui ralentit la progression.
Là-dedans, quelque part, on a un True "si s n'est pas entre (3a + b)/4 et b ou (mflag est vrai et |s−b| ≥ |b−c| / 2) ou (mflag est faux et |s−b| ≥ |c−d| / 2) alors". :| on va y arriver.

Par contre sur le net l'algo de Brent n'est pas toujours décrit de cette façon.
Au fait le F1 ne sert à rien, c'était un cadavre : supprimé.

Code : Tout sélectionner

   000 {             } 
   001 {    42 21 11 } f LBL A
   002 {       44  1 } STO 1
   003 {          34 } x↔y
   004 {       44  0 } STO 0
   005 {       32  0 } GSB 0
   006 {       44  2 } STO 2
   007 {       45  1 } RCL 1
   008 {       32  0 } GSB 0
   009 {       44  3 } STO 3
   010 {    45 20  2 } RCL × 2
   011 {    43 30  3 } g TEST x≥0
   012 {       22  9 } GTO 9
   013 {       32  8 } GSB 8
   014 {       45  0 } RCL 0
   015 {       44  5 } STO 5
   016 {       45  2 } RCL 2
   017 {       44  7 } STO 7 
   018 {    43  4  0 } g SF 0
   019 {    42 21  2 } f LBL 2
   020 {    43  5  1 } g CF 1
   021 {       45  1 } RCL 1
   022 {    45 30  0 } RCL − 0
   023 {       43 16 } g ABS
   024 {       45  6 } RCL 6
   025 {    43 30  7 } g TEST x>y
   026 {       22  3 } GTO 3
   027 {       45  3 } RCL 3
   028 {       43 20 } g x=0
   029 {       22  3 } GTO 3
   030 {    43  5  2 } g CF 2
   031 {       45  7 } RCL 7
   032 {       45  2 } RCL 2
   033 {    43 30  5 } g TEST x=y
   034 {    43  4  2 } g SF 2
   035 {       45  3 } RCL 3
   036 {       45  7 } RCL 7
   037 {    43 30  5 } g TEST x=y
   038 {    43  4  2 } g SF 2
   039 {       32  4 } GSB 4
   040 {       45  3 } RCL 3
   041 {    45 30  2 } RCL − 2
   042 {          15 } 1/x
   043 {       45  1 } RCL 1
   044 {    45 30  0 } RCL − 0
   045 {          20 } ×
   046 {    45 20  3 } RCL × 3
   047 {          16 } CHS
   048 {    45 40  1 } RCL + 1
   049 {       44  8 } STO 8
   050 {    42 21  5 } f LBL 5
   051 {    43  5  2 } g CF 2
   052 {           0 } 0
   053 {    44 48  1 } STO .1
   054 {       45  0 } RCL 0
   055 {           3 } 3
   056 {          20 } ×
   057 {    45 40  1 } RCL + 1
   058 {           4 } 4
   059 {          10 } ÷
   060 {       45  8 } RCL 8
   061 {    43 30  8 } g TEST x<y
   062 {    43  4  2 } g SF 2
   063 {       45  1 } RCL 1
   064 {       45  8 } RCL 8
   065 {    43 30  7 } g TEST x>y
   066 {    43  4  2 } g SF 2
   067 {    32 48  0 } GSB .0
   068 {    43  5  2 } g CF 2
   069 {           3 } 3
   070 {    44 48  2 } STO .2
   071 {       45  8 } RCL 8
   072 {    45 30  1 } RCL − 1
   073 {       43 16 } g ABS
   074 {       45  1 } RCL 1
   075 {    45 30  5 } RCL − 5
   076 {       43 16 } g ABS
   077 {           2 } 2
   078 {          10 } ÷
   079 {       43 10 } g x≤y
   080 { 42  5 48  2 } f DSE .2
   081 {    43  6  0 } g F? 0
   082 { 42  5 48  2 } f DSE .2
   083 {           1 } 1
   084 {    45 48  2 } RCL .2
   085 {    43 30  5 } g TEST x=y
   086 {    43  4  2 } g SF 2
   087 {    32 48  0 } GSB .0
   088 {    43  5  2 } g CF 2
   089 {           3 } 3
   090 {    44 48  2 } STO .2
   091 {       45  8 } RCL 8
   092 {    45 30  1 } RCL − 1
   093 {       43 16 } g ABS
   094 {       45  5 } RCL 5
   095 { 45 30 48  0 } RCL − .0
   096 {       43 16 } g ABS
   097 {           2 } 2
   098 {          10 } ÷
   099 {       43 10 } g x≤y
   100 { 42  5 48  2 } f DSE .2
   101 {    43  6  0 } g F? 0
   102 { 42  6 48  2 } f ISG .2
   103 {           2 } 2
   104 {    45 48  2 } RCL .2
   105 {    43 30  5 } g TEST x=y
   106 {    43  4  2 } g SF 2
   107 {    32 48  0 } GSB .0
   108 {    45 48  1 } RCL .1
   109 {    43 30  1 } g TEST x>0
   110 {       22  6 } GTO 6
   111 {    43  5  0 } g CF 0
   112 {       22  7 } GTO 7
   113 { 42 21 48  0 } f LBL .0
   114 {           1 } 1
   115 {    43  6  2 } g F? 2
   116 { 44 40 48  1 } STO + .1
   117 {       43 32 } g RTN
   118 {    42 21  6 } f LBL 6
   119 {       45  0 } RCL 0
   120 {    45 40  1 } RCL + 1
   121 {           2 } 2
   122 {          10 } ÷
   123 {       44  8 } STO 8
   124 {    43  4  0 } g SF 0
   125 {    42 21  7 } f LBL 7
   126 {       45  8 } RCL 8
   127 {       32  0 } GSB 0
   128 {       44  9 } STO 9
   129 {       45  5 } RCL 5
   130 {    44 48  0 } STO .0
   131 {       45  1 } RCL 1
   132 {       44  5 } STO 5
   133 {       45  3 } RCL 3
   134 {       44  7 } STO 7
   135 {       45  2 } RCL 2
   136 {    45 20  9 } RCL × 9
   137 {    43 30  2 } g TEST x<0
   138 {    22 48  1 } GTO .1
   139 {       45  8 } RCL 8
   140 {       44  0 } STO 0
   141 {       45  9 } RCL 9
   142 {       44  2 } STO 2
   143 { 42 21 48  3 } f LBL .3
   144 {       32  8 } GSB 8
   145 {       45  0 } RCL 0
   146 {       45  1 } RCL 1
   147 {       22  2 } GTO 2
   148 { 42 21 48  1 } f LBL .1
   149 {       45  8 } RCL 8
   150 {       44  1 } STO 1
   151 {       45  9 } RCL 9
   152 {       44  3 } STO 3
   153 {    22 48  3 } GTO .3
   154 {    42 21  0 } f LBL 0
   155 {          36 } ENTER
   156 {          36 } ENTER
   157 {          36 } ENTER
   158 {           3 } 3
   159 {          40 } +
   160 {          34 } x↔y
   161 {           1 } 1
   162 {          30 } −
   163 {       43 11 } g x²
   164 {          20 } ×
   165 {       43 32 } g RTN
   166 {    42 21  8 } f LBL 8
   167 {       45  2 } RCL 2
   168 {       43 16 } g ABS
   169 {       45  3 } RCL 3
   170 {       43 16 } g ABS
   171 {       43 10 } g x≤y
   172 {       43 32 } g RTN
   173 {       45  1 } RCL 1
   174 {       44  4 } STO 4
   175 {       45  0 } RCL 0
   176 {       44  1 } STO 1
   177 {       45  4 } RCL 4
   178 {       44  0 } STO 0
   179 {       45  3 } RCL 3
   180 {       44  4 } STO 4
   181 {       45  2 } RCL 2
   182 {       44  3 } STO 3
   183 {       45  4 } RCL 4
   184 {       44  2 } STO 2
   185 {       43 32 } g RTN
   186 {    42 21  9 } f LBL 9
   187 {    43  4  9 } g SF 9
   188 {       43 32 } g RTN
   189 {    42 21  3 } f LBL 3
   190 {       45  1 } RCL 1
   191 {    43  4  9 } g SF 9
   192 {       43 32 } g RTN
   193 {    42 21  4 } f LBL 4
   194 {    43  6  2 } g F? 2
   195 {       43 32 } g RTN
   196 {       45  2 } RCL 2
   197 {    45 30  3 } RCL − 3
   198 {       45  2 } RCL 2
   199 {    45 30  7 } RCL − 7
   200 {          20 } ×
   201 {          15 } 1/x
   202 {    45 20  0 } RCL × 0
   203 {    45 20  3 } RCL × 3
   204 {    45 20  7 } RCL × 7
   205 {       44  8 } STO 8
   206 {       45  3 } RCL 3
   207 {    45 30  2 } RCL − 2
   208 {       45  3 } RCL 3
   209 {    45 30  7 } RCL − 7
   210 {          20 } ×
   211 {          15 } 1/x
   212 {    45 20  1 } RCL × 1
   213 {    45 20  2 } RCL × 2
   214 {    45 20  7 } RCL × 7
   215 {    44 40  8 } STO + 8
   216 {       45  7 } RCL 7
   217 {    45 30  2 } RCL − 2
   218 {       45  7 } RCL 7
   219 {    45 30  3 } RCL − 3
   220 {          20 } ×
   221 {          15 } 1/x
   222 {    45 20  5 } RCL × 5
   223 {    45 20  2 } RCL × 2
   224 {    45 20  3 } RCL × 3
   225 {    44 40  8 } STO + 8
   226 {       45  8 } RCL 8
   227 {    43  4  1 } g SF 1
   228 {       22  5 } GTO 5
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 109
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par OlidaBel »

Pour creuser plus loin les résultats de calcul, j'ai trouvé cette page qui donne plus d'informations sur le même exemple :
https://newtonexcelbach.com/2017/12/06/ ... -examples/

Un des derniers screenshots détaille toutes les valeurs en jeu au cours des itérations.
https://newtonexcelbach.files.wordpress ... ent1-6.png

La méthode de Brent est très sûre, mais quelle lenteur face au Solve intégré de la calculatrice...!
Et pour répondre à C.Ret, oui les MPO c'est purement du plaisir intellectuel, et un défi. Très étonnante pratique pour les proches qui nous voient tapoter sur ces petits claviers!
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 109
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par OlidaBel »

Brent encore débuggé, nettoyé, ce coup-ci les itérations s'enchaînent bien, ouf ! :D :slime: :slime: :geek: .

Listing html en couleur : https://www.mediafire.com/file/8dop2kil ... l.htm/file
Fichier binaire à charger dans l'émulateur HP-15C : https://www.mediafire.com/file/vc1czebg ... l.15c/file
Amusant de voir la convergence, PSE après PSE, surtout à la fin.

Le programme a été validé pour les 2 équations données plus haut, par contre je n'ai pas essayé le cas où la fonction est tangente à l'axe des X.
Vu la taille du code enflant, j'avais eu un warning donc besoin de céder quelques registres au profit des pas de programmes supplémentaires : état actuel : RCL Dim (i) = 14, au lieu des 21 standards.

Code : Tout sélectionner

   000 {             } 
   001 {    42 21 11 } f LBL A
   002 {       44  1 } STO 1
   003 {          34 } x↔y
   004 {       44  0 } STO 0
   005 {       44  5 } STO 5
   006 {       32  0 } GSB 0
   007 {       44  2 } STO 2
   008 {       44  7 } STO 7
   009 {       45  1 } RCL 1
   010 {       32  0 } GSB 0
   011 {       44  3 } STO 3
   012 {    45 20  2 } RCL × 2
   013 {    43 30  3 } g TEST x≥0
   014 {       22  9 } GTO 9
   015 {       32  8 } GSB 8
   016 {    43  4  0 } g SF 0
   017 {    42 21  2 } f LBL 2
   018 {       45  1 } RCL 1
   019 {       42 31 } f PSE
   020 {    45 30  0 } RCL − 0
   021 {       43 16 } g ABS
   022 {       45  6 } RCL 6
   023 {    43 30  7 } g TEST x>y
   024 {       22  3 } GTO 3
   025 {       45  3 } RCL 3
   026 {       43 20 } g x=0
   027 {       22  3 } GTO 3
   028 {    43  4  2 } g SF 2
   029 {       45  7 } RCL 7
   030 {       45  2 } RCL 2
   031 {    43 30  5 } g TEST x=y
   032 {    43  5  2 } g CF 2
   033 {       45  3 } RCL 3
   034 {       45  7 } RCL 7
   035 {    43 30  5 } g TEST x=y
   036 {    43  5  2 } g CF 2
   037 {    43  6  2 } g F? 2
   038 {       22  4 } GTO 4
   039 {       45  3 } RCL 3
   040 {    45 30  2 } RCL − 2
   041 {          15 } 1/x
   042 {       45  1 } RCL 1
   043 {    45 30  0 } RCL − 0
   044 {          20 } ×
   045 {    45 20  3 } RCL × 3
   046 {          16 } CHS
   047 {    45 40  1 } RCL + 1
   048 {       44  8 } STO 8
   049 {    42 21  5 } f LBL 5
   050 {    43  5  2 } g CF 2
   051 {           0 } 0
   052 {    44 48  1 } STO .1
   053 {       45  0 } RCL 0
   054 {           3 } 3
   055 {          20 } ×
   056 {    45 40  1 } RCL + 1
   057 {           4 } 4
   058 {          10 } ÷
   059 {       45  1 } RCL 1
   060 {       43 10 } g x≤y
   061 {          34 } x↔y
   062 {       45  8 } RCL 8
   063 {    43 30  7 } g TEST x>y
   064 {    43  4  2 } g SF 2
   065 {          34 } x↔y
   066 {          33 } R⬇
   067 {    43 30  8 } g TEST x<y
   068 {    43  4  2 } g SF 2
   069 {    32 48  0 } GSB .0
   070 {    43  5  2 } g CF 2
   071 {           3 } 3
   072 {    44 48  2 } STO .2
   073 {       45  8 } RCL 8
   074 {    45 30  1 } RCL − 1
   075 {       43 16 } g ABS
   076 {       45  1 } RCL 1
   077 {    45 30  5 } RCL − 5
   078 {       43 16 } g ABS
   079 {           2 } 2
   080 {          10 } ÷
   081 {       43 10 } g x≤y
   082 { 42  5 48  2 } f DSE .2
   083 {    43  6  0 } g F? 0
   084 { 42  5 48  2 } f DSE .2
   085 {           1 } 1
   086 {    45 48  2 } RCL .2
   087 {    43 30  5 } g TEST x=y
   088 {    43  4  2 } g SF 2
   089 {    32 48  0 } GSB .0
   090 {    43  5  2 } g CF 2
   091 {           3 } 3
   092 {    44 48  2 } STO .2
   093 {       45  8 } RCL 8
   094 {    45 30  1 } RCL − 1
   095 {       43 16 } g ABS
   096 {       45  5 } RCL 5
   097 { 45 30 48  0 } RCL − .0
   098 {       43 16 } g ABS
   099 {           2 } 2
   100 {          10 } ÷
   101 {       43 10 } g x≤y
   102 { 42  5 48  2 } f DSE .2
   103 {    43  6  0 } g F? 0
   104 { 42  6 48  2 } f ISG .2
   105 {       43 35 } g CLx
   106 {           2 } 2
   107 {    45 48  2 } RCL .2
   108 {    43 30  5 } g TEST x=y
   109 {    43  4  2 } g SF 2
   110 {    32 48  0 } GSB .0
   111 {    45 48  1 } RCL .1
   112 {    43 30  1 } g TEST x>0
   113 {       22  6 } GTO 6
   114 {    43  5  0 } g CF 0
   115 {       22  7 } GTO 7
   116 { 42 21 48  0 } f LBL .0
   117 {           1 } 1
   118 {    43  6  2 } g F? 2
   119 { 44 40 48  1 } STO + .1
   120 {       43 32 } g RTN
   121 {    42 21  6 } f LBL 6
   122 {       45  0 } RCL 0
   123 {    45 40  1 } RCL + 1
   124 {           2 } 2
   125 {          10 } ÷
   126 {       44  8 } STO 8
   127 {    43  4  0 } g SF 0
   128 {    42 21  7 } f LBL 7
   129 {       45  8 } RCL 8
   130 {       32  0 } GSB 0
   131 {       44  9 } STO 9
   132 {       45  5 } RCL 5
   133 {    44 48  0 } STO .0
   134 {       45  1 } RCL 1
   135 {       44  5 } STO 5
   136 {       45  3 } RCL 3
   137 {       44  7 } STO 7
   138 {       45  2 } RCL 2
   139 {    45 20  9 } RCL × 9
   140 {    43 30  2 } g TEST x<0
   141 {    22 48  1 } GTO .1
   142 {       45  8 } RCL 8
   143 {       44  0 } STO 0
   144 {       45  9 } RCL 9
   145 {       44  2 } STO 2
   146 { 42 21 48  3 } f LBL .3
   147 {       32  8 } GSB 8
   148 {       22  2 } GTO 2
   149 { 42 21 48  1 } f LBL .1
   150 {       45  8 } RCL 8
   151 {       44  1 } STO 1
   152 {       45  9 } RCL 9
   153 {       44  3 } STO 3
   154 {    22 48  3 } GTO .3
   155 {    42 21  0 } f LBL 0
   156 {          36 } ENTER
   157 {          36 } ENTER
   158 {          36 } ENTER
   159 {           3 } 3
   160 {          40 } +
   161 {          34 } x↔y
   162 {           1 } 1
   163 {          30 } −
   164 {       43 11 } g x²
   165 {          20 } ×
   166 {       43 32 } g RTN
   167 {    42 21  8 } f LBL 8
   168 {       45  2 } RCL 2
   169 {       43 16 } g ABS
   170 {       45  3 } RCL 3
   171 {       43 16 } g ABS
   172 {       43 10 } g x≤y
   173 {       43 32 } g RTN
   174 {       45  1 } RCL 1
   175 {       44  4 } STO 4
   176 {       45  0 } RCL 0
   177 {       44  1 } STO 1
   178 {       45  4 } RCL 4
   179 {       44  0 } STO 0
   180 {       45  3 } RCL 3
   181 {       44  4 } STO 4
   182 {       45  2 } RCL 2
   183 {       44  3 } STO 3
   184 {       45  4 } RCL 4
   185 {       44  2 } STO 2
   186 {       43 32 } g RTN
   187 {    42 21  9 } f LBL 9
   188 {    43  4  9 } g SF 9
   189 {       43 32 } g RTN
   190 {    42 21  3 } f LBL 3
   191 {       45  1 } RCL 1
   192 {       43 32 } g RTN
   193 {    42 21  4 } f LBL 4
   194 {       45  2 } RCL 2
   195 {    45 30  3 } RCL − 3
   196 {       45  2 } RCL 2
   197 {    45 30  7 } RCL − 7
   198 {          20 } ×
   199 {          15 } 1/x
   200 {    45 20  0 } RCL × 0
   201 {    45 20  3 } RCL × 3
   202 {    45 20  7 } RCL × 7
   203 {       44  8 } STO 8
   204 {       45  3 } RCL 3
   205 {    45 30  2 } RCL − 2
   206 {       45  3 } RCL 3
   207 {    45 30  7 } RCL − 7
   208 {          20 } ×
   209 {          15 } 1/x
   210 {    45 20  1 } RCL × 1
   211 {    45 20  2 } RCL × 2
   212 {    45 20  7 } RCL × 7
   213 {    44 40  8 } STO + 8
   214 {       45  7 } RCL 7
   215 {    45 30  2 } RCL − 2
   216 {       45  7 } RCL 7
   217 {    45 30  3 } RCL − 3
   218 {          20 } ×
   219 {          15 } 1/x
   220 {    45 20  5 } RCL × 5
   221 {    45 20  2 } RCL × 2
   222 {    45 20  3 } RCL × 3
   223 {    44 40  8 } STO + 8
   224 {       45  8 } RCL 8
   225 {       22  5 } GTO 5
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par C.Ret »

Là, je suis bien embêté pour taper ce dernier code d'Olidabel programme sur mon HP-15C. J'ai fini mon pack de six !

En plus, en étudiant très sérieusement son code, et en le comparant avec mes notes et ébauches de programme datant de la création de ce MPO, je me suis rendu compte que j'ai complètement raté le test "n'appartient pas à l'intervalle Image.

J'ai dû refaire quelques tronçons de code ! Ce qui m'a donné encore plus soif.

Voici à quoi ressemble la version corrigée pour SHARP PC-1211:
MPO 89 SHARP PC1211 (color).gif
MPO 89 SHARP PC1211 (color).gif (34.37 Kio) Vu 5753 fois
Les noms des variables sont ceux utilisés dans l'article Wikipedia.
MPO 89 SHARP PC1211 (variables).gif
MPO 89 SHARP PC1211 (variables).gif (16.6 Kio) Vu 5753 fois
Un exemple d'exécution avec les affichages transitoires de l'instruction PAUSE:
MPO 89 SHARP PC1211 (example).gif
MPO 89 SHARP PC1211 (example).gif (22.96 Kio) Vu 5753 fois
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.
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 109
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par OlidaBel »

Ah, chapeau C.Ret. , et belle présentation ! Maintenant, il faut repasser à l’eau minérale ! :D
Il donne soif ce Brent, c’est vrai :D
Je mesure les progrès de syntaxe et de lisibilité entre ces calculatrices, ces quelques jours à manipuler des GTO, des flags, des IF et des enchaînements de AND et OR avec les outils limités de la 15C, ça creuse…!
Je ne connais pas vraiment le Basic et encore moins sur ce vénérable Sharp. Les multiplications ne requièrent pas le symbole ‘*’ ?
C’est vraiment du luxe cette machine, elles sont pourtant à peu près de la même époque (1980).
Mon dernier bug tournait justement autour de ce test avec l’intervalle [(3A+B)/4…B] : j’avais négligé la situation où il faut le trier, le retourner.
Je me souviendrai de ce MPO, de mémoire je n’avais pas autant travaillé sur un programme RPN pour une « Voyager ».
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°89 : Algorithme de Brent

Message par C.Ret »

Oui, c'est bien cela j'aime le PC-1211 pour son BASIC très rudimentaire qui permet d'abuser de la multiplication implicite qui est l'opération prioritaire ce qui permet pas mal de raccourcis et d'astuces.
Autre point important, on peut ne pas terminer les expressions de calcul; les parenthèses manquantes et les opérations en suspens seront terminées automatiquement, ce qui fait encore gagner quelques pas de programme ... et aussi pas mal de temps. En effet, comme l'HP-15C original, le SHARP PC-1211 n'est pas rapide du tout.

En tout cas ce qui est sûr c'est que l'alphanumérique aide bien dans ce type de programme pour retranscrire les formules et expliciter les tests. En plus, comme pour les listing HTML de tes codes, j'ai mis un peu de couleur pour faciliter la lecture. Le contraste et saisissant entre un code RPN austère et difficile à décrypter et le BASIC qui se lit (presque) comme une (simple) page en anglais avec les formules ...

Du coup, c'est très certainement plus difficile et demande bien plus d'application et d'attention de mettre au point un tel algorithme sur une machine strictement numérique telle que l'HP-15C (que ce soit sur une vraie ou sur un simple émulateur). Il n'y a que ceux qui programment les HP-15C (et autres RPN) sur des environnements spéciaux qui n'ont aucun mérite...

Donc, bravo et chapeau d'avoir su tenir ce challenge :)
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.
Répondre

Retourner vers « Tous les Pockets »