Function FactGN(ByVal a As Long, Optional b As Variant = 2) As String
'CALCUL FACTORIELLE

'Traitement option : B=1er nb de départ
b = CLng(b)

'Traitement des cas triviaux
If a < 0 Then FactGN = "#VALEUR!": Exit Function
If a = 0 Then FactGN = 1: Exit Function

'Variables
Dim Base As Double, P As Double, Q As Double
Dim N As Long, j As Long, i As Long
Dim Expo As Long

'Base dynamique optimisée
Expo = 15 - Len(Trim(Str$(a))) 'évite P>10^15 et donc le formattage exponentiel (1E15) !!

'Base de calcul
Base = 10 ^ Expo

'Nombre d'indice dans la base
N = Int((0.92 + (a + 0.5) * Log(a) - a) / Log(10)) + 1 'nb chiffre de A!
N = Int(N / Expo) + 1

'Déclaration des indices
ReDim t(N) As Double
t(0) = 1

'Algorithme factorielle
For j = b To a
    For i = 0 To N
        P = t(i) * j + Q
        Q = Int(P / Base)
        t(i) = P - Q * Base
    Next i
Next j

'Rajoute les zeros devant les indices moins long que expo
Dim Z As String 'optimisation string$
Z = "0"
Dim ln10 As Double
ln10 = Log(10)
For i = N To 0 Step -1
    FactGN = FactGN & String$(Expo - 1 - Fix(Log(t(i) + 0.11) / ln10), Z) & t(i)
Next i

'Supprime les zeros inutiles du début
FactGN = ZeroGN(FactGN)

End Function