J'étais chez un ami pour le dîner et ils ont suggéré l'idée d'un "espace vectoriel à facteur premier". Dans cet espace, les entiers positifs sont exprimés comme un vecteur de telle sorte que le n ème élément dans le vecteur soit le nombre de fois que le n e premier divise le nombre. (Notez que cela signifie que nos vecteurs ont un nombre infini de termes.) Par exemple, 20 est
2 0 1 0 0 0 ...
Parce que sa factorisation première est 2 * 2 * 5 .
Puisque la factorisation première est unique, chaque nombre correspond à un vecteur.
Nous pouvons ajouter des vecteurs en ajoutant par paire leurs entrées. Cela revient à multiplier les nombres auxquels ils sont associés. Nous pouvons également faire une multiplication scalaire, ce qui revient à élever le nombre associé à une puissance.
Le problème est que cet espace n'est pas en fait un espace vectoriel car il n'y a pas d'inverses. Si nous allons de l'avant et ajoutons les inverses et fermons l'espace vectoriel, nous avons maintenant un moyen d'exprimer chaque nombre rationnel positif comme un vecteur. Si l'on garde le fait que l'addition vectorielle représente la multiplication. L'inverse d'un nombre naturel est alors sa réciproque.
Par exemple, le nombre 20 avait le vecteur
2 0 1 0 0 0 ...
La fraction 1/20 est donc son inverse
-2 0 -1 0 0 0 ...
Si nous voulions trouver le vecteur associé à une fraction comme 14/15, nous trouverions 14
1 0 0 1 0 0 ...
et 1/15
0 -1 -1 0 0 0 ...
et les multiplier en effectuant l'addition de vecteurs
1 -1 -1 1 0 0 ...
Maintenant que nous avons un espace vectoriel, nous pouvons le modifier pour former un espace de produit intérieur en lui donnant un produit intérieur. Pour ce faire, nous volons le produit intérieur que les espaces vectoriels sont donnés de façon classique. Le produit intérieur de deux vecteurs est défini comme la somme de la multiplication par paire de leurs termes. Par exemple, 20 · 14/15 serait calculé comme suit
20 = 2 0 1 0 0 0 ...
14/15 = 1 -1 -1 1 0 0 ...
2 0 -1 0 0 0 ... -> 1
Comme autre exemple, le produit 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
Votre tâche consiste à implémenter un programme qui exécute ce produit scalaire. Il doit prendre deux nombres rationnels positifs via une paire d'entiers positifs (numérateur et dénominateur) ou un type rationnel (les flottants ne sont pas autorisés, car ils posent des problèmes de précision et de divisibilité) et doit générer un entier représentant le produit scalaire des deux. contributions.
Il s'agit de code-golf donc les réponses seront notées en octets avec moins d'octets mieux.
Cas de test
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
la source
Réponses:
MATL , 12 octets
L'entrée est un tableau
[num1 den1 num2 den2]
.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Considérez l'exemple d'entrée
[20 1 14 15]
.la source
C (gcc) , 99 + 32 = 131 octets
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
.Essayez-le en ligne!
la source
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
(32 octets) est utilisé (donc 99 + 32 = 131); sinon, le code à lui seul n'a pas de sens.Gelée ,
1211 octetsEssayez-le en ligne!
la source
Python 2 , 110 octets
Essayez-le en ligne!
Prend l'entrée comme
[num1, num2, den1, den2]
. Utilise un nombre complexer
pour stocker les entrées de primep
pour les deux rationnels et(r*r).imag/2
pour extraire leur produitr.real*r.imag
dans la somme globalet
. L'addition1j**i
dei=0,1,2,3
fait chaque combinaison d'incrémentation ou de décrémentation de la partie réelle ou imaginaire pour les quatre nombres d'entrée.Bubbler a enregistré 2 octets en combinant les valeurs initiales
p=t=2
.la source
p=t=2
au lieu dep=2;t=0
puisquet.real
est de toute façon ignoré ( TIO ).Wolfram Language (Mathematica) , 55 octets
Essayez-le en ligne!
la source
JavaScript (Node.js) ,
104...10094 octetsEssayez-le en ligne!
Passez les nombres sous forme de tableau de [Num1, Den1, Num2, Den2].
Merci pour Arnauld d'avoir corrigé les disparus
F=
sans octets supplémentaires, et 2 octets de moins.Explication & non golfé
la source
J , 19 octets
Essayez-le en ligne!
Explication:
Un verbe dyadique, les arguments sont à la fois à gauche et à droite
la source
Stax , 11 octets
Exécuter et déboguer
La représentation ascii correspondante du même programme est la suivante.
Fondamentalement, il obtient les exposants de la factorisation principale pour chaque partie. Il prend la différence de chaque paire, puis le produit, et résume enfin tous les résultats.
la source
Python 2 ,
133127 octetsEssayez-le en ligne!
A volé la condition de boucle de la soumission de xnor .
Merci pour les conseils de @mathmandan de changer la fonction en programme (Oui, il a en effet économisé quelques octets).
Solution obsolète et incorrecte (124 octets):
la source
p
va pas tester des valeurs non premières comme 9?return
parprint
, et vous pouvez également enregistrer les espaces d'indentation si vous écrivez en tant que programme au lieu d'une fonction.eval()
sauf si l'entrée de fonction elle-même est une chaîne).Haskell , 153 octets
Essayez-le en ligne! Exemple d' utilisation pour
20 · 14/15
:(2%) [20,1,14,15]
.la source