Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[HS] Traduction d'un code Ubasic en VBA

12 réponses
Avatar
garnote
Bonjour, Bonjour

Mon obsession des nombres premiers me pousse
à vouloir traduire un code Ubasic en VBA.
Ce code permet de trouver le n ième nombre premier
et je veux le traduire correctemnt en espérant qu'il
soit plus rapide que ma mienne macro qui a pris
36 minutes pour trouver le millionième nombre premier
(15 485 863).

Voici le code Ubasic :

10 input N:clr time:'pnsmr.ub
20 S1=0:Z=2*(int(N*log(N))+1)
30 for K=1 to Z
40 S2=0
50 for J=2 to K
60 S3=0
70 for L=1 to J
80 S3=S3+J\L-(J-1)\L
90 next L
100 S2=S2+1+(2-S3)\J
110 next J
120 S1=S1+1-S2\N
130 next K
140 print "The prime";N;"-th is=";S1+1;
150 if S1+1<>prm(N) then print "Error":end
160 print "Verified y Right",time:end

Et voici ma tentative qui ne mène nulle part :

Sub pn()
n = 5
S1 = 0: Z = 2 * (Int(n * Log(n)) + 1)
For k = 1 To Z
S2 = 0
For j = 2 To k
S3 = 0
For L = 1 To j
S3 = S3 + j \ L - (j - 1) \ L
Next L
S2 = S2 + 1 + (2 - S3) \ j
Next j
S1 = S1 + 1 - S2 \ n
Next k
Debug.Print "The prime"; n; "-th is="; S1 + 1;
End Sub

Je n'ai pas tenu compte du clr time:'pnsmr.ub
de l'instruction 10 ni de l'instruction 150 dont
je ne comprends pas le prm(N).
Je n'ai pas tenu compte non plus de l'instruction 160.

Quelqu'un saurait-il me dépatouiller ?

Serge
P.-S. : J'espère que Trirème trouvera mon sujet un tantinet évocateur ;-)

10 réponses

1 2
Avatar
isabelle
bonjour Serge,

est ce que ça : 686555179 c'est la bonne réponse ?

si oui,

Sub vv()
10 N = 5
20 S1 = 0: Z = 2 * (Int(N * Log(N)) + 1)
30 For k = 1 To Z
40 S2 = 0
50 For j = 2 To k
60 S3 = 0
70 For L = 1 To j
80 S3 = S3 + j L - (j - 1) L
90 Next L
100 S2 = S2 + 1 + (2 - S3) j
110 Next j
120 S1 = S1 + 1 - S2 N
130 Next k
140 Debug.Print "The prime"; N; "-th is="; S1 + 1;
'150 If S1 + 1 <> prm(n) Then Print "Error": End
160 Debug.Print "Verified y Right", Time: End
End Sub

isabelle


Bonjour, Bonjour

Mon obsession des nombres premiers me pousse
à vouloir traduire un code Ubasic en VBA.
Ce code permet de trouver le n ième nombre premier
et je veux le traduire correctemnt en espérant qu'il
soit plus rapide que ma mienne macro qui a pris
36 minutes pour trouver le millionième nombre premier
(15 485 863).

Voici le code Ubasic :

10 input N:clr time:'pnsmr.ub
20 S1=0:Z=2*(int(N*log(N))+1)
30 for K=1 to Z
40 S2=0
50 for J=2 to K
60 S3=0
70 for L=1 to J
80 S3=S3+JL-(J-1)L
90 next L
100 S2=S2+1+(2-S3)J
110 next J
120 S1=S1+1-S2N
130 next K
140 print "The prime";N;"-th is=";S1+1;
150 if S1+1<>prm(N) then print "Error":end
160 print "Verified y Right",time:end

Et voici ma tentative qui ne mène nulle part :

Sub pn()
n = 5
S1 = 0: Z = 2 * (Int(n * Log(n)) + 1)
For k = 1 To Z
S2 = 0
For j = 2 To k
S3 = 0
For L = 1 To j
S3 = S3 + j L - (j - 1) L
Next L
S2 = S2 + 1 + (2 - S3) j
Next j
S1 = S1 + 1 - S2 n
Next k
Debug.Print "The prime"; n; "-th is="; S1 + 1;
End Sub

