¿Cómo se calcula el mínimo común múltiplo de múltiples números?
Hasta ahora solo he podido calcularlo entre dos números. Pero no tengo idea de cómo expandirlo para calcular 3 o más números.
Hasta ahora así es como lo hice
LCM = num1 * num2 / gcd ( num1 , num2 )
Con gcd es la función para calcular el máximo divisor común para los números. Usando algoritmo euclidiano
Pero no puedo entender cómo calcularlo para 3 o más números.
Respuestas:
Puede calcular el MCM de más de dos números calculando iterativamente el LCM de dos números, es decir
fuente
En Python ( primes.py modificado ):
Uso:
reduce()
funciona algo así como que :fuente
t = a; a = b; b = t % b
Aquí hay una implementación de estilo ECMA:
fuente
Yo iría con este (C #):
Solo algunas aclaraciones, porque a primera vista no parece tan claro lo que está haciendo este código:
Aggregate es un método de extensión de Linq, por lo que no puede olvidar agregar usando System.Linq a sus referencias.
El agregado obtiene una función de acumulación para que podamos utilizar la propiedad lcm (a, b, c) = lcm (a, lcm (b, c)) sobre un IEnumerable. Más sobre agregado
El cálculo de GCD utiliza el algoritmo euclidiano .
El cálculo del mcm usa Abs (a * b) / mcd (a, b), consulte Reducción por el máximo común divisor .
Espero que esto ayude,
fuente
Acabo de descubrir esto en Haskell:
¡Incluso me tomé el tiempo para escribir mi propia
gcd
función, solo para encontrarla en Prelude! Mucho aprendizaje para mí hoy: Dfuente
lcm ns = foldr1 lcm' ns
olcm = foldr1 lcm'
Integral
lo implicadiv
Algún código de Python que no requiere una función para gcd:
Así es como se ve en la terminal:
fuente
Aquí hay una línea única de Python (sin contar las importaciones) para devolver el MCM de los enteros del 1 al 20 inclusive:
Python 3.5+ importaciones:
Python 2.7 importaciones:
Lógica común:
Tenga en cuenta que tanto en Python 2 como en Python 3 , las reglas de precedencia de operadores dictan que los operadores
*
y//
tienen la misma precedencia, por lo que se aplican de izquierda a derecha. Como tal,x*y // z
significa(x*y) // z
y nox * (y//z)
. Los dos suelen producir resultados diferentes. Esto no habría importado tanto para la división de flotación, pero sí para la división de piso .fuente
Aquí hay un puerto C # de implementación de Virgil Disgr4ce:
fuente
Función para encontrar el mcm de cualquier lista de números:
fuente
Usando LINQ podrías escribir:
Debería agregar
using System.Linq;
y no olvidar manejar las excepciones ...fuente
Y la versión Scala:
fuente
Aquí está en Swift .
fuente
puede hacerlo de otra manera: deje que haya n números. Tome un par de números consecutivos y guarde su mcm en otra matriz. Al hacer esto en el primer programa de iteración, se realizan n / 2 iteraciones. Luego, el siguiente par comienza desde 0 como (0,1), (2,3) y así sucesivamente. Calcule su LCM y almacénelo en otra matriz. Haga esto hasta que quede con una matriz. (no es posible encontrar mcm si n es impar)
fuente
En R, podemos usar las funciones mGCD (x) y mLCM (x) de los números de paquete , para calcular el máximo común divisor y el mínimo común múltiplo para todos los números en el vector entero x juntos:
fuente
Estilo ES6
fuente
gcd(a, b)
pero lagdc
función espera una matriz, así que querías llamargcd([a, b])
Solo por diversión, una implementación de shell (casi cualquier shell):
pruébalo con:
Llegar
El mayor aporte y resultado debe ser menor
(2^63)-1
o se ajustará la matemática del shell.fuente
Estaba buscando gcd y mcm de elementos de matriz y encontré una buena solución en el siguiente enlace.
https://www.hackerrank.com/challenges/between-two-sets/forum
que incluye el siguiente código. El algoritmo para gcd usa el algoritmo euclidiano explicado bien en el siguiente enlace.
https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/the-euclidean-algorithm
fuente
Aquí está la implementación de PHP :
Los créditos van a @ T3db0t con su respuesta anterior (código de estilo ECMA) .
fuente
GCD necesita una pequeña corrección para los números negativos:
fuente
¿Qué tal esto?
fuente
Tenemos una implementación funcional de Mínimo Común Múltiple en Cálculo que funciona para cualquier cantidad de entradas y también muestra los pasos.
Lo que hacemos es:
Y eso es todo, tienes tu mcm.
fuente
LCM es asociativo y conmutativo.
LCM (a, b, c) = LCM (LCM (a, b), c) = LCM (a, LCM (b, c))
Aquí hay un código de muestra en C:
fuente
El método compLCM toma un vector y devuelve LCM. Todos los números están dentro del vector in_numbers.
fuente
fuente
Para cualquiera que busque un código de trabajo rápido, intente esto:
Escribí una función
lcm_n(args, num)
que calcula y devuelve el mcm de todos los números en la matrizargs
. El segundo parámetronum
es el recuento de números en la matriz.Ponga todos esos números en una matriz
args
y luego llame a la función comolcm_n(args,num);
Esta función devuelve el mcm de todos esos números.
Aquí está la implementación de la función
lcm_n(args, num)
:Esta función necesita debajo de dos funciones para funcionar. Entonces, solo agrégalos junto con él.
fuente
int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a%b); } int lcm(int[] a, int n) { int res = 1, i; for (i = 0; i < n; i++) { res = res*a[i]/gcd(res, a[i]); } return res; }
fuente
En python:
fuente
Esto es lo que usé
fuente
para python 3:
fuente
En Ruby, es tan simple como:
(probado en Ruby 2.2.10 y 2.6.3.)
fuente