MATHS & EXCEL : Décomposition d'un nombre ?

Levis

XLDnaute Nouveau
Bonjour,
Y a-t-il une fonction sur excel pour décomposer un nombre en facteur de nombres premiers ?
Et surtout, comment donner la valuation p-adique d'un nombre ?
(Quand p est un nombre premier, par exemple p=3, la valuation 3-adique d'un nombre est son exposant pour 3 dans sa décomposition, par exemple la valuation 3-adique de 1134 est 4 car 1134=2*7*3^4)
Quelqu'un de fort en programmation excel pourrait-il me dire comment faire ?
Merci !
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : MATHS & EXCEL : Décomposition d'un nombre ?

Re...
Mon problème est que je ne sais toujours pas quel est votre problème.

Message #3 :
Je n'en ai pas besoin pour d'énorme nombre, j'en ai besoin pour des nombres inférieurs à 1000.

Message #30 :
(...) Par exemple pour la ligne correspondant à 1456, j'ai sur chaque colonne la valuation p-adique où p (premier) (...)

Par ailleurs, il s'agissait au début de trouver la valuation p-adique d'un entier, maintenant il s'agit de sommer les valuations p-adiques du dit entier pour plusieurs valeurs différentes de p.

Quel est, finalement, le but de la manœuvre ?​
ROGER2327
#3480


26 Floréal An CCXVIII
2010-W19-6T15:18:20Z
 

job75

XLDnaute Barbatruc
Re : MATHS & EXCEL : Décomposition d'un nombre ?

Re Levis,

Faire la somme des p-adiques, je ne vois pas par formule.

Par contre en VBA, voyez le fichier joint avec la fonction S qui fait ce travail.

Pour cette fonction, j'ai juste complété le code de la fonction D.

A+
 

Pièces jointes

  • Nombres premiers(2).xls
    38.5 KB · Affichages: 159

ROGER2327

XLDnaute Barbatruc
Re : MATHS & EXCEL : Décomposition d'un nombre ?

Bonjour à tous
Voici une fonction personnalisée pour calculer la somme des valuations p-adiques d'un entier positif (entier maximum : 2 147 483 647, qui est le plus grand entier long au sens de VisualBasic).
Code:
[COLOR="DarkSlateGray"][B]      CODE SUPPRIMÉ  -  voir #33 [/B][/COLOR]

J'ai ajouté au classeur joint au message #33 des fonctions construites sur le même modèle pour le calcul du nombre des diviseurs et la factorisation première des dits "entiers longs".
ROGER2327
#3481


26 Floréal An CCXVIII
2010-W19-6T16:30:15Z


____________________
À job75 : je viens de voir votre dernier message : je regarderez son contenu un peu plus tard.
 
Dernière édition:

JNP

XLDnaute Barbatruc
Supporter XLD
Re : MATHS & EXCEL : Décomposition d'un nombre ?

Bonsoir le fil :),
Une petite proposition dont je n'ai pas calculé les limites, ni le temps d'exécution, mais qui me semble dans des limites de temps de calcul acceptables :
Code:
Function Décompose(Nbre As Double) As String
Dim Tableau(), I As Double, J As Integer
If Int(Nbre) <> Nbre Or Nbre <= 0 Then
Décompose = "Erreur !"
Exit Function
End If
If Nbre = 1 Then Décompose = "1": Exit Function
If Nbre = 2 Then Décompose = "2": Exit Function
J = 0
Refait:
ReDim Preserve Tableau(J)
If Nbre Mod 2 = 0 Then
Tableau(J) = 2
Nbre = Nbre / 2
ReDim Preserve Tableau(UBound(Tableau) + 1)
J = J + 1
GoTo Refait
End If
I = 3
Do
If Nbre Mod I = 0 Then
Tableau(J) = I
Nbre = Nbre / I
ReDim Preserve Tableau(UBound(Tableau) + 1)
J = J + 1
Else
I = I + 2
End If
Loop While Int(Sqr(Nbre)) >= I
Décompose = Tableau(0)
For I = LBound(Tableau) + 1 To UBound(Tableau) - 1
Décompose = Décompose & "x" & Tableau(I)
Next I
If UBound(Tableau) > 1 Then
Décompose = Décompose & "x" & Nbre
Else
Décompose = Nbre
End If
End Function
et
Code:
Function SommeAdique(Adique As String) As Integer
Dim Tableau
Tableau = Split(Adique, "x")
SommeAdique = UBound(Tableau) + 1
End Function
pour la somme des adiques.
Bonne soirée :cool:
 

