MaX_62
Messages postés879Date d'inscriptionvendredi 22 octobre 2004StatutMembreDernière intervention29 juin 2007
-
8 mai 2005 à 19:36
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 2016
-
12 mai 2005 à 22:17
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 12 mai 2005 à 22:17
Allons bon ! Allons bon !
JE vais pas détailler par le menu vos remarques. JE pense qu'un lecteur attentif et averti saura comprendre les faiblesses et les ambiguïtés de vos remarques... JE vois surtout l'urgence pour moi, de faire une explication détaillée, qui permettra à tout un chacun d'étudier plus facilement mon code, pour en trouver ces points faibles (personne n'est parfait)...
Amicalement,
Us.
PS : Le terme "bout de code" n'avais pas de connotation péjorative, mais plutôt affective...
Chrysostome
Messages postés121Date d'inscriptionvendredi 17 octobre 2003StatutMembreDernière intervention14 octobre 2016 12 mai 2005 à 10:36
Désolé, mon post s"adresser au:
http://www.vbfrance.com/codes/NOMBRES_PREMIERS__VRAI_OU_FAUX_/31121.aspx où l'on était en recherche de vitesse de calcul,on voit que ce n'est pas ton but, donc, je n'ai fait qu'un bout de code pour émettre une piste de développement.
Je te remercie de la leçon sur le "petit théorème de Fermat", mais j'avais pris la précaution de faire suivre ma citation d'un point d'interrogation, car en fait, je me demandais si la formulation:
tout nombre entier est de la forme 4n±1
n'était pas déduite du "petit théorème de Fermat", faisant appel à mes lointains souvenirs.
En ce qui concerne l'utilisation de variant, tu verras lorsque tu seras un peu plus vieux (104 ans!), que cela permet une certaine souplesse, comme pouvoir dépasser 2 147 483 647, je te renvois vers Microsoft Visual Basic Aide:
"...Cependant, si une opération arithmétique est exécutée sur une donnée de type Variant contenant une valeur de type Byte, Integer, Long ou Single et si le résultat excède la plage de valeurs du type de données, le résultat se voit automatiquement affecté le type de données Variant immédiatement supérieur. Une donnée de type Byte est transformée en Integer, une donnée de type Integer est transformée en Long et une donnée de type Long ou Single en Double..."
En ce qui concerne l'utilisation de la formule 6n±1, il faut que n >3, ce qui sous-entend de traiter avant les valeurs de 2 et 3, donc, de ralentir
En conclusion, car il va falloir que je gagne ma pitance en développant des bouts de code, je te prie de bien vouloir accepter les félicitations d'un humble développeur pour ton grand et magnifique code.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 11 mai 2005 à 23:26
Allons bon !
Disons rapidement, que le Théorème de Fermat est appelé pour les nombres premiers "le petit théorème de Fermat" (1640). IL permet de tester la primalité d'un nombre. Notons, que ce n'est pas le but de ton bout de code...
De plus, a et b, sont en Variant, alors qu'on fait que des calculs avec... Donc un type Long ou Double serait d'entrer de jeu meilleur... ET sans rentrer dans le détail, la conclusion de ton programme c'est de donner une décomposition du nombre NbBase... (A noter, qu'il faut rajouter un moyen d'entrer cette valeur)... ET par exemple ton bout de code renvoit : 10000=(2^4)x5x25x5. Ce qui est juste en terme de calcul, mais assez curieux en terme de présentation du résultat... JE ne peux que renvoyer le lecteur au post : http://www.vbfrance.com/codes/DECOMPOSITION_FACTEURS_PREMIERS/31260.aspx pour un bon algorithme dédié à ce type de problème... ou mieux bien, le mien aprés tout...
Pour continuer, la forme d'un nombre premier peut-être 4n ± 1, mais mieux 6n ± 1... Ce qui permet directement de gagner du temps dans ton algorithme... Mais si on cherche à optimiser on trouvera qlq chose de similaire à mon algorithme NbDiv... Et pour les lecteurs qui voudrait mieux comprendre et trouver des éléments de réponse, (en attendant que je fasse une explication détaillée) je propose la lecture des posts de mon algorithme http://www.vbfrance.com/codes/NOMBRES_PREMIERS__VRAI_OU_FAUX_/31121.aspx ou j'ai progressivement élaboré l'idée (non finalisé)d'une généralisation des "sauts", avec le soutien de Mindiell... (Re-merçi, au passage...)
Sur ce...
A+
Us.
Chrysostome
Messages postés121Date d'inscriptionvendredi 17 octobre 2003StatutMembreDernière intervention14 octobre 2016 11 mai 2005 à 16:36
Voici un autre solution qui apporte plus de rapidité, je pense. Elle utilise le théorème :
Tout Nombre Premier est de la forme 4n±1.
Dim a As Variant ' Nombre à traiter
Dim b As Variant ' Nombre à traiter
Dim np As Integer ' puissance de 2
Dim res As String ' résultat
res = ""
a = NbBase ' Nombre de base
' traitement des puissances de 2
While a Mod 2 = 0
np = np + 1
a = a / 2
Wend
' enregistrement du résultat
Select Case np
Case 1
res = "2"
Case Is > 1
res = "(2 ^ " & np & ")"
End Select
' Diminution du Nombre de Base.
b = NbBase / (2 ^ np)
a = Int(Sqr(a)) + 4 - Int(Sqr(a) Mod 4)
' Application du Théorème (de Fermat?) Tout Nb Premier est de la forme 4n ± 1.
For i = 4 To a Step 4
If b Mod (i - 1) = 0 Then
res = res & " x " & (i - 1)
b = b / (i - 1)
End If
If b Mod (i + 1) = 0 Then
res = res & " x " & (i + 1)
b = b / (i + 1)
End If
Next i
' Publication du résultat.À améliorer. Decomp étant une étiquette.
If res = "" Then
Decomp.Caption = NbBase & " est un Nombre Premier!"
Else
If Left(res, 1) " " Then res Right(res, Len(res) - 2)
Decomp.Caption NbBase & " " & res & " x " & b
End If
Encore bravo pour tous ceux qui s'intéressent aux Maths dans ce qu'ils ont de plus esthétiques.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 11 mai 2005 à 00:00
Aprés vérification, ton conseil donne un p'tit qlq chose plus rapide...
Merçi.
Us.
Mindiell
Messages postés558Date d'inscriptionjeudi 25 juillet 2002StatutMembreDernière intervention 5 septembre 20071 9 mai 2005 à 10:09
Tu sais que tu pars toujours de 0 là :
For t = 0 To bs
tt = 30 * t
Je te conseillerais donc :
tt = 0
For t=0 To bs
.....
tt = tt + 30
Next t
Ca t'évite des multiplications... A tester
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 8 mai 2005 à 20:05
Si... si... il faut critiquer ! C'est pour ça que je mets ce code en ligne... J'ai pas la science infuse, donc s'il y a des remarques ou des suggestions, je suis preneur...
Pour NbDiv, si tu as une proposition, tant mieux... Juste faire attention à ne pas ralentir la fonction, qui est la base même des appels de Np2... La répétition ici, c'est aussi un moyen assez sur d'éviter des calculs dans une boucle intermédiaire qui est souvent pénalisant... mais bon, je n'ai pas regardé en détail... alors... si tu trouves mieux....
Amicalement,
Us.
MaX_62
Messages postés879Date d'inscriptionvendredi 22 octobre 2004StatutMembreDernière intervention29 juin 2007 8 mai 2005 à 19:36
C'est bien d'avoir regroupé ces quatre fonctions en une, ça nous fait une fonction très complète !
Au niveau du code, je ne peux pas encore me permettre de critiquer, mais je constate que la fonction NbDiv est assez répétive, et peut etre optimisable, je me trompe ?
12 mai 2005 à 22:17
JE vais pas détailler par le menu vos remarques. JE pense qu'un lecteur attentif et averti saura comprendre les faiblesses et les ambiguïtés de vos remarques... JE vois surtout l'urgence pour moi, de faire une explication détaillée, qui permettra à tout un chacun d'étudier plus facilement mon code, pour en trouver ces points faibles (personne n'est parfait)...
Amicalement,
Us.
PS : Le terme "bout de code" n'avais pas de connotation péjorative, mais plutôt affective...
12 mai 2005 à 10:36
http://www.vbfrance.com/codes/NOMBRES_PREMIERS__VRAI_OU_FAUX_/31121.aspx
où l'on était en recherche de vitesse de calcul,on voit que ce n'est pas ton but, donc, je n'ai fait qu'un bout de code pour émettre une piste de développement.
Je te remercie de la leçon sur le "petit théorème de Fermat", mais j'avais pris la précaution de faire suivre ma citation d'un point d'interrogation, car en fait, je me demandais si la formulation:
tout nombre entier est de la forme 4n±1
n'était pas déduite du "petit théorème de Fermat", faisant appel à mes lointains souvenirs.
En ce qui concerne l'utilisation de variant, tu verras lorsque tu seras un peu plus vieux (104 ans!), que cela permet une certaine souplesse, comme pouvoir dépasser 2 147 483 647, je te renvois vers Microsoft Visual Basic Aide:
"...Cependant, si une opération arithmétique est exécutée sur une donnée de type Variant contenant une valeur de type Byte, Integer, Long ou Single et si le résultat excède la plage de valeurs du type de données, le résultat se voit automatiquement affecté le type de données Variant immédiatement supérieur. Une donnée de type Byte est transformée en Integer, une donnée de type Integer est transformée en Long et une donnée de type Long ou Single en Double..."
En ce qui concerne l'utilisation de la formule 6n±1, il faut que n >3, ce qui sous-entend de traiter avant les valeurs de 2 et 3, donc, de ralentir
En conclusion, car il va falloir que je gagne ma pitance en développant des bouts de code, je te prie de bien vouloir accepter les félicitations d'un humble développeur pour ton grand et magnifique code.
11 mai 2005 à 23:26
Disons rapidement, que le Théorème de Fermat est appelé pour les nombres premiers "le petit théorème de Fermat" (1640). IL permet de tester la primalité d'un nombre. Notons, que ce n'est pas le but de ton bout de code...
De plus, a et b, sont en Variant, alors qu'on fait que des calculs avec... Donc un type Long ou Double serait d'entrer de jeu meilleur... ET sans rentrer dans le détail, la conclusion de ton programme c'est de donner une décomposition du nombre NbBase... (A noter, qu'il faut rajouter un moyen d'entrer cette valeur)... ET par exemple ton bout de code renvoit : 10000=(2^4)x5x25x5. Ce qui est juste en terme de calcul, mais assez curieux en terme de présentation du résultat... JE ne peux que renvoyer le lecteur au post : http://www.vbfrance.com/codes/DECOMPOSITION_FACTEURS_PREMIERS/31260.aspx pour un bon algorithme dédié à ce type de problème... ou mieux bien, le mien aprés tout...
Pour continuer, la forme d'un nombre premier peut-être 4n ± 1, mais mieux 6n ± 1... Ce qui permet directement de gagner du temps dans ton algorithme... Mais si on cherche à optimiser on trouvera qlq chose de similaire à mon algorithme NbDiv... Et pour les lecteurs qui voudrait mieux comprendre et trouver des éléments de réponse, (en attendant que je fasse une explication détaillée) je propose la lecture des posts de mon algorithme http://www.vbfrance.com/codes/NOMBRES_PREMIERS__VRAI_OU_FAUX_/31121.aspx
ou j'ai progressivement élaboré l'idée (non finalisé)d'une généralisation des "sauts", avec le soutien de Mindiell... (Re-merçi, au passage...)
Sur ce...
A+
Us.
11 mai 2005 à 16:36
Tout Nombre Premier est de la forme 4n±1.
Dim a As Variant ' Nombre à traiter
Dim b As Variant ' Nombre à traiter
Dim np As Integer ' puissance de 2
Dim res As String ' résultat
res = ""
a = NbBase ' Nombre de base
' traitement des puissances de 2
While a Mod 2 = 0
np = np + 1
a = a / 2
Wend
' enregistrement du résultat
Select Case np
Case 1
res = "2"
Case Is > 1
res = "(2 ^ " & np & ")"
End Select
' Diminution du Nombre de Base.
b = NbBase / (2 ^ np)
a = Int(Sqr(a)) + 4 - Int(Sqr(a) Mod 4)
' Application du Théorème (de Fermat?) Tout Nb Premier est de la forme 4n ± 1.
For i = 4 To a Step 4
If b Mod (i - 1) = 0 Then
res = res & " x " & (i - 1)
b = b / (i - 1)
End If
If b Mod (i + 1) = 0 Then
res = res & " x " & (i + 1)
b = b / (i + 1)
End If
Next i
' Publication du résultat.À améliorer. Decomp étant une étiquette.
If res = "" Then
Decomp.Caption = NbBase & " est un Nombre Premier!"
Else
If Left(res, 1) " " Then res Right(res, Len(res) - 2)
Decomp.Caption NbBase & " " & res & " x " & b
End If
Encore bravo pour tous ceux qui s'intéressent aux Maths dans ce qu'ils ont de plus esthétiques.
11 mai 2005 à 00:00
Merçi.
Us.
9 mai 2005 à 10:09
For t = 0 To bs
tt = 30 * t
Je te conseillerais donc :
tt = 0
For t=0 To bs
.....
tt = tt + 30
Next t
Ca t'évite des multiplications... A tester
8 mai 2005 à 20:05
Pour NbDiv, si tu as une proposition, tant mieux... Juste faire attention à ne pas ralentir la fonction, qui est la base même des appels de Np2... La répétition ici, c'est aussi un moyen assez sur d'éviter des calculs dans une boucle intermédiaire qui est souvent pénalisant... mais bon, je n'ai pas regardé en détail... alors... si tu trouves mieux....
Amicalement,
Us.
8 mai 2005 à 19:36
Au niveau du code, je ne peux pas encore me permettre de critiquer, mais je constate que la fonction NbDiv est assez répétive, et peut etre optimisable, je me trompe ?
A+
MaX_62