Byłem w domu przyjaciela na obiedzie, a oni zasugerowali pomysł na „przestrzeń wektorową czynnika pierwszego”. W tej przestrzeni dodatnie liczby całkowite są wyrażane jako wektor w taki sposób, że n- ty element w wektorze jest liczbą razy, gdy n- ta liczba pierwsza dzieli liczbę. (Zauważ, że oznacza to, że nasze wektory mają nieskończoną liczbę terminów.) Na przykład 20 to
2 0 1 0 0 0 ...
Ponieważ jego pierwsza faktoryzacja wynosi 2 * 2 * 5 .
Ponieważ pierwsza faktoryzacja jest unikalna, każda liczba odpowiada jednemu wektorowi.
Możemy dodawać wektory, dodając ich pary. Jest to to samo, co pomnożenie liczb, z którymi są skojarzone. Możemy również dokonywać mnożenia skalarnego, co jest podobne do podnoszenia powiązanej liczby do potęgi.
Problem polega na tym, że ta przestrzeń nie jest w rzeczywistości przestrzenią wektorową, ponieważ nie ma odwrotności. Jeśli pójdziemy dalej i dodamy odwrotności i zamkniemy przestrzeń wektorową, możemy teraz wyrazić każdą dodatnią liczbę wymierną jako wektor. Jeśli utrzymamy fakt, że dodawanie wektora reprezentuje mnożenie. Zatem odwrotność liczby naturalnej jest odwrotnością.
Na przykład liczba 20 miała wektor
2 0 1 0 0 0 ...
Tak więc ułamek 1/20 jest odwrotny
-2 0 -1 0 0 0 ...
Gdybyśmy chcieli znaleźć wektor związany z ułamkiem takim jak 14/15 , znaleźlibyśmy 14
1 0 0 1 0 0 ...
i 1/15
0 -1 -1 0 0 0 ...
i pomnóż je przez dodanie wektora
1 -1 -1 1 0 0 ...
Teraz, gdy mamy przestrzeń wektorową, możemy ją zmodyfikować, aby utworzyć wewnętrzną przestrzeń produktu, nadając jej wewnętrzny produkt. Aby to zrobić, kradniemy wewnętrzny produkt, który klasycznie podaje przestrzenie wektorowe. Iloczyn wewnętrzny dwóch wektorów jest definiowany jako suma mnożenia parami ich terminów. Na przykład 20,14/15 można obliczyć w następujący sposób
20 = 2 0 1 0 0 0 ...
14/15 = 1 -1 -1 1 0 0 ...
2 0 -1 0 0 0 ... -> 1
Jako kolejny przykład 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
Twoim zadaniem jest wdrożenie programu, który wykonuje ten produkt kropkowy. Powinien przyjmować dwie dodatnie liczby wymierne za pośrednictwem pary dodatnich liczb całkowitych (licznik i mianownik) lub typu wymiernego (liczby zmiennoprzecinkowe są niedozwolone, ponieważ powodują problemy z precyzją i podzielnością) i powinien wypisywać liczbę całkowitą reprezentującą iloczyn iloczynu dwóch wejścia.
To jest golf golfowy, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.
Przypadki testowe
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
źródło
Odpowiedzi:
MATL , 12 bajtów
Dane wejściowe to tablica
[num1 den1 num2 den2]
.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Rozważ przykładowe dane wejściowe
[20 1 14 15]
.źródło
C (gcc) , 99 + 32 = 131 bajtów
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
.Wypróbuj online!
źródło
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
używana jest dodatkowa flaga (32 bajty) (więc 99 + 32 = 131); w przeciwnym razie sam kod nie ma większego sensu.Galaretka ,
1211 bajtówWypróbuj online!
źródło
Python 2 , 110 bajtów
Wypróbuj online!
Przyjmuje dane wejściowe jak
[num1, num2, den1, den2]
. Używa liczby zespolonejr
do przechowywania wpisów liczb pierwszychp
dla dwóch uzasadnień i(r*r).imag/2
do wyodrębnienia ich produktur.real*r.imag
w ramach sumyt
. Dodanie1j**i
dlai=0,1,2,3
powoduje wykonanie każdej kombinacji zwiększania lub zmniejszania części rzeczywistej lub urojonej dla czterech liczb wejściowych.Bubbler zapisał 2 bajty łączące wartości początkowe
p=t=2
.źródło
p=t=2
zamiastp=2;t=0
ponieważt.real
jest ignorowane mimo to ( TIO ).Wolfram Language (Mathematica) , 55 bajtów
Wypróbuj online!
źródło
JavaScript (Node.js) ,
104...10094 bajtówWypróbuj online!
Przekaż liczby jako tablicę [Num1, Den1, Num2, Den2].
Dzięki za Arnauld za naprawienie brakujących
F=
bez dodatkowych bajtów i 2 kolejnych bajtów mniej.Wyjaśnienie i nie golfista
źródło
J , 19 bajtów
Wypróbuj online!
Wyjaśnienie:
Czasownik dynamiczny, argumenty znajdują się zarówno po lewej, jak i po prawej stronie
źródło
Stax , 11 bajtów
Uruchom i debuguj
Odpowiada to reprezentacji ascii tego samego programu.
Zasadniczo pobiera wykładniki pierwszej faktoryzacji dla każdej części. Pobiera różnicę dla każdej pary, następnie produktu, i na koniec sumuje wszystkie wyniki.
źródło
Python 2 ,
133127 bajtówWypróbuj online!
Ukradnij warunek pętli od złożenia xnora .
Dzięki za radę @mathmandan, aby zmienić funkcję w program (tak, rzeczywiście zaoszczędził kilka bajtów).
Przestarzałe, nieprawidłowe rozwiązanie (124 bajty):
źródło
p
zamierza testować wartości innych niż pierwotne, takich jak 9?return
zprint
, można również zapisać spacje wcięć jeśli piszesz jako program zamiast funkcji.eval()
chyba że dane wejściowe funkcji są ciągiem).Haskell , 153 bajty
Wypróbuj online! Przykładowe zastosowania dla
20 · 14/15
:(2%) [20,1,14,15]
.źródło