Je n'ai pas tenu compte du clr time:'pnsmr.ub
de l'instruction 10 ni de l'instruction 150 dont
je ne comprends pas le prm(N).
Je n'ai pas tenu compte non plus de l'instruction 160.

Quelqu'un saurait-il me dépatouiller ?

Serge
P.-S. : J'espère que Trirème trouvera mon sujet un tantinet évocateur ;-)









Avatar
garnote
Bonjour Isabelle,

Où as-tu déniché ce 686555179 ? ;-)
No comprendo.
Pour N=5, on devrait obtenir 11.

Température splendide à Québec
Bonne journée

Serge




"isabelle" a écrit dans le message de news:
bonjour Serge,

est ce que ça : 686555179 c'est la bonne réponse ?

si oui,

Sub vv()
10 N = 5
20 S1 = 0: Z = 2 * (Int(N * Log(N)) + 1)
30 For k = 1 To Z
40 S2 = 0
50 For j = 2 To k
60 S3 = 0
70 For L = 1 To j
80 S3 = S3 + j L - (j - 1) L
90 Next L
100 S2 = S2 + 1 + (2 - S3) j
110 Next j
120 S1 = S1 + 1 - S2 N
130 Next k
140 Debug.Print "The prime"; N; "-th is="; S1 + 1;
'150 If S1 + 1 <> prm(n) Then Print "Error": End
160 Debug.Print "Verified y Right", Time: End
End Sub

isabelle


Bonjour, Bonjour

Mon obsession des nombres premiers me pousse
à vouloir traduire un code Ubasic en VBA.
Ce code permet de trouver le n ième nombre premier
et je veux le traduire correctemnt en espérant qu'il
soit plus rapide que ma mienne macro qui a pris
36 minutes pour trouver le millionième nombre premier
(15 485 863).

Voici le code Ubasic :

10 input N:clr time:'pnsmr.ub
20 S1=0:Z=2*(int(N*log(N))+1)
30 for K=1 to Z
40 S2=0
50 for J=2 to K
60 S3=0
70 for L=1 to J
80 S3=S3+JL-(J-1)L
90 next L
100 S2=S2+1+(2-S3)J
110 next J
120 S1=S1+1-S2N
130 next K
140 print "The prime";N;"-th is=";S1+1;
150 if S1+1<>prm(N) then print "Error":end
160 print "Verified y Right",time:end

Et voici ma tentative qui ne mène nulle part :

Sub pn()
n = 5
S1 = 0: Z = 2 * (Int(n * Log(n)) + 1)
For k = 1 To Z
S2 = 0
For j = 2 To k
S3 = 0
For L = 1 To j
S3 = S3 + j L - (j - 1) L
Next L
S2 = S2 + 1 + (2 - S3) j
Next j
S1 = S1 + 1 - S2 n
Next k
Debug.Print "The prime"; n; "-th is="; S1 + 1;
End Sub

Je n'ai pas tenu compte du clr time:'pnsmr.ub
de l'instruction 10 ni de l'instruction 150 dont
je ne comprends pas le prm(N).
Je n'ai pas tenu compte non plus de l'instruction 160.

Quelqu'un saurait-il me dépatouiller ?

Serge
P.-S. : J'espère que Trirème trouvera mon sujet un tantinet évocateur ;-)










Avatar
isabelle
Température splendide à Québec


ici aussi, septembre commence très bien,

Où as-tu déniché ce 686555179 ? ;-)


dans la fenêtre débog, mais c'était une erreur,


Pour N=5, on devrait obtenir 11.


comme ca, j'obtiens 11

Sub nn()
10 N = 5
20 S1 = 0: Z = 2 * (Int(N * Log(N)) + 1)
30 For k = 1 To Z
40 S2 = 0
50 For j = 2 To k
60 S3 = 0
70 For L = 1 To j
80 S3 = S3 + j L - (j - 1) L
90 Next L
100 S2 = S2 + 1 + (2 - S3) j
110 Next j
120 S1 = S1 + 1 - S2 N
130 Next k
160 Debug.Print "Verified y Right", S1 + S2
End Sub


isabelle

Avatar
garnote
Isabelle,

