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:

Patexcel

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

bonjour Levis

En attendant les vrais matheux du forum
Un essai
En page "premiers" la liste des 1000 premiers nombres premiers obtenus Grace a une formule du génial MdF
En feuille2 deux fonctions personnalisées
Attention :Si le nombre dont on cherche la décomposition est premier la durée du calcul peut devenir très longue
d'autre part je ne connais pas trop le comportement de la fonction pour les cas limites
Bonjour,
Je vous remercie particulièrement pour votre macro qui me permet d'aider mon petit fils en classe de seconde.
Je l'ai incorporé dans un fichier pour lui expliquer l'Algorithme d'Euclide et la division Euclidienne.
Tout marche bien mais j'ai une erreur lorsque le nombre est un nombre premier.
Serait-il possible d'apporter une petite amélioration pour que le résultat soit donné avec les exposants ?
Je vous en remercie par avance.
Je vous livre mon fichier qui est en très grosse partie le votre.
Bien cordialement.
Patrick Bayle,
 

Pièces jointes

  • Algorithme d'Euclide.xlsm
    66 KB · Affichages: 7

Patexcel

XLDnaute Nouveau
Bonjour,
Je vous remercie pour votre réponse tellement rapide.
J'ai mis mon grain de sel en écrivant ce bout de code pour à partir de =2^3 * 3^4 * 7^2 obtenir
Factorisation.jpg

VB:
Sub MISENFORM()

Dim Cell As Range
Dim i As Integer

 For Each Cell In Selection
    With Cell
    .NumberFormat = "@"
    .Value = ActiveCell.Previous
    .Value = Replace(.Value, "=", "= ")
    .Value = Replace(.Value, "*", "x")
        For i = 1 To Len(.Value)
            If .Characters(i, 2).Text Like "^#" Then
                .Characters(i, 1).Text = ""
                .Characters(i, 1).Font.Superscript = True
            End If
        Next i
 
    End With

Next Cell

End Sub

Merci encore.
Bien cordialement.
Patrick Bayle,
 

Pièces jointes

  • Factorisation.jpg
    Factorisation.jpg
    3.3 KB · Affichages: 4

RIPcagou

XLDnaute Nouveau
Bonjour.
Re : MATHS & EXCEL : Décomposition d'un nombre ?

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.
J'aime bien et c'est ce qu'il me faut.
Mais est-il possible d'avoir une version sans les puissances.
Style 12=2*2*3
Merci
 

job75

