A leggyorsabb faktoriális - verem túlcsordulás az orosz

Típusok jele (aláírt)

A leggyorsabb algoritmust faktoriálisát típus int - ez a használata az asztalra. Mivel túlfolyó int eredmények definiálatlan viselkedés (UB), a maximális érték korlátozott faktoriális INT_MAX.

32 bites int a maximális faktoriális fac (12) = 479001600. a leggyorsabb int32_t faktoriális függvény így néz ki:

Típusai előjel nélküli (unsigned)

Unsigned int érdekesebb, akkor túlcsordulás, de FAC (34) van egy tényező 2 ^ 32:

Az, hogy mivel mind a 34 fac (uint32_t) nulla lenne.

64 bites típusok

A 64-bites számok túlcsordulás következik be, miután FAC (20). nulla, mivel a FAC (66).

Így, a használata a 66. táblázat faktoriális valamennyi típusú elemek akár 64 bit:

Azt hiszem, a leggyorsabb algoritmust faktoriális struktúra határozza meg számítástechnikai eszköze.
Például, a Stirling képletű elismeri ábrázolása
n!

S (n) = a (n / e) n + 1/2. ahol a = sqrt (2 * pi * e).
log2 S (n) = ((N +1/2) (ln n - 1) + ln a) * log2 e = L (n), S (n) = exp (* in2) * 2 [L (n) ].
Ebben a bináris jelölés faktoriális végződik B (n) = [n / 2] + [N / 2 2] + [N / 2 3] +. nullák (például B (2 k) = [2 K / 2] + [2 K / 2 2] +. + 2 + 1 = 2 k -1), és ezért a faktort vele.

Ennek eredményeképpen kapunk egy formula gyors faktoriális egész számként bináris léptékét.
n! = [Exp (L (n) * in2) * 2 L (n) -B (n) +1/2] * 2 B (n),
amely, ha megfelelően megválasztott pontosabb számításokat pontos lesz.

Válaszol december 2 '15 at 17:06

A probléma megoldódott nagyon gyorsan segítségével a Google, hogy a válasz vett algolist.manual.ru site:

Figyelek arra, hogy a számítások egymást megszorozzuk hosszú szám normális (az alapadatok típusú, például long int). Az eredmény a szorzás algoritmus komplexitása O (m), m - a szám hossza, és egyszerűen megvalósítható.

Ez a megközelítés a közös logaritmusa faktoriális:

Az egész része ez a szám azt mutatja, hány 1-számjegyek, és dolgozni a mantissza.

Lehet számítani a faktoriális a ELN (n!), És gyorsabb lesz, mint a közvetlen szorzás. De ez nem lesz pontos érték nagy n, ahol egy igazi nyereség sebességet.

Azonban gyakran (például a számítás binomiális együtthatók), akkor nem kell a faktoriális, és néhány értékeket, amelyek hányadosaként kapott hatalmas faktoriális a másik ugyanabban a sorrendben, és az eredmény egy kis számot.

Ebben az esetben van értelme, hogy működik ez az logaritmusa faktoriális, amelynek kiszámítása (mint például a forrás felett) sokkal könnyebb és gyorsabb. Osztás és szorzás helyébe a különbség, és az összeget a logaritmusok. Ha szüksége van igazán hatékony számítás, egy ilyen utat ellenőrzése alatt pontosabb számításokat természetesen előnyös.

Válaszol január 28 '11 at 10:46

Először is meg kell hagyni a rekurzió nem overhead kibontani vagy összecsukni verem.

Másodszor, lehetséges, hogy nem a multi-threading: zayuzat lefolyás magok, mivel középpontjában állnak - lesz O (n) / magok száma. Például, a 2 mag és a faktoriális 100: első áram 1 * 2 *. * 50; egy második adatfolyamra 51 * 52 *. 100. Ezután szorozzuk meg az eredményt. Harmadszor, fejlesztése az ötlet 2-es szám, akkor létrehozhat egy statikus tömb már vychisennymi faktoriális (lépteit, és elosztjuk az elemek számát befolyásolja a teljes sebességgel az egész)

Meg kell számítani a faktoriális 102, már számolni, hogy a faktoriális 100, szorozza meg a 101 és 102 - gyors.

Általában mind a 3 módszer egyszerre - viszonylag gyorsan.

By the way, akkor lehet, hogy a tömb nem fordítási időben, és amikor a program. Például, ha egy statikus összeállítás volt a tömbben 2 értékek: 1! és 10! és meg kell számolni a 102! Úgy gondoljuk, hogy, majd adja hozzá a tömb faktoriálisát 100! mi kell hirtelen tekinthető 105!

Azt hiszem rekurzívan kiszámítja valaki a fejét, hogy nem jön. Predpodschot egyes értékek nem hoz javulást egyáltalán, amikor az egyik faktoriális kiszámítása. Természetesen, ha meg kell kiszámítani a számát faktoriális sorba, akkor mentse a korábbi eredményeket, és végül, hogy működni fog az amortizált egység! Párhuzamosítás - egy trükk, és a kérdés az algoritmikus, hanem praktikus. - kirelagin január 28 '11 at 11:01

Kérdés algoritmikus, de ez egy alkalmazott jellegű. - Nicolas Chabanovsky ♦ január 28 '11 at 11:27

@ Matroskin ilyen esetben, gyűjtsenek össze minden javasolt optimalizálási :). - kirelagin január 29 '11 11:30

Kapcsolódó cikkek