Mais pour d'autres valeurs de n, ça n'aboutit pas ;-(
Voici la macro que j'utilise présentement pour trouver
le n ième nombre premier.
1 minute 10 pour trouver le 100 000 ième
36 minutes pour trouver le millionième.
Ta machine fait-elle mieux ?

Serge

Sub Nombre_Premier()
'Trouve le n ième nombre premier
Dim n As Long, i As Long, r As Long
n = Application.InputBox("Entrer le rang du nombre premier désiré.", _
" Le n ième nombre premier", 100, Type:=1)
If Int(n) <> n Or n < 1 Then Exit Sub
t1 = Time
Do Until i = n
r = r + 1
If EstPremier(r) = "oui" Then i = i + 1
Loop
MsgBox Format(r, "#,##0") & vbNewLine & Format(Time - t1, "hh:mm:ss")
End Sub

Function EstPremier(n As Long) As String
'Cette fonction permet de savoir si
'un nombre entier est premier ou pas.
Dim i As Long, d As Long, p As Boolean
Dim r As Long
If n = 1 Then
EstPremier = "non"
Exit Function
End If
If n = 2 Or n = 3 Then
EstPremier = "oui"
Exit Function
End If
d = 2
p = True
r = n Mod d
If r = 0 Then
p = False
Else
d = d + 1
r = n Mod d
End If
If r = 0 Then
p = False
Else
d = d + 2
i = 1
End If
Do While d ^ 2 <= n And p
r = n Mod d
If r = 0 Then
p = False
ElseIf i Mod 2 <> 0 Then
i = i + 1
d = d + 2
Else
i = i + 1
d = d + 4
End If
Loop
If p Then EstPremier = "oui" Else EstPremier = "non"
End Function









"isabelle" a écrit dans le message de news: %


Température splendide à Québec


ici aussi, septembre commence très bien,

Où as-tu déniché ce 686555179 ? ;-)


dans la fenêtre débog, mais c'était une erreur,


Pour N=5, on devrait obtenir 11.


comme ca, j'obtiens 11

Sub nn()
10 N = 5
20 S1 = 0: Z = 2 * (Int(N * Log(N)) + 1)
30 For k = 1 To Z
40 S2 = 0
50 For j = 2 To k
60 S3 = 0
70 For L = 1 To j
80 S3 = S3 + j L - (j - 1) L
90 Next L
100 S2 = S2 + 1 + (2 - S3) j
110 Next j
120 S1 = S1 + 1 - S2 N
130 Next k
160 Debug.Print "Verified y Right", S1 + S2
End Sub


isabelle



Avatar
isabelle
c'est pas bon Serge, à n résultat: -61 au lieu de 71

isabelle(ps/ à n0 la tienne est plus rapide et exact)
Avatar
isabelle
rererebonjour Serge,