ROGER2327

XLDnaute Barbatruc
Re : MATHS & EXCEL : Décomposition d'un nombre ?

Suite...
Le code proposé dans le message #33 comporte une erreur qui, dans quelques cas, induit une erreur par dépassement de capacité. Voici le code rectifié et le classeur corrigé... Avec mes excuses.
Code:
[COLOR="DarkSlateGray"][B]Function SVal(v&)
Dim f, i&, j&, k&, n&, m&
[COLOR="SeaGreen"]'   Application.Volatile[/COLOR]
   If v Then
      f = Array(2, 3, 5, 7, 11)
      For i = 0 To 4
         k = f(i)
         m = 0
         Do Until k * (v \ k) - v
            v = v \ k
            m = m + 1
         Loop
         If m Then SVal = SVal + m
      Next
      f = Array(12, 4, 2, 4, 6, 2, 6, 4, 2, 4, 6, 6, 2, 6, 4, 2, 6, 4, 6, 8, 4, 2, 4, 2, 4, 14, 4, 6, 2, 10, 2, 6, _
         6, 4, 2, 4, 6, 2, 10, 2, 4, 2, 12, 10, 2, 4, 2, 4, 6, 2, 6, 4, 6, 6, 6, 2, 6, 4, 2, 6, 4, 6, 8, 4, 2, 4, _
         6, 8, 6, 10, 2, 4, 6, 2, 6, 6, 4, 2, 4, 6, 2, 6, 4, 2, 6, 10, 2, 10, 2, 4, 2, 4, 6, 8, 4, 2, 4, 12, 2, 6, _
         4, 2, 6, 4, 6, 12, 2, 4, 2, 4, 8, 6, 4, 6, 2, 4, 6, 2, 6, 10, 2, 4, 6, 2, 6, 4, 2, 4, 2, 10, 2, 10, 2, 4, _
         6, 6, 2, 6, 6, 4, 6, 6, 2, 6, 4, 2, 6, 4, 6, 8, 4, 2, 6, 4, 8, 6, 4, 6, 2, 4, 6, 8, 6, 4, 2, 10, 2, 6, 4, _
         2, 4, 2, 10, 2, 10, 2, 4, 2, 4, 8, 6, 4, 2, 4, 6, 6, 2, 6, 4, 8, 4, 6, 8, 4, 2, 4, 2, 4, 8, 6, 4, 6, 6, 6, _
         2, 6, 6, 4, 2, 4, 6, 2, 6, 4, 2, 4, 2, 10, 2, 10, 2, 6, 4, 6, 2, 6, 4, 2, 4, 6, 6, 8, 4, 2, 6, 10, 8, 4, 2, _
         4, 2, 4, 8, 10, 6, 2, 4, 8, 6, 6, 4, 2, 4, 6, 2, 6, 4, 6, 2, 10, 2, 10, 2, 4, 2, 4, 6, 2, 6, 4, 2, 4, 6, 6, _
         2, 6, 6, 6, 4, 6, 8, 4, 2, 4, 2, 4, 8, 6, 4, 8, 4, 6, 2, 6, 6, 4, 2, 4, 6, 8, 4, 2, 4, 2, 10, 2, 10, 2, 4, _
         2, 4, 6, 2, 10, 2, 4, 6, 8, 6, 4, 2, 6, 4, 6, 8, 4, 6, 2, 4, 8, 6, 4, 6, 2, 4, 6, 2, 6, 6, 4, 6, 6, 2, 6, _
         6, 4, 2, 10, 2, 10, 2, 4, 2, 4, 6, 2, 6, 4, 2, 10, 6, 2, 6, 4, 2, 6, 4, 6, 8, 4, 2, 4, 2, 12, 6, 4, 6, 2, _
         4, 6, 2, 12, 4, 2, 4, 8, 6, 4, 2, 4, 2, 10, 2, 10, 6, 2, 4, 6, 2, 6, 4, 2, 4, 6, 6, 2, 6, 4, 2, 10, 6, 8, _
         6, 4, 2, 4, 8, 6, 4, 6, 2, 4, 6, 2, 6, 6, 6, 4, 6, 2, 6, 4, 2, 4, 2, 10, 12, 2, 4, 2, 10, 2, 6, 4, 2, 4, _
         6, 6, 2, 10, 2, 6, 4, 14, 4, 2, 4, 2, 4, 8, 6, 4, 6, 2, 4, 6, 2, 6, 6, 4, 2, 4, 6, 2, 6, 4, 2, 4, 12, 2)
      k = 1
      For j = 0 To Int(Sqr(v) - 11) \ 2310
         For i = 0 To 479
            k = k + f(i)
            m = 0
            Do Until k * (v \ k) - v
               v = v \ k
               m = m + 1
            Loop
            If m Then
               SVal = SVal + m
               If v = 1 Then Exit Function
            End If
         Next
      Next
      If v > 1 Then SVal = SVal + 1
   Else
      SVal = ""
   End If
