Přejít na hlavní obsah

Kontrola prvočísla v krajtě pomocí rekurze

  • Linda Kučerová
  • Triky

Ověření čísla pro jednoduchost je důležitým úkolem v programování, zejména při práci s algoritmy a úkoly, které vyžadují definici prvočísel. V Pythonu existuje několik způsobů, jak ověřit jednoduchost čísla, jedním z nich je použití rekurze.

Rekurze je metoda řešení problému, při které funkce způsobuje sama sebe. V případě ověření čísla na jednoduchost můžeme napsat rekurzivní funkci, která bude dělit číslo na všechna čísla od 2 do kořene z tohoto čísla. Pokud je zbytek dělení nulový, pak číslo není prvočíslo.

Je důležité poznamenat, že rekurze nemusí být nejúčinnějším způsobem, jak ověřit čísla na jednoduchost, zejména u velkých čísel. Použití rekurze však v tomto případě umožňuje názorně demonstrovat princip fungování algoritmu a pochopit jeho logiku.

Jak zkontrolovat číslo pro jednoduchost v Pythonu

Prvočíslo je přirozené číslo, větší než jednotka, která není dělitelná žádným jiným číslem než jednotkou a sama sebou. K ověření čísla pro jednoduchost lze použít algoritmus pro přeřazení všech čísel od 2 do n - 1, kde n je ověřitelné číslo. Pokud se najde alespoň jedno číslo, na které je n vyděleno beze zbytku, pak je číslo n složené, jinak je prvočíslo.

Rekurzivní algoritmus ověřování čísla na jednoduchost je třeba rozdělit na dvě části. V první části se zkontroluje, zda je číslo n dělitelné nějakými čísly od 2 do kořene n. Pokud se takové číslo najde, pak je číslo n složené. Ve druhé části je rekurzivně vyvolána funkce ověření čísla pro jednoduchost pro všechna čísla od 2 do kořene n. pokud alespoň pro jedno číslo z tohoto rozsahu funkce vrátí True, pak je číslo n složené, jinak prvočíslo.

Jednou z výhod použití rekurze je kompaktnější a stručnější kód, který je snadněji pochopitelný a udržitelný. Je však třeba vzít v úvahu, že rekurzivní algoritmus může mít vyšší složitost a spotřebovat více zdrojů než iterativní algoritmus.

Příklad rekurzivní funkce pro ověření čísla pro jednoduchost:

def is_prime(n, i=2):if i > n**0.5:return Trueif n % i == 0:return Falsereturn is_prime(n, i+1)

Pro použití této funkce stačí zavolat s požadovaným argumentem:

number = 17if is_prime(number):print(f" - простое число")else:print(f" - составное число")

V důsledku provedení tohoto kódu se zobrazí zpráva, zda je číslo 17 jednoduché nebo složené.

Rekurzivní algoritmus pro testování čísla na jednoduchost tak umožňuje poměrně efektivně určit, zda je číslo prvočíslo metodou přeseknutí. Před použitím tohoto algoritmu však stojí za to posoudit jeho složitost a použít jej pouze v případech, kdy iterativní algoritmus není vhodný.

Co je prvočíslo

Příklady prvočísel: 2, 3, 5, 7, 11, 13, 17 a tak dále. Prvočísla jsou důležitá v matematice a kryptografii. Jejich použití pomáhá při šifrování informací a ochraně dat.

Test čísla na jednoduchost umožňuje určit, zda může být rozloženo na menší faktory. Pokud číslo není prvočíslo, nazývá se složené a lze jej rozložit na prvočísla. Například číslo 12 je složené, protože lze rozložit na faktory 2 a 6.

Algoritmus pro ověření čísla pro jednoduchost zahrnuje vyloučení čísel, která jsou menší než 2, protože minimální prvočíslo je 2. Číslo je poté testováno na dělitelnost beze zbytku na všechna čísla od 2 do kořene ze samotného čísla.

Pokud je při dělení těmito čísly zůstatek 0, pak číslo není prvočíslo. Jinak je to jednoduché.

Metody kontroly jednoduchosti

Existuje také efektivnější metoda - eratosthen. Umožňuje najít všechna prvočísla před daným číslem n. algoritmus je následující: vytvoří se seznam čísel od 2 do n, poté procházíme seznamem a vyškrtneme všechna čísla násobky aktuálního čísla. Po procházení seznamu budou všechna zbývající čísla jednoduchá.

Přemíra dělitelů

Eratosthen

- Neefektivní pro velká čísla

- Efektivní pro velká čísla

Volba metody ověření jednoduchosti závisí na kontextu a požadavcích konkrétního úkolu. Pokud je třeba zkontrolovat pouze jedno číslo, pak je příliš mnoho dělitelů jednoduchým a srozumitelným způsobem. Pokud je nutné najít všechna prvočísla před danou hodnotou, pak bude eratosfénová mřížka účinnější.

