[hp39gII] Simplificateur de racines carrées

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 de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2474
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: [hp39gII] Simplificateur de racines carrées

Message par C.Ret » 20 mars 2013 09:46

gege a écrit :Bonjour,
ok ça marche mais la fulgurante vitesse de la 39GII masque un peu le fait que l'algo est plutôt brut !
Très juste, et je m'en suis rendu compte uniquement en transcrivant mon code sur mon fidèle HP-28S.

En particulier pour les grands nombres, si la racine carrée est loin du plus grand diviseur, l'algo descend tout doucement (de 1 en 1) vers celui-ci.
Alors qu'en partant dans l'autre sens, les petits diviseur successifs sont atteints à la même vitesse (de 1 en 1), mais bien plus rapidement, car entre 30 et 87 il y a moins à parcourrir qu'entre 12345 et 789 !!
Remarquez qu'à part chercher les diviseurs, je ne vois pas mieux...
Oui, c'est le principe.
Par ailleurs, la plupart des nombres ont plus de petits diviseurs que de grands. Donc boucler en croissant est normalement plus efficace.
Ici 'normalement' veut dire, avec la très grande majorité des nombres à tester. En fait l'algorithme descendant n'est efficace que pour la minorité des nombre dans le plus grand diviseur est suffisamment proche de la racine carrée !
Argh
G.E. dit "schtroumpf grognon"
[/quote]
Moi j'aime pas bien les schtroumpfs qui schtroumpfent pas. Ou les Schadocks qui ne pompent pas ! :P

jxano a écrit :J'ai implanté ce type d'algo dans un petit programme de résolution de trinome, afin d'afficher Delta et les solutions le plus "académiquement" possible. La machine utilisée était un Sharp PC-1261, pas un foudre de guerre... Et avec une liste des premiers jusqu'à 30, ça suffit dans la quasi-totalité des cas.
Effectivement en se limitant aux nombres premiers, on doit pouvoir améliorer l'ascension vers les diviseurs.
Gilles59 a écrit : il y une comande sur la 39 qui sort tous les diviseur d'un nombre.... mais tu en fais quoi après ?
Le pb de commencer par les plus petits diviseurs, c'est que tu ne trouve pas la meilleure solution
IL faut combiner les diviseurs pour essayer de trouver des carrés parfaits et les sortir du radical.
Tout en combinant d'abord les grands diviseurs pour conserver une approche 'descendante'.
Stroumpf Grognon a écrit : Ben si, prenons 10647, on trouve les diviseurs 3, 3, 7, 13 et 13.
3 et 13 sont en double, donc la solution est 3 x 13, reste 7.
Donc rac(10647)=39 x rac(3).
G.E.
Voilà, la démarche 'descendante' est donc de sortir d'abord 13x13, puis 3x3. Mais bon, une fois la liste obtenue l'ordre de traitement n'a plus beaucoup d'importance (les nombres étant premiers).

Code : Tout sélectionner

ifactors(10647)  ---> [ 3 , 2   ,  7,1   , 13,2 ]          V(10647)
                                              ^______   13.V(63)
                                     ^___pass
                            ^_________________________  39.V(7)

//-------------------------------------------------------------------------------
EXPORT FSTRAC( X )
BEGIN
  LOCAL F:=SIGN(X),R:=ABS(X);
  LOCAL p,q,T:="√("+X+")=";

  LOCAL LF:=ifactors(R);
  FOR p FROM SIZE(LF) DOWNTO 2 STEP 2 DO
    q:=LF(p-1)^FLOOR(LF(p)/2);
    F:=F*q; R:=R/q/q;
  END;

IF (ABS(F)<>1) OR (R=F) THEN T:=T+ABS(F) END;
IF F<0 THEN T:=T+" i " END;
IF R≠1 THEN RETURN T+"√"+R;
          ELSE RETURN T;     END;
END;

Pour le mettre sur Hp-28S, ça va être un peu plus dur, la fonction prenant le plus de temps étant IFACTORS qui va être à créer de toutes pièces.

Bon en fait pas si dure que cela:

Code : Tout sélectionner

« DUP SIGN SWAP ABS           // Initie F et R 
  2                           // Initie premier facteur p
  DO 
    WHILE DUP2 SQ MOD NOT
    REPEAT
      ROT OVER *              // F <- F*p
      SWAP ROT OVER SQ /      // R <- R/p/p
      SWAP
    END
    NPRIME                    // facteur p suivant
  UNTIL DUP2 SQ < END         // arrêt si p² > R
  DROP
  2 ->ARRY                    // mise en forme résultat.
»
A chacun de composer (ou non sur les RPL plus récents) son NPRIME perso.