End Function[/B][/COLOR]
ROGER2327
#3482


26 Floréal An CCXVIII
2010-W19-6T20:15:10Z
 

Pièces jointes

  • Valuations_3482.zip
    82.3 KB · Affichages: 38
Dernière édition:

dedef

XLDnaute Occasionnel
Re : MATHS & EXCEL : Décomposition d'un nombre ?

Bonjour Levis, salut pierrejean, Staple, Roger,

Voici une autre fonction qui détermine d'abord les nombres premiers et les stocke dans une collection :

Code:
Function D(N As Double) As String 'décompose N en nombres premiers
Dim maxi As Long, liste As New Collection, i As Long, j As Long
maxi = 10000 'modifiable
If N = 0 Or Int(N) <> N Or N > maxi Then Exit Function
'---Liste des nombres premiers---
liste.Add 2
For i = 3 To N Step 2
  For j = 2 To liste.Count
    If liste(j) > Evaluate("SQRT(" & i & ")") Then Exit For
    If i Mod liste(j) = 0 Then GoTo 1
  Next
  liste.Add i
1 Next
'---Calcul de D---
For i = 1 To liste.Count
  If N Mod liste(i) = 0 Then
    j = 1
2   j = j + 1
    If N Mod liste(i) ^ j = 0 Then GoTo 2
    D = D & IIf(D = "", "", "*") & liste(i) & IIf(j = 2, "", "^" & j - 1)
    If Evaluate(D) = N Then Exit For
  End If
Next
If D = "" Then D = N
End Function


Elle est paramétrée pour un maximum de 10000, qu'on peut modifier.

Fichier joint.

A+

Bonjour,

Je déterrre un vieux sujet.

Le calcul prend beaucoup de temps pour de grands nombres.

Est-il possible de précharger la "collection" de nombres premiers plutôt que de la constituer au fil des différents calculs (si c'est bien comme cela que la macro fonctionne?).

Merci d'avance.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Le résultat de la fonction peut aussi être #N/A.

Ceci se produit parce que la liste des nombres premiers est trop petite. La décomposition comprend un nombre premier qui n'est pas dans la liste des 10 000 nombres premiers.

Pour pouvoir aller jusqu'au maximum du type entier long, il faudrait la liste des nombres premiers jusqu'au maximum du type entier long.
 

Discussions similaires

Statistiques des forums

Discussions
292 811
Messages
1 926 469
Membres
183 093
dernier inscrit
Juvenat