XLDnaute Barbatruc
Bonsoir Ripcagou, bienvenue sur XLD,
J'aime bien et c'est ce qu'il me faut.
Mais est-il possible d'avoir une version sans les puissances.
Style 12=2*2*3
A la place de la fonction D utilisez cette fonction DD :
VB:
Function DD(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 DD---
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
    DD = DD & Application.Rept("*" & liste(i), j - 1)
    If Left(DD, 1) = "*" Then DD = Mid(DD, 2)
    If Evaluate(DD) = N Then Exit For
  End If
Next
If DD = "" Then DD = N
End Function
A+
 

RIPcagou

XLDnaute Nouveau
Bonsoir Ripcagou, bienvenue sur XLD,

A la place de la fonction D utilisez cette fonction DD :
VB:
Function DD(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 DD---
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
    DD = DD & Application.Rept("*" & liste(i), j - 1)
    If Left(DD, 1) = "*" Then DD = Mid(DD, 2)
    If Evaluate(DD) = N Then Exit For
  End If
Next
If DD = "" Then DD = N
End Function
A+
C'est hyper super cool d'avoir répondu aussi vite.
Il faudra que je creuse la signification de chaque ligne pour mieux comprendre.
Merci beaucoup.
 

job75

XLDnaute Barbatruc
Re,

Pour les fonctions D ou DD je ne sais pas pourquoi j'évalue la fonction Excel SQRT (RACINE) :
VB:
If liste(j) > Evaluate("SQRT(" & i & ")") Then Exit For
Sans doute parce qu'en 2010 je ne connaissais pas la fonction VBA Sqr beaucoup plus rapide :
VB:
If liste(j) > Sqr(i) Then Exit For
Donc utilisez ce dernier code dans les 2 fonctions.

Bonne nuit.
 

job75

XLDnaute Barbatruc
Bonjour RIPcagou, le forum,

C'est bien d'être venu sur ce fil, ça me donne l'occasion de revoir mes vieilles solutions.

J'ai constaté que l'opérateur VBA Mod ne convient plus sur des grands nombres.

Voyez le fichier joint et les 2 fonctions D et DD modifiées :
VB:
Function D(N As Double) As String 'décompose N en nombres premiers
Dim liste As New Collection, i As Double, j As Long
If N = 0 Or Int(N) <> N Then Exit Function
'---Liste des nombres premiers---
liste.Add 2
Calcul_D N, 2, D
If D <> "" Then If Evaluate(D) = N Then Exit Function
For i = 3 To N Step 2
    For j = 2 To liste.Count
        If liste(j) ^ 2 > i Then Exit For
        If i - liste(j) * Int(CDec(i / liste(j))) = 0 Then GoTo 1
    Next
    liste.Add i
    Calcul_D N, i, D
    If D <> "" Then If Evaluate(D) = N Then Exit Function
1 Next
If D = "" Then D = N
End Function

Sub Calcul_D(N As Double, NP As Double, D As String)
If N - NP * Int(CDec(N / NP)) Then Exit Sub
Dim i As Long
i = 1
1 i = i + 1
If N - (NP ^ i) * Int(CDec(N / (NP ^ i))) = 0 Then GoTo 1
D = D & IIf(D = "", "", "*") & NP & IIf(i = 2, "", "^" & i - 1)
End Sub

Function DD(N As Double) As String 'décompose N en nombres premiers
Dim liste As New Collection, i As Double, j As Long
If N = 0 Or Int(N) <> N Then Exit Function
'---Liste des nombres premiers---
liste.Add 2
Calcul_DD N, 2, DD
If DD <> "" Then If Evaluate(DD) = N Then Exit Function
For i = 3 To N Step 2
    For j = 2 To liste.Count
        If liste(j) ^ 2 > i Then Exit For
        If i - liste(j) * Int(CDec(i / liste(j))) = 0 Then GoTo 1
    Next
    liste.Add i
    Calcul_DD N, i, DD
    If DD <> "" Then If Evaluate(DD) = N Then Exit Function
1 Next
If DD = "" Then DD = N
End Function

Sub Calcul_DD(N As Double, NP As Double, DD As String)
If N - NP * Int(CDec(N / NP)) Then Exit Sub
Dim i As Long
i = 1
1 i = i + 1
If N - (NP ^ i) * Int(CDec(N / (NP ^ i))) = 0 Then GoTo 1
DD = DD & Application.Rept("*" & NP, i - 1)
If Left(DD, 1) = "*" Then DD = Mid(DD, 2)
End Sub
J'ai aussi supprimé la variable maxi qui ne servait pas à grand-chose.

A+
 

Pièces jointes

  • Décomposition(1).xlsm
    19.6 KB · Affichages: 4

job75

XLDnaute Barbatruc
Cela dit si vous y tenez absolument c'est très simple, voyez ce fichier (2) avec ;
VB:
If DD <> "" Then If Evaluate(DD) = N Then DD = Replace(DD, "*", "x"):: Exit Function
 

Pièces jointes

  • Décomposition(2).xlsm
    19.9 KB · Affichages: 2

RIPcagou

XLDnaute Nouveau
C'est super cool de l'avoir fait quand même. Je suis d'accord que cela n'a pas d'intérêt majeur.
En fait pour expliquer, je suis enseignant, je fais un devoir personnalisé pour mes 84 élèves de 5eme (3 classes) et sur deux décompositions chacun. Je veux mettre la correction en ligne et les élèves comprendront mieux 2 x 3 x 5 que 2*3*5.
J'aurais tout retapé sinon. Un grand merci.
En fait je vais garder la DD avec * et transformer la nouvelle DD en DDD pour avoir aussi les x.
Comme cela je pourrais éventuellement garder la formulation * pour des élèves plus grands.
Bonne soirée
 

Discussions similaires