Biorąc pod uwagę kwadratową macierz liczb całkowitych jako dane wejściowe, wyprowadza wyznacznik macierzy.
Zasady
- Możesz założyć, że wszystkie elementy w macierzy, wyznacznik macierzy i całkowita liczba elementów w macierzy mieszczą się w reprezentatywnym zakresie liczb całkowitych dla twojego języka.
- Wyprowadzanie wartości dziesiętnej / zmiennoprzecinkowej z ułamkową częścią 0 jest dozwolone (np.
42.0
Zamiast42
). - Wbudowane są dozwolone, ale zachęcamy do dołączenia rozwiązania, które nie używa wbudowanych.
Przypadki testowe
[[42]] -> 42
[[2, 3], [1, 4]] -> 5
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] -> 0
[[13, 17, 24], [19, 1, 3], [-5, 4, 0]] -> 1533
[[372, -152, 244], [-97, -191, 185], [-53, -397, -126]] -> 46548380
[[100, -200, 58, 4], [1, -90, -55, -165], [-67, -83, 239, 182], [238, -283, 384, 392]] -> 571026450
[[432, 45, 330, 284, 276], [-492, 497, 133, -289, -28], [-443, -400, 56, 150, -316], [-344, 316, 92, 205, 104], [277, 307, -464, 244, -422]] -> -51446016699154
[[416, 66, 340, 250, -436, -146], [-464, 68, 104, 471, -335, -442], [159, -407, 310, -489, -248, 370], [62, 277, 446, -325, 47, -193], [460, 460, -418, -28, 234, -374], [249, 375, 489, 172, -423, 125]] -> 39153009069988024
[[-246, -142, 378, -156, -373, 444], [186, 186, -23, 50, 349, -413], [216, 1, -418, 38, 47, -192], [109, 345, -356, -296, -47, -498], [-283, 91, 258, 66, -127, 79], [218, 465, -420, -326, -445, 19]] -> -925012040475554
[[-192, 141, -349, 447, -403, -21, 34], [260, -307, -333, -373, -324, 144, -190], [301, 277, 25, 8, -177, 180, 405], [-406, -9, -318, 337, -118, 44, -123], [-207, 33, -189, -229, -196, 58, -491], [-426, 48, -24, 72, -250, 160, 359], [-208, 120, -385, 251, 322, -349, -448]] -> -4248003140052269106
[[80, 159, 362, -30, -24, -493, 410, 249, -11, -109], [-110, -123, -461, -34, -266, 199, -437, 445, 498, 96], [175, -405, 432, -7, 157, 169, 336, -276, 337, -200], [-106, -379, -157, -199, 123, -172, 141, 329, 158, 309], [-316, -239, 327, -29, -482, 294, -86, -326, 490, -295], [64, -201, -155, 238, 131, 182, -487, -462, -312, 196], [-297, -75, -206, 471, -94, -46, -378, 334, 407, -97], [-140, -137, 297, -372, 228, 318, 251, -93, 117, 286], [-95, -300, -419, 41, -140, -205, 29, -481, -372, -49], [-140, -281, -88, -13, -128, -264, 165, 261, -469, -62]] -> 297434936630444226910432057
You may assume that all elements in the matrix, the determinant of the matrix, and the total number of elements in the matrix are within the representable range of integers for your language.
Odpowiedzi:
Galaretka , 15 bajtów
Wypróbuj online!
Jak to działa
Dlaczego to działa - wersja mathy
Operator det pobiera macierz i zwraca skalar. An n -by- n matrycy może być traktowana jako zbiór n wektorów o długości n , tak det jest bardzo funkcją wykonuje n wektorów z ℤ n i zwraca skalarnego.
Dlatego piszę det ( v 1 , v 2 , v 3 , ..., v n ) dla det [ v 1 v 2 v 3 ... v n ].
Zauważ, że det jest liniowy w każdym argumencie, tj. Det ( v 1 + λ w 1 , v 2 , v 3 , ..., v n ) = det ( v 1 , v 2 , v 3 , ..., v n ) + λ det ( w 1 , v 2 , v 3 , ..., v n ). Dlatego jest to mapa liniowa z (ℤ n ) ⊗ n do ℤ.
Wystarczy określić obraz podstawy pod mapą liniową. Podstawa (ℤ n ) ⊗ n składa się z n- krotnych produktów tensorowych elementów podstawowych basis n , tj. E 5 ⊗ e 3 ⊗ e 1 ⊗ e 5 ⊗ e 1 . Produkty tensorów, które zawierają identyczne tensory, muszą być wysłane do zera, ponieważ wyznacznikiem macierzy, w której dwie kolumny są identyczne, jest zero. Pozostaje sprawdzić, do jakich produktów tensorowych o odrębnych elementach podstawowych są wysyłane. Wskaźniki wektorów w produkcie tensorowym tworzą bijection, czyli permutację, w której parzyste permutacje są wysyłane do 1, a nieparzyste permutacje są wysyłane do -1.
Na przykład, aby znaleźć wyznacznik [[1, 2], [3, 4]]: zwróć uwagę, że kolumny to [1, 3] i [2, 4]. Rozkładamy [1, 3], aby dać (1 e 1 + 3 e 2 ) i (2 e 1 + 4 e 2 ). Odpowiednim elementem w produkcie tensorowym jest (1 e 1 ⊗ 2 e 1 + 1 e 1 ⊗ 4 e 2 + 3 e 2 ⊗ 2 e 1 + 3 e 2 ⊗ 4 e 2 ), do którego upraszczamy (2 e 1 1 e 1 + 4 e 1 ⊗ e 2 + 6 e 2 ⊗ e 1 + 12 e 2 ⊗ e 2). W związku z tym:
det [[1, 2], [3, 4]]
= det (1 e 1 + 3 e 2 , 2 e 1 + 4 e 2 )
= det (2 e 1 ⊗ e 1 + 4 e 1 ⊗ e 2 + 6 e 2 ⊗ e 1 + 12 e 2 ⊗ e 2 )
= det (2 e 1 ⊗ e 1 ) + det (4 e 1 ⊗ e 2 ) + det (6 e 2 ⊗ e 1 ) + det (12 e2 ⊗ e 2 )
= 2 det (e 1 ⊗ e 1 ) + 4 det (e 1 ⊗ e 2 ) + 6 det (e 2 ⊗ e 1 ) + 12 det (e 2 ⊗ e 2 )
= 2 (0) + 4 (1) + 6 (-1) + 12 (0)
= 4 - 6
= -2
Teraz pozostaje udowodnić, że wzór na znalezienie parzystości permutacji jest prawidłowy. Mój kod polega przede wszystkim na znalezieniu liczby inwersji, tj. Miejsc, w których element po lewej stronie jest większy niż element po prawej stronie (niekoniecznie kolejno).
Na przykład w permutacji 3614572 występuje 9 inwersji (31, 32, 61, 64, 65, 62, 42, 52, 72), więc permutacja jest nieparzysta.
Uzasadnieniem jest to, że każda transpozycja (zamiana dwóch elementów) albo dodaje jedną inwersję, albo usuwa jedną inwersję, zamieniając parytet liczby inwersji, a parzystość permutacji jest parzystością liczby transpozycji potrzebnych do uzyskania permutacji.
Podsumowując, naszą formułę podaje:
Dlaczego to działa - wersja niematyczna
gdzie σ jest permutacją 𝕊 n grupa wszystkie kombinacje o n liter i sgn jest znakiem permutacji AKA (1) podnosi się do parzystości permutacji i ij jest ( ij ) th wpisu macierz ( i w dół, j w poprzek).
źródło
R , 3 bajty
Trywialne rozwiązanie
Wypróbuj online!
R ,
9492 bajtyponownie wdrożone rozwiązanie
rozegrany przez Jarko Dubbeldam
Wypróbuj online!
Rekurencyjnie wykorzystuje ekspansję nieletnich w dół pierwszej kolumny matrycy.
źródło
Galaretka ,
16151210 bajtówUżywa rozszerzenia Laplace'a . Dzięki @miles za grę w golfa z
35 bajtów!Wypróbuj online!
Jak to działa
źródło
Wolfram Language (Mathematica) , od 14 do 42 bajtów
Mamy wbudowane 3-bajtowe i 53-bajtowe rozwiązanie, które całkowicie eliminuje wbudowane, więc oto niektóre dziwniejsze rozwiązania gdzieś pomiędzy.
Język Wolfram ma wiele bardzo intensywnych funkcji rozkładania macierzy na produkty innych macierzy o prostszej strukturze. Jednym z prostszych (co oznacza, że słyszałem o tym wcześniej) jest rozkład Jordana. Każda macierz jest podobna do (prawdopodobnie złożonej) górnej macierzy trójkątnej wykonanej z bloków ukośnych o określonej strukturze, zwanej rozkładem Jordana tej macierzy. Podobieństwo zachowuje wyznaczniki, a wyznacznik macierzy trójkątnej jest iloczynem elementów ukośnych, więc możemy obliczyć wyznacznik na podstawie następujących 42 bajtów :
Wyznacznik jest również równy iloczynowi wartości własnych macierzy z wielokrotnością. Na szczęście funkcja wartości własnej Wolframa śledzi wielokrotność (nawet w przypadku matryc nieprzeznaczonych do przekątnej), więc otrzymujemy następujące 20-bajtowe rozwiązanie:
Kolejnym rozwiązaniem jest oszustwo i nie jestem pewien, dlaczego to działa. Wronskian listy n funkcji jest wyznacznikiem macierzy pierwszych pochodnych n -1 funkcji. Jeśli podamy
Wronskian
funkcji macierz liczb całkowitych i powiedzmy, że zmienna różnicowania wynosi 1, to w jakiś sposób wypluwa wyznacznik macierzy. To dziwne, ale nie zawiera liter „Det
” i ma tylko 14 bajtów …(The Casoratian wyznacznikiem działa tak samo, przez 1 bajt więcej:
#~Casoratian~1&
)W dziedzinie algebry abstrakcyjnej wyznacznikiem macierzy n x n (uważanej za mapę k → k, która jest mnożona przez wyznacznik) jest n- ta zewnętrzna moc macierzy (po wybraniu izomorfizmu k → ⋀ n k n ). W języku Wolfram możemy to zrobić za pomocą następujących 26 bajtów :
A oto rozwiązanie, które działa tylko na pozytywne determinanty. Jeśli weźmiemy hipersześcian n- wymiarowej jednostki i zastosujemy do niego transformację liniową, to n- wymiarowa „objętość” regionu wynikowego jest wartością bezwzględną wyznacznika transformacji. Zastosowanie transformacji liniowej do kostki daje równoległościan i możemy pobrać jego objętość za pomocą 39 bajtów kodu:
źródło
Exp@*Tr@*MatrixLog
, ale niestety nie działa to w przypadku pojedynczych macierzy.Check[E^Tr@MatrixLog@#,0]&
.Check
.Haskell , 71 bajtów
-3 bajty dzięki Lynn. Kolejny bajtuje kurz dzięki Craig Roy.
Wypróbuj online! Dodano
-O
flagę do celów optymalizacji. To nie jest konieczne.Wyjaśnienie (nieaktualne)
f
rekurencyjnie implementuje ekspansję kofaktora.Ta linia obejmuje podstawowy przypadek macierzy 1 × 1 , w którym to przypadku wyznacznikiem jest
mat[0, 0]
.Wykorzystuje dopasowanie wzoru Haskella do rozbicia matrycy na głowę (pierwszy rząd) i ogon (resztę matrycy).
Wyliczyć wierzchołek macierzy (zipując nieskończoną listę liczb całkowitych i głowę) i iterować nad nią.
Neguj wynik na podstawie tego, czy jego indeks jest nawet, ponieważ obliczanie wyznacznika obejmuje naprzemienne dodawanie i odejmowanie.
Ta zasadniczo usuwa i-tą kolumnę ogona poprzez : i elementów i łączenie go z szeregu z pierwszym (i + 1) -ej elementy spadła dla każdego rzędu w ogonie.
Oblicz wyznacznik powyższego wyniku i pomnóż go przez wynik
(-1)*i*v
.Zsumuj wynik z powyższej listy i zwróć ją.
źródło
sum[(-1)^i*...
sięfoldr(-)0[...
Proton , 99 bajtów
Wypróbuj online!
-3 bajty dzięki Mr. Xcoder
-3 bajty dzięki Erikowi Outgolfer
Rozszerzenie w pierwszym rzędzie
źródło
((~i%2)*2-1)
->((-i%2)|1)
j!=i
przyj-i
czyi-j
.Oktawa , 28 bajtów
Wypróbuj online!
This zastosowania rozkładu QR macierzy X w w orthgonal macierzy Q i górna matryca trójkątna R . Wyznacznik X jest produktem tych Q i R . Matryca ortogonalna ma wyznacznik jednostki, a dla macierzy trójkątnej wyznacznik jest iloczynem jej przekątnych wejść. Oktawa jest
qr
funkcja wywoływana z pojedynczym wyjściu daje R .Wynik jest zaokrąglany do najbliższej liczby całkowitej. W przypadku dużych macierzy wejściowych niedokładności zmiennoprzecinkowe mogą powodować przekroczenie błędu,
0.5
a tym samym błędny wynik.źródło
det
wbudowanego. ;)Haskell , 59 bajtów
Wypróbuj online!
źródło
C,
176125 bajtówDzięki @ceilingcat za grę w golfa 42 bajty, a także @Lynn i @ Jonathan Frech za zapisanie każdego bajtu!
Oblicza wyznacznik za pomocą rozszerzenia Laplace'a w pierwszym rzędzie.
Wypróbuj online!
Rozwinięty:
źródło
(i%2*-2+1)
→(1-i%2*2)
zapisuje jeszcze jeden bajt.n+1+c
może byćn-~c
.i=s
zamiastreturn s
Galaretka , 43 bajty
Wreszcie skończyłem pisać moje niewbudowane rozwiązanie w języku golfowym!
Dzięki HyperNeutrino za uratowanie bajtu!
Wypróbuj online! (kod odstępu dla przejrzystości)
strasznie długa droga do usunięcia n-tych elementów z listy, poprawi się później
Ta odpowiedź została obezwładniona odpowiedziami HyperNeutrino, Dennisa i Dziurawej Zakonnicy. Galaretka jest bardzo popularna jako język golfa.
Szybkie wyjaśnienie:
źródło
Galaretka , 24 bajty
Wypróbuj online!
Wyjaśnienie
-2 bajty dzięki rozwiązaniu user202729
źródło
MATL , 3 bajty / 5 bajtów
Z wbudowaną funkcją
Wypróbuj online!
Bez wbudowanego
Dzięki Misze Ławrow za wskazanie błędu, teraz poprawionego
Wypróbuj online!
Oblicza to wyznacznik jako iloczyn wartości własnych, zaokrąglonych do najbliższej liczby całkowitej, aby uniknąć niedokładności zmiennoprzecinkowych.
źródło
R , 32 bajty
Wykorzystuje algorytm Not a Tree do pobierania wartości własnych macierzy i przyjmowania rzeczywistej części ich iloczynu.
Wypróbuj online!
źródło
Oktawa , 30 bajtów
Wypróbuj online!
lub nudne rozwiązanie 4-bajtowe (dzięki Luisowi Mendo zapisano 6 bajtów (zapomniałem zasad dotyczących wbudowanych funkcji)):
Wyjaśnienie:
Nadchodzi! :)
źródło
TI-Basic, 2 bajty
Ach tak.
Proszę nie głosować na trywialne odpowiedzi.
Jako uczeń szkoły średniej (który jest zmuszony do posiadania jednego z tych kalkulatorów), ta funkcja jest bardzo przydatna, więc ...
źródło
Haskell, 62 bajty
Wypróbuj online! (Stopka z przypadkami testowymi zaczerpniętymi z rozwiązania @ całkowicieludzkiego).
d
oblicza wyznacznik za pomocą rozszerzenia Laplace'a wzdłuż pierwszej kolumny. Potrzebuje trzech bajtów więcej niż stały .źródło
Python 2 , 95 bajtów
-12 bajtów dzięki Lynn.
Port mojej odpowiedzi Haskell .
Wypróbuj online!
źródło
[]
jako podstawowego przypadku:f=lambda m:sum((-1)**i*v*f([j[:i]+j[i+1:]for j in m[1:]])for i,v in enumerate(m[0]))if m else 1
na 95 bajtów!m==[]or sum(...)
daje 92 bajty.Wolfram Language (Mathematica) ,
5352 bajtyWypróbuj online!
Niestety, obliczenie wyznacznika macierzy n na n w ten sposób wykorzystuje pamięć O ( n n ), co powoduje, że duże przypadki testowe są poza zasięgiem.
Jak to działa
Pierwsza część
1##&@@@(t=Tuples)@#
oblicza wszystkie możliwe produkty terminu z każdego wiersza danej macierzy.t[Range@Tr[1^#]&/@#]
daje listę o tej samej długości, której elementami są rzeczy{3,2,1}
lub{2,2,3}
stwierdzenia, który wpis każdego wiersza wybraliśmy dla odpowiedniego produktu.Odnosimy się
Signature
do drugiej listy, która mapuje parzyste permutacje1
, nieparzyste permutacje-1
i nie-permutacje do0
. Jest to właśnie współczynnik, z którym odpowiadający produkt pojawia się w wyznaczniku.Na koniec bierzemy iloczyn kropkowy z dwóch list.
Jeśli nawet
Signature
jest za dużo wbudowanego, przy 73 bajtach możemy wziąćzastępując go przez
1##&@@Order@@@#~Subsets~{2}&
. ObliczaSignature
to ewentualnie permutację, przyjmując iloczynOrder
zastosowany do wszystkich par elementów permutacji.Order
da,1
jeśli para jest w porządku rosnącym,-1
jeśli jest w porządku malejącym i0
jeśli są równe.-1 bajt dzięki @ user202729
źródło
Python 3 ,
238 bajtów,227 bajtów,224 bajty, 216 bajtówWypróbuj online!
Moje rozwiązanie korzysta z definicji wyznacznika do obliczeń. Niestety złożoność tego algorytmu jest
n!
i nie mogę pokazać przejścia ostatniego testu, ale teoretycznie jest to możliwe.źródło
CJam (
5045 bajtów)Jest to anonimowy blok (funkcja), który pobiera tablicę 2D na stos i pozostawia liczbę całkowitą na stosie.
Zestaw testów online
Sekcja
To implementuje algorytm Faddeeva-LeVerriera i myślę, że to pierwsza odpowiedź na to podejście.
źródło
Wolfram Language (Mathematica) , 3 bajty
Wypróbuj online!
Zgodnie z meta konsensusem , głosuj głównie za nietradycyjnymi rozwiązaniami, których pisanie wymaga wysiłku.
źródło
Python 2 , 75 bajtów
Wypróbuj online!
źródło
SageMath , różne
Oto kilka metod obliczania wyznacznika, które uważałem za interesujące, wszystkie zaprogramowane w SageMath. Wszystkie można tutaj wypróbować .
Wbudowany, 3 bajty
Ten nie jest zbyt interesujący. Sage zapewnia aliasy na poziomie globalnym dla wielu typowych operacji, które normalnie byłyby metodami obiektowymi, więc jest to krótszy niż
lambda m:m.det()
.Rzeczywista część iloczynu wartości własnych, 36 bajtów
Niestety,
eigenvalues
nie jest jednym z tych aliasów na poziomie globalnym. To, w połączeniu z faktem, że Sage nie ma zgrabnego sposobu komponowania funkcji, oznacza, że utknęliśmy na kosztownymlambda
. Ta funkcja symboliczne wartości, które są automatycznie konwertowane na wartości liczbowe po wydrukowaniu, więc niektóre niedokładności zmiennoprzecinkowe mogą występować na niektórych wyjściach.Produkt o przekątnej w normalnej formie Jordana, 60 bajtów
W postaci Jordan Normal macierz NxN jest reprezentowana jako macierz blokowa, z N blokami na przekątnej. Każdy blok składa się albo z pojedynczej wartości własnej, albo z macierzy MxM z powtarzaną wartością własną na przekątnej is
1
na super-przekątnej (przekątna powyżej i na prawo od „głównej” przekątnej). Daje to macierz ze wszystkimi wartościami własnymi (z wielokrotnością) na głównej przekątnej, a niektóre1
s na super-przekątnej odpowiadające powtarzanym wartościom własnym. Zwraca to iloczyn przekątnej normalnej postaci Jordana, który jest iloczynem wartości własnych (z wielokrotnością), więc jest to bardziej okrągły sposób wykonywania tego samego obliczenia, co poprzednie rozwiązanie.Ponieważ Sage chce, aby normalna forma Jordana znajdowała się nad tym samym pierścieniem co pierwotna matryca, działa to tylko wtedy, gdy wszystkie wartości własne są racjonalne. Złożone wartości własne powodują błąd (chyba że pierwotna macierz znajduje się nad pierścieniem
CDF
(złożone podwójne zmiennoprzecinkowe) lubSR
). Oznacza to jednak, że wzięcie prawdziwej roli nie jest konieczne w porównaniu z powyższym rozwiązaniem.Produkt przekątnej w rozkładzie Smitha
W przeciwieństwie do normalnej postaci Jordana, normalna forma Smitha ma gwarancję, że znajdzie się nad tym samym polem, co pierwotna matryca. Zamiast obliczać wartości własne i przedstawiać je za pomocą blokowej macierzy diagonalnej, rozkład Smitha oblicza elementarne dzielniki macierzy (co jest tematem zbyt skomplikowanym dla tego postu), umieszcza je w macierzy diagonalnej
D
i oblicza dwie macierze z jednostką wyznacznikU
iV
taki, żeD = U*A*V
(gdzieA
jest oryginalna matryca). Ponieważ determinantą iloczyn macierzy jest równa produkt determinantów (matrycdet(A*B*...) = det(A)*det(B)*...
) orazU
iV
są określone jako determinanty elementarnedet(D) = det(A)
. Wyznacznikiem macierzy diagonalnej jest po prostu iloczyn elementów na przekątnej.Rozszerzenie Laplace'a, 109 bajtów
Spowoduje to rozwinięcie Laplace'a w pierwszym rzędzie, stosując podejście rekurencyjne.
det([[a]]) = a
jest używany w przypadku podstawowym. Powinien być krótszy do użyciadet([[]]) = 1
w przypadku podstawowym, ale moja próba implementacji zawierała błąd, którego nie udało mi się jeszcze wyśledzić.Formuła Leibniza, 100 bajtów
To bezpośrednio implementuje formułę Leibniza. Aby uzyskać znacznie lepsze wyjaśnienie formuły i dlaczego działa ona, niż mogłabym napisać, zobacz tę doskonałą odpowiedź .
Rzeczywista część
e^(Tr(ln(M)))
, 48 bajtówTa funkcja zwraca wyrażenia symboliczne. Aby uzyskać przybliżenie numeryczne, zadzwoń
n(result)
przed drukowaniem.To podejście, którego jeszcze nie widziałem. Dam ci dłuższe, bardziej szczegółowe wyjaśnienie tego.
Niech
A
będzie kwadratowa matryca nad rzeczywistością. Z definicji wyznacznikA
jest równy iloczynowi wartości własnychA
. ŚladA
jest równy sumieA
wartości własnych. Dla liczb rzeczywistychr_1
ir_2
,exp(r_1) * exp(r_2) = exp(r_1 + r_2)
. Ponieważ funkcja wykładnicza macierzy jest zdefiniowana jako analogiczna do skalarnej funkcji wykładniczej (szczególnie w poprzedniej tożsamości), a wykładnicza funkcja macierzowa może być obliczona poprzez diagonalizację macierzy i zastosowanie skalarnej funkcji wykładniczej do wartości własnych na przekątnej, możemy powiedziećdet(exp(A)) = exp(trace(A))
(produkt z przykładuexp(λ)
dla każdej wartości własnychλ
odA
równa sumie wartości własnychexp(A)
). Tak więc, jeśli możemy znaleźć macierzL
taką, żeexp(L) = A
, możemy obliczyćdet(A) = exp(trace(L))
.Taką matrycę możemy znaleźć,
L
obliczająclog(A)
. Logarytm macierzowy można obliczyć w taki sam sposób, jak macierz wykładniczy: uformować kwadratową macierz diagonalną, stosując funkcję logarytmu skalarnego do każdej wartości własnejA
(dlatego zmieniliśmyA
na rzeczywiste). Ponieważ zależy nam tylko na śladachL
, możemy pominąć konstrukcję i po prostu bezpośrednio zsumować wykładnicze wartości własne. Wartości własne mogą być złożone, nawet jeśli macierz nie znajduje się nad złożonym pierścieniem, więc bierzemy prawdziwą część sumy.źródło
real(prod(m.eigenvalues()))
golfem.Java 8,
266261259258 bajtówSpójrz mamo, brak wbudowanych .. ponieważ Java nie ma ..>.>
-7 bajtów dzięki @ceilingcat .
Wyjaśnienie:
Wypróbuj tutaj. (Tylko ostatni przypadek testowy jest zbyt duży, aby zmieścił się w
long
rozmiarze 2 63 -1.)źródło
JavaScript (ES6), 91
Laplace rekurencyjne
Mniej golfa
Test
źródło
Python 2 + numpy , 29 bajtów
Wypróbuj online!
źródło
Julia , 3 bajty
Wypróbuj online!
źródło
Pari / GP , 6 bajtów
Wypróbuj online!
źródło
Java (OpenJDK 8) ,
195 192177 bajtówWypróbuj online!
Podobnie jak wiele innych odpowiedzi, wykorzystuje to również formułę Laplace'a. Wersja nieco mniej golfowa:
źródło
J , 5 bajtów
Wypróbuj online!
źródło