Bon sang pas facile de refaire du RPL après avoir décortiqué le PASCAL-like de la HP-39gii.
SHARP PC-1211+CE-121+CE-122 | Commodore 128D+Printer P-803+SD2iec | TI-57 LCD | HP-28S+HP82240A | TI-74 BASICalc | HP-41C+2mem+stat+IR | HP-15C | SHARP PC-1360+64Ko+CE-126 | HP Prime | TI-92 II | CASIO fx-602p+FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader | Sommaire des M.P.O. | Ma...dov'il sapone !.

"All science is either physics or stamp collecting. That which is not measurable is not science." - E. R.

Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1424
Inscription : 27 oct. 2010 20:46

Re: [hp39gII] Simplificateur de racines carrées

Message par Gilles59 » 20 mars 2013 22:28

C.Ret a écrit :...
Mais je préfère cette version, qui traite aussi les racines de nombres négatifs !

Code : Tout sélectionner

EXPORT RAC(X)
BEGIN
 LOCAL F:=SIGN(X), R:=ABS(X);
 LOCAL I:=1,Txt:="√("+X+")=";

 REPEAT
   IF R MOD I*I 
  THEN I:=I-1;
   ELSE F:=F*I; R:=R/I/I; I:=FLOOR(√R);
   END;
 UNTIL I<2;

 IF (ABS(F)<>1) OR (R=F) THEN Txt:=Txt+ABS(F) END;
 IF F<0 THEN Txt:=Txt+" i " END;
 IF R≠1 THEN Txt:=Txt+"√"+R END;
 RETURN Txt;
END;
C.ret, Eddie W. Shore souhaiterait publier ton prog sur son blog (en citant la source bien sur ...).
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+

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2474
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: [hp39gII] Simplificateur de racines carrées

Message par C.Ret » 20 mars 2013 23:52

OK, pas de souci, tout ce que je poste sur un forum est public.

Mias, ce n'est pas la version ultime:

Code : Tout sélectionner

EXPORT RAC(X)
BEGIN
 LOCAL F:=SIGN(X), R:=ABS(X);
 LOCAL I:=1,Txt:="√("+X+")=";

 REPEAT
   IF R MOD Q*Q 
  THEN I:=prevprime(I);
   ELSE F:=F*I; R:=R/I/I; I:=FLOOR(√R);
   END;
 UNTIL I<2;

 IF (ABS(F)<>1) OR (R=F) THEN Txt:=Txt+ABS(F) END;
 IF F<0 THEN Txt:=Txt+" i " END;
 IF R≠1 THEN Txt:=Txt+"√"+R END;
 RETURN Txt;
END;
ou encore plus 'compilé':

Code : Tout sélectionner

EXPORT RAC( X )
BEGIN
  LOCAL F:=SIGN(X),R:=ABS(X);
  LOCAL p,Q,T:="√("+X+")=";

  LOCAL LF:=ifactors(R);
  FOR p FROM 2 TO SIZE(LF) STEP 2 DO
    I:=LF(p-1)^FLOOR(LF(p)/2);
    F:=F*I; R:=R/I/I;
  END;

IF (ABS(F)<>1) OR (R=F) THEN T:=T+ABS(F) END;
IF F<0 THEN T:=T+" i " END;
IF R≠1 THEN T:=T+"√"+R END;
RETURN T;    
END;
Dernière édition par C.Ret le 23 mars 2013 10:02, édité 1 fois.
SHARP PC-1211+CE-121+CE-122 | Commodore 128D+Printer P-803+SD2iec | TI-57 LCD | HP-28S+HP82240A | TI-74 BASICalc | HP-41C+2mem+stat+IR | HP-15C | SHARP PC-1360+64Ko+CE-126 | HP Prime | TI-92 II | CASIO fx-602p+FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader | Sommaire des M.P.O. | Ma...dov'il sapone !.

"All science is either physics or stamp collecting. That which is not measurable is not science." - E. R.

Avatar de l’utilisateur
Paul Tergeist
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2417
Inscription : 15 oct. 2007 15:50
Localisation : 3ème planète après le soleil

Re: [hp39gII] Simplificateur de racines carrées

Message par Paul Tergeist » 21 mars 2013 11:41

C.Ret a écrit :OK, pas de souci, tout ce que je poste sur un forum est public.
C'est pas tombé dans l'oreille d'un sourd... parce que quand je créerai ma rubrique HP39Gii
sur mon petit site je risque de mettre également tes sources (en te citant ainsi que le forum bien sur).

Pour ta citation, elle me fait penser à celle d'un juge de New York a propos d'un dossier concernant Twitter:
"Ce qui est exprimé sur la place publique appartient à tout le monde". (traduction)

Répondre

Revenir vers « Tous les Pockets »