VBA : PPCM

dionys0s

XLDnaute Impliqué
Bonjour le forum,

j'aimerais créer ma propre fonction de calcul du plus petit commun multiple de n nombres (i.e. grâce à un ParamArray).
J'ai déjà créé celle du plus grand commun diviseur, mais je n'arrive pas à faire celle du plus petit commun multiple.
Je pensais naïvement qu'il s'agissait du produit des n paramètres divisé par le PGCD des n paramètres, mais je me trompe.

VB:
Sub TesterLcm()

  Dim Lng As Long

  MsgBox Excel.Application.WorksheetFunction.Lcm(132, 72, 21) & " - " & Lcm(132, 72, 21)

End Sub

Public Function Lcm(ParamArray Args() As Variant) As Long 'Least Common Multiple

  Dim k As Long

  k = LBound(Args): Lcm = Args(k): Do: k = k + 1
  Lcm = Lcm * Args(k): Loop Until k = UBound(Args)
  Lcm = Lcm / Gcd(Args)

End Function

Public Function Gcd(ParamArray Args() As Variant) As Long 'Greatest common divisor

  Dim k As Long

  k = LBound(Args): Gcd = Args(k): Do: k = k + 1
  sGcd Gcd, Args(k - 1) + 0, Args(k) + 0
  Loop Until k = UBound(Args)

End Function

Private Sub sGcd(Rslt As Long, Nb1 As Long, Nb2 As Long)

  Dim Remainder As Long

  Remainder = MMod(Nb1 + 0, Nb2 + 0)
  If Remainder = 0 Then
  If Nb2 < Rslt Then Rslt = Nb2
  Else: sGcd Rslt, Nb2, Remainder: End If

End Sub

Public Function MMod(Number As Double, Divisor As Double) As Long
MMod = Number - (Divisor * VBA.Fix(Number / Divisor)): End Function

Sur la toile je ne trouve que des définitions de PPCM pour 2 nombres, pas pour n. Quelqu'un a-t-il une idée ?

D'avance merci pour toute aide :)
 

ROGER2327

XLDnaute Barbatruc
Bonjour dionys0s.

Bonjour le forum,

j'aimerais créer ma propre fonction de calcul du plus petit commun multiple de n nombres (i.e. grâce à un ParamArray).
J'ai déjà créé celle du plus grand commun diviseur, mais je n'arrive pas à faire celle du plus petit commun multiple.
Je pensais naïvement qu'il s'agissait du produit des n paramètres divisé par le PGCD des n paramètres, mais je me trompe.
(...)
Sur la toile je ne trouve que des définitions de PPCM pour 2 nombres, pas pour n. Quelqu'un a-t-il une idée ?

D'avance merci pour toute aide :)

Pas de formule miracle :




ℝOGER2327
#8406


Mardi 17 As 144 (Saint Pangloss, humoriste passif - fête Suprême Quarte)
29 Brumaire An CCXXV, 1,2285h - cormier
2016-W46-6T02:56:55Z
 

Pièces jointes

  • ppmc de n entiers.PNG
    ppmc de n entiers.PNG
    40.6 KB · Affichages: 692

Modeste geedee

XLDnaute Barbatruc
Bonsour®
j'aimerais créer ma propre fonction de calcul du plus petit commun multiple de n nombres.
Je pensais naïvement qu'il s'agissait du produit des n paramètres divisé par le PGCD des n paramètres, mais je me trompe.
Sur la toile je ne trouve que des définitions de PPCM pour 2 nombres, pas pour n. Quelqu'un a-t-il une idée ?
sauf à ré-inventer les mathématiques :
Le PPCM peut se définir plus généralement pour un nombre quelconque d'éléments : par exemple le PPCM de n entiers non nuls est le plus petit entier strictement positif multiple simultanément de ces n entiers.
un process itératif correspond à cette hypothèse :
Code:
=PPCM(PPCM(PPCM(PPCM(PPCM(PPCM(n1;n2);n3);n4);n5);n6);n7)
 

dionys0s

XLDnaute Impliqué
Re,
bonjour tout le monde,

Merci à vous deux pour votre aide ! Du coup j'obtiens ce petit jeu de fonctions qui fonctionnent à merveille :)

VB:
Public Function Lcm(ParamArray Args() As Variant) As Double 'Least common multiple

  Dim k As Long

  k = LBound(Args): Lcm = Args(k): Do: k = k + 1
  Lcm = Lcm * Args(k) / fGcd(Lcm, Args(k) + 0): Loop Until k = UBound(Args)

End Function

Public Function Gcd(ParamArray Args() As Variant) As Double 'Greatest common divisor

  Dim k As Long

  k = LBound(Args): Gcd = Args(k): Do: k = k + 1
  Gcd = fGcd(Args(k - 1) + 0, Args(k) + 0): Loop Until k = UBound(Args)

End Function

Private Function fGcd(Nb1 As Double, Nb2 As Double) As Double
  fGcd = MMod(Nb1, Nb2): If fGcd = 0 Then fGcd = Nb2 Else fGcd = fGcd(Nb2, fGcd)
End Function

Public Function MMod(Number As Double, Divisor As Double) As Long
MMod = Number - (Divisor * VBA.Fix(Number / Divisor)): End Function

Bonne journée !
 

ROGER2327

XLDnaute Barbatruc
Re...

(...)
Du coup j'obtiens ce petit jeu de fonctions qui fonctionnent à merveille
(...)
Méfiez-vous quand même :
Code:
=Gcd(9240;12936;-1380;6600)
renvoie 60. Je doute que 12 936 soit divisible par 5...

Bonne nuit.


ℝOGER2327
#8412


Vendredi 20 As 144 (Saint Olibrius, augure - fête Suprême Quarte)
2 Frimaire An CCXXV, 9,7707h - turnep
2016-W47-2T23:26:59Z
 

Discussions similaires

Statistiques des forums

Discussions
314 190
Messages
2 106 991
Membres
109 733
dernier inscrit
chardou