comme ça, j'obtiens un Temps d'exécution de 23 sec. ( may be it's the becanne fault)

Sub Liste_Premiers()
'Donne la liste des n premiers nombres premiers
Dim n As Long, i As Long, k As Long
Dim L()
d = Time
n = 100000
If Int(n) <> n Or n < 1 Then Exit Sub
ReDim L(1 To n, 1 To 2)
Do Until k = n
i = i + 1
If EstPremier(i) = "oui" Then
k = k + 1
L(k, 1) = k
L(k, 2) = i
End If
Loop
MsgBox "Temps d'exécution: " & Format(Time - d, "hh:mm:ss") & Chr(10) & L(n, UBound(L, 2))
End Sub

isabelle


Isabelle,

Mais pour d'autres valeurs de n, ça n'aboutit pas ;-(
Voici la macro que j'utilise présentement pour trouver
le n ième nombre premier.
1 minute 10 pour trouver le 100 000 ième
36 minutes pour trouver le millionième.
Ta machine fait-elle mieux ?

Serge

Sub Nombre_Premier()
'Trouve le n ième nombre premier
Dim n As Long, i As Long, r As Long
n = Application.InputBox("Entrer le rang du nombre premier désiré.", _
" Le n ième nombre premier", 100, Type:=1)
If Int(n) <> n Or n < 1 Then Exit Sub
t1 = Time
Do Until i = n
r = r + 1
If EstPremier(r) = "oui" Then i = i + 1
Loop
MsgBox Format(r, "#,##0") & vbNewLine & Format(Time - t1, "hh:mm:ss")
End Sub

Function EstPremier(n As Long) As String
'Cette fonction permet de savoir si
'un nombre entier est premier ou pas.
Dim i As Long, d As Long, p As Boolean
Dim r As Long
If n = 1 Then
EstPremier = "non"
Exit Function
End If
If n = 2 Or n = 3 Then
EstPremier = "oui"
Exit Function
End If
d = 2
p = True
r = n Mod d
If r = 0 Then
p = False
Else
d = d + 1
r = n Mod d
End If
If r = 0 Then
p = False
Else
d = d + 2
i = 1
End If
Do While d ^ 2 <= n And p
r = n Mod d
If r = 0 Then
p = False
ElseIf i Mod 2 <> 0 Then
i = i + 1
d = d + 2
Else
i = i + 1
d = d + 4
End If
Loop
If p Then EstPremier = "oui" Else EstPremier = "non"
End Function









"isabelle" a écrit dans le message de news: %



Température splendide à Québec


ici aussi, septembre commence très bien,


Où as-tu déniché ce 686555179 ? ;-)


dans la fenêtre débog, mais c'était une erreur,



Pour N=5, on devrait obtenir 11.


comme ca, j'obtiens 11

Sub nn()
10 N = 5
20 S1 = 0: Z = 2 * (Int(N * Log(N)) + 1)
30 For k = 1 To Z
40 S2 = 0
50 For j = 2 To k
60 S3 = 0
70 For L = 1 To j
80 S3 = S3 + j L - (j - 1) L
90 Next L
100 S2 = S2 + 1 + (2 - S3) j
110 Next j
120 S1 = S1 + 1 - S2 N
130 Next k
160 Debug.Print "Verified y Right", S1 + S2
End Sub


isabelle








Avatar
isabelle
et pour n=1,000,000
np485863
temps = 00:11:45

isabelle


rererebonjour Serge,

comme ça, j'obtiens un Temps d'exécution de 23 sec. ( may be it's the
becanne fault)

Sub Liste_Premiers()
'Donne la liste des n premiers nombres premiers
Dim n As Long, i As Long, k As Long
Dim L()
d = Time
n = 100000
If Int(n) <> n Or n < 1 Then Exit Sub
ReDim L(1 To n, 1 To 2)
Do Until k = n
i = i + 1
If EstPremier(i) = "oui" Then
k = k + 1
L(k, 1) = k
L(k, 2) = i
End If
Loop
MsgBox "Temps d'exécution: " & Format(Time - d, "hh:mm:ss") & Chr(10)
& L(n, UBound(L, 2))
End Sub

isabelle


Isabelle,

Mais pour d'autres valeurs de n, ça n'aboutit pas ;-(
Voici la macro que j'utilise présentement pour trouver
le n ième nombre premier.
1 minute 10 pour trouver le 100 000 ième
36 minutes pour trouver le millionième.
Ta machine fait-elle mieux ?

Serge

Sub Nombre_Premier()
'Trouve le n ième nombre premier
Dim n As Long, i As Long, r As Long
n = Application.InputBox("Entrer le rang du nombre premier
désiré.", _
" Le n ième nombre premier", 100, Type:=1)
If Int(n) <> n Or n < 1 Then Exit Sub
t1 = Time
Do Until i = n
r = r + 1
If EstPremier(r) = "oui" Then i = i + 1
Loop
MsgBox Format(r, "#,##0") & vbNewLine & Format(Time - t1, "hh:mm:ss")
End Sub

Function EstPremier(n As Long) As String
'Cette fonction permet de savoir si
'un nombre entier est premier ou pas.
Dim i As Long, d As Long, p As Boolean
Dim r As Long
If n = 1 Then
EstPremier = "non"
Exit Function
End If
If n = 2 Or n = 3 Then
EstPremier = "oui"
Exit Function
End If
d = 2
p = True
r = n Mod d
If r = 0 Then
p = False
Else
d = d + 1
r = n Mod d
End If
If r = 0 Then
p = False
Else
d = d + 2
i = 1
End If
Do While d ^ 2 <= n And p
r = n Mod d
If r = 0 Then
p = False
ElseIf i Mod 2 <> 0 Then
i = i + 1
d = d + 2
Else
i = i + 1
d = d + 4
End If
Loop
If p Then EstPremier = "oui" Else EstPremier = "non"
End Function









"isabelle" a écrit dans le message de news:
%



Température splendide à Québec



ici aussi, septembre commence très bien,


Où as-tu déniché ce 686555179 ? ;-)



dans la fenêtre débog, mais c'était une erreur,



Pour N=5, on devrait obtenir 11.



comme ca, j'obtiens 11

Sub nn()
10 N = 5
20 S1 = 0: Z = 2 * (Int(N * Log(N)) + 1)
30 For k = 1 To Z
40 S2 = 0
50 For j = 2 To k
60 S3 = 0
70 For L = 1 To j
80 S3 = S3 + j L - (j - 1) L
90 Next L
100 S2 = S2 + 1 + (2 - S3) j
110 Next j
120 S1 = S1 + 1 - S2 N
130 Next k
160 Debug.Print "Verified y Right", S1 + S2
End Sub


isabelle











Avatar
isabelle
je vais l'exécuter ce soir avec n = 10 ^ 9 on verra le résultat demain matin,

isabelle


et pour n=1,000,000
np485863
temps = 00:11:45

isabelle


rererebonjour Serge,

comme ça, j'obtiens un Temps d'exécution de 23 sec. ( may be it's the
becanne fault)

Sub Liste_Premiers()
'Donne la liste des n premiers nombres premiers
Dim n As Long, i As Long, k As Long
Dim L()
d = Time
n = 100000
If Int(n) <> n Or n < 1 Then Exit Sub
ReDim L(1 To n, 1 To 2)
Do Until k = n
i = i + 1
If EstPremier(i) = "oui" Then
k = k + 1
L(k, 1) = k
L(k, 2) = i
End If
Loop
MsgBox "Temps d'exécution: " & Format(Time - d, "hh:mm:ss") &
Chr(10) & L(n, UBound(L, 2))
End Sub

isabelle


Isabelle,

Mais pour d'autres valeurs de n, ça n'aboutit pas ;-(
Voici la macro que j'utilise présentement pour trouver
le n ième nombre premier.
1 minute 10 pour trouver le 100 000 ième
36 minutes pour trouver le millionième.
Ta machine fait-elle mieux ?

Serge

Sub Nombre_Premier()
'Trouve le n ième nombre premier
Dim n As Long, i As Long, r As Long
n = Application.InputBox("Entrer le rang du nombre premier
désiré.", _
" Le n ième nombre premier", 100, Type:=1)
If Int(n) <> n Or n < 1 Then Exit Sub
t1 = Time
Do Until i = n
r = r + 1
If EstPremier(r) = "oui" Then i = i + 1
Loop
MsgBox Format(r, "#,##0") & vbNewLine & Format(Time - t1,
"hh:mm:ss")
End Sub

Function EstPremier(n As Long) As String
'Cette fonction permet de savoir si
'un nombre entier est premier ou pas.
Dim i As Long, d As Long, p As Boolean
Dim r As Long
If n = 1 Then
EstPremier = "non"
Exit Function
End If
If n = 2 Or n = 3 Then
EstPremier = "oui"
Exit Function
End If
d = 2
p = True
r = n Mod d
If r = 0 Then
p = False
Else
d = d + 1
r = n Mod d
End If
If r = 0 Then
p = False
Else
d = d + 2
i = 1
End If
Do While d ^ 2 <= n And p
r = n Mod d
If r = 0 Then
p = False
ElseIf i Mod 2 <> 0 Then
i = i + 1
d = d + 2
Else
i = i + 1
d = d + 4
End If
Loop
If p Then EstPremier = "oui" Else EstPremier = "non"
End Function









"isabelle" a écrit dans le message de news:
%



Température splendide à Québec




ici aussi, septembre commence très bien,


Où as-tu déniché ce 686555179 ? ;-)




dans la fenêtre débog, mais c'était une erreur,



Pour N=5, on devrait obtenir 11.




comme ca, j'obtiens 11

Sub nn()
10 N = 5
20 S1 = 0: Z = 2 * (Int(N * Log(N)) + 1)
30 For k = 1 To Z
40 S2 = 0
50 For j = 2 To k
60 S3 = 0
70 For L = 1 To j
80 S3 = S3 + j L - (j - 1) L
90 Next L
100 S2 = S2 + 1 + (2 - S3) j
110 Next j
120 S1 = S1 + 1 - S2 N
130 Next k
160 Debug.Print "Verified y Right", S1 + S2
End Sub


isabelle














Avatar
garnote
Gros projet ;-)
En tous cas, le voici le milliardième nombre premier :
22 801 763 489

