Problem W przedziale całkowitym <a,b> wyszukaj wszystkie liczby parzyste.

Podobne dokumenty
WYKŁAD 3 (13 MARZEC 2014) LICZBY CAŁKOWITE I RZECZYWISTE. Bartosz Łakomy i Dariusz Dobiesz

PROBLEM. Znaleźć rozkład liczby p > 1. na iloczyn czynników pierwszych.

Algorytmy i struktury danych. Wykład 4

Przykładowe zadania z teorii liczb

Liczby całkowite i rzeczywiste

Teoria liczb. Magdalena Lemańska. Magdalena Lemańska,

Teoria liczb. Zajmuje się własnościami liczb, wszystkim całkowitych

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Algorytm Euklidesa. Największy wspólny dzielnik dla danych dwóch liczb całkowitych to największa liczba naturalna dzieląca każdą z nich bez reszty.

ALGORYTMY MATEMATYCZNE Ćwiczenie 1 Na podstawie schematu blokowego pewnego algorytmu (rys 1), napisz listę kroków tego algorytmu:

Dr inż. Robert Wójcik, p. 313, C-3, tel Katedra Informatyki Technicznej (K-9) Wydział Elektroniki (W-4) Politechnika Wrocławska

Luty 2001 Algorytmy (7) 2000/2001

1. Liczby wymierne. x dla x 0 (wartością bezwzględną liczby nieujemnej jest ta sama liczba)

2.8. Algorytmy, schematy, programy

Wybrane zagadnienia teorii liczb

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Programowanie w Baltie klasa VII

Zadania do samodzielnego rozwiązania

Sortowanie przez wstawianie Insertion Sort

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

B.B. 2. Sumowanie rozpoczynamy od ostatniej kolumny. Sumujemy cyfry w kolumnie zgodnie z podaną tabelką zapisując wynik pod kreską:

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

WHILE (wyrażenie) instrukcja;

Zestaw zadań dotyczących liczb całkowitych

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Piotr Chrząstowski-Wachtel Uniwersytet Warszawski. Al Chwarizmi i trzy algorytmy Euklidesa

WHILE (wyrażenie) instrukcja;

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Sortowanie Shella Shell Sort

do instrukcja while (wyrażenie);

Jarosław Wróblewski Matematyka Elementarna, lato 2012/13. W dniu 21 lutego 2013 r. omawiamy test kwalifikacyjny.

Luty 2001 Algorytmy (8) 2000/2001

(3 kwiecień 2014) Marika Pankowska Kamila Pietrzak

Arytmetyka komputera. Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka. Opracował: Kamil Kowalski klasa III TI

Zestaw 1 ZESTAWY A. a 1 a 2 + a 3 ± a n, gdzie skªadnik a n jest odejmowany, gdy n jest liczb parzyst oraz dodawany w przeciwnym.

1. LICZBY DZIAŁ Z PODRĘCZNIKA L.P. NaCoBeZu kryteria sukcesu w języku ucznia

Algorytm. a programowanie -

Matematyka dyskretna

ZADANIE 1. Ważenie (14 pkt)

Anna Sobocińska Sylwia Piwońska

2. Liczby pierwsze i złożone, jednoznaczność rozkładu na czynniki pierwsze, największy wspólny dzielnik, najmniejsza wspólna wielokrotność.

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

Liczby rzeczywiste. Działania w zbiorze liczb rzeczywistych. Robert Malenkowski 1

1. Liczby naturalne, podzielność, silnie, reszty z dzielenia

Elementy teorii liczb. Matematyka dyskretna

wagi cyfry pozycje

Podzielność, cechy podzielności, liczby pierwsze, największy wspólny dzielnik, najmniejsza wspólna wielokrotność.

Pętle. Dodał Administrator niedziela, 14 marzec :27

Algorytmy w teorii liczb

Algorytm i złożoność obliczeniowa algorytmu

Podzielność, cechy podzielności, liczby pierwsze, największy wspólny dzielnik, najmniejsza wspólna wielokrotność.

I. Wymagania edukacyjne niezbędne do uzyskania śródrocznych ocen klasyfikacyjnych z matematyki w klasie VII.

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Wykorzystanie rozkładu liczby na czynniki pierwsze

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

WYMAGANIA NA POSZCZEGÓLNE OCENY MATEMATYKA KL.VII

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

