XL 2010 Factorisation en Nombres premiers par récursivité

jm.andryszak

XLDnaute Occasionnel
J'ai un problème de point d'arrêt dans la fonction DecompositionRecursif
que je contourne par On Error GoTo err: 'Espace pile insuffisant (Erreur 28)
Cette solution ne me convient pas vraiment.
Quelqu'un aurait-il une solution ?
Merci
Voici le code

Option Explicit
'***********************************************
Dim Facteur
'***********************************************
Function DecompositionRecursif(n As Long, i) As String
'***********************************************
Dim j
Dim Result
'**********************************************
On Error GoTo err: 'Espace pile insuffisant (Erreur 28), Pb de point d'arrêt ??
'Point d'arrêt
If n = 1 Then
Result = Mid(Facteur, 1, Len(Facteur) - 3)
Debug.Print Result
Exit Function 'End
End If
'
j = 0
While n Mod i = 0
n = n / i
j = j + 1
Wend
If j <> 0 Then
Result = i & "^" & j & " * "
End If
Facteur = Facteur & Result

err:
'Espace pile insuffisant (Erreur 28), Pb de point d'arrêt ??
'Arrêt de la récursivité
If err.Number = 28 Then
Debug.Print Facteur & n & " " & EstPremier(n)
Exit Function 'End
'Récursité
Else
DecompositionRecursif = DecompositionRecursif(n, i + 1)
End If
End Function
'***********************************************
Sub Test_DecompositionRecursif()
'***********************************************
Dim Nombre As Long
Dim Debut
'***********************************************
'Nombre = 7 * 5000000
'Nombre = 9
'Nombre = 13 * 2 * 997
'Nombre = 461 * 499987
Nombre = 3 * (152311 + 3 ^ 1 * 19 ^ 1 * 89 ^ 1 * 1607)
Debug.Print Nombre
Facteur = ""
Debut = Timer
DecompositionRecursif Nombre, 2
Debug.Print "fin " & Timer - Debut
End Sub
'***********************************************
 

jm.andryszak

XLDnaute Occasionnel
Merci beaucoup
j'ai testé la fonction D, un peu lent pour un nombre comme
24913866 (2*3*4152311) mais là n'est pas la question.
La nuit portant conseil j'ai trouvé mon oubli, il manquait un autre point d'arrêt à la récursivité.
J'ai modifié comme ceci et ça fonctionne.
(la fonction EstPremier comme son nom l'indique vérifie si n est premier)

'Premier point d'arrêt
If n = 1 Then
Result = Mid(Facteur, 1, Len(Facteur) - 3)
Debug.Print Result
Exit Function 'End

'Deuxième Point d'arrêt, plus d'erreur Espace pile insuffisant (Erreur 28)
ElseIf EstPremier(n) Then
Debug.Print Facteur & n
Exit Function 'End
End If
temps d'exécution : 0,0098 sec.

Merci encore A+
 

Discussions similaires

Réponses
12
Affichages
537