Führerův algoritmus je rychlá metoda pro násobení velkých celých čísel. Algoritmus byl sestaven v roce 2007 švýcarským matematikem Martinem Führerem [1] z University of Pennsylvania jako asymptoticky rychlejší algoritmus než jeho předchůdce, Schönhage-Strassenův algoritmus , publikovaný v roce 1971 [2] . Problém rychlého množení velkých čísel je velmi zajímavý v oblasti kryptografie s veřejným klíčem .
Předchůdce Fuhrerova algoritmu, Schönhage-Strassenův algoritmus, používal rychlou Fourierovu transformaci k násobení velkých čísel v čase , ale jeho autoři Arnold Schönhage ( německy Arnold Schönhage ) a Volker Strassen předpokládali, že existuje algoritmus, který může vyřešit problém násobení velkých čísel v . Fuhrerův algoritmus [1] zaplnil mezeru mezi těmito hranicemi: lze jej použít k násobení čísel v čase , kde je iterovaný logaritmus n . Časový rozdíl mezi algoritmy je však patrný při velmi velkých násobených číslech (větších než 10 000 000 000 000 [3] platné číslice).
V roce 2008 Anindaya De, Shenden Saha, Pyush Kurur a Ramprasad Saptharishi vytvořili podobný algoritmus založený spíše na modulární než komplexní aritmetice, přičemž dosáhli stejné doby běhu [4] .
Řekněme, že vynásobíme čísla 123 a 456 "ve sloupci", ale bez provedení převodu. Výsledek bude vypadat takto:
jeden | 2 | 3 | ||
× | čtyři | 5 | 6 | |
6 | 12 | osmnáct | ||
5 | deset | patnáct | ||
čtyři | osm | 12 | ||
čtyři | 13 | 28 | 27 | osmnáct |
Tato sekvence (4, 13, 28, 27, 18) se nazývá acyklická nebo lineární konvoluce sekvencí (1,2,3) a (4,5,6). Při znalosti acyklické konvoluce dvou sekvencí není obtížné vypočítat součin: stačí provést převod (například ve sloupci úplně vpravo necháme 8 a přidáme 1 do sloupce obsahujícího 27). V našem příkladu to má za následek 56088.
Existují i jiné typy záhybů, které mohou být užitečné. Řekněme, že vstupní sekvence obsahují n prvků (v příkladu - 3). Výsledná lineární konvoluce pak obsahuje n + n − 1 prvků; pokud vezmeme pravý sloupec z n prvků a přidáme sloupec nejvíce vlevo z n − 1 ', skončíme s kruhovou konvolucí:
28 | 27 | osmnáct | ||
+ | čtyři | 13 | ||
28 | 31 | 31 |
Pokud provedeme zabalení, bude výsledek stejný jako při násobení čísel modulo B n − 1 (v tomto příkladu je to 10 3 − 1 = 999). Proveďme převod (zatím ne cyklický): (31+3=34, 28+3=31) a dostaneme 3141. Přičteme-li levou trojku k pravé, dostaneme 144 ≡ 56088 (mod 999) (The převod musí být prováděn cyklicky, to znamená, že 3 z nižších 31 se přidají k vyšším 31, 3 z přijatých 34 se přidají k 28 a trojnásobek přijatých 31 se přičte k nižšímu řádu, tzn. do 1).
A naopak, vezmeme-li sloupec zcela vpravo z n prvků a odečteme sloupec zcela vlevo od n − 1 prvků, skončíme s defoldingem:
28 | 27 | osmnáct | ||
− | čtyři | 13 | ||
28 | 23 | 5 |
Pokud provedeme rollback, bude výsledek stejný, jako když vynásobíme čísla modulo B n + 1. V tomto příkladu 10 3 + 1 = 1001 provedeme přenos (28, 23, 5) a získejte 3035, zatímco 3035 ≡ 56088 (mod 1001). Reverzní sklad může obsahovat záporná čísla, která lze během balení odstranit stejnou technikou jako u dlouhých odečítání.
Stejně jako jiné metody založené na rychlé Fourierově transformaci je Fuhrerův algoritmus zásadně závislý na konvoluční větě, která poskytuje účinný způsob výpočtu cyklické konvoluce dvou sekvencí. Její myšlenka je:
Cyklickou konvoluci dvou vektorů lze nalézt pomocí diskrétní Fourierovy transformace (DFT) každého z nich, vynásobením výsledných vektorů prvek po prvku, následovaným inverzní Fourierovou transformací (IDFT).Nebo pomocí vzorců:
CyclicConvolution(X, Y) = IDFT(DFT(X) DFT(Y)), kde: CyclicConvolution - cyklická konvoluce , DFT - Diskrétní Fourierova transformace , IDFT - Inverzní diskrétní Fourierova transformace .Pokud vypočítáme DFT a ODFT pomocí rychlé Fourierovy transformace a zavoláme náš multiplikační algoritmus rekurzivně, abychom vynásobili vstupy(?) transformovaných vektorů DFT(X) a DFT(Y), skončíme s účinným algoritmem pro výpočet cyklického konvoluce.
V tomto algoritmu je mnohem efektivnější vypočítat inverzní kruhovou konvoluci; jak se ukazuje, mírně upravená verze konvoluční věty to dokáže. Předpokládejme, že vektory X a Y mají délku n a a je primitivní odmocnina řádu 2 n (což znamená, že a 2 n = 1 a všechny menší mocniny a nejsou rovny 1). Můžeme tedy definovat třetí vektor A , nazývaný hmotnostní vektor , který má následující vlastnosti:
A = ( aj ) , 0 ≤ j < n A −1 = ( a −j), 0 ≤ j < nNyní můžeme napsat:
Negacyklická konvoluce( X , Y ) = A −1 IDFT(DFT( A X ) DFT ( A Y )), kde Negacyclic Convolution — Reverzní cyklická konvoluce , DFT - Diskrétní Fourierova transformace , IDFT - Inverzní diskrétní Fourierova transformace .Jinými slovy, je to stejné až na to, že vstupní vektory jsou vynásobeny A a výsledek je vynásoben A −1 .
Jednotlivá Fourier transformace je abstraktní operace, která může být vykonávána na nějakém algebraickém prstenu ; to je obvykle převzato z pole komplexních čísel, ale ve skutečnosti používat komplexní aritmetiku s dostatečnou přesností poskytovat přesné výsledky je pomalé a neefektivní. Místo toho můžeme použít číselně teoretickou transformaci, která transformuje pole celých čísel modulo N na nějaké celé číslo N.
Stejně jako existují primitivní jednotkové kořeny libovolného řádu v komplexní rovině, pro libovolné dané n můžeme zvolit vhodné N takové, že b je primitivní jednotkový kořen řádu n v oboru celých čísel modulo N (jinými slovy b n ≡ 1 (mod N ), a všechny menší mocniny b se nerovnají 1 mod N).
Algoritmus tráví většinu času rekurzivně prováděním součinu menších čísel; v jednoduché verzi algoritmu se to děje na mnoha místech:
Klíčovým bodem je zvolit N, modulo 2 n + 1 pro nějaké celé číslo n . Tato metoda má řadu výhod v řadě standardních systémů, ve kterých jsou velká celá čísla reprezentována binárně:
Hlavním rozdílem od jeho předchůdce je vícenásobné provedení komprese čísel, která poskytuje výpočetní složitost, na rozdíl od jediného použití v algoritmu Schönhage-Strassen, který poskytuje složitost
Součin celých čísel
Modulový součin celých čísel Rozklad FFT Rozložený produkt Inverzní FFT Složení výsledku
Číselné teoretické algoritmy | |
---|---|
Testy jednoduchosti | |
Hledání prvočísel | |
Faktorizace | |
Diskrétní logaritmus | |
Hledání GCD | |
Modulová aritmetika | |
Násobení a dělení čísel | |
Výpočet druhé odmocniny |