Przeskocz do treści

Delta mi!

Współczynniki dwumianowe modulo math

Tomasz Idziaszek

o artykule ...

  • Publikacja w Delcie: listopad 2010
  • Publikacja elektroniczna: 20-12-2010
  • Wersja do druku [application/pdf]: (114 KB)

O tym jak szybko można obliczać współczynniki dwumianowe math.

W informatycznym kąciku olimpijskim w poprzednim numerze Delty opisane zostało zadanie, którego rozwiązanie sprowadzono do obliczenia pewnej liczby współczynników dwumianowych modulo ustalony moduł  math . Przedstawiono tam też prosty algorytm obliczania wartości math, działający w czasie math , zatem niezbyt praktyczny, gdy zarówno  math, jak i  math są duże. W niniejszym artykule przedstawimy inny algorytm, który po fazie obliczeń wstępnych zajmujących czas  math pozwoli na obliczanie math w czasie math. Na początku pokażemy, jak obliczać współczynniki dwumianowe modulo potęga liczby pierwszej. W dalszej części artykułu math zawsze będzie oznaczać liczbę pierwszą, a  math jej potęgę o wykładniku całkowitym dodatnim.

Na początku pokażemy, jak obliczać współczynniki dwumianowe modulo potęga liczby pierwszej. W dalszej części artykułu math zawsze będzie oznaczać liczbę pierwszą, a  math jej potęgę o wykładniku całkowitym dodatnim.

Aby obliczyć math, skorzystamy ze wzoru

display-math

i spróbujemy sprowadzić zadanie do obliczenia math. Musimy jednak uważać, gdyż np. dla math w mianowniku pojawia nam się zero. Aby poradzić sobie z tym kłopotem, wyciągniemy z silni wszystkie czynniki  math. Niech mianowicie math będzie największą potęgą liczby  math dzielącą  math. Jeśli będziemy umieli znaleźć liczbę

display-math

to rozwiązaniem będzie

display-math

Dzielenie w powyższym wzorze jest wykonywane w grupie  math.

Czytelnicy znający rozwiązanie zadania ,,obliczyć, iloma zerami kończy się zapis dziesiętny liczby  math” wiedzą, a pozostali łatwo się przekonają, że

display-math

zatem math możemy łatwo obliczyć w czasie math . Pozostaje już tylko znaleźć wartość  math. Zdefiniujmy silniopodobną funkcję  math oznaczającą iloczyn liczb od 1 do  math niepodzielnych przez  math. Wprowadźmy też oznaczenie

display-math

Przypomnijmy, że twierdzenie Wilsona orzeka, że dla liczby pierwszej  math spełnione jest math Uogólnienie tego twierdzenia na potęgi liczb pierwszych  math wygląda następująco:

display-math

Dla dowodu zauważmy, że po lewej stronie kongruencji mamy iloczyn wszystkich elementów grupy  math. Każdy element tej grupy ma zdefiniowany jednoznacznie element odwrotny. Iloczyn elementów, które nie są swoimi własnymi odwrotnościami, wynosi  math. Pozostaje zatem obliczyć iloczyn elementów spełniających równanie

display-math

Równanie to jest równoważne kongruencji math, co dla math jest równoważne math lub math. Zatem math.

W przypadku math mamy math, math, a dla math równanie  math ma cztery rozwiązania: mathmath, mathmath, których iloczyn modulo  math wynosi  math.

Teraz już możemy pokazać, jak obliczać  math. Mianowicie, jeśli wprowadzimy oznaczenie math , to

display-math

Dowód przeprowadzimy przez indukcję względem  math. Jeśli math, to wzór na  math jest spełniony. Dla math załóżmy więc, że spełniony jest w przypadku math i wywnioskujmy z tego prawdziwość dla  math. Kluczową sprawą jest wyznaczenie math. Każdą liczbę w tym iloczynie przedstawiamy w postaci math, a następnie korzystamy z uogólnionego twierdzenia Wilsona:

pict

W celu obliczenia  math, liczby od 1 do  math rozbijamy na dwie grupy: niepodzielne przez  math (ich iloczyn to oczywiście  math) oraz resztę, do której zastosujemy założenie indukcyjne:

pict

Dla ustalonego  math wartości math dla math możemy wyznaczyć w fazie obliczeń wstępnych. Faktycznie, math oraz dla math

display-math

zatem możemy to zrobić w czasie math . Mając tablicę  math , obliczamy  math w czasie math . Ostatecznie, wzór math obliczamy w czasie math .

Przejdźmy teraz do przypadku ogólnego. Chcąc obliczyć math , musimy najpierw rozłożyć moduł na iloczyn potęg liczb pierwszych

display-math

Możemy sobie pozwolić na zastosowanie naiwnego algorytmu  math , gdyż i tak obliczanie tablic  math zajmie czas math .

Jeśli teraz oznaczymy math, to z chińskiego twierdzenia o resztach dostajemy, że

display-math

gdzie math oznacza odwrotność tego elementu w grupie  math. Ponieważ

display-math

zatem obliczenie wszystkich odwrotności (również tych używanych przy obliczaniu  math) zabierze łączny czas math . Ostatecznie obliczenie wartości  math i wzoru  math zajmie czas math .

Ponieważ math , zatem ostatecznie dostajemy, że po wstępnych obliczeniach zajmujących czas  math możemy obliczyć dowolny współczynnik dwumianowy math modulo  math w czasie math.