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

  • Initiateur de la discussion Initiateur de la discussion Levis
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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:
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

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: 10
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
 
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+
 
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.
 
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.
 
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

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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
413
  • Question Question
Microsoft 365 Formule avec OU ?
Réponses
5
Affichages
404
Retour