Estaba cenando en la casa de un amigo y me sugirieron la idea de un "espacio vectorial de factor primo". En este espacio los enteros positivos se expresan como un vector tal que el n -ésimo elemento en el vector es el número de veces que el n º divisiones principales del número. (Tenga en cuenta que esto significa que nuestros vectores tienen un número infinito de términos). Por ejemplo, 20 es
2 0 1 0 0 0 ...
Porque su factorización prima es 2 * 2 * 5 .
Como la factorización prima es única, cada número corresponde a un vector.
Podemos agregar vectores agregando sus entradas por pares. Esto es lo mismo que multiplicar los números con los que están asociados. También podemos hacer una multiplicación escalar, que es similar a elevar el número asociado a una potencia.
El problema es que este espacio no es, de hecho, un espacio vectorial porque no hay inversos. Si continuamos y sumamos los inversos y cerramos el espacio vectorial, ahora tenemos una forma de expresar cada número racional positivo como un vector. Si mantenemos el hecho de que la suma de vectores representa la multiplicación. Entonces el inverso de un número natural es su recíproco.
Por ejemplo, el número 20 tenía el vector
2 0 1 0 0 0 ...
Entonces la fracción 1/20 es inversa
-2 0 -1 0 0 0 ...
Si quisiéramos encontrar el vector asociado con una fracción como 14/15 , encontraríamos 14
1 0 0 1 0 0 ...
y 1/15
0 -1 -1 0 0 0 ...
y multiplíquelos realizando la suma vectorial
1 -1 -1 1 0 0 ...
Ahora que tenemos un espacio vectorial, podemos modificarlo para formar un espacio interno del producto dándole un producto interno. Para hacer esto, robamos el producto interno que los espacios vectoriales se dan clásicamente. El producto interno de dos vectores se define como la suma de la multiplicación por pares de sus términos. Por ejemplo 20 · 14/15 se calcularía de la siguiente manera
20 = 2 0 1 0 0 0 ...
14/15 = 1 -1 -1 1 0 0 ...
2 0 -1 0 0 0 ... -> 1
Como otro ejemplo, el producto 2/19 · 4/19
2/19 = 1 0 0 0 0 0 0 -1 0 0 0 ...
4/19 = 2 0 0 0 0 0 0 -1 0 0 0 ...
2 0 0 0 0 0 0 1 0 0 0 ... -> 3
Su tarea es implementar un programa que realice este producto punto. Debe tomar dos números racionales positivos a través de un par de enteros positivos (numerador y denominador) o de un tipo racional (no se permiten los flotantes, porque causan problemas con la precisión y la divisibilidad) y debe generar un número entero que represente el producto de punto de los dos entradas
Este es el código de golf, por lo que las respuestas se puntuarán en bytes, con menos bytes mejor.
Casos de prueba
4 · 4 = 4
8 · 8 = 9
10 · 10 = 2
12 · 12 = 5
4 · 1/4 = -4
20 · 14/15 = 1
2/19 · 4/19 = 3
fuente
Respuestas:
MATL , 12 bytes
La entrada es una matriz
[num1 den1 num2 den2]
.Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
Considere la entrada de ejemplo
[20 1 14 15]
.fuente
C (gcc) , 99 + 32 = 131 bytes
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
.Pruébalo en línea!
fuente
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
se usa la bandera adicional (32 bytes) (entonces 99 + 32 = 131); de lo contrario, el código solo tiene poco sentido.Jalea ,
1211 bytesPruébalo en línea!
fuente
Python 2 , 110 bytes
Pruébalo en línea!
Toma entrada como
[num1, num2, den1, den2]
. Utiliza un número complejor
para almacenar las entradas de primop
para los dos racionales, y(r*r).imag/2
para extraer su productor.real*r.imag
dentro de la suma totalt
. Sumando1j**i
parai=0,1,2,3
cada combinación de aumentar o disminuir la parte real o imaginaria para los cuatro números de entrada.Bubbler ahorró 2 bytes combinando los valores iniciales
p=t=2
.fuente
p=t=2
en lugar dep=2;t=0
desde entoncest.real
se ignora de todos modos ( TIO ).Wolfram Language (Mathematica) , 55 bytes
Pruébalo en línea!
fuente
JavaScript (Node.js) ,
104...10094 bytesPruébalo en línea!
Pase los números como una matriz de [Num1, Den1, Num2, Den2].
Gracias por Arnauld por arreglar lo que falta
F=
sin bytes adicionales, y 2 bytes más menos.Explicación y sin golf
fuente
J , 19 bytes
Pruébalo en línea!
Explicación:
Un verbo diádico, los argumentos están a la izquierda y a la derecha
fuente
Stax , 11 bytes
Ejecutar y depurarlo
La representación ascii correspondiente del mismo programa es esta.
Básicamente, obtiene los exponentes de la factorización prima para cada parte. Toma la diferencia de cada par, luego el producto, y finalmente suma todos los resultados.
fuente
Python 2 ,
133127bytesPruébalo en línea!
Robó la condición del bucle de la sumisión de xnor .
Gracias por el consejo de @mathmandan para cambiar la función a un programa (Sí, de hecho, guardó algunos bytes).
Solución obsoleta, incorrecta (124 bytes):
fuente
p
va a probar valores no primos como 9?return
conprint
, y también puede guardar los espacios de sangría si escribe como un programa en lugar de una función.eval()
menos que la entrada de la función sea una cadena).Haskell , 153 bytes
Pruébalo en línea! Ejemplo de uso para
20 · 14/15
:(2%) [20,1,14,15]
.fuente