cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 4 déc. 2006 à 14:00
Exact, VB6 est plus rapide que VB2005 de 25% si on reste en Double, et le type Double reste pratiquement 2x plus rapide que le type Long de VB2005, alors que j'ai pourtant optimisé avec \ (sinon c'est carrément très lent).
cs_DarkVader
Messages postés51Date d'inscriptionsamedi 21 octobre 2000StatutMembreDernière intervention10 octobre 2011 4 déc. 2006 à 12:04
Sorry,
pour les grands nombres
estPair ((n / 2) Int(n / 2))
c = n + 1 + Abs(estPair + 1)
cs_DarkVader
Messages postés51Date d'inscriptionsamedi 21 octobre 2000StatutMembreDernière intervention10 octobre 2011 4 déc. 2006 à 11:56
Bravo pour la base mathématique de l'algo -
(Pour ce genre d'opération, .net est bien moins rapide que vb6)
Une petite optimisation toute bête permettant de diviser par 2 le temps de calcul :
Function PreSuiv(n As Double) As Double
Dim c As Double, d As Double, f As Double, i As Double, j As Double, t As Double
Dim temps
c n + 1 + Abs(n Mod 2 1)
d = Int(n + Sqr(n) + 9)
f = 1
For i = c To d Step 2
t = 0
For j = 1 To Int(Sqr(i))
t = t + Int(i / j) - Int((i - 1) / j)
Next j
t = 2 - (2 * t)
f = f * (-Int(t / i))
If t = f Then Exit For
'If t = 0 Then Exit For
Next
PreSuiv = i
End Function
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 3 déc. 2006 à 17:12
Oui tu as probablement raison, mais je m'attache plus à l'algorithme. De plus, je tiens à préciser qu'on peut aller vraiment plus vite (sans comparaison) avec mon autre code NPD... mais le principe est très différent de celui-ci, bien sur.
Amicalement,
Us.
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 3 déc. 2006 à 11:38
Tu devrais essayer avec VB 2005 (qui est gratuit), la capacité du long a doublée en nombre de bits : à mon avis, je ne crois pas que le double apportera quelque chose en plus avec une telle capacité, et les traitements devrais être vraiment plus rapides avec des Long de VB8.
Int64 VB8.Long : MaxValue 9223372036854775807
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 2 déc. 2006 à 23:07
Bonsoir,
Pour répondre aux questions? i\j est identique à Int(i/j), sauf que la première forme n'est pas utilisable au-delà de la limite d'un Long, quel que soit le type déclaré?
Exemple :
Sub essai()
Dim A As Double, B As Double, C As Double, D As Double
A = 2147483647
B = A + 1
C = A \ 2
Debug.Print C
D = B \ 2
Debug.Print D
End Sub
2147483647 est la limite du type long.
Le code cause une erreur sur D? Il faudrait s'arrêter au type Long pour utiliser « \ »? et dans ce cas, le programme serait optimale en vitesse, mais pas dans la plage de valeurs? c'est un choix.
Ensuite on peut choisir pour N, le type Currency? mais avec le type Double on peut aller plus loin? et plus vite.
Exemple :
Sub essai()
Dim A As Currency, B As Double
A = 922337203685477#
B = CDbl(A) + 10000000000000#
Debug.Print A, B
End Sub
922337203685477 est la limite de Currency, qu'alors avec B on peut aller au-delà? tout en restant en format d'un nombre entier?
Mettre dans une variable Q pour la limite de la boucle FOR permet un très très léger gain de temps, d'après mes tests. A peine 1 seconde sur 89 secondes? mais bon, c'est déjà ça. De plus, on peut retirer les parenthèses inutiles des deux lignes :
T = 2 - 2 * T
F = -F * Int(T / I)
Ensuite, d'un point mathématique, j'ignore la raison pour laquelle on a D = Int(N + Sqr(N) + 9)? voir le site, si quelqu'un trouve pourquoi?
Il est possible que ce code soit encore optimisable? même s'il est déjà très performant?
Rq : Il est à noter que ce code, peut très bien s'adapter pour savoir si un nombre est premier ou pas. Il suffit pour cela de tester si N-1=N.
Amicalement,
Us.
cs_comme
Messages postés122Date d'inscriptiondimanche 19 mars 2006StatutMembreDernière intervention18 juillet 2009 1 déc. 2006 à 19:30
Tres bon travail , du point de vue mathématiques je veux savoir pourqoi l'expression intermediaire: D = Int(N + Sqr(N) + 9) audebut
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 1 déc. 2006 à 14:03
2) : je crois que la fin de la boucle n'est évaluée qu'une fois, donc pas de gain ici.
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 1 déc. 2006 à 13:47
Salut, deux petites questions sur l'optimisation du code :
1) pourquoi utiliser le type Double ? Si c'est pour de grands nombres, autant prendre Currency, ou alors limiter au Long pour plus de vitesse.
2) Il me semble (jmais e peux me tromper) que "For J 1 To Int(Sqr(I))" est moins rapide que "For J 1 To Q" (avec Q=Int(Sqr(I))).
@+
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 1 déc. 2006 à 13:15
4 déc. 2006 à 14:00
4 déc. 2006 à 12:04
pour les grands nombres
estPair ((n / 2) Int(n / 2))
c = n + 1 + Abs(estPair + 1)
4 déc. 2006 à 11:56
(Pour ce genre d'opération, .net est bien moins rapide que vb6)
Une petite optimisation toute bête permettant de diviser par 2 le temps de calcul :
Function PreSuiv(n As Double) As Double
Dim c As Double, d As Double, f As Double, i As Double, j As Double, t As Double
Dim temps
c n + 1 + Abs(n Mod 2 1)
d = Int(n + Sqr(n) + 9)
f = 1
For i = c To d Step 2
t = 0
For j = 1 To Int(Sqr(i))
t = t + Int(i / j) - Int((i - 1) / j)
Next j
t = 2 - (2 * t)
f = f * (-Int(t / i))
If t = f Then Exit For
'If t = 0 Then Exit For
Next
PreSuiv = i
End Function
3 déc. 2006 à 17:12
Amicalement,
Us.
3 déc. 2006 à 11:38
Int64 VB8.Long : MaxValue 9223372036854775807
2 déc. 2006 à 23:07
Pour répondre aux questions? i\j est identique à Int(i/j), sauf que la première forme n'est pas utilisable au-delà de la limite d'un Long, quel que soit le type déclaré?
Exemple :
Sub essai()
Dim A As Double, B As Double, C As Double, D As Double
A = 2147483647
B = A + 1
C = A \ 2
Debug.Print C
D = B \ 2
Debug.Print D
End Sub
2147483647 est la limite du type long.
Le code cause une erreur sur D? Il faudrait s'arrêter au type Long pour utiliser « \ »? et dans ce cas, le programme serait optimale en vitesse, mais pas dans la plage de valeurs? c'est un choix.
Ensuite on peut choisir pour N, le type Currency? mais avec le type Double on peut aller plus loin? et plus vite.
Exemple :
Sub essai()
Dim A As Currency, B As Double
A = 922337203685477#
B = CDbl(A) + 10000000000000#
Debug.Print A, B
End Sub
922337203685477 est la limite de Currency, qu'alors avec B on peut aller au-delà? tout en restant en format d'un nombre entier?
Mettre dans une variable Q pour la limite de la boucle FOR permet un très très léger gain de temps, d'après mes tests. A peine 1 seconde sur 89 secondes? mais bon, c'est déjà ça. De plus, on peut retirer les parenthèses inutiles des deux lignes :
T = 2 - 2 * T
F = -F * Int(T / I)
Ensuite, d'un point mathématique, j'ignore la raison pour laquelle on a D = Int(N + Sqr(N) + 9)? voir le site, si quelqu'un trouve pourquoi?
Il est possible que ce code soit encore optimisable? même s'il est déjà très performant?
Rq : Il est à noter que ce code, peut très bien s'adapter pour savoir si un nombre est premier ou pas. Il suffit pour cela de tester si N-1=N.
Amicalement,
Us.
1 déc. 2006 à 19:30
1 déc. 2006 à 14:03
1 déc. 2006 à 13:47
1) pourquoi utiliser le type Double ? Si c'est pour de grands nombres, autant prendre Currency, ou alors limiter au Long pour plus de vitesse.
2) Il me semble (jmais e peux me tromper) que "For J 1 To Int(Sqr(I))" est moins rapide que "For J 1 To Q" (avec Q=Int(Sqr(I))).
@+
1 déc. 2006 à 13:15