Od dawna wiadomo, że każdą nieujemną liczbę całkowitą można przepisać jako sumę czterech kwadratowych liczb całkowitych. Na przykład liczbę 1 można wyrazić jako . Lub, ogólnie rzecz biorąc, dla dowolnej nieujemnej liczby całkowitej istnieją liczby całkowite takie, że
Joseph-Louis Lagrange udowodnił to w 1700 roku, dlatego często nazywa się to twierdzeniem Lagrange'a .
Czasami jest to omawiane w odniesieniu do czwartorzędów - rodzaju liczby odkrytej przez Williama Hamiltona w XIX wieku, reprezentowanej jako gdzie są liczbami rzeczywistymi, a i to odrębne urojone jednostki, które nie mnożą się przemiennie. W szczególności omawia się to w odniesieniu do kwadratu każdego komponentu czwartorzędu Ta wielkość jest czasem nazywana normą lub normą do kwadratu , a także kwadrantem . Niektóre współczesne dowody twierdzenia Lagrange'a używają czwartorzędów.
Rudolf Lipschitz badał czwartorzędy zawierające wyłącznie składniki całkowite, zwane czwartorzędami Lipschitza. Korzystając z kwadrantu, możemy sobie wyobrazić, że każdy czwartorzęd Lipschitza może mieć przyjaciela w liczbach całkowitych. Na przykład czwartorzędowy można uznać za powiązany z liczbą całkowitą . Ponadto, jeśli cofniemy się, wówczas każdą liczbę całkowitą można uznać za posiadającą przyjaciela w kwaterach Lipschitza.
Istnieje jednak interesujący szczegół twierdzenia Lagrange'a - podsumowanie nie jest unikalne. Każda liczba całkowita może mieć kilka różnych zestawów czterech kwadratów, które można zsumować, aby ją utworzyć. Na przykład liczbę 1 można wyrazić na 4 sposoby przy użyciu liczb całkowitych nieujemnych (rozważmy tylko nieujemne dla tego wyzwania):
1 = 1 ^ 2 + 0 ^ 2 + 0 ^ 2 + 0 ^ 2
Sumy mają zawsze kwadraty 0 lub 1, ale mogą znajdować się w różnych pozycjach wyrażenia.
W przypadku tego wyzwania „posortujmy” nasze sumy od najniższych do najwyższych, aby wyeliminować duplikaty, abyśmy mogli rozważyć w tym ćwiczeniu, że 1 ma tylko jeden sposób przedstawienia się jako suma czterech kwadratów:
Innym przykładem jest liczba 42, którą można wyrazić na cztery sposoby (ponownie, biorąc pod uwagę tylko nieujemne a, b, c, d i eliminując zduplikowane układy składników)
Co jeśli wyobrażamy sobie, że każdy z tych różnych sposobów wyrażania liczby całkowitej jest powiązany z konkretnym czwartorzędem? Możemy więc powiedzieć, że liczba 42 jest związana z tymi czterema czwartorzędami:
Jeśli wyobrażamy sobie standardową interpretację grafiki komputerowej czwartorzędu, gdzie , i są wektorami w trójwymiarowej przestrzeni euklidesowej , a więc składowe , i czwartorzędu są trójwymiarowymi współrzędnymi kartezjańskimi , wówczas możemy sobie wyobrazić, że każdą liczbę całkowitą, poprzez ten proces myślowy, można powiązać z zestawem trójwymiarowych współrzędnych w przestrzeni. Na przykład liczba 42 jest powiązana z następującymi czterema współrzędnymi : x y z ( x , y , z ) ( 1 , 4 , 5 ) , ( 1 , 2 , 6 ) , ( 3 , 4 , 4 ) , ( 2 , 3 , 5 )
Można to uznać za chmurę punktów lub zestaw punktów w przestrzeni. Jedną ciekawą rzeczą dotyczącą zestawu skończonych punktów w przestrzeni jest to, że zawsze możesz narysować wokół nich minimalne obwiednię - pole, które jest wystarczająco duże, aby zmieścić wszystkie punkty, ale nie większe. Jeśli wyobrażasz sobie, że to pole jest zwykłym polem wyrównanym do osi , nazywa się to obwiednią wyrównaną do osi . Obwiednia ma również objętość, którą można obliczać, określając jej szerokość, długość i wysokość oraz mnożąc je razem.
Następnie możemy sobie wyobrazić objętość obwiedni dla punktów utworzonych przez nasze czwartorzędy. Dla liczby całkowitej 1, korzystając z kryteriów tego ćwiczenia, mamy jedną ćwiartkę, której kwadrant wynosi 1, . Jest to bardzo prosta chmura punktów, ma tylko jeden punkt, więc jej obwiednia ma objętość 0. Jednak dla liczby całkowitej 42 mamy cztery ćwiartki, a więc cztery punkty, wokół których możemy narysować obwiednię. Minimalny punkt pudełka to a maksymalny to co daje szerokość, długość i wysokość 2, 2 i 2, co daje objętość 8.
Powiedzmy, że dla liczby całkowitej objętość q jest objętością wyrównanego do osi pola granicznego wszystkich punktów 3D utworzonych przez ćwiartki o ćwiartce równej , gdzie składowe ćwiartki są nieujemne i .
Utwórz program lub funkcję, która, biorąc pod uwagę jedną nieujemną liczbę całkowitą , wyświetli qvolume .
Przykłady:
input -> output
0 -> 0
1 -> 0
31 -> 4
32 -> 0
42 -> 8
137 -> 96
1729 -> 10032
To jest golf golfowy, najmniejsza liczba bajtów wygranych.
źródło
Odpowiedzi:
Wolfram Language (Mathematica) ,
6758 bajtówWypróbuj online!
źródło
Galaretka , 17 bajtów
Wypróbuj online! (dość wolno - zrób to wystarczająco szybko dla wszystkich przypadków testowych z wiodącym
½
)W jaki sposób?
źródło
Haskell ,
132123 bajtyWypróbuj online!
Całkiem proste rozwiązanie. Brute force wszystkie możliwe rozwiązania, iterując wszystkie wartości od 0 do n (o wiele za dużo, ale krócej bajtecount). Wypisuję punkt jako listę, abyśmy mogli użyć magicznego
(!)
operatora @ Lynn . Ten operator zwija każdy wymiar funkcją po lewej stronie, dlategomax!p
zwraca listę rozmiaru 3, która składa się z maksimów wzdłuż każdego wymiaru imin!p
robi to samo dla minimum. Następnie po prostu znajdujemy minimalny rozmiar w każdym wymiarze (odejmując wartość minimalną od maksymalnej za pomocąz(-)
) i mnożymy je razem.Bardzo dziękuję @Lynn za zdjęcie 9 bajtów za pomocą składanej magii zip!
źródło
zipWith
logiki. 123 bajtyMłot 0.2, 12 bajtów
Używaj z Mathematica 11.2 i tą wersją Sledgehammer, która poprzedza wyzwanie. Zobacz historię edycji dla wersji, która działa w wersji 0.3, która ma GUI i generuje wyrażenie Mathematica.
To wypycha dane wejściowe do stosu i wywołuje sekwencję poleceń
co jest równoważne z oceną następującego kodu Wolfram pochodzącego z mojej odpowiedzi Wolfram Language :
Wypróbuj online!
źródło
Python 2 , 138 bajtów
Wypróbuj online!
Rekurencyjnie generuje odwrotnie posortowane czwartorzędy z podaną normą, a następnie przyjmuje iloczyn między maksimum i miną wszystkich możliwych wartości w pierwszych trzech indeksach.
itertools
mógłby mieć szansę, gdyby nie używał śmiesznie długich nazwisk takich jakitertools.combinations_with_replacement
Python 2 , 161 bajtów
Wypróbuj online!
Dlatego
itertools
nigdy nie jest odpowiedzią .źródło
JavaScript (ES6),
148143 bajtówWypróbuj online!
Skomentował
Krok 1
Krok 2
źródło
C # (interaktywny kompilator Visual C #) , 229 bajtów
Wypróbuj online!
źródło
05AB1E , 18 bajtów
Wypróbuj online!
Port galaretki Jonathana Allana .
źródło
Haskell , 108 bajtów
Wypróbuj online! (limit czasu dla większych przypadków testowych)
Są tu dziwne optymalizacje. Aby obliczyć
maximum l-minimum l
listęl
elementów w danej pozycji, okazuje się krótszy w kontekście, aby przekonwertować je oba na maksima, negując drugi termin:maximum l+maximum(map((-1)*))l
lub równoważniesum[maximum$map(b*)l||b<-[-1,1]]
.Aby pomnożyć trzy wymiary, okazuje się, że krótsze jest napisanie produktu
f n=n%0*n%1*n%2
niż użycie jakiejkolwiek pętli. Tutajn%i
jest różnica między wartością minimalną i maksymalnąi
wartości współrzędnych, które są wyodrębniane za pomocą indeksowania!!i
.Aby wygenerować poprawne cztery krotki, bierzemy listy czterech liczb, z
[0..n]
których kwadraty sumują sięn
i maleją. Sprawdzamy odwrotność sortowania zat
pomocąscanr1 max t==t
, która sprawdza , czy maksimum biegu wstecznego jest samo w sobie, ponieważ Haskell nie ma wbudowanego sortowania bez kosztownego importu. Próbowałem różnych sposobów rekurencyjnego generowania czterech krotek, tak jak w moich odpowiedziach w języku Python, ale wszystkie były dłuższe niż ten sposób generowania i filtrowania brutalnej siły.źródło