Function PolyFact(ByVal MatX As Range, ByVal I As Long, Optional ByVal R As Variant = 3) 'Factorisation d'un polynome de la forme 'Y = C1*X^n + Ci*X^(n-1) + ... + Cn. 'en Y=(X+Xo)(X+Xi)...(X+Xn) 'i = numero de la solution Xi 'r = arrondi des résultats à l'affichage 'Traitement de l'arrondi R = CLng(R) 'Tailles matrices Dim l As Long, C As Long, N As Long l = MatX.Rows.Count C = MatX.Columns.Count 'Erreur de taille If C > 1 Then PolyFact = "#COLONNE!": Exit Function N = l - 1 If N = 0 Then PolyFact = "#DEGRE!": Exit Function If I > N Then PolyFact = "#INDICE!": Exit Function 'Variable et tableau ReDim A(N), B(N), sig(N), reel(N), imagi(N) 'Tableau des coeffs Dim t As Long For t = N To 0 Step -1 A(t) = MatX.Cells(t + 1) Next t 'Résolution Bairstow Dim S As Double, P As Double, D As Double, DS As Double Dim DP As Double, S1 As Double, P1 As Double, Er As Double Dim delta As Double, k As Long If N > 2 Then Do S = 0: P = 0 Do B(0) = A(0): B(1) = A(1) + S * B(0): B(2) = A(2) + S * B(1) - P * B(0) sig(0) = 0: sig(1) = B(0): sig(2) = B(1) + S * sig(1) For k = 3 To N B(k) = A(k) + S * B(k - 1) - P * B(k - 2) sig(k) = B(k - 1) + S * sig(k - 1) - P * sig(k - 2) Next k D = sig(N) * sig(N - 2) - sig(N - 1) ^ 2 If D = 0 Then D = 1 DS = B(N - 1) * sig(N - 1) - B(N) * sig(N - 2) If DS = 0 Then DS = 1 + 0.000000000001 DP = B(N - 1) * sig(N) - B(N) * sig(N - 1) If DP = 0 Then DP = 1 S1 = S + DS / D: P1 = P + DP / D Er = (Abs(S1 - S) + Abs(P1 - P)) / (Abs(S1) + Abs(P1)) S = S1: P = P1 Loop Until Er < 0.000000001 GoSub resolution N = N - 2 For t = 0 To N: A(t) = B(t): Next t Loop Until N <= 2 End If If N = 2 Then S = -A(1) / A(0): P = A(2) / A(0) GoSub resolution Else reel(1) = -A(1) / A(0): imagi(1) = 0 End If 'Affichage de la solution reel(I) = WorksheetFunction.Round(-reel(I), R) imagi(I) = WorksheetFunction.Round(-imagi(I), R) Select Case reel(I) Case Is <> 0 Select Case imagi(I) Case Is < 0 PolyFact = reel(I) & imagi(I) & "i" Case Is > 0 PolyFact = reel(I) & "+" & imagi(I) & "i" Case Else PolyFact = reel(I) End Select Case Else Select Case imagi(I) Case Is <> 0 PolyFact = imagi(I) & "i" Case Else PolyFact = "0" End Select End Select Exit Function 'Résolution du polynôme du second degré resolution: delta = S ^ 2 - 4 * P If delta >= 0 Then reel(N) = 0.5 * (S + Sqr(delta) * Sgn(S)) reel(N - 1) = P / reel(N) imagi(N) = 0 imagi(N - 1) = 0 Else reel(N) = S / 2 reel(N - 1) = S / 2 imagi(N) = Sqr(-delta) / 2 imagi(N - 1) = -imagi(N) End If Return End Function