Liczby Pierwsze

Użytkowanie arkusza kalkulacyjnego
zaczytana124
Posty: 3
Rejestracja: ndz mar 10, 2019 4:34 pm

Liczby Pierwsze

Post autor: zaczytana124 »

Witam
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
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Liczby Pierwsze

Post autor: Jan_J »

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.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
zaczytana124
Posty: 3
Rejestracja: ndz mar 10, 2019 4:34 pm

Re: Liczby Pierwsze

Post autor: zaczytana124 »

Kolejność jest losowa. Najwieksza to 9875
Open Office 4.1.4 Windows 10
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Liczby Pierwsze

Post autor: Jan_J »

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ć.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
zaczytana124
Posty: 3
Rejestracja: ndz mar 10, 2019 4:34 pm

Re: Liczby Pierwsze

Post autor: zaczytana124 »

Dziękuję
Open Office 4.1.4 Windows 10
Awatar użytkownika
Rafkus
Posty: 516
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Liczby Pierwsze

Post autor: Rafkus »

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ą:

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
 
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.

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
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Liczby Pierwsze

Post autor: Jan_J »

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.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