Liczby Pierwsze
-
- Posty: 3
- Rejestracja: ndz mar 10, 2019 4:34 pm
Liczby Pierwsze
Witam
Mam plik w którym jest 15 tyś liczb. Muszę sprawdzić ile z nich jest liczbami pierwszymi. Jaką funkcją mogę to zrobić?
Mam plik w którym jest 15 tyś liczb. Muszę sprawdzić ile z nich jest liczbami pierwszymi. Jaką funkcją mogę to zrobić?
Open Office 4.1.4 Windows 10
Re: Liczby Pierwsze
1. Czy to są liczby kolejne?
2. Jaka jest największa z tych liczb?
3. Jeśli niezbyt wielka, użyj sita Eratostenesa. Jest to znacznie bardziej efektywne, niż sprawdzanie wszystkich liczb po kolei.
4. W arkuszu nie ma gotowej funkcji na sprawdzenie czy liczba jest pierwsza.
5. Zadanie nie nadaje się dla Calca (ani Excela, ani podobnych zabawek) w przypadku naprawdę dużych liczb (ponad 15 cyfr w systemie dziesiętnym), bo arkusze kalkulacyjne nie operują na danych całkowitoliczbowych, tylko na zmiennopozycyjnych.
2. Jaka jest największa z tych liczb?
3. Jeśli niezbyt wielka, użyj sita Eratostenesa. Jest to znacznie bardziej efektywne, niż sprawdzanie wszystkich liczb po kolei.
4. W arkuszu nie ma gotowej funkcji na sprawdzenie czy liczba jest pierwsza.
5. Zadanie nie nadaje się dla Calca (ani Excela, ani podobnych zabawek) w przypadku naprawdę dużych liczb (ponad 15 cyfr w systemie dziesiętnym), bo arkusze kalkulacyjne nie operują na danych całkowitoliczbowych, tylko na zmiennopozycyjnych.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
-
- Posty: 3
- Rejestracja: ndz mar 10, 2019 4:34 pm
Re: Liczby Pierwsze
Czyli małe.
Najprościej zbuduj sito Eratostenesa dla n = 10000 i zobacz, czy Twoje liczby zostały przesiane, czy zatrzymane.
Punkt startu: np. http://www.math.edu.pl/sito-eratostenesa
Czy to wystarczy, zależy od celu: czy masz po prostu wykonać pracę by otrzymać wynik, czy raczej opanować zasadę jej przeprowadzenia. W tym drugim przypadku trzeba by zrozumieć, co jest napisane we wstępie i zrealizować te obliczenia samodzielnie.
Jeżeli mas 15 tys. liczb, a największa nie przekracza 10000, to wartości powinny się powtarzać.
Najprościej zbuduj sito Eratostenesa dla n = 10000 i zobacz, czy Twoje liczby zostały przesiane, czy zatrzymane.
Punkt startu: np. http://www.math.edu.pl/sito-eratostenesa
Czy to wystarczy, zależy od celu: czy masz po prostu wykonać pracę by otrzymać wynik, czy raczej opanować zasadę jej przeprowadzenia. W tym drugim przypadku trzeba by zrozumieć, co jest napisane we wstępie i zrealizować te obliczenia samodzielnie.
Jeżeli mas 15 tys. liczb, a największa nie przekracza 10000, to wartości powinny się powtarzać.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
-
- Posty: 3
- Rejestracja: ndz mar 10, 2019 4:34 pm
Re: Liczby Pierwsze
a może tak stworzyć własną funkcję ??
na temat ich tworzenia można poczytać tu: https://help.libreoffice.org/Calc/User- ... nctions/pl
a to moja funkcja sprawdzająca czy dana liczba jest pierwszą:
funkcja zwraca wartość true lub false
--------
Edytowałem kod, obecnie sprawdza również liczby ujemne,
w pętli FOR...TO...(STEP).... dodałem krok = 2 ; jeśli liczba nie dzieli się przez 2 to nie ma sensu sprawdzać czy dzieli się przez 4(2*2), 6(2*3),...,10(2*5)... itd
--------
Edytowano:
Podaję jeszcze jedną funkcję, która przeprowadza nieco mniej obliczeń. Pierwsza funkcja sprawdzała czy istnieje reszta z dzielenia, dzieląc daną liczbę przez kolejno: 2,3,5,7,9,11,13,15 itd. Poniższa dzieli tylko liczby nieparzyste, nie kończące się cyfrą 5, przez liczby: 3,7,11,13,17... itd kolejne cyfry uzyska się dodając do ostatniej cyfry naprzemiennie 2 i 4.
na temat ich tworzenia można poczytać tu: https://help.libreoffice.org/Calc/User- ... nctions/pl
a to moja funkcja sprawdzająca czy dana liczba jest pierwszą:
Kod: Zaznacz cały
function PIERWSZA(liczba As Variant)As boolean
dim i, k, max As Variant
liczba= abs(liczba) 'wartość bezwzględna
if liczba < 2 then
PIERWSZA = false
else
PIERWSZA = true
if liczba = 2 then Exit Function
max = fix(sqr(liczba)) 'część całkowita z pierwiastka liczby
for i=1 to max step 2
if i=1 then k=2 else k=i
if liczba - fix(liczba/k)*k = 0 then PIERWSZA = false
if PIERWSZA = false then Exit For
next i
end if
End function
--------
Edytowałem kod, obecnie sprawdza również liczby ujemne,
w pętli FOR...TO...(STEP).... dodałem krok = 2 ; jeśli liczba nie dzieli się przez 2 to nie ma sensu sprawdzać czy dzieli się przez 4(2*2), 6(2*3),...,10(2*5)... itd
--------
Edytowano:
Podaję jeszcze jedną funkcję, która przeprowadza nieco mniej obliczeń. Pierwsza funkcja sprawdzała czy istnieje reszta z dzielenia, dzieląc daną liczbę przez kolejno: 2,3,5,7,9,11,13,15 itd. Poniższa dzieli tylko liczby nieparzyste, nie kończące się cyfrą 5, przez liczby: 3,7,11,13,17... itd kolejne cyfry uzyska się dodając do ostatniej cyfry naprzemiennie 2 i 4.
Kod: Zaznacz cały
function PIERWSZA(liczba As Variant)As boolean
dim i, k, max As Variant
dim niePierwsza as string
niePierwsza = "024568" 'liczby pierwsze nie kończą się cyframi z tego ciągu, za wyjątkiem 2 oraz 5
liczba = abs(liczba) 'wartość bezwzględna
if liczba < 2 then
PIERWSZA = false 'wynik dla liczby = (0,1) - to nie są liczby pierwsze
elseif len (liczba)>1 and InStr(niePierwsza, right(liczba,1)) > 0 then
PIERWSZA = false 'wynik dla liczb parzystych oraz kończące się "5" większych od 9
else
PIERWSZA = true
i = 2
Do While i*i <= liczba and PIERWSZA = true
if liczba mod i = 0 then 'jeśli nie ma reszty z dzielenia
PIERWSZA = 0 'wynik, to nie jest liczba pierwsza
elseif i=2 then k = 5
elseif i < 10 then k = 2
end if
do 'zmienna k będzie cyklicznie zmieniać wartość: 4,2,4,2,4..., dzięki czemu
k = 6 - k 'zmienna i nie będzie więcej podzielna przez 3 (mniej obliczeń)
i=i+k 'następny dzielnik
loop while right(i,1) = "5" 'eliminacja dzielników kończących się cyfrą "5"
Loop
end if
End function
Ostatnio zmieniony śr mar 13, 2019 1:21 pm przez Rafkus, łącznie zmieniany 3 razy.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Liczby Pierwsze
Oczywiście,
ale i tak lepszą praktyką jest realizacja sita Eratostenesa niż pojedynczego naiwnego testu pierwszości, stosowanego osobno dla każdej liczby.
Ciekawym, i nietrudnym zadaniem jest zbudowanie sita za pomocą formuł arkusza.
Makro jest nawet prostsze (nie biorąc pod uwagę konieczności opanowania języka), bo dostępne są adekwatne struktury sterujące, które przy użyciu formuł trzeba zastępować protezami.
ale i tak lepszą praktyką jest realizacja sita Eratostenesa niż pojedynczego naiwnego testu pierwszości, stosowanego osobno dla każdej liczby.
Ciekawym, i nietrudnym zadaniem jest zbudowanie sita za pomocą formuł arkusza.
Makro jest nawet prostsze (nie biorąc pod uwagę konieczności opanowania języka), bo dostępne są adekwatne struktury sterujące, które przy użyciu formuł trzeba zastępować protezami.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)