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