4. Postęp arytmetyczny i geometryczny. Wartość bezwzględna, potęgowanie i pierwiastkowanie liczb rzeczywistych.

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 5. Karol Tarnowski A-1 p.

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

Wprowadzenie do algorytmiki

METODA SYMPLEKS. Maciej Patan. Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski

Poszukiwanie liniowe wśród liczb naturalnych

1. Informatyka - dyscyplina naukowa i techniczna zajmująca się przetwarzaniem informacji.

Wymagania edukacyjne z matematyki w klasie VII szkoły podstawowej

Treść wykładu. Pierścienie wielomianów. Dzielenie wielomianów i algorytm Euklidesa Pierścienie ilorazowe wielomianów


Czy liczby pierwsze zdradzą swoje tajemnice? Czy liczby pierwsze zdradzą swoje tajemnice?

Liczby. Wymagania programowe kl. VII. Dział

Zapis liczb binarnych ze znakiem

WYMAGANIA EDUKACYJNE Z MATEMATYKI KLASA VII

Funkcje wymierne. Jerzy Rutkowski. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k.

Kongruencje twierdzenie Wilsona

Matematyka z kluczem. Szkoła podstawowa nr 18 w Sosnowcu. Przedmiotowe zasady oceniania klasa 7

TEORETYCZNE PODSTAWY INFORMATYKI

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

0 --> 5, 1 --> 7, 2 --> 9, 3 -->1, 4 --> 3, 5 --> 5, 6 --> 7, 7 --> 9, 8 --> 1, 9 --> 3.

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Dydaktyka matematyki (II etap edukacyjny) II rok matematyki Semestr letni 2018/2019 Ćwiczenia nr 7

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Język C część 2. Podejmowanie decyzji w programie. if else. switch

Zestaw 1: Organizacja plików: Oddajemy tylko źródła programów (pliki o rozszerzeniach.adb i.ads)!!! Zad. 1: Zad. 2: 2,2,2 5,5,5,5,5,5 Zad.

Rozdział 1 PROGRAMOWANIE LINIOWE

LISTA 1 ZADANIE 1 a) 41 x =5 podnosimy obustronnie do kwadratu i otrzymujemy: 41 x =5 x 5 x przechodzimy na system dziesiętny: 4x 1 1=25 4x =24

1. Wykład NWD, NWW i algorytm Euklidesa.

Wstęp do Informatyki

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Zadanie 1. Oblicz prawdopodobieństwo, że rzucając dwiema kostkami do gry otrzymamy:

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

FUNKCJA KWADRATOWA. Zad 1 Przedstaw funkcję kwadratową w postaci ogólnej. Postać ogólna funkcji kwadratowej to: y = ax + bx + c;(

Dydaktyka matematyki (II etap edukacyjny) II rok matematyki Semestr letni 2016/2017 Ćwiczenia nr 7

Informatyka A. Algorytmy

2. Liczby pierwsze i złożone, jednoznaczność rozkładu na czynniki pierwsze, największy wspólny dzielnik, najmniejsza wspólna wielokrotność. (c.d.

Obóz Naukowy Olimpiady Matematycznej Gimnazjalistów

Podstawy Programowania Podstawowa składnia języka C++

Jarosław Wróblewski Matematyka Elementarna, zima 2015/16

Transkrypt:

Problem W przedziale całkowitym <a,b> wyszukaj wszystkie liczby parzyste.

Liczby parzyste W wielu algorytmach musimy wygenerować liczby parzyste z zadanego przedziału <a,b> liczb całkowitych. Tego typu zadanie rozwiązujemy stosując podejście nr 2. Ponieważ granice przedziału a i b mogą być dowolnymi liczbami całkowitymi, musimy najpierw znaleźć najmniejszą liczbę parzystą z przedziału <a,b>. 1. Jeśli a jest parzyste, to najmniejszą liczbą parzystą w tym przedziale będzie właśnie a. 2. Jeśli a nie jest parzyste, to najmniejszą liczbą parzystą będzie a + 1.

Parzystość a sprawdzimy badając resztę z dzielenia a przez 2. Jeśli reszta jest zerowa, to a jest liczbą parzystą. Jeśli a nie jest liczbą parzystą, to 1. Reszta wynosi 1 dla a > 0 2. Reszta wynosi -1 dla a < 0 Z powyższego wnioskujemy, iż pierwszą liczbę parzystą w przedziale całkowitym <a,b> otrzymamy następująco: i = a Jeśli reszta z dzielenia a przez 2 jest różna od 0, to zwiększ i o 1 Następna liczba parzysta jest zawsze o 2 większa. Podsumowując otrzymujemy następujący, prosty algorytm generacji liczb parzystych w przedziale całkowitym <a,b>:

Algorytm generacji liczb parzystych Wejście a początek przedziału, a ЄZ b koniec przedziału, b ЄZ, a < b Wyjście: Kolejne liczby parzyste zawarte w przedziale <a,b> Zmienna pomocnicza i przebiega przez kolejne liczby parzyste w przedziale <a,b>, i Z Lista kroków: K01: i a ; obliczamy pierwszą liczbę parzystą K02: Jeśli a mod 2 0, to i i + 1 K03: Dopóki i b, wykonuj kroki K03...K04 ; generujemy liczby parzyste w przedziale <a,b> K04: Pisz i ; wyprowadzamy liczbę parzystą K05: i i + 2 ; następna liczba parzysta K06: Zakończ

Program: Program spodziewa się w pierwszym wierszu liczb a i b. W kolejnych wierszach wyświetla liczby parzyste zawarte w przedziale <a,b>.

Liczby nieparzyste Liczby nieparzyste generujemy w identyczny sposób: wyznaczamy pierwszą liczbę nieparzystą w przedziale <a,b>, a kolejne są o 2 większe. Jeśli a jest nieparzyste, to pierwsza liczba nieparzysta jest równa a, w przeciwnym razie jest o 1 większa. Poniższy program czyta krańce przedziału a, b i wyświetla wszystkie kolejne liczby nieparzyste zawarte w tym przedziale.

Program: Program spodziewa się w pierwszym wierszu liczb a i b.

W przedziale <a,b> liczb całkowitych wyszukać wszystkie liczby podzielne przez jedną z liczb z zadanego zbioru P. W przypadku ogólnym stosujemy podejście pierwsze, czyli generujemy wszystkie kolejne liczby z przedziału <a,b> i sprawdzamy, czy dzielą się bez reszty przez jedną z liczb z zadanego zbioru. Jeśli tak, wyprowadzamy je na wyjście.

Wejście a początek przedziału, aє Z b koniec przedziału, b ЄZ, a < b n liczba podzielników, nє N P tablica, której kolejne elementy są podzielnikami. Elementy Z. Numeracja elementów od zera. Wyjście: Kolejne liczby z przedziału <a,b> podzielne przez jeden z podzielników w P Zmienne pomocnicze i przebiega przez kolejne liczby w przedziale <a,b>, i Z j przebiega przez numery kolejnych podzielników w P, j N

Lista kroków: K01: Dla i = a,a+1,...,b wykonuj K02...K03 ; (przechodzimy przez kolejne liczby z przedziału <a,b>) K02: Dla j = 0,1,...,n-1 wykonuj K03 ; (sprawdzamy, czy liczba i dzieli się przez jeden z podzielników) K03: Jeśli i mod P[j] = 0, to: pisz i następny obieg pętli K01 ; (z tablicy P[]. Jeśli tak, wyprowadzamy i, przerywamy pętlę K02 ) K04: Zakończ

Program: Program spodziewa się w pierwszym wierszu liczb a i b. W drugim wierszu należy podać n = 1...1000, a następnie w n wierszach kolejne podzielniki (nie muszą być uporządkowane). Dane przykładowe (przekopiuj do schowka i wklej do okna konsoli): -100 100 3 5 12 17

Problem można rozwiązać podejściem drugim, tzn. wyznaczając kolejne liczby podzielne przez jeden z podzielników z tablicy P[]. Wystarczy zauważyć, iż liczby te będą wielokrotnościami swoich podzielników. Zatem dla każdego podzielnika wyznaczamy najmniejszą wielokrotność zawartą w przedziale <a,b>. Następnie z tych wielokrotności wybieramy najmniejszą i przesyłamy na wyjście. Jeśli w trakcie szukania najmniejszej liczby trafimy na taką, która została już wysłana na wyjście, to zamieniamy ją na jej następną wielokrotność. Operację kontynuujemy dotąd, aż najmniejsza liczba przekroczy kraniec b przedziału. Poniżej przedstawiamy szczegółowy algorytm tego rozwiązania.

Algorytm wyznaczania liczb podzielnych przez zadane czynniki Wejście a początek przedziału, a Є Z b koniec przedziału, b Є Z n liczba podzielników, n Є N P tablica, której kolejne elementy są podzielnikami. Elementy Z. Numeracja elementów od zera. Wyjście: Kolejne liczby z przedziału <a,b> podzielne przez jeden z podzielników w P Zmienne pomocnicze i przebiega przez indeksy podzielników w P[]. i ЄZ s liczba przesłana na wyjście, s ЄZ minv minimalna wartość wielokrotności podzielników z P[]. minvє Z V tablica wielokrotności podzielników. ElementyЄ Z. Numeracja elementów od zera zgodna z numeracją P. MAXZ największa wartość całkowita

Lista kroków: K01: Dla i = 0,1,...,n-1 wykonuj kroki K02...K03 K02: Jeśli P[i] < 0, to P[i] -P[i] ; ( ujemne podzielniki zamieniamy na dodatnie) K03: Jeśli a < 0, to V[i] (a div P[i]) P[i] inaczej V[i] ((a + P[i] - 1) div P[i]) P[i] ; (wyznaczamy pierwszą w <a,b> wielokrotność ; podzielnika P[i] ) K04: s a - 1 ; (s zapamiętuje wysłaną na wyjście liczbę. Nadajemy mu wartość niemożliwą ) K05: minv MAXZ ; (wśród wielokrotności V szukamy najmniejszej ) K06: Dla i = 0,1,...,n-1 wykonuj kroki K07...K08 K07: Jeśli V[i] = s, to V[i] V[i] + P[i] ; (jeśli trafimy na wysłaną już wielokrotność, to obliczamy kolejną) K08: Jeśli V[i] < minv, to minv V[i] ; (zapamiętujemy najmniejszą z wielokrotności) K09: s minv; ; (zapamiętujemy w s znalezioną najmniejszą z wielokrotności ) K10: Jeśli s > b, to zakończ ; (jeśli jest ona poza przedziałem <a,b>, to kończymy) K11: Pisz s ;( inaczej wyprowadzamy s i kontynuujemy pętlę) K12: Idź do K05 Algorytm wygląda na dłuższy niż w pierwszej wersji. Jednakże działa on efektywniej, ponieważ w pętli głównej nie wykonujemy dzieleń, a jedynie dodawania oraz pętla ta nie wykonuje pustych przebiegów przy każdym obiegu wyprowadzana jest jedna liczba. Korzyści ujawnią się szczególnie przy dużym przedziale <a,b> oraz znacznej różnicy pomiędzy dzielnikami.

Program: Program spodziewa się w pierwszym wierszu liczb a i b. W drugim wierszu należy podać n = 1...1000, a następnie w n wierszach kolejne podzielniki (nie muszą być uporządkowane). Dane przykładowe (przekopiuj do schowka i wklej do okna konsoli): -100 100 3 5 12 17

Jeśli liczba ma być podzielna przez każdy z podzielników, to również musi być podzielna przez ich iloczyn. Zatem w podejściu 1 obliczamy iloczyn kolejnych podzielników, a następnie w pętli przebiegającej przez kolejne liczby z przedziału <a,b> sprawdzamy, czy są one podzielne przez ten iloczyn. Jeśli tak, to wyprowadzamy je na wyjście. W podejściu drugim obliczamy najmniejszą wielokrotność iloczynu podzielników, która wpada w przedział <a,b> (patrz powyżej rozwiązanie alternatywne). Następnie w pętli dopóki wielokrotność jest mniejsza lub równa b, wyprowadzamy ją na wyjście i obliczamy następną dodając iloczyn podzielników. W ramach ćwiczeń proponuję czytelnikom samodzielne utworzenie algorytmów oraz na ich podstawie odpowiednich programów.

W przedziale <a,b> liczb całkowitych wyszukać wszystkie liczby niepodzielne przez żadną z liczb z zadanego zbioru P. Stosując pierwsze podejście przebiegamy przez kolejne liczby w przedziale <a,b>. Każdą liczbę sprawdzamy na podzielność przez podzielniki z P. Jeśli któryś z nich dzieli liczbę, to przechodzimy do następnej liczby w <a,b>. Jeśli żaden nie dzieli liczby, liczbę wyprowadzamy na wyjście.

Algorytm wyszukiwania liczb niepodzielnych przez zadane liczby Wejście a początek przedziału, aє Z b koniec przedziału, b ЄZ n liczba podzielników, n ЄN P tablica, której kolejne elementy są podzielnikami. Elementy ЄZ. Numeracja elementów od zera. Wyjście: Kolejne liczby z przedziału <a,b> niepodzielne przez żaden z podzielników w P Zmienne pomocnicze i przebiega przez kolejne liczby w <a,b>. iє Z j przebiega przez indeksy podzielników w P. jє N

Lista kroków: K01: Dla i = a,a+1,...,b wykonuj kroki K02...K04 ;( pętla przebiegająca przez kolejne liczby z <a,b>) K02: Dla j = 0,1,...,n-1 wykonuj krok K03 ; (pętla sprawdzająca podzielność przez dzielniki z P ) K03: Jeśli i mod P[j] = 0, to następny obieg pętli K01 ; (jeśli jakiś dzielnik dzieli i, przechodzimy do następnej liczby) K04: Pisz i ; (jeśli żaden dzielnik nie dzieli i, wyprowadzamy je) K05: Zakończ

Program: Program spodziewa się w pierwszym wierszu liczb a i b. W drugim wierszu należy podać n = 1...1000, a następnie w n wierszach kolejne podzielniki (nie muszą być uporządkowane). Dane przykładowe (przekopiuj do schowka i wklej do okna konsoli): -100 100 4 2 3 5 7

Dla danych dwóch liczb naturalnych a i b znaleźć największą liczbę naturalną c, która dzieli bez reszty liczbę a i dzieli bez reszty liczbę b. Liczba c o powyższej własności nosi nazwę NWD największego wspólnego dzielnika a i b (ang. GCD greatest common divisor). NWD znajdujemy za pomocą znanego algorytmu Euklidesa, będącego jednym z najstarszych algorytmów, ponieważ pojawił się on w dziele Elementy napisanym przez Euklidesa około 300 p.n.e. Właściwie Euklides nie podał algorytmu dla liczb, lecz dla dwóch odcinków. Chodziło w nim o znalezienie wspólnej miary (czyli odcinka jednostkowego), która mogłaby posłużyć do zmierzenia obu danych odcinków wspólna miara odkłada się w każdym z odcinków całkowitą liczbę razy.

Rozwiązanie 1 Euklides wykorzystał prosty fakt, iż NWD liczb a i b dzieli również ich różnicę. Zatem od większej liczby odejmujemy w pętli mniejszą dotąd, aż obie liczby się zrównają. Wynik to NWD dwóch wyjściowych liczb. Algorytm Euklidesa Wejście a, b liczby naturalne, których NWD poszukujemy, a, bє N Wyjście: NWD liczb a i b Lista kroków: K01: Dopóki a b wykonuj krok K02 K02: Jeśli a < b, to b b - a inaczej a a - b ; (od większej liczby odejmujemy mniejszą aż się zrównają ) K03: Pisz a ; (wtedy dowolna z nich jest NWD) K04: Zakończ

Program: Program odczytuje z pierwszego wiersza dwie liczby a i b, a następnie wypisuje w następnym wierszu ich NWD. Żadna z liczb a i b nie może wynosić 0 wtedy różnica nie zmienia większej z nich i program działa w nieskończoność. Niedogodność tę da się prosto zlikwidować proponuję to jako ćwiczenie dla czytelników.

Pierwsze rozwiązanie problemu znajdowania NWD jest złe z punktu widzenia efektywności. Wyobraźmy sobie, iż a jest równe 4 miliardy, a b jest równe 2. Pętla odejmująca będzie wykonywana dotąd, aż zmienna a zrówna się ze zmienną b, czyli w tym przypadku 2 miliardy razy trochę dużo. Tymczasem można wykorzystać operację reszty z dzielenia. Mniejszą liczbę można odjąć od większej liczby tyle razy, ile wynosi iloraz całkowity tych liczb. Po odejmowaniu pozostaje reszta z dzielenia a Euklides właśnie zauważył, iż NWD dzieli również różnicę danych liczb, czyli: NWD(a,b) = NWD(a mod b,b) Ponieważ reszta zawsze jest mniejsza od dzielnika, wymieniamy a z b, a b z a mod b. Jeśli otrzymamy wynik b = 0, to w a jest ostatni dzielnik dzielący bez reszty różnicę.

Wejście Algorytm Euklidesa a, b liczby naturalne, których NWD poszukujemy, a, b ЄN Wyjście: NWD liczb a i b Zmienne pomocnicze t tymczasowo przechowuje dzielnik, t N

Lista kroków: K01: Dopóki b 0 wykonuj kroki K02...K04 K02: t b ; (zapamiętujemy dzielnik ) K03: b a mod b ; (wyznaczamy resztę z dzielenia, która staje się dzielnikiem) K04: a t ; (poprzedni dzielnik staje teraz się dzielną ) K05: Pisz a ; NWD jest ostatnią dzielną K06: Zakończ

Program: Program odczytuje z pierwszego wiersza dwie liczby a i b, a następnie wypisuje w następnym wierszu ich NWD.

W przedziale <a,b> liczb naturalnych wyszukać wszystkie liczby względnie pierwsze (ang. relatively prime integers) z zadaną liczbą p. Liczba naturalna m jest względnie pierwsza (ang. coprime) z liczbą naturalną n wtedy i tylko wtedy, gdy NWD(m,n) = 1. Definicja ta oznacza, iż liczby n i m nie posiadają wspólnych podzielników za wyjątkiem 1.

Przechodzimy przez kolejne liczby w przedziale <a,b>. Dla każdej liczby obliczamy algorytmem Euklidesa jej NWD z liczbą p. Jeśli wynikiem będzie 1, to obie liczby są względnie pierwsze, zatem wyprowadzamy liczbę z przedziału na wyjście. Algorytm wyznaczania liczb względnie pierwszych Wejście a początek przedziału, a ЄN b koniec przedziału, b ЄN p liczba służąca do wyznaczenia w przedziale <a,b> liczb z nią względnie pierwszych, p Є N Wyjście: liczby z przedziału <a,b>, które są względnie pierwsze z liczbą p Zmienne pomocnicze i przebiega przez kolejne liczby w przedziale <a,b>. i Є N t tymczasowo przechowuje dzielnik w algorytmie Euklidesa, t Є N ax zmienna dla algorytmu Euklidesa. ax Є N bx zmienna dla algorytmu Euklidesa. bx Є N

K01:Dla i = a,a+1,...,b wykonuj kroki K02...K08; przechodzimy przez kolejne liczby z przedziału <a,b> K02: ax i; zmienne dla algorytmu Euklidesa K03: bx p K04: Dopóki bx 0 wykonuj kroki K05...K07; wyznaczamy NWD(i,p) K05: t bx K06: bx ax mod bx K07: ax t K08: Jeśli ax = 1, to pisz i; NWD(i,p) = 1, zatem i jest względnie pierwsze z p K09:Zakończ

Program odczytuje z pierwszego wiersza trzy liczby a, b i p a następnie wypisuje wszystkie liczby w przedziale <a,b> względnie pierwsze z p

Dla danych liczb naturalnych a i b znaleźć najmniejszą liczbę naturalną c, która jest podzielna bez reszty przez a i przez b. Liczba naturalna c o takich własnościach nosi nazwę NWW najmniejszej wspólnej wielokrotności liczb a i b. Sposób obliczania NWW jest bardzo prosty: NWW(a,b) = a b/nwd(a,b) Jeśli liczby a i b są względnie pierwsze, to NWD(a,b) = 1. Wtedy NWW(a,b) = a b.

Wejście a,b liczby, których NWW poszukujemy, a,b ЄN Wyjście: NWW najmniejsza wspólna wielokrotność liczb a i b. Zmienne pomocnicze ab zapamiętuje iloczyn a i b. ab Є N t tymczasowo przechowuje dzielnik w algorytmie Euklidesa, t ЄN Lista kroków: K01:ab a b; zapamiętujemy iloczyn a i b K02:Dopóki b 0 wykonuj kroki K03...K05; algorytmem Euklidesa znajdujemy NWD(a,b) K03: t b K04: b a mod b K05: a t K06:ab ab div a; obliczamy NWW K07:Pisz ab K08:Zakończ

Program odczytuje z pierwszego wiersza liczby a i b. W następnym wierszu wypisuje NWW(a,b). W programie zastosowano zmienne 64 bitowe.

Znaleźć n kolejnych liczb pierwszych (ang. primes). Liczba naturalna p jest liczbą pierwszą (ang. prime number) posiadającą dokładnie dwa różne podzielniki: 1 i siebie samą. W informatyce liczby pierwsze posiadają olbrzymie zastosowanie np. w kryptografii, czyli przy szyfrowaniu i rozszyfrowywaniu informacji. Jak jest to ważne dla handlu i bankowości w sieci, chyba nie trzeba nikogo przekonywać. Dlatego znajomość sposobów generacji liczb pierwszych jest obowiązkowa dla każdego informatyka.

Pierwsze, narzucające się podejście do problemu generacji liczb pierwszych jest bardzo prymitywne. Po prostu bierzemy kolejne liczby naturalne poczynając od 2 (1 nie jest pierwsze ponieważ dzieli się tylko przez 1 i brakuje nam drugiego podzielnika). Wybraną liczbę naturalną p próbujemy dzielić przez liczby od 2 do p-1. Jeśli żadna z tych liczb nie jest podzielnikiem p, to liczba p jest pierwsza. Wyprowadzamy ją i w specjalnym liczniku odnotowujemy ten fakt. Gdy licznik osiągnie stan n, kończymy algorytm.

Wejście n liczba określająca ile liczb pierwszych należy wygenerować, nєn Wyjście: n kolejnych liczb pierwszych Zmienne pomocnicze lp zlicza kolejno wygenerowane liczby pierwsze. lp Є N p kolejno testowane liczby naturalne. pєn d kolejne dzielniki. dєn

K01:lp 0; zerujemy licznik liczb pierwszych K02:p 2; generację rozpoczynamy od 2 K03:Dopóki lp < n, wykonuj kroki K04...K08; pętla generacji liczb pierwszych K04: Dla d = 2,3,...,p -1, wykonuj krok K05; pętla sprawdzania podzielności p przez d K05: Jeśli p mod d = 0, idź do K08; jeśli p dzieli się przez d, to nie jest pierwsze K06: Pisz p; p jest pierwsze K07: lp lp + 1; zwiększamy licznik wygenerowanych liczb pierwszych K08: p p + 1; przechodzimy do kolejnej liczby, kandydata K09:Zakończ

Program w pierwszym wierszu czyta liczbę n i w następnych wierszach wypisuje n kolejnych liczb pierwszych.

W przedziale <2,n> znaleźć wszystkie liczby pierwsze (ang. primes). Liczby pierwsze można wyszukiwać poprzez eliminację ze zbioru liczbowego wszystkich wielokrotności wcześniejszych liczb. Przykład: Mamy następujący zbiór liczb naturalnych: {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50} Ze zbioru wyrzucamy wszystkie wielokrotności pierwszej liczby 2. Otrzymujemy następujący zbiór: {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50}

W zbiorze pozostały liczby nieparzyste z wyjątkiem pierwszej liczby 2. Liczby podzielne przez dwa zostały wyeliminowane. Teraz eliminujemy wielokrotności kolejnej liczby 3. Otrzymamy następujący zbiór: {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3 5 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50} Teraz w zbiorze pozostały liczby niepodzielne przez 2 i 3 z wyjątkiem pierwszych 2 i 3. Zwróć uwagę, iż kolejna liczba 4 została już ze zbioru wyeliminowana. Skoro tak, to ze zbioru zniknęły również wszystkie wielokrotności liczby 4, ponieważ są one również wielokrotnościami liczby 2, a te wyeliminowaliśmy przecież na samym początku. Przechodzimy zatem do liczby 5 i eliminujemy jej wielokrotności otrzymując zbiór wynikowy: {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50} Oprócz 2,3 i 5 pozostałe w zbiorze liczby nie dzielą się już przez 2,3 i 5. Liczba 6 jest wyeliminowana (wielokrotność 2), zatem przechodzimy do 7. Po wyeliminowaniu wielokrotności liczby 7 zbiór przyjmuje postać: {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50} W zbiorze pozostały same liczby pierwsze. {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50}

Przy eliminacji wystarczy usunąć ze zbioru wielokrotności liczb leżących w przedziale od 2 do pierwiastka z n. Wyjaśnienie tego faktu jest identyczne jak w algorytmie szukania liczb pierwszych przez testowanie podzielności. Jeśli liczba p jest złożona, to musi posiadać czynniki pierwsze w przedziale od 2 do pierwiastka z p. Powyższe operacje wyrzucania wielokrotności prowadzą do przesiania zbioru wejściowego. W zbiorze pozostają tylko liczby pierwsze, liczby będące wielokrotnościami poprzedzających je liczb zostają ze zbioru odsiane. Algorytm dokonujący tej eliminacji nosi nazwę sita Eratostenesa (ang. Eratosthenes' sieve) i jest jednym z najszybszych sposobów generowania liczb pierwszych.

Sito Eratostenesa jest algorytmem dwuprzebiegowym. Najpierw dokonuje on eliminacji liczb złożonych ze zbioru zaznaczając je w określony sposób, a w drugim obiegu przegląda zbiór ponownie wyprowadzając na wyjście liczby, które nie zostały zaznaczone. Podstawowe znaczenie w tym algorytmie ma wybór odpowiedniej struktury danych do reprezentacji zbioru liczb. Na tym polu można dokonywać różnych optymalizacji. W pierwszym podejściu zastosujemy tablicę wartości logicznych S. Element S[i] będzie odpowiadał liczbie o wartości i. Zawartość S[i] będzie z kolei informowała o tym, czy liczba i pozostała w zbiorze (S[i] = true) lub została usunięta (S[i] = false).

Najpierw przygotowujemy tablicę reprezentującą zbiór liczbowy wypełniając ją wartościami logicznymi true. Odpowiada to umieszczeniu w zbiorze wszystkich liczb wchodzących w zakres od 2 do n. Następnie z tablicy będziemy usuwali kolejne wielokrotności początkowych liczb od 2 do pierwiastka całkowitego z n w pisując do odpowiednich elementów wartość logiczną false. Na koniec przeglądniemy zbiór i wypiszemy indeksy elementów zawierających wartość logiczną true odpowiadają one liczbom, które w zbiorze pozostały. Za pierwszą wielokrotność do wyrzucenia ze zbioru przyjmiemy kwadrat liczby i. Przyjrzyj się naszemu przykładowi. Gdy wyrzucamy wielokrotności liczby 2, to pierwszą z nich jest 4 = 2 2. Następnie dla wielokrotności liczby 3 pierwszą do wyrzucenia jest 9 = 3 2, gdyż 6 zostało wyrzucone wcześniej jako wielokrotność 2. Dla 5 będzie to 25 = 5 2, gdyż 10 i 20 to wielokrotności 2, a 15 jest wielokrotnością 3, itd. Pozwoli to wyeliminować zbędne obiegi pętli usuwającej wielokrotności.

Algorytm sita Eratostenesa Wejście n liczba określająca górny kraniec przedziału poszukiwania liczb pierwszych, nєn, n > 1 Wyjście: Kolejne liczby pierwsze w przedziale od 2 do n. Zmienne pomocnicze S tablica wartości logicznych. S[i] Є {false,true}, dla i = 2,3,...,n. g zawiera granicę wyznaczania wielokrotności. gєn i przebiega przez kolejne indeksy elementów S[i]. iєn w wielokrotności wyrzucane ze zbioru S, wєn

K01:Dla i = 2,3,...,n wykonuj S[i] true; zbiór początkowo zawiera wszystkie liczby K02:g [ n]; obliczamy granicę eliminowania wielokrotności K03:Dla i = 2,3,...,g wykonuj kroki K04...K08; w pętli wyrzucamy ze zbioru wielokrotności i K04: Jeśli S[i] = false, to następny obieg pętli K03; sprawdzamy, czy liczba i jest w zbiorze K05: w i 2 ; jeśli tak, wyrzucamy jej wielokrotności K06: Dopóki w n wykonuj kroki K07...K08; ze zbioru K07: S[w] false K08: w w + i; następna wielokrotność K09:Dla i = 2,3,...,n wykonuj krok K10; przeglądamy zbiór wynikowyk10: Jeśli S[i] = true, to pisz i; wyprowadzając pozostałe w nim liczby K11:Zakończ

Program w pierwszym wierszu czyta liczbę n i w następnych wierszach wypisuje kolejne liczby pierwsze zawarte w przedziale od 2 do n.

Dziękujemy za uwagę