Rekurzivní algoritmus ověřování čísel pro jednoduchost

Rekurzivní funkce je funkce, která se sama spouští uvnitř své definice. K ověření čísla pro jednoduchost lze použít rekurzivní funkci, která toto číslo rozdělí na stále menší čísla, počínaje 2 a konče kořenem z čísla.

Příklad takového rekurzivního algoritmu může vypadat následovně:

def is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falsefor i in range(3, int(n ** 0.5) + 1, 2):if n % i == 0:return Falsereturn True

V tomto příkladu funkce is_prime kontroluje číslo n na jednoduchost pomocí rekurze. Začíná kontrolou základních případů: pokud je číslo n méně než 2 pak není jednoduché a vrací hodnotu False a pokud je číslo 2, je jednoduché a funkce vrací hodnotu True. Funkce poté zkontroluje, zda je číslo sudé. Pokud je číslo dělitelné 2 beze zbytku, není jednoduché a funkce vrací hodnotu False.

Funkce dále prochází čísly v rozmezí od 3 do celé části odmocniny z čísla n Krok 2. Rozděluje číslo n na každé z těchto čísel a kontroluje, zda je beze zbytku dělitelné. Pokud je číslo děleno nějakým z čísel beze zbytku, není prvočíslo a funkce vrací hodnotu False.

Pokud je cyklus dokončen bez nalezení dělitele, znamená to, že číslo je jednoduché a funkce vrací hodnotu True.

Rekurzivní algoritmus pro testování čísla na jednoduchost tedy umožňuje určit, zda je uvedené číslo prvočíslo nebo ne.

Implementace rekurzivního algoritmu v Pythonu

Implementace rekurzivního algoritmu k ověření čísla pro jednoduchost v Pythonu může vypadat následovně:

def is_prime(n):if n n:return Trueelif n % i == 0:return Falseelse:return is_prime_recursive(n, i + 1)

V tomto kódu funkce is_prime(n) kontroluje, zda je číslo n jednoduchým. Pokud je číslo menší nebo rovno 1, není jednoduché a funkce vrací False. Pokud je číslo 2, je považováno za jednoduché a funkce vrátí True. V ostatních případech funkce způsobuje pomocnou rekurzivní funkci is_prime_recursive(n, i) tím, že jí předá číslo n a počáteční hodnota i rovný 2.

Rekurzivní funkce is_prime_recursive(n, i) kontroluje, zda je číslo n jednoduché, od dělitele i. Pokud dělitel i převyšuje druhou odmocninu z n, to číslo n jednoduché a funkce vrací True. Pokud číslo n dělí se beze zbytku na dělitel i, není to jednoduché a funkce vrací False. V ostatních případech se funkce sama vyvolá přenosem čísla n a zvýšená hodnota dělitele i na 1.

Rekurzivní algoritmus tak umožňuje otestovat číslo na jednoduchost, rozdělit úkol na jednodušší dílčí úlohy a vyvolat funkci rekurzivně pro jejich řešení.

Příklad použití rekurzivního algoritmu

K ověření čísla pro jednoduchost pomocí rekurzivního algoritmu v Pythonu lze použít následující kód:

def is_prime(n, i=2):if n n:return Trueelse:return is_prime(n, i + 1)

Pro ověření čísla pro jednoduchost je volána funkce " is_prime "se dvěma argumenty - číslo, které je třeba zkontrolovat, a proměnná" i", což je počítadlo pro dělitele čísla. Původní hodnota proměnné " i " je 2, protože nejmenším dělitelem libovolného čísla je číslo 2.

Funkce "is_prime" zahájí kontrolu několika podmínkami: pokud je číslo menší nebo rovno 1, není prvočíslo a funkce vrátí False; pokud je číslo 2, je prvočíslo a funkce vrátí True; pokud je číslo vyděleno beze zbytku aktuálním dělitelem "i", není jednoduché a funkce vrátí False; pokud je hodnota proměnné" i " vynásobena více než ověřitelné číslo, pak všechny možné dělitele již byly zkontrolovány a číslo je jednoduché, funkce vrátí True.

Pokud není splněna žádná z výše uvedených podmínek, funkce se sama povolá ke kontrole dalšího dělitele "i + 1". Jedná se o rekurzivní krok algoritmu - funkce se volá sama s novými hodnotami argumentů, dokud není nalezen dělitel nebo není překročena hodnota "i * i".

Příklad použití funkce "is_prime":

n = int(input("Введите число: "))if is_prime(n):print(f" является простым числом")else:print(f" не является простым числом")