Serge


"isabelle" a écrit dans le message de news: %
je vais l'exécuter ce soir avec n = 10 ^ 9 on verra le résultat demain matin,

isabelle


et pour n=1,000,000
np485863 temps = 00:11:45

isabelle


rererebonjour Serge,

comme ça, j'obtiens un Temps d'exécution de 23 sec. ( may be it's the becanne fault)

Sub Liste_Premiers()
'Donne la liste des n premiers nombres premiers
Dim n As Long, i As Long, k As Long
Dim L()
d = Time
n = 100000
If Int(n) <> n Or n < 1 Then Exit Sub
ReDim L(1 To n, 1 To 2)
Do Until k = n
i = i + 1
If EstPremier(i) = "oui" Then
k = k + 1
L(k, 1) = k
L(k, 2) = i
End If
Loop
MsgBox "Temps d'exécution: " & Format(Time - d, "hh:mm:ss") & Chr(10) & L(n, UBound(L, 2))
End Sub

isabelle


Isabelle,

Mais pour d'autres valeurs de n, ça n'aboutit pas ;-(
Voici la macro que j'utilise présentement pour trouver
le n ième nombre premier.
1 minute 10 pour trouver le 100 000 ième
36 minutes pour trouver le millionième.
Ta machine fait-elle mieux ?

Serge

Sub Nombre_Premier()
'Trouve le n ième nombre premier
Dim n As Long, i As Long, r As Long
n = Application.InputBox("Entrer le rang du nombre premier désiré.", _
" Le n ième nombre premier", 100, Type:=1)
If Int(n) <> n Or n < 1 Then Exit Sub
t1 = Time
Do Until i = n
r = r + 1
If EstPremier(r) = "oui" Then i = i + 1
Loop
MsgBox Format(r, "#,##0") & vbNewLine & Format(Time - t1, "hh:mm:ss")
End Sub

Function EstPremier(n As Long) As String
'Cette fonction permet de savoir si
'un nombre entier est premier ou pas.
Dim i As Long, d As Long, p As Boolean
Dim r As Long
If n = 1 Then
EstPremier = "non"
Exit Function
End If
If n = 2 Or n = 3 Then
EstPremier = "oui"
Exit Function
End If
d = 2
p = True
r = n Mod d
If r = 0 Then
p = False
Else
d = d + 1
r = n Mod d
End If
If r = 0 Then
p = False
Else
d = d + 2
i = 1
End If
Do While d ^ 2 <= n And p
r = n Mod d
If r = 0 Then
p = False
ElseIf i Mod 2 <> 0 Then
i = i + 1
d = d + 2
Else
i = i + 1
d = d + 4
End If
Loop
If p Then EstPremier = "oui" Else EstPremier = "non"
End Function









"isabelle" a écrit dans le message de news: %



Température splendide à Québec




ici aussi, septembre commence très bien,


Où as-tu déniché ce 686555179 ? ;-)




dans la fenêtre débog, mais c'était une erreur,



Pour N=5, on devrait obtenir 11.




comme ca, j'obtiens 11

Sub nn()
10 N = 5
20 S1 = 0: Z = 2 * (Int(N * Log(N)) + 1)
30 For k = 1 To Z
40 S2 = 0
50 For j = 2 To k
60 S3 = 0
70 For L = 1 To j
80 S3 = S3 + j L - (j - 1) L
90 Next L
100 S2 = S2 + 1 + (2 - S3) j
110 Next j
120 S1 = S1 + 1 - S2 N
130 Next k
160 Debug.Print "Verified y Right", S1 + S2
End Sub


isabelle
















Avatar
isabelle

Gros projet ;-)
En tous cas, le voici le milliardième nombre premier :
22 801 763 489


merci serge, je vais le lancer ce soir (car soiré cinéma en vue), si le résultat est exact,
je relancerai cette nuit avec n = 10 ^ 12 ça va chauffer ;-)

isabelle

1 2