Je l'ai fait plus ou moins à la main et je trouve qu'il faut l'insérer entre la 8e et la 9e position avec une instabilité de 0.9556
Comme c'est du travail manuel, je me trompe certainement…
Modérateur : Politburo
Je l'ai fait plus ou moins à la main et je trouve qu'il faut l'insérer entre la 8e et la 9e position avec une instabilité de 0.9556
Malheureusement, ce n'est pas la réponse attendue; tu devrais faire comme nous et n'utiliser que des instruments vintages et te méfier de ce que l'on trouve sur le net ou que l'on voit sur YouTube !
Non, je ne pense pas, j'utilise pour ma part un petit code de quatre ligne en BASIC sur on HP-71B et aussi, pour illustrer, un "éclateur de nombre entiers" sur mon Commodore 8 bits dont voici une capture d'écran qui montre que Over-score a trouvé le bon résultat :Over_score a écrit : ↑09 mai 2022 16:58Je l'ai fait plus ou moins à la main et je trouve qu'il faut l'insérer entre la 8e et la 9e position avec une instabilité de 0.9556
Comme c'est du travail manuel, je me trompe certainement…
Voilà du bon matériel, mes gamins utilisent toujours leur Ti-83 avec laquelle ils ont passé leur Baccalauréat.
Code : Tout sélectionner
10 DESTROY ALL @ DELAY 0 @ INPUT N @ N$=STR$(N) @ T=80-13*SGN(PRIM(N))
20 FOR I=1 TO LEN(N$) @ FOR J=48 TO 57 @ X=VAL(N$[1,I-1]&CHR$(J)&N$[I+1]) @ IF N=X THEN 40
30 IF X<2 THEN C=C+1 ELSE IF PRIM(X) THEN C=C+1 ELSE P=P+1 @ DISP X
40 NEXT J @ NEXT I @ DISP USING "K,XB,K'c',K'p',DD.5D";N,T,C,P,C/(C+P) @ BEEP
[RUN]
? 30817_[END LINE]
31817
30517
30817 P43c2p .95556 "biiip"
Code : Tout sélectionner
PROGRAM:PREM
Ans→V
√(V→W
0→B:2→J
While J≤W and not(B
If 0=fPart(V/J
1→B
J+2→J
If J=4
3→J
End
PROGRAM:INST
Input X
seq(int(10fPart(X/10^(I+1))),I,int(log(X)),0,1→L₁
dim(L₁→N
0→C:0→T
For(I,1,dim(L₁
For(K,0,9
If K≠L₁(I
Then
L₁→L₃:K→L₃(I
sum(seq(10^(N-C)L₃(C),C,1,N,1
prgmPREM
If B
1+C→C
1+T→T
End
End
End
Disp C
Disp T-C
Disp C/T
Prgm
?30817
43
2
.9555555556
Done
Code : Tout sélectionner
inst(x)
Prgm
string(x)→x
0→p:0→t
For k,1,dim(x)
For i,0,9
If string(i)≠mid(x,k,1) Then
mid(x,1,k-1)&string(i)&mid(x,k+1)→s
If isPrime(expr(s)) Then
1+p→p
EndIf
1+t→t
EndIf
EndFor
EndFor
Disp t-p,p,approx(1-p/t)
EndPrgm
inst(30817)
43
2
.955556
Code : Tout sélectionner
10 INPUT "Nombre a tester:";M:N=M:GOSUB 500:O=C:H=0
20 B=1:FOR P=0TO INT LOG M:B=B*10
30 E=M-INT ((M-INT (M/B)*B)/B*10)*B/10:I=E
50 IF I<>MLET N=I:GOSUB 500:H=H+C
60 I=I+B/10:IF I<E+BTHEN 50
70 NEXT P
75 PRINT 9*P-H;H
80 IF OTHEN PRINT "Instab=";((9*P)-H)/(9*P):END
85 PRINT "Instab=";H/(9*P):END
500 R=INT SQR N:D=0:C=0
510 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
511 IF D>RTHEN RETURN
512 D=D+1:IF INT (N/D)*D=NLET C=1:RETURN
513 IF D>RTHEN RETURN
514 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
515 IF D>RTHEN RETURN
516 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
517 IF D>RTHEN RETURN
518 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
519 IF D>RTHEN RETURN
600 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
601 IF D>RTHEN RETURN
602 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
603 IF D>RTHEN RETURN
604 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
605 IF D>RTHEN RETURN
606 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
607 IF D>RTHEN RETURN
610 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
611 IF D>RTHEN RETURN
612 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
613 IF D>RTHEN RETURN
614 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
615 IF D>RTHEN RETURN
616 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
617 IF D>RTHEN RETURN
620 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
621 IF D>RTHEN RETURN
622 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
623 IF D>RTHEN RETURN
624 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
625 IF D>RTHEN RETURN
626 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
627 IF D>RTHEN RETURN
630 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
631 IF D>RTHEN RETURN
632 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
633 IF D>RTHEN RETURN
634 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
635 IF D>RTHEN RETURN
636 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
637 IF D>RTHEN RETURN
640 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
641 IF D>RTHEN RETURN
642 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
643 IF D>RTHEN RETURN
644 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
645 IF D>RTHEN RETURN
646 D=D+8:IF INT (N/D)*D=NLET C=1:RETURN
647 IF D>RTHEN RETURN
650 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
651 IF D>RTHEN RETURN
652 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
653 IF D>RTHEN RETURN
654 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
655 IF D>RTHEN RETURN
656 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
657 IF D>RTHEN RETURN
660 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
661 IF D>RTHEN RETURN
662 D=D+8:IF INT (N/D)*D=NLET C=1:RETURN
663 IF D>RTHEN RETURN
664 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
665 IF D>RTHEN RETURN
666 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
667 IF D>RTHEN RETURN
670 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
671 IF D>RTHEN RETURN
672 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
673 IF D>RTHEN RETURN
674 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
675 IF D>RTHEN RETURN
676 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
677 IF D>RTHEN RETURN
680 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
681 IF D>RTHEN RETURN
682 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
683 IF D>RTHEN RETURN
684 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
685 IF D>RTHEN RETURN
686 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
687 IF D>RTHEN RETURN
690 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
691 IF D>RTHEN RETURN
692 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
693 IF D>RTHEN RETURN
694 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
695 IF D>RTHEN RETURN
696 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
697 IF D>RTHEN RETURN
700 D=D+6:IF INT (N/D)*D=NLET C=1:RETURN
701 IF D>RTHEN RETURN
702 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
703 IF D>RTHEN RETURN
704 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
705 IF D>RTHEN RETURN
706 D=D+4:IF INT (N/D)*D=NLET C=1:RETURN
707 IF D>RTHEN RETURN
710 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
711 IF D>RTHEN RETURN
712 D=D+10:IF INT (N/D)*D=NLET C=1:RETURN
713 IF D>RTHEN RETURN
714 D=D+2:IF INT (N/D)*D=NLET C=1:RETURN
715 IF D>RTHEN RETURN
716 D=D+10:IF INT (N/D)*D=NLET C=1:RETURN
717 IF D>RTHEN RETURN
800 GOTO 600
Code : Tout sélectionner
Function Name Description Input Output Author Source
AINT Alpha Integer Part Number in X Appends Integer part Frits Ferwerda ML ROM
DECX Decrement X Number in X Number-1 in X Ross Cooling PPCJ V12 N12 p21
ASUB Alpha Substitute Y: position; X:Char Places char in position Zengrange ZENROM Manual
PRIME? Is X Prime? Number in X No: Divisor in X - Yes: none Jason Delooze PPCJ V11 N7 p30
X>=0? X>=0? Like X<0? Skips a line if false Ángel Martin SANDBOX Project
Code : Tout sélectionner
001 LBL "QDD"
002 STO 00 // R00: N
003 LOG
004 INT
005 0
006 STO 01 // Pi=0
007 STO 02 // Ci=0
008 X<>Y // nombre de digits de N
009 LBL 01 // boucle pour chaque digit de N
010 RCL 00
011 CLA
012 AINT // "N" dans Alpha
013 X<>Y
014 48.057 // Compteur de boucles
015 LBL 02 // Boucle de 0 à 9 (ASCII 48 à 57)
016 ASUB // Remplace le digit y de "N" par x
017 RCL 00 // N
018 ANUM // Valeur numérique du nombre en Alpha
019 -
020 X=0? // Si égal à N on ne le compte pas
021 GTO 03
022 X<> L
023 X=0?
024 GTO 03
025 PRIME? // Nombre premier?
026 ISG 01 // Pi+=1
027 ISG 02 // Ci+=1
028 LBL 03
029 RDN
030 ISG X
031 GTO 02 // Prochaine Valeur du digit courant
032 RDN
033 DECX
034 X>=0?
035 GTO 01 // Passe au digit de N suivant
036 RCL 02
037 R/S // Affiche Ci
038 RCL 01
039 R/S // Affiche Pi
040 RCL 02
041 +
042 / // Calcule Si
043 END // Fin du programme, affiche Si
A oui! Il y a pas mal de ligne au-delà de 90. c'est une bonne idée d'utiliser un séquence de facteur pseudo-premier pour cet exercice car les nombres intéressant à tester vont vite être assez grand.Over_score a écrit : ↑09 mai 2022 23:09 Sur Sharp PC-1500A (de 1982) en 49 secondes pour 30817
Les lignes 90 et au-delà sont pour le test de primalité.
zpalm a écrit : ↑09 mai 2022 23:14 Voici un programme sur HP-41CX (ou C/CV avec fonctions étendues) plus module Sandbox (dans un Clonix-D).
Pour N=30817 il retourne en 45" :
C= 43
P= 2
S= 0,9556
[...][...]Code : Tout sélectionner
Function Name Description Input Output Author Source AINT Alpha Integer Part Number in X Appends Integer part Frits Ferwerda ML ROM DECX Decrement X Number in X Number-1 in X Ross Cooling PPCJ V12 N12 p21 ASUB Alpha Substitute Y: position; X:Char Places char in position Zengrange ZENROM Manual PRIME? Is X Prime? Number in X No: Divisor in X - Yes: none Jason Delooze PPCJ V11 N7 p30 X>=0? X>=0? Like X<0? Skips a line if false Ángel Martin SANDBOX Project
Le programme en 43 pas et 3 registres (R00-R02):Code : Tout sélectionner
001 LBL "QDD" [...] 023 X=0? 024 GTO 03 025 PRIME? // Nombre premier? 026 ISG 01 // Pi+=1 027 ISG 02 // Ci+=1 [...][/quote] j'étudie ce programme avec beaucoup d'intérêt, hier encore, je cherchais (en vain) quel module utiliser pour disposer d'une fonction PRIME? J'imagine que le test x=0? avant l'appel de l'instruction PRIME? est necessaire car, comme la fonction PRIM() du modul JPC ROM du HP-71B, l'appel avec un argument égal à zéro pose problème. Par contre, j'adore l'astuce que constitue l'enchainement PRIME? ISG 01 ISG 02 !! Du grand art, comme toujours :)
Oui, il y a bien DATA, READ et RESTORE. Le programme est bel et bien beaucoup plus court, mais également plus lent !
Ah, oui, maintenant je me rappelle, j'ai fait la même constatation sur mon PC-1360. La lecture des DATA consomme du temps, j'avais aussi utilisé une version avec plein de ...D=4:GOSUB 500:D=2:GOSUB 500:D=4:GOSUB ... Les appels trop nombreux consomment aussi du temps et nuisent à l'efficacité globale.Over_score a écrit : ↑10 mai 2022 14:03Oui, il y a bien DATA, READ et RESTORE READ. Le programme est bel et bien beaucoup plus court, mais également plus lent !
La HP-41 Function Database est un bon outil pour retrouver une fonction dans un module.
Exactement, j'ai suis tombé sur ce problème en testant des nombres inférieurs à 10.
Le label qui suit a également son importance dans l’enchaînement de la séquence.
J'ai moi aussi modifié mon code pour SHARP PC-1360:
Code : Tout sélectionner
50:INPUT "N=";N:NN$= STR$ N,C=0,T=0: WAIT 0
52:FOR I=1 TO LEN NN$: FOR J=48 TO 57 :P= VAL ( LEFT$ (NN$,I-1)& CHR$ J& MID$ (NN$,I+1,9))
54:IF P<>N GOSUB 70:T=T+1,C=C+ SGN F: IF F=0 PRINT P;
56:NEXT J:NEXT I: P=N: GOSUB 70: PRINT
58:PRINT NN$;"("; STR$ F;")";C;T-C: PRINT C/T: BEEP 1:END
70:F=2,Q=P/F: IF Q= INT Q RETURN
72:F=3,Q=P/F: IF Q= INT Q RETURN
74:F=5,Q=P/F: IF Q= INT Q RETURN
76:F=7,Q=P/F: IF Q= INT Q RETURN
78:F=11,Q=P/F: IF Q= INT Q RETURN
79:IF F>Q LET F=0: RETURN
80:F=2+F,Q=P/F: IF Q= INT Q RETURN
82:F=4+F,Q=P/F: IF Q= INT Q RETURN
84:F=2+F,Q=P/F: IF Q= INT Q RETURN
86:F=4+F,Q=P/F: IF Q= INT Q RETURN
88:F=6+F,Q=P/F: IF Q= INT Q RETURN
90:F=2+F,Q=P/F: IF Q= INT Q RETURN
92:F=6+F,Q=P/F: IF Q= INT Q RETURN
94:F=4+F,Q=P/F: IF Q= INT Q RETURN
96:F=2+F,Q=P/F: IF Q= INT Q RETURN
98:F=4+F,Q=P/F: IF Q= INT Q RETURN
100:F=6+F,Q=P/F: IF Q= INT Q RETURN
102:F=6+F,Q=P/F: IF Q= INT Q RETURN
103:IF F>Q LET F=0: RETURN
104:F=2+F,Q=P/F: IF Q= INT Q RETURN
106:F=6+F,Q=P/F: IF Q= INT Q RETURN
108:F=4+F,Q=P/F: IF Q= INT Q RETURN
110:F=2+F,Q=P/F: IF Q= INT Q RETURN
112:F=6+F,Q=P/F: IF Q= INT Q RETURN
114:F=4+F,Q=P/F: IF Q= INT Q RETURN
116:F=6+F,Q=P/F: IF Q= INT Q RETURN
118:F=8+F,Q=P/F: IF Q= INT Q RETURN
120:F=4+F,Q=P/F: IF Q= INT Q RETURN
122:F=2+F,Q=P/F: IF Q= INT Q RETURN
124:F=4+F,Q=P/F: IF Q= INT Q RETURN
126:F=2+F,Q=P/F: IF Q= INT Q RETURN
127:IF F>Q LET F=0: RETURN
128:F=4+F,Q=P/F: IF Q= INT Q RETURN
130:F=8+F,Q=P/F: IF Q= INT Q RETURN
132:F=6+F,Q=P/F: IF Q= INT Q RETURN
134:F=4+F,Q=P/F: IF Q= INT Q RETURN
136:F=6+F,Q=P/F: IF Q= INT Q RETURN
138:F=2+F,Q=P/F: IF Q= INT Q RETURN
140:F=4+F,Q=P/F: IF Q= INT Q RETURN
142:F=6+F,Q=P/F: IF Q= INT Q RETURN
144:F=2+F,Q=P/F: IF Q= INT Q RETURN
146:F=6+F,Q=P/F: IF Q= INT Q RETURN
148:F=6+F,Q=P/F: IF Q= INT Q RETURN
150:F=4+F,Q=P/F: IF Q= INT Q RETURN
151:IF F>Q LET F=0: RETURN
152:F=2+F,Q=P/F: IF Q= INT Q RETURN
154:F=4+F,Q=P/F: IF Q= INT Q RETURN
156:F=6+F,Q=P/F: IF Q= INT Q RETURN
158:F=2+F,Q=P/F: IF Q= INT Q RETURN
160:F=6+F,Q=P/F: IF Q= INT Q RETURN
162:F=4+F,Q=P/F: IF Q= INT Q RETURN
164:F=2+F,Q=P/F: IF Q= INT Q RETURN
166:F=4+F,Q=P/F: IF Q= INT Q RETURN
168:F=2+F,Q=P/F: IF Q= INT Q RETURN
170:F=10+F,Q=P/F: IF Q= INT Q RETURN
172:F=2+F,Q=P/F: IF Q= INT Q RETURN
174:F=10+F,Q=P/F: IF Q= INT Q RETURN
176:GOTO 79
Code : Tout sélectionner
Q=P/F: IF Q= INT Q
Code : Tout sélectionner
IF INT (P/F)*F=P
J'ai tenté d'implémenter le test de primalité de Miller-Rabin : https://en.wikipedia.org/wiki/Miller%E2 ... s_of_bases. Ça marche, mais c'est encore pire en termes de temps d'exécution. Je pense que les nombres à tester sont (beaucoup) trop petits pour que cet algo soit "rentable".Schraf a écrit : ↑10 mai 2022 20:10 Une autre idée pour le test de primalité serait d'utiliser le théorème de Fermat. A part pour pour quelques exceptions (Nombres de Carmichael par exemple qui ne sont pas premiers mais qui passent ce test), ça permettrait (peut-être) d'avoir des temps d'exécutions plus rapides.
Ils en parlent à de nombreuses reprises dans la revue l'OP avec des programmes en BASIC + HP 41 + Ti 57:
C'est effectivement une très bonne idée, je viens de m'en rendre compte, mon PC-1360 résout 2666752421 en 35 secondes; d'après lui 2666752421 est un multiple de deux !?!Over_score a écrit : ↑10 mai 2022 20:11Ce type de construction pose un problème ! Imagine P=9876543211 et F=2
Q = P/F = 9876543211/2 = 4938271606 et pas 4938271605.5 (en tout cas, c'est comme ça sur PC-1500A) et dans ce cas Q=INT(Q) ce qui est faux.
C'est pour cela que j'ai utiliséCode : Tout sélectionner
IF INT (P/F)*F=P
Une autre source d'info est une autre Question Très simple d'un Dimanche après-midi.Schraf a écrit : ↑10 mai 2022 20:10 Une autre idée pour le test de primalité serait d'utiliser le théorème de Fermat. A part pour pour quelques exceptions (Nombres de Carmichael par exemple qui ne sont pas premiers mais qui passent ce test), ça permettrait (peut-être) d'avoir des temps d'exécutions plus rapides.
Ils en parlent à de nombreuses reprises dans la revue l'OP avec des programmes en BASIC + HP 41 + Ti 57: