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 == 1Liczby 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 == 1Wyprowadź 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) % pOblicz 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) % MODNigdy 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
- Działania modulo liczby pierwszej
- Szybkie potęgowanie modularne
- Odwrotność modularna z twierdzenia Fermata
- nCr z wcześniej obliczonymi silniami