1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
Function Base_Canonique(ByVal m As Long, ByVal n As Integer) As String
'm nombre de variables (min 2)
'n degré du polynôme (min 2)
If m < 2 Or n < 2 Then Exit Function
Dim Format_Base As String, Arrêt_Calc As String
Dim i As Long, j As Long, degre As Integer, resp As String
Dim Resultat As New Collection
'initialisation
Format_Base = Application.WorksheetFunction.Rept("0", m)
'les termes de degré > n ne nous intéresse pas, on peut s'arrêter de compter dès que le 1er digit est égal à n
arret_calc = CStr(n) & Application.WorksheetFunction.Rept("0", m - 2) & "1"
Max = convDec(n + 1, CLng(arret_calc))
For i = 2 To Max
resp = Format(convN(n + 1, i), Format_Base)
degre = 0
'vérification 1<somme(k)<=n ; j'ai fais le choix d'ignorer les termes de degré 1 et la constante
For j = 1 To Len(resp)
degre = degre + CInt(Mid(resp, j, 1))
Next j
If 1 < degre And n >= degre Then
Resultat.Add resp
End If
Next i
For i = 1 To Resultat.Count
Base_Canonique = Base_Canonique & ";" & Resultat(i)
Next i
Base_Canonique = Right(Base_Canonique, Len(Base_Canonique) - 1)
End Function
Function convDec(base_depart As Integer, nombre As Long) As Long
Dim Resultat As Long
For i = 1 To Len(CStr(nombre))
Resultat = Resultat + CInt(Mid(CStr(nombre), i, 1)) * base_depart ^ (Len(CStr(nombre)) - i)
Next i
convDec = Resultat
End Function
Function convN(Base_Arrivee As Integer, ByVal nombre As Long) As Long
Dim Resultat As String
Dim Nb_Digits As Long
Do
Nb_Digits = Nb_Digits + 1
Loop Until nombre < Base_Arrivee ^ Nb_Digits
For i = Nb_Digits - 1 To 0 Step -1
Resultat = Resultat & CStr(Int(nombre / Base_Arrivee ^ i))
nombre = nombre - (Int(nombre / Base_Arrivee ^ i)) * Base_Arrivee ^ i
Next i
convN = CLng(Resultat)
End Function
Sub test()
a = Base_Canonique(4, 3)
End Sub |
Partager