Ich war zum Abendessen bei einem Freund und sie schlugen die Idee eines "Prime-Factor-Vector-Space" vor. In diesem Raum werden die positiven ganzen Zahlen als ein Vektor ausgedrückt, so dass das n- te Element im Vektor die Häufigkeit ist, mit der die n- te Primzahl die Zahl teilt. (Beachten Sie, dass dies bedeutet, dass unsere Vektoren eine unendliche Anzahl von Begriffen haben.) Zum Beispiel 20 ist
2 0 1 0 0 0 ...
Weil seine Primfaktorisierung 2 * 2 * 5 ist .
Da die Primfaktorisierung eindeutig ist, entspricht jede Zahl einem Vektor.
Wir können Vektoren hinzufügen, indem wir ihre Einträge paarweise hinzufügen. Dies entspricht dem Multiplizieren der ihnen zugeordneten Zahlen. Wir können auch eine Skalarmultiplikation durchführen, die einer Potenzierung der zugehörigen Zahl entspricht.
Das Problem ist, dass dieser Raum kein Vektorraum ist, weil es keine Inversen gibt. Wenn wir die Inversen addieren und den Vektorraum schließen, haben wir jetzt die Möglichkeit, jede positive rationale Zahl als Vektor auszudrücken. Wenn wir die Tatsache beibehalten, dass die Vektoraddition eine Multiplikation darstellt. Dann ist die Umkehrung einer natürlichen Zahl ihre Umkehrung.
Zum Beispiel hatte die Zahl 20 den Vektor
2 0 1 0 0 0 ...
Der Bruch 1/20 ist also umgekehrt
-2 0 -1 0 0 0 ...
Wenn wir den mit einem Bruch wie 14/15 assoziierten Vektor finden wollten, würden wir 14 finden
1 0 0 1 0 0 ...
und 1/15
0 -1 -1 0 0 0 ...
und multiplizieren Sie sie durch Vektoraddition
1 -1 -1 1 0 0 ...
Jetzt, da wir einen Vektorraum haben, können wir ihn modifizieren, um einen inneren Produktraum zu bilden, indem wir ihm ein inneres Produkt geben. Dazu stehlen wir das innere Produkt, dass Vektorräume klassisch gegeben sind. Das innere Produkt zweier Vektoren ist definiert als die Summe der paarweisen Multiplikation ihrer Terme. Zum Beispiel würde 20 · 14/15 wie folgt berechnet
20 = 2 0 1 0 0 0 ...
14/15 = 1 -1 -1 1 0 0 ...
2 0 -1 0 0 0 ... -> 1
Als weiteres Beispiel das Produkt 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
Ihre Aufgabe ist es, ein Programm zu implementieren, das dieses Skalarprodukt ausführt. Es sollten zwei positive rationale Zahlen über ein Paar positiver Ganzzahlen (Zähler und Nenner) oder einen rationalen Typ (Gleitkommazahlen sind nicht zulässig, da sie Probleme mit der Genauigkeit und Teilbarkeit verursachen) und eine ganze Zahl ausgegeben werden, die das Skalarprodukt der beiden darstellt Eingänge.
Dies ist Codegolf, daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.
Testfälle
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
quelle
Antworten:
MATL , 12 Bytes
Die Eingabe ist ein Array
[num1 den1 num2 den2]
.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Betrachten Sie die Beispieleingabe
[20 1 14 15]
.quelle
C (gcc) , 99 + 32 = 131 Bytes
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
.Probieren Sie es online!
quelle
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
(32 Byte) verwendet wird (also 99 + 32 = 131); ansonsten macht der code alleine wenig sinn.Jelly ,
1211 BytesProbieren Sie es online!
quelle
Python 2 , 110 Bytes
Probieren Sie es online!
Nimmt Eingaben wie
[num1, num2, den1, den2]
. Verwendet eine komplexe Zahlr
, um die Einträge für Primzahlenp
für die beiden Rationen zu speichern und(r*r).imag/2
ihr Produktr.real*r.imag
innerhalb der Gesamtsumme zu extrahierent
. Addieren1j**i
füri=0,1,2,3
bewirkt jede Kombination des Inkrementierens oder Dekrementierens des Real- oder Imaginärteils für die vier eingegebenen Zahlen.Bubbler speicherte 2 Bytes, die die Anfangswerte kombinierten
p=t=2
.quelle
p=t=2
stattp=2;t=0
dat.real
wird sowieso ignoriert ( TIO ).Wolfram Language (Mathematica) , 55 Byte
Probieren Sie es online!
quelle
JavaScript (Node.js) ,
104...10094 BytesProbieren Sie es online!
Übergeben Sie die Zahlen als Array von [Num1, Den1, Num2, Den2].
Vielen Dank für Arnauld, dass er das Fehlen
F=
ohne zusätzliche Bytes behoben hat und 2 weitere Bytes weniger.Erklärung & ungolfed
quelle
J , 19 Bytes
Probieren Sie es online!
Erläuterung:
Als dyadisches Verb stehen die Argumente sowohl auf der linken als auch auf der rechten Seite
quelle
Stax , 11 Bytes
Führen Sie es aus und debuggen Sie es
Dies ist die entsprechende ASCII-Darstellung desselben Programms.
Grundsätzlich werden die Exponenten der Primfaktorisierung für jeden Teil ermittelt. Es wird die Differenz jedes Paares, dann des Produkts und schließlich die Summe aller Ergebnisse berechnet.
quelle
Python 2 ,
133127 BytesProbieren Sie es online!
Die Schleifenbedingung wurde aus xnors Vorlage gestohlen .
Vielen Dank für den Rat von @mathmandan, die Funktion in ein Programm umzuwandeln (Ja, es hat tatsächlich einige Bytes gespart).
Veraltete, falsche Lösung (124 Bytes):
quelle
p
Nicht-Primzahlen wie 9 testen?return
mitprint
, und Sie können auch die Vertiefung Räume sparen , wenn Sie als ein Programm statt einer Funktion schreiben.eval()
Eingabe handelt (es sei denn, die Funktionseingabe selbst ist eine Zeichenfolge).Haskell , 153 Bytes
Probieren Sie es online! Beispiel für die Verwendung für
20 · 14/15
:(2%) [20,1,14,15]
.quelle