IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Algorithme base canonique polynôme multivariable [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 112
    Points : 191
    Points
    191
    Par défaut Algorithme base canonique polynôme multivariable
    Bonjour le forum,

    je cherche à déterminer la base canonique d'un polynôme avec m variables et de degré n. Je n'arrive pas à écrire la fonction qui me sort les diverses combinaisons possible.

    Exemple de résultat attendu simple avec m = 3 et n = 2 :
    x1 | x2 | x3 | x1² | x1x2 | x1x3 | x2² | x2x3 | x3²

    La fonction que je cherche à écrire serait du genre : base(3, 2) = {(1.0.0)/(0.1.0)/(0.0.1)/(2.0.0)/(1.1.0)/.../(0.0.2)}

    Je galère, vraiment aucune idée de comment l'écrire... une fonction récursive ? Bref si nue bonne âme peut me donner un coup de main je suis preneur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Function base(ByVal m As Integer, ByVal n As Integer) As Variant
        Dim tuple() As Integer 'variable contenant le degré de chaque variable
        ReDim tuple(1 To m)
        Dim b As Variant    'variable de stockage des tuples
        dimB = Application.WorksheetFunction.MultiNomial(n, m)
        ReDim b(1 To dimB)
     
                For i = 1 To dimB
                   '  ...le calcul du tuple que je misère à implémenter 
                     b(i) = tuple
                Next i
        base = b
    end function
    A+
    letienne

    EDIT: j'ai trouvé un code Python qui est censé faire ça mais je ne voit vraiment pas comment le transposer en vba...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def base(m, n):
        b = ((),)
        for _ in range(m):
            b = (x + (y,) for x in b for y in range(n-sum(x)+1))
        return b

  2. #2
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    Bonjour,

    Si tu me confirme que ce lien répond à ta question , je peux te le faire , il faut que je revois certains trucs , mais ton exercice m'intéresse


    http://www.gecif.net/articles/mathem.../polynome.html
    Allez le RC LEns

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour tamtam
    Bien lire :
    je cherche à déterminer la base canonique d'un polynôme avec m variables et de degré n. Je n'arrive pas à écrire la fonction qui me sort [U]les diverses combinaisons possible[/U].
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, peut-être que cela fera avancer les choses ?

  5. #5
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 112
    Points : 191
    Points
    191
    Par défaut
    Bonjour et merci pour vos réponses.

    @tamtam64 ton lien est intéressant mais ce n'est pas mon sujet, je ne cherche pas à trouver les racines mais l'ensemble de monômes.
    @kiki29 oui j'avais déjà vu cette manière de faire et c'est ce que je veux faire pour représenter les puissances.

    Au final j'ai trouvé une méthode qui fonctionne, bien que je ne la trouve pas très élégante.
    La voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    EDIT: Le résultat renvoie une chaine de la forme "0002;0003;...;3000", représentant x1^0*x2^0*x3^0*x4^2;x1^0*x2^0*x3^0*x4^3;...;x1^3*x2^0*x3^0*x4^0

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/05/2015, 13h09
  2. Algorithme base de données
    Par Pachina75 dans le forum Outils
    Réponses: 5
    Dernier message: 28/05/2014, 16h19
  3. Algorithme à base de pseudo-aléatoire
    Par tamerla dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 08/12/2013, 12h23
  4. Algorithme de conversion de base
    Par dejaoui dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 10/04/2008, 16h07
  5. Réponses: 4
    Dernier message: 09/04/2008, 20h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo