web-dev-qa-db-fra.com

quel est le moyen le plus rapide de trouver le gcd de n nombres?

quel est le moyen le plus rapide de calculer le plus grand commun diviseur de n nombres?

31
Themasterhimself

Vous devriez utiliser l'algorithme GCD de Lehmer .

1
akjlab

Sans récursion:

int result = numbers[0];
for(int i = 1; i < numbers.length; i++){
    result = gcd(result, numbers[i]);
}
return result;

Pour les très grands tableaux, il peut être plus rapide d’utiliser le modèle de jointure en fourche, où vous divisez votre tableau et calculez gcds en parallèle. Voici quelques pseudocodes:

int calculateGCD(int[] numbers){
    if(numbers.length <= 2){
        return gcd(numbers);    
    }
    else {
        INVOKE-IN-PARALLEL {
            left = calculateGCD(extractLeftHalf(numbers));
            right = calculateGCD(extractRightHalf(numbers));
        }
        return gcd(left,right);
    }
}
15
dogbane

Vous voudrez peut-être trier d'abord les nombres et calculer le gcd de manière récursive à partir des deux plus petits nombres.

15
lhf

C++ 17

J'ai écrit cette fonction pour calculer gcd de n nombres en utilisant la fonction __gcd(int a, int b) intégrée de C++. 

int gcd(vector<int> vec, int vsize)
{
    int gcd = vec[0];
    for (int i = 1; i < vsize; i++)
    {
        gcd = __gcd(gcd, vec[i]);
    }
    return gcd;
}

Pour en savoir plus sur cette fonction, visitez ce lien .

Reportez-vous également à Algorithme GCD de Dijkstra à partir du lien suivant. Cela fonctionne sans division. Cela pourrait donc être un peu plus rapide (corrigez-moi si je me trompe.)

2

Utilisez l'algorithme Euclidean :

function gcd(a, b)
while b ≠ 0
   t := b; 
   b := a mod b; 
   a := t; 
return a;

Vous l'appliquez pour les deux premiers nombres, puis le résultat avec le troisième chiffre, etc ...:

read(a);
read(b);

result := gcd(a, b);
i := 3;
while(i <= n){
    read(a)
    result := gcd(result, a);
}
print(result);
1
Nagy Robi

Vous pouvez utiliser diviser et conquérir. Pour calculer gcdN ([]), vous divisez la liste en première moitié et seconde moitié. s'il n'a qu'un numéro pour chaque liste. vous calculez en utilisant gcd2 (n1, n2).

Je viens d'écrire un exemple de code rapide. (en supposant que tous les num de la liste sont des Ints positifs)

def gcdN(nums):
    n = len(nums)
    if n == 0: return "ERROR"
    if n == 1: return nums[0]
    if n >= 2: return gcd2(gcdN(nums[:n//2]), gcdN(nums[n//2:]))

def gcd2(n1, n2):
    for num in xrange(min(n1, n2), 0, -1):
        if n1 % num == 0 and n2 % num == 0:
            return num
1
CSY

Si vous avez beaucoup de petits nombres, la factorisation peut être plus rapide.

//Java
int[] array = {60, 90, 45};
int gcd = 1;
outer: for (int d = 2; true; d += 1 + (d % 2)) {
    boolean any = false;
    do {
        boolean all = true;
        any = false;
        boolean ready = true;
        for (int i = 0; i < array.length; i++) {
            ready &= (array[i] == 1);
            if (array[i] % d == 0) {
                any = true;
                array[i] /= d;
            } else all = false;
        }
        if (all) gcd *= d;
        if (ready) break outer;
    } while (any);
}
System.out.println(gcd);

(fonctionne pour quelques exemples, mais pas vraiment testé)

1
Landei
//Recursive solution to get the GCD of Two Numbers

long long int gcd(long long int a,long long int b)<br>
{
   return b==0 ? a : gcd(b,a%b);
}
int main(){
  long long int a,b;
  cin>>a>>b;
  if(a>b) cout<<gcd(a,b);
  else cout<<gcd(b,a);
return 0;
}
0
Mohit Kumra

Ci-dessous, le code source du programme C permettant de trouver des nombres HCF de N à l’aide de tableaux.

#include<stdio.h>

int main()
{
    int n,i,gcd;
    printf("Enter how many no.s u want to find gcd : ");
    scanf("%d",&n);
    int arr[n];
    printf("\nEnter your numbers below :- \n ");
    for(i=0;i<n;i++)
    {
        printf("\nEnter your %d number = ",i+1);
        scanf("%d",&arr[i]);
    }
    gcd=arr[0];
    int j=1;
    while(j<n)
    {
       if(arr[j]%gcd==0)
       {
           j++;
       }
       else
       {
           gcd=arr[j]%gcd;
           i++;
       }
    }
    printf("\nGCD of k no.s = %d ",gcd);
    return 0;
}

Pour plus d'informations, reportez-vous à ce site Web pour plus de précisions .......

0
Sam Smith

Voici une méthode de gcd qui utilise la propriété suivante: gcd (a, b, c) = gcd (a, gcd (b, c)).
Il utilise la méthode gcd de BigInteger car il est déjà optimisé. 

public static BigInteger gcd(BigInteger[] parts){
    BigInteger gcd = parts[0];
    for(int i = 1; i < parts.length; i++)
        gcd = parts[i].gcd(gcd);
    return gcd;
}
0
James McDowell

Un JavaScript unique (ES6) récursif pour un nombre quelconque de chiffres.

const gcd = (a, b, ...c) => b ? gcd(b, a % b, ...c) : c.length ? gcd(a, ...c) : Math.abs(a);
0
Lachlan Hunt