0Pricing
Competitive Programming Academy · Lekcja

Odwrotność modularna z twierdzenia Fermata

Bezpieczne dzielenie modulo

Odwrotność modularna z twierdzenia Fermata to bezpłatna lekcja Competitive Programming Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Competitive Programming Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Competitive Programming Academy zawiera 4 lekcji w sumie.

Dzielenie nie działa modulo

Dodawanie, odejmowanie i mnożenie zachowują się poprawnie modulo, ale zwykłe dzielenie już nie. Nie można po prostu podzielić wartości i wziąć reszty. ⚠️

Zastąp dzielenie mnożeniem

Rozwiązaniem jest odwrotność modularna: dzielenie przez x zastępuje się mnożeniem przez odwrotność x. Zatem a / b modulo m zamienia się na a pomnożone przez odwrotność b.

Czym jest odwrotność

Odwrotność liczby x to liczba, która po pomnożeniu przez x daje 1 modulo. Pełni rolę 1/x w zwykłej arytmetyce.

# x * inv(x) % m == 1

Liczby pierwsze to umożliwiają

Odwrotność istnieje tylko wtedy, gdy x nie ma z m żadnego wspólnego dzielnika większego od 1. Użycie modułu pierwszego, takiego jak 1e9+7, gwarantuje, że każda niezerowa wartość x ma odwrotność.

Poznaj małe twierdzenie Fermata

Małe twierdzenie Fermata mówi, że dla liczby pierwszej p liczba x do potęgi p minus 1 jest przystająca do 1, o ile x nie jest wielokrotnością p.

# x^(p-1) % p == 1

Wyprowadź odwrotność

Po wydzieleniu jednego czynnika x pozostała część musi być jego odwrotnością. Zatem odwrotność x to x podniesione do potęgi p minus 2, a następnie obliczone modulo p.

# inv(x) = x^(p-2) % p

Oblicz ją za pomocą szybkiego potęgowania

Ten wykładnik jest ogromny, więc użyj szybkiego potęgowania z poprzedniej lekcji. W Pythonie jedno wywołanie pow wykona całą pracę.

inv = pow(x, MOD - 2, MOD)

Użyj jej do dzielenia

Aby obliczyć a podzielone przez b modulo, pomnóż a przez odwrotność b. Otrzymana reszta jest dokładnie prawdziwym ilorazem modulo p.

ans = a * pow(b, MOD - 2, MOD) % MOD

Nigdy nie odwracaj zera

Odwrotność 0 nie istnieje, ponieważ żadna liczba pomnożona przez zero nie daje jedynki. Należy zabezpieczyć się przed dzieleniem przez wartość, która modulo daje zero.

Koszt jednej odwrotności

Każda odwrotność wyznaczana twierdzeniem Fermata wymaga jednego szybkiego potęgowania, więc jej koszt czasowy wynosi O(log p). To niewiele przy kilku dzieleniach, ale koszt rośnie przy milionach operacji.

Wskazówka: wiele odwrotności naraz

Gdy potrzebnych jest wiele odwrotności, można obliczyć je w sprytnym liniowym przejściu zamiast wywoływać pow dla każdego elementu. Ta technika przyda się w następnym temacie, dotyczącym nCr.

Szybkie sprawdzenie

Jaka potęga daje odwrotność modularną dla modułu pierwszego?

Podsumowanie

Można teraz dzielić modulo liczby pierwszej, mnożąc przez odwrotność modularną, wyznaczaną jako x do potęgi p minus 2 za pomocą pow. Nie wolno tylko odwracać zera. ✅

Często zadawane pytania

Czy lekcja „Odwrotność modularna z twierdzenia Fermata” jest bezpłatna?

Tak — pełny tekst „Odwrotność modularna z twierdzenia Fermata” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Competitive Programming Academy, przejdź na CoddyKit PRO. Kurs Competitive Programming Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Odwrotność modularna z twierdzenia Fermata”?

Bezpieczne dzielenie modulo Ćwiczysz Competitive Programming Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Competitive Programming Academy?

Nie wymagamy żadnego doświadczenia. Competitive Programming Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Odwrotność modularna z twierdzenia Fermata”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Competitive Programming Academy?

Tak. Każda lekcja Competitive Programming Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Działania modulo liczby pierwszej
  2. Szybkie potęgowanie modularne
  3. Odwrotność modularna z twierdzenia Fermata
  4. nCr z wcześniej obliczonymi silniami
← Powrót do Competitive Programming Academy