Discussion:
Sito Eratostenesa -- programy
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Wlodzimierz Holsztynski
2005-07-01 12:35:31 UTC
Permalink
Pogram generujacy liczby pierwsze
metoda Eratostenesa jest jednym
z najprostszych cwiczen w programowaniu.
Jednak dla matematykow jest wygodny.
Zamiast przechowywac na dysku wielkie tabele
liczb pierwszych, wystarczy miec krotki
program. Po pierwsze, tworzy wielkie tabele
tak szybko, ze ne warto ich przechowywac
na stale. Po drugie, taki program moze byc
uzupelniany na rozne sposoby zgodnie z
potrzebami.

Program ponizej oblicza nie tylko liczby
pierwsze, ale takze liczbe roznych dzielnikow
pierwszych dla nieparzystych liczb zlozonych
z danego zasiegu.

Program, mimo ze napisany w Perlu, liczy
na moim "Mac mini" szybko az po 36M (M -- milion),
moze i dalej, ale zatyka sie, gdy ma liczyc liczby
pierwsze az po 64M. Dlatego w oddzielnym poscie
podam wersje, ktora choc wolniej liczy dla mniejszych
zasiegow, to szybciej dla wiekszych, dla ktorych
ponizsza wersja zuzywa za duzo pamieci.

Moja maszyna ma nastepujace parametry:

komputer: Mac mini
System operacyjny: OS X 10.3.9
Procesor: 1.25GHz PowerPC G4
Pamiec: 512MB DDR SDRAM
Cache : 512KB
"Bus speed": 167MHz

Dla policzenia liczb pierwszych p \< S
program na opisanej maszynie zuzywa
t sekund, zgodnie z tabelka ponizej,
ktora w 3' & 4' kolumnie podaje liczbe liczb
pierwszych w danym zakresie oraz ostatnia
z nich:

S t #p ostatnie p
================================
1M 1 78498 999983
4M 6 283146 3999971
16M 25 1031130 15999989
36M 59 2204262 35999993

Przy wczesniejszej okazji zamiast 6s i 59s (patrz
tabelka) program zuzyl odpowiednio 5s i 58s --
bo to zalezy od widzimisie systemu, a raczej
od innych obowiazkow, ktore akurat spelnia.

(Dodam, ze druga wersja policzyla zasieg 64M
w 141s oraz 100M w 223s).

Ponizej podaje kod, pozdrawiam,

Wlodek

#######

#!/usr/bin/perl

# program name -- eratosthenes.pl
# author -- Wlodzimierz Holsztynski, 2005
#
# The program uses the Eratosthenes sieve
# to compute the array of primes up to a
# full square r^2. I use a well known but
# not widely popular version which saves
# half of the memory by running the filter
# only over odd numbers, which are indexed
# by consective natural numbers; odd n
# is coded by floor(n/2).
#
# Possibly the original feature of this
# program is counting of the number of the
# different prime divisors of all the composite
# odd numbers from the given range.
#
# This is not a commercial (industrial)
# quality code but it can be used to write
# several other number theoretical applications.
#
# In its present verion the program displays
# only the number of primes and the last 400
# primes in the given range (or all of them
# if there are fewer than 400 of them). The
# rest of the results are wasted but can be
# easily recovered with a bit of additional
# easy code.
#
# My other similar program uses a bit array,
# hence it is faster when it avoids a usage of
# disk. For small ranges the other code is
# slower, and it does not compute the number
# of prime divisors.
# =======================================

use integer;

print "Enter sqrt of the bound ==> ";
chomp($r=<>);

$start = times();

($extra = $r&1)++;

$upBd = ($r*$r - $extra)/2;

#---- sieve ----#

for ($p=3; $p < $r; $p += 2)
{ $d = ($p>>1);
if(!$comp[$d])
{ push @primes,$p;
for ($n=$d+$p; $n <= $upBd; $n += $p) { ++$comp[$n] }
} }
for(((1+$r-$extra)/2)..$upBd)
{ push @primes,2*$_+1 if !$comp[$_] }

#----- end of sieve -----#

$endT = times();

(($disp = @primes - 400) > 0) || ($disp=0, printf "\n %8u",2);
print"\n",' 'x(9*($disp%10));
for ($disp..(@primes-1))
{ print "\n" if !($_%10);
print "\n" if !($_%100);
printf " %8u", $primes[$_]
}
print "\n\n *** There are ", @primes+1," primes < ",$r*$r,"\n\n";
print "Duration of the execution in seconds: ", $endT-$start, "\n\n"
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Wlodzimierz Holsztynski
2005-07-01 13:51:39 UTC
Permalink
Post by Wlodzimierz Holsztynski
Dla policzenia liczb pierwszych p \< S
program na opisanej maszynie zuzywa
t sekund, zgodnie z tabelka ponizej,
ktora w 3' & 4' kolumnie podaje liczbe liczb
pierwszych w danym zakresie oraz ostatnia
S t #p ostatnie p
================================
1M 1 78498 999983
4M 6 283146 3999971
16M 25 1031130 15999989
36M 59 2204262 35999993
(Dodam, ze druga wersja policzyla zasieg 64M
w 141s oraz 100M w 223s).
Program ponizej jest wolniejszy dla powyzszych parametrow
-- zuzyl odpowiednio 1s 8s 34s 78s. Ma jednak
swoje przewagi, bo liczy na moim Macu w zasiegu
wyzszym niz ten z cytowanego postu (nawet gdy
jednoczesnie robie inne rzeczy, jak w przypadku
zasiegu 144M):

S t #p ostatnie p
================================

64M 141 3785086 63999979
100M 223 5761455 99999989
144M 321 8125404 143999983


Program dziala poprawnie tylko dla architektury
32-bitowej (szerokosc slowa dla liczb "standardowych"
liczb calkowitych) Na przyklad dla architektury 64-
bitowej nalezaloby go zedytowac. Moglem uzyc
symbolicznych stalych, ale mie sie nie chcialo,
gdyz po pierwsze od reki nie wiem jak to zrobic
leciutkiego spowolnienia programu, a po drugie,
w obecnym stanie ten program jest krociutki
i nie ma sprawy.

Pozdrawiam,

Wlodek

######

#!/usr/bin/perl

# program name -- bitErato.pl
# author -- Wlodzimierz Holsztynski, 2005
#
# The program computes primes using Eratosthenes
# sieve. It uses memory carefully. I should
# use symbolic constants instead of the archtecture
# related explicit integer 32 (the popular today
# computer word length) and the derivative
# constants 31 = 32-1, 5 = log_2(32) and 6 = 5+1.

use integer;

print "Enter sqrt of the bound ==> ";
chomp($r=<>);

$start = times();

($extra = $r&1)++;

$upBd = ($r*$r - $extra)/2;

#---- sieve ----#

for ($p=3, $bitpos=1; $p < $r; $p += 2, ++$bitpos)
{ ($bitpos < 32) || ($bitpos = 0);
if(!($comp[$p>>6]&(1<<$bitpos)))
{ push @primes,$p;
for ($n=$p+($p>>1); $n <= $upBd; $n += $p)
{ $comp[$n>>5] |= (1<<($n&31)) }
} }
for(((1+$r-$extra)/2)..$upBd)
{ push @primes,2*$_+1 if !($comp[$_>>5] & (1<<($_&31))) }

#----- end of sieve -----#

$endT = times();

(($disp = @primes - 400) > 0) || ($disp=0, printf "\n %8u",2);
print"\n",' 'x(9*($disp%10));
for ($disp..(@primes-1))
{ print "\n" if !($_%10);
print "\n" if !($_%100);
printf " %8u", $primes[$_]
}
print "\n\n *** There are ", @primes+1," primes < ",$r*$r,"\n\n";
print "Duration of the execution in seconds: ", $endT-$start, "\n\n"
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Takamura
2005-07-01 23:00:08 UTC
Permalink
Post by Wlodzimierz Holsztynski
Pogram generujacy liczby pierwsze
metoda Eratostenesa jest jednym
z najprostszych cwiczen w programowaniu.
.......
Post by Wlodzimierz Holsztynski
Program ponizej oblicza nie tylko liczby
pierwsze, ale takze liczbe roznych dzielnikow
pierwszych dla nieparzystych liczb zlozonych
z danego zasiegu.
Brawo!. Nareszcie, mamy coś konkretnego. Dziękuję za ujawnienie
programu. Będziemy mogli porównać je.
Post by Wlodzimierz Holsztynski
Program, mimo ze napisany w Perlu, liczy
na moim "Mac mini" szybko az po 36M (M -- milion),
moze i dalej, ale zatyka sie, gdy ma liczyc liczby
pierwsze az po 64M.
.....
Ponizej podaje kod,
I tu zaczyna się problem, ja nie znam Perla. Dobrze byłoby w przyszłości
podawać również komentarze w istotnych momentach programach ( nie chodzi
o komentarze do każdej operacji).
Ponieważ Perl przypomina C, to udało mi się zrozumieć istotę programu.
Sito to ta linia
Post by Wlodzimierz Holsztynski
for ($n=$d+$p; $n <= $upBd; $n += $p) { ++$comp[$n] }
działa na zasadzie 'trafiony zatopiony'.
Krytyczny problemem jest jednak wielkość tablicy 'comp'. Rozmiar tej
dynamicznej tablicy jest upBd czyli prawie N/2. W następnym poście
przysłałeś bardziej złożony algorytm. Jeżeli go dobrze zrozumiałem to
właśnie tablica 'comp' zajmuje mniej miejsca i dlatego można liczyć
większe liczby.

Tak na marginesie, mógłbyś może sprawdzić ten program napisany w Perlu.
http://dreamfrequency.com/df.cgi?url=index#freeware
=> Freeware Perl Scripts: Prime Number Calculator
( tam nie ma tablicy więc trzeba by ją dodać. Jeżeli dobrze go rozumiem
to liczbę pierwszą oblicza sie przez modulo. Więc twój program dla
dużych liczb powinien być zdecydownie szybszy)

No to teraz moja kolej. Program to Mathematica.
n-tą liczbę pierwszą można uzyskać tak
Prime[n] ,
tablicę wszystkich liczb pierwszych od 2 do NN uzyskuje się

t1 = Table[ Prime[i] , {i , PrimePi[NN]}]
(* komentarz funkcja PrimePi oblicza liczbę wszystkich liczb pierwszych
<= NN co w literaturze oznaczone jest jako pi(NN) *)

W swoich obydwu postach podałeś liczbę liczb pierwszych i ostatnią dla
NN= 1M, 2M,.....,144M. Mogę potwierdzić, że dokładnie takie same liczby
uzyskuje się w Mathematice.

Podałeś również czas wykonania twojego programu. Dla porównania podam
czas wykonania na 2 maszynach z różnymi wersjami Mathematici

Czas obliczenia (sek) liczb pierwszych
NN W1 T1 T2
1M 1 0.88 0.60
2M 1.76 2.42
4M 6 3.40 6.15
8M 6.81 13.34
16M 25 12.8 27.4
32/36M* 59 24.5 54.0
64M 47.6 118.1

W1 - Włodek Perl maszyna 1.25 GHz 512 RAM
T1 - Takamura Mathematica 4.1 maszyna 1.7 GHz 256 RAM
T2 - Takamura Mathematica 5.0 maszyna 0.6 GHz 256 RAM (to mój komputer)
* 32M Takamura 36M Włodek
--
takamura

PS.Teraz pozostaje tylko czekać, aż (c)RaSz ujawni swoje rzeszoto
Wlodzimierz Holsztynski
2005-07-02 01:10:02 UTC
Permalink
Post by Takamura
Brawo!. Nareszcie, mamy coś konkretnego.
Dziękuję za ujawnienie programu. Będziemy mogli porównać je.
Na przestrzeni lat podalem kilka programow pod psem.
Nie chce przedobrzyc.
Post by Takamura
Ponieważ Perl przypomina C, to udało mi się zrozumieć
istotę programu. Sito to ta linia
Post by Wlodzimierz Holsztynski
for ($n=$d+$p; $n <= $upBd; $n += $p) { ++$comp[$n] }
działa na zasadzie 'trafiony zatopiony'.
Z tym, ze ta linijka na dodatek liczy
liczbe trafien, dzieki czemu podaje
liczbe czynnikow pierwszych dla liczb
zlozonych 2*$n+1 (a wiec nieparzystych),
a dla pierwszych daje 0 zamiast 1 --
tak mi wygodniej, ale to glupstwo.
Post by Takamura
Krytyczny problemem jest jednak wielkość tablicy 'comp'. Rozmiar tej
dynamicznej tablicy jest upBd czyli prawie N/2. W następnym poście
przysłałeś bardziej złożony algorytm. Jeżeli go dobrze zrozumiałem to
właśnie tablica 'comp' zajmuje mniej miejsca i dlatego można liczyć
większe liczby.
W zwyklych komputerach ta tablica zajmuje 32 razy mniej pamieci,
bo poswiec a tylko 1 bit, a nie slowo, na kazda liczbe nieparzysta
z danego zakresu.
Post by Takamura
Tak na marginesie, mógłbyś może sprawdzić ten program napisany w Perlu.
http://dreamfrequency.com/df.cgi?url=index#freeware
=> Freeware Perl Scripts: Prime Number Calculator
( tam nie ma tablicy więc trzeba by ją dodać. Jeżeli dobrze go rozumiem
to liczbę pierwszą oblicza sie przez modulo. Więc twój program dla
dużych liczb powinien być zdecydownie szybszy)
Dziekuje za link. Juz jest wsrod moich "favorite".
Przy okazji pobawie sie ich programami.
Post by Takamura
No to teraz moja kolej. Program to Mathematica.
n-tą liczbę pierwszą można uzyskać tak
Prime[n] ,
O, jaki prosty program :-)
Post by Takamura
tablicę wszystkich liczb pierwszych od 2 do NN uzyskuje się
t1 = Table[ Prime[i] , {i , PrimePi[NN]}]
(* komentarz funkcja PrimePi oblicza liczbę wszystkich liczb pierwszych
<= NN co w literaturze oznaczone jest jako pi(NN) *)
Prosto i naturalnie.
Post by Takamura
W swoich obydwu postach podałeś liczbę liczb pierwszych i ostatnią dla
NN= 1M, 2M,.....,144M. Mogę potwierdzić, że dokładnie takie same liczby
uzyskuje się w Mathematice.
Podalem te parametry wlasnie po to, by
mozna bylo testowac poprawnosc moich
programow; tez tak sobie, dla zabawy.
Post by Takamura
Podałeś również czas wykonania twojego programu. Dla porównania podam
czas wykonania na 2 maszynach z różnymi wersjami Mathematici
Czas obliczenia (sek) liczb pierwszych
NN W1 T1 T2
1M 1 0.88 0.60
2M 1.76 2.42
4M 6 3.40 6.15
8M 6.81 13.34
16M 25 12.8 27.4
32/36M* 59 24.5 54.0
64M 47.6 118.1
Moj drugi program obliczyl zakres 64M w ciagu 141s.
Widac, ze Perl jest powolny.

Jeszcze wspomne, ze dla optymizacji szybkosci
kazalem Perlowi "use integers", wiec zaokraglal
czas do calkowitego, w dol. Mialem dwa momenty:
$start oraz $endT. Czas obliczen, to
$endT - $start. Wiec zaokraglenie moze
nastapic w dowolna strone, zarowno w dol
jak i w gore.
Post by Takamura
W1 - Włodek Perl maszyna 1.25 GHz 512 RAM
T1 - Takamura Mathematica 4.1 maszyna 1.7 GHz 256 RAM
T2 - Takamura Mathematica 5.0 maszyna 0.6 GHz 256 RAM (to mój komputer)
* 32M Takamura 36M Włodek
Dziekuje za odpowiedz na moj post.
Mysle o napisaniu jeszcze o dystrybucji
roznic liczb pierwszych. Od paru dni mam
dla 36M, ale chcialem miec wiecej materialu.
Teraz uzupelnie kod i bede mial dla 64M
i wiecej.

Bedzie to okazja do przsekonania sie o wyzszosci
]podejscia matematycznego nad inzynieryjnym,
reprezentowanym przez Twoje "clustering".
Czyli nie wystarczy miec dane i mechanicznie dac
algorytmom dzielic je. Przydatny jest glebszy wglad
w nature danych, by je moc poprawnie interpretowac,
by widziec to, co komputer golym okiem nie
zobaczy.

Pozdrawiam,

Wlodek
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
(c)RaSz
2005-07-02 23:41:23 UTC
Permalink
Post by Takamura
Post by Wlodzimierz Holsztynski
Pogram generujacy liczby pierwsze
metoda Eratostenesa jest jednym
z najprostszych cwiczen w programowaniu.
.......
--
takamura
PS.Teraz pozostaje tylko czekać, aż (c)RaSz ujawni swoje rzeszoto
- osobom, które zajrzawszy na moją stroniczkę
http://republika.pl/c_rasz/index.htm odniosły wrażenie (chyba podobnie
Takamura-san), że tekst jest szyfrowany, lub też, dla zmylenia obcych wywiadów,
został napisany w języku dawno wymarłych plemion słowiańskich, albo
przed-krzyżackich Prusów, wyjaśniam, że tak nie jest. Chociaż faktycznie, nie
jest on również napisany "językiem matematyki" - niestety.

Napisałem, jak umiałem!

Jednak zdawszy sobie sprawę z tego, że tekst wyszedł mi całkiem dla matematyków
niestrawny, postaram się wyciągnąć z niego to, co istotne, i podać w postaci
czytelniejszej. Na tyle, na ile mi się uda, oczywiście. Zgodnie z zaleceniami:
pominę długie, przeładowane subiektywną zawartością opisy, oraz elementy
gorączkowej autoreklamy... Może po tych zabiegach pozostanie jeszcze coś z
treści? No cóż, spróbuję...


Tym niemniej: pogłoski, o głębokim utajnieniu procedury "rzeszota" - są w dużej
mierze przesadzone...
--
Pozdrawiam - (c)RaSz (mocno skruszony)


PS.: związek rzeszota z sitem Eratostenesa - jest dość... luźny! Już więcej
łączy je z ciągami Dirichleta, stanowiącymi zresztą jeden z najistotniejszych
elementów procedury.
Wlodzimierz Holsztynski
2005-07-04 22:55:18 UTC
Permalink
Post by Takamura
Tak na marginesie, mógłbyś może sprawdzić ten program napisany w Perlu.
http://dreamfrequency.com/df.cgi?url=index#freeware
=> Freeware Perl Scripts: Prime Number Calculator
W dniu ukazania sie Twojego postu link dzialal.
Nie mialem wtedy czasu, wiec prawie tego programu
nie ruszylem. Zdiwilo ,mnie, ze strona graficznie
taka niby zaawansowana, a output, czyli to co wazne,
byl sformatowany flejtuchowato, jakby wcale
nie sformatowany (free fromat). Moj amatorski,
naiwny program jednak ustawia liczby pierwsze
i inne tabelki rowno w dziesieciu kolumnach,
a co 10 wierszy jest odstep, czyli latwo
odmierzac setki i dziesiatki liczb pierwszyhc.
Co wiecej, tak sa ustawione, ze gdy lista
zaczyna sie powiedzmy od elementu o indeksie
3027, to ten element pokaze sie w siodmej
kolumnie (lub w innych tabelachj w osmej, gdy
indeksuje od zera). Takie drobiazgi ulatwiaja
zycie uzytkownika.

Prawde mowiac nmie przetestowalem
programu porzadnie, bo chyba byl wolny,
wiec odlozylem serio testowanie na potem.

Dzis jednak link nie dziala! Dostaje odzew w oknie:

***********

Software error:

syntax error at df.cgi line 12, near "&($url"
Execution of df.cgi aborted due to compilation errors.
For help, please send mail to the webmaster
(***@dreamfrequency.com), giving this error message
and the time and date of the error.

*********

Chca by ich powiadomic o bledzie. Ale wole
czas poswiecac na bardziej obiecujace projekty.
To raz jeszc ze podkresla, ze dobrze czasem
gotowac samemu, bo z restauracjami
roznie bywa.

Pozdrawiam,

Wlodek

PS. Doswiadczenie mi pokazalo, ze naprawde C++
jest 100 razy szybsze od perla w zastosowaniach
czysto matematycznych lub kombinatorycznych
(nie tekstowych). Wiec czas ktory moj
program poswieca na liczenie nie moze byc
"imponujacy".
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
(c)RaSz
2005-07-02 15:34:45 UTC
Permalink
(...) liczy (...) szybko az po 36M
(...) ale zatyka sie, gdy ma liczyc liczby
pierwsze az po 64M. Dlatego w oddzielnym poscie
podam wersje, ktora choc wolniej liczy dla mniejszych
zasiegow, to szybciej dla wiekszych, dla ktorych
ponizsza wersja zuzywa za duzo pamieci.
Wlodek
- a gdyby tak dodatkowo zaimplementować postulowane przeze mnie "sziftowanie"
tablicy przeszukiwanej? Wiem, że mój opis jest straAasznie mętny, ale, w miarę
swych skromnych możliwości, mogę go spróbować nieco wyklarować! Choć i dla mnie
będzie to ciężki orzech do zgryzienia, jako żem matematyczny profan...

[ Zaś gdy już muszę coś-tam sobie "po-kar-kulować" ;-) to i metod używam
takich, że... nie liczcie, cobym się przyznał ! ]

Użycie zamiast jednej, dużej tablicy wartości przeszukiwanych - jej zastępczego
odpowiednika, i sekwencyjnej, kolejnej obróbki zbioru, w postaci
"po-porcjowanej", pozwala oszczędzić sporo miejsca, kosztem pewnej komplikacji
algorytmu. Daje też możliwość liczenia "w górę, i w górę!" - bez ŻADNYCH
ograniczeń (prócz trwałości komputera), zaś jedynym problemem, co do zajętości
pamięci, jest wtedy kwestia sprytnego przechowywania "wcześniej już
znalezionych" (przy niższych sziftach) liczb pierwszych. Sądzę, że kilka takich
chytrych sposobów dałoby się znaleźć. Nie szukając daleko: zamiast przechowywać
je w postaci "pełnej", można zastosować zapis typowy dla grafiki wektorowej!
Zresztą: pewnie i tak "matematyk zrobi to lepiej!"

Lecz zwrócę jeszcze uwagę, że podczas wykreślania odpowiednich wielokrotności,
będziemy wcześniej znalezione liczby pierwsze używać "grubszymi porcjami" - niż
[badać] wartości samej tablicy "liczb przeszukiwanych" (wykreślanych). Grubszymi
porcjami, oraz... rzadziej! A więc nawet bez żadnego "sprytnego upakowywania"
ich (znalezionych L.p.) uzyskamy pewną poprawę pracy maszyny, gdyż rzadziej
będzie relokować strony pamięci na dysk. Czyli: odpowiednie zagnieżdżenie
procedur obliczeniowych, będzie znacznie korzystniej dostosowane do
"przyzwyczajeń" komputera! Nazwę to podejściem "psycho-elektronicznym"...

Reasumując: jestem pewien, że korzyści będą znaczne, no i... warto spróbować!
--
Pozdrawiam - (c)RaSz


PS.: Czytam w "Re: Erato..."
(...) zawsze dobrze wiedziec co uzykano
przed nami, honorowac i celebrowac
oryginalnych autorow wynikow.
- jeśli gdzieś powtórzyłem czyjeś prace, to, hm, nic o tym nie wiem! Dlatego
trudno by mi było przypisać do jakichś "wyników" - konkretne nazwiska... Jeżeli
tak się stało, to proszę wskazać "co i jak" wiadomym było od dawna, tudzież KTO
pierwszy do tego doszedł, alibo też udowodnił. Będę b. wdzięczny, no i
oczywiście: brakujące, odpowiednie przypisania uzupełnię na swej stroniczce.
Wlodzimierz Holsztynski
2005-07-02 20:03:00 UTC
Permalink
Post by (c)RaSz
- a gdyby tak dodatkowo zaimplementować postulowane
przeze mnie "sziftowanie" tablicy przeszukiwanej? [...]
Reasumując: jestem pewien, że korzyści będą znaczne,
no i... warto spróbować!
Wiec sprobuj!!! Wez kilka, chocby jeden przyklad
sporej liczby pierwszej. Nie musi miec setek cyfr,
ale niech ma powiedzmy okolo 30, i pokaz jak
sprawdzasz, czy jest pierwsza. Mozesz tez wziac
znana liczbe pierwsza, jako poczatek postepu
arytmetycznego o roznicy 2310, i sprawdzic, ktore z nich
sa pierwsze: p p+2310 p+4620 p+6930 ...
Sprawdz dla ilustracji tylko kilka wyrazow, chocby od
trzech do pieciu. Dzis sprawdzanie stucyfrowych liczb
jest dla fachowych programow, poswieconych szyfrowaniu,
fraszka. Ale pytam Cie tylko o 30-cyfrowe.

Co do dobrze napisanych tekstow matematycznych,
to jest icg wokol Ciebie przeciez zatrzesienie. W bibliotece
i w ksiegarniach masz wiele monografii. W internecie tez mozesz
wybrac teksty dobrze napisane, a przy tym wedlug swojego gustu.

Mam wrazenie, ze potrafisz pisac, gdy chcesz, gdy sie
powstrzymujesz przed uwagami o sobie, jaki to jestes
do niczego, lub jaki przy tym genialny. W porownaniu
z trzema ligami wielkich umyslow, to jak dotad pod
psem wszycy jestesmy zerami-plus. Wiec nie ma co sie krygowac
i nudzic samoocenami. Wtedy odechciewa sie czytac.
A chetnie zobacze spelnienie Twoich zapowiedzi, i czy
jest w Twojej pracy cos istotnie nowego. Naprawde chcialbym
wiedziec.

Powodzenia, pozdrawiam,

Wlodek
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
apollyon
2005-07-04 07:16:15 UTC
Permalink
Post by Wlodzimierz Holsztynski
Pogram generujacy liczby pierwsze
metoda Eratostenesa jest jednym
z najprostszych cwiczen w programowaniu.
Jednak dla matematykow jest wygodny.
Zamiast przechowywac na dysku wielkie tabele
liczb pierwszych, wystarczy miec krotki
program. Po pierwsze, tworzy wielkie tabele
tak szybko, ze ne warto ich przechowywac
na stale. Po drugie, taki program moze byc
uzupelniany na rozne sposoby zgodnie z
potrzebami.
Nie wiem czy jest sens wywazania przez Pana drzwi, ktore juz ktos kiedys
wywazyl.
Polecam darmowy pakiet
free L I P
l o n g i n t e g e r p a c k a g e
napisany przez Pana Arjena K. Lenstre, profesora kryptologii,

Sens uzywania takiej bilbioteki jest taki ze jest ona bardzo dobrze
zoptymalizowana przez wielu ludzi, i jest naprawde szybka,
ale z drugiej strony rozumiem ze pisanie samemu niektorych funkcji moze miec
znaczenie edukacyjne.

a tutaj niektore funkcje z tej biblioteki:

Montgomery modular arithmetic
-----------------------------
zmstart, zmfree, ztom, zmtoz, zmontadd, zmontsub, zsmontmul,
zmontmul,
zmontsq, zmontdiv, zmontinv, zmontexp, zmontexp_m_ary,
zmontexp_doub1, zmontexp_doub2, zmontexp_doub3, zmontexp_doub

Euclidean algorithms
--------------------
zgcd, zgcdeucl, zexteucl, zinvs, zinvodds, zinv, zchirem,
zjacobis, zjacobi

Random number generation
------------------------
zrstarts, zrstart, zrseed, zrandom, zrandomb, zrandoml,
zrandomprime, zrandomqprime, zrandomfprime, zrandomgprime

Small prime generation
----------------------
zpstart, zpstart2, zpnext, zpnextb, zp

Compositeness testing and factorization
---------------------------------------
zcomposite, zmcomposite, zprime, zprobprime,
ztridiv, zpollardrho, zecm_trial, zecm, zfecm, zsquf

Allocation
----------
zsetlength, zfree

Timing
------
gettime, getutime, getstime, starttime, printtime

Biblioteke mozna znalezc np. tutaj:
http://www.win.tue.nl/~klenstra/

Pozdrawiam
Marcin Orchel
Takamura
2005-07-04 16:56:59 UTC
Permalink
Polecam darmowy pakiet free L I P
l o n g i n t e g e r p a c k a g e
napisany przez Pana Arjena K. Lenstre, profesora kryptologii,
bardzo dobrze, że podrzucasz bibliotekę procedur do operacji na lub z
liczbami pierwszymi baaardzo dużymi. Biblioteka jest duuża
Sens uzywania takiej bilbioteki jest taki ze jest ona bardzo dobrze
zoptymalizowana przez wielu ludzi, i jest naprawde szybka,
ale z drugiej strony rozumiem ze pisanie samemu niektorych funkcji moze miec
znaczenie edukacyjne.
Mam nadzieję, że używałeś już te procedury i możesz dla celów
edukacyjnych odpowiedzieć nam na nastepujące pytania :
1. procedury są napisane w C,W jakim C to działa lub nie działa?.
Autor wspomina wyłącznie o systemach unix (np HP-UX 8.05), a lip.c jest
WIN32.
2. w procedurze zsqrtmod jest bardzo ciekawy fragment ( loop : ), w
którym wykonuje sie wielokrotnie operacji modulo. Czy rzeczywiście w C
jest to operacja bardzo szybka.
3. Włodek Holsztyński w swoim poście podał nie tylko swoją procedurę
ale co również bardzo ważne, szybkość działania jego procedury.
Czy mógłbyć dla celów porównawczych uruchomić program do tablicowania
wszystkich liczb pierwszych <=N i podać ( podobnie jak Włodek) ile czasu
to zajmuje dla dla N = 1M, 2M, 4M ,..itd...<=ile sie da w Twoim
komputerze. Pożądane byłoby także podanie szybkości taktowania procesora
i ilośc pamięci dynamicznej.
--
takamura
Wlodzimierz Holsztynski
2005-07-04 22:28:43 UTC
Permalink
Post by apollyon
Nie wiem czy jest sens wywazania przez Pana drzwi,
ktore juz ktos kiedys wywazyl. Polecam darmowy pakiet
free L I P l o n g i n t e g e r p a c k a g e
napisany przez Pana Arjena K. Lenstre, profesora kryptologii,
To by bylo zabawne, gdyby nie bylo smieszne.

Hej, ukulem nowe powiedzonko!!! :-)

Ten pakiet nie chce sie skompilowac.
Gdy probuje c++, to wyskakuje tyle bledow,
ze nie chce mi sie tego czytac.

Gdy kompiluje za pomoca cc, to dostaje
wiadomosc o nieistnieniu w systemie malloc.h.
Probowalem go zastapic przez stdlib.h (lub
najpierw po prostu wykomentowac, z nadzieja,
ze dzis moze malloc.h zostal zaabsorbowany
przez inne moduly), ale nic z tego.

Takie klopoty sa niestety typowe.

A przeciez matematyk nie chce zycia
"zmarnowac" na przyswajaniu coraz to
nowych pakietow, gdy mu raptem potrzebne
sito Eratostenesa. Gdy nie jest prosty program
czescia standardowego jezyka, to prosciej
samemu sobie zaprogramowac. Wtedy
czlowiek wie co robi, i moze dorobic co
tylko zechce.

Oczywiscie nie ma reguly. Za link
dziekuje. Naprawde chcialem skorzystac.

Wszystko jedno czesto lepiej drzwi
samemu otworzyc, niz miec je wywazone
przez jakas bande nieznajomych ludzi.

Kiedys dzialalem na alpha (a moze beta?),
ktora byla 64 bitowa. Potrzebowalem
liczb calkowitych 80-90 bitowych. Niby
moglem szukac pakietu o dowolnej
dlugosci liczb calkowitych, w rodzaju tego lip.c
(to byl rok 1993, ale takie pakiety oczywiscie byly).
Wolalem sobie zaprogramowac "poltorej
precyzji". Zalezalo mi na szybkosci (cpu-time).
Prawdopodobnie moj program byl szybszy
niz programy, ktore dzialaja dla t.zw.
nieskonczonej precyzji. Zaprogramowalem co
potrzebowalem i nie wiecej. Nie mialem
kosztow dodatkowych.

Wiec raz jeszcze szczere dzieki za link.
Ale nie za chamska uwage o wywazaniu drzwi.
Forma "Pan" nie uczynila ja/ grzeczniejsza/.

Wlodek
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Maciek
2005-07-04 23:00:09 UTC
Permalink
Post by Wlodzimierz Holsztynski
(.........) Polecam darmowy pakiet
free L I P l o n g i n t e g e r p a c k a g e
napisany przez Pana Arjena K. Lenstre, profesora kryptologii,
To by bylo zabawne, gdyby nie bylo smieszne.
Hej, ukulem nowe powiedzonko!!! :-)
Dobre. :-))
Post by Wlodzimierz Holsztynski
Ten pakiet nie chce sie skompilowac. (...)
Gdy kompiluje za pomoca cc, to dostaje
wiadomosc o nieistnieniu w systemie malloc.h.
Być może masz coś zepsute w swojej instalacji kompilatora.
Plik malloc.h jest standardowy, moduł źródłowy odwołuje się
do niego poprzez nawiasy kątowe <...>, więc kompilator
powinien wiedzieć, gdzie go szukać. Jeśli nie znajduje,
to raczej kompilatora wina (lub jego autorów, lub, jak
napisałem, Twojej instalacji), a nie plików źródłowych.
U mnie się kompiluje bez problemów, zarówno gcc i cc.

Gorzej, że się nie chciał potem połączyć. Linker raportuje,
że moduł lip.c odwołuje się do funkcji htonl() oraz ntohl().
Ale w dostarczonym module nie ma ich implementacji - trzeba
było dołączyć, oprócz wskazanej przez autora biblioteki
arytmetycznej, jeszcze bibliotekę sieciową: -lm -lsocket.
Post by Wlodzimierz Holsztynski
Probowalem go zastapic przez stdlib.h (lub
najpierw po prostu wykomentowac, z nadzieja,
ze dzis moze malloc.h zostal zaabsorbowany
przez inne moduly), ale nic z tego.
Najpewniej po prostu zginął Ci malloc.h. Trzeba go gdzieś
odnaleźć i na nowo włożyć pomiędzy standardowe pliki *.h.


Maciek
Takamura
2005-07-05 12:16:53 UTC
Permalink
Post by Maciek
Być może masz coś zepsute w swojej instalacji kompilatora.
Plik malloc.h jest standardowy, moduł źródłowy odwołuje się
do niego poprzez nawiasy kątowe <...>,
.......
Post by Maciek
Gorzej, że się nie chciał potem połączyć. Linker raportuje,
że moduł lip.c odwołuje się do funkcji htonl() oraz ntohl().
Ale w dostarczonym module nie ma ich implementacji - trzeba
było dołączyć, oprócz wskazanej przez autora biblioteki
arytmetycznej, jeszcze bibliotekę sieciową: -lm -lsocket.
to znaczy jesteś jedyny, któremu udało się to uruchomić.
Więc może ty odpowiesz na postawione wcześniej pytanie
"Czy mógłbyć dla celów porównawczych uruchomić program do tablicowania
wszystkich liczb pierwszych <=N i podać ( podobnie jak Włodek) ile czasu
to zajmuje dla dla N = 1M, 2M, 4M ,..itd...<=ile sie da w Twoim
komputerze. Pożądane byłoby także podanie szybkości taktowania procesora
i ilośc pamięci dynamicznej."
--
takamura
Maciek
2005-07-05 13:35:42 UTC
Permalink
Post by Takamura
Post by Maciek
Być może masz coś zepsute w swojej instalacji kompilatora.
Plik malloc.h jest standardowy, (..........)
.......
Post by Maciek
Gorzej, że się nie chciał potem połączyć. (...) - trzeba
było dołączyć, oprócz wskazanej przez autora biblioteki
arytmetycznej, jeszcze bibliotekę sieciową: -lm -lsocket.
to znaczy jesteś jedyny, któremu udało się to uruchomić.
Więc może ty odpowiesz na postawione wcześniej pytanie
"Czy mógłbyć dla celów porównawczych uruchomić program do tablicowania wszystkich liczb pierwszych <=N i podać (
podobnie jak Włodek) ile czasu to zajmuje dla dla N = 1M, 2M, 4M ,..itd...<=ile sie da w Twoim komputerze. Pożądane
byłoby także podanie szybkości taktowania procesora i ilośc pamięci dynamicznej."
Jasne, mógłbym. Niestety jestem ostatnio mocno zajęty, tak że
wręcz kradnę czas, żeby wpaść na newsy, i nie wiem kiedy będę
mógł się tym zająć. Zwłaszcza że nie znam perla, więc muszę
jeszcze przez chwilę przysiąść nad tłumaczeniem perl -> C.
Wprawdzie wygląda na trywialnie proste, no ale zawsze trzeba
sprawdzić.

Chętnie się tym zajmę, gdy tylko znajdę wolne "parę minut"
-- ale na pewno nie będzie to w ciągu najbliższych godzin.


Maciek
apollyon
2005-07-07 19:20:02 UTC
Permalink
Post by Wlodzimierz Holsztynski
Post by apollyon
Nie wiem czy jest sens wywazania przez Pana drzwi,
^^^^^^^^^^^
Post by Wlodzimierz Holsztynski
Post by apollyon
ktore juz ktos kiedys wywazyl. Polecam darmowy pakiet
free L I P l o n g i n t e g e r p a c k a g e
napisany przez Pana Arjena K. Lenstre, profesora kryptologii,
To by bylo zabawne, gdyby nie bylo smieszne.
Wiec raz jeszcze szczere dzieki za link.
Ale nie za chamska uwage o wywazaniu drzwi.
Forma "Pan" nie uczynila ja/ grzeczniejsza/.
Witam Pana
Uwaga poczyniona na wstepie byla jedynie zwroceniem uwagi na mozliwosc
skorzystania z darmowego pakietu zamiast implementacji samodzielnej. Bardzo
mi przykro, jesli Pana urazila.

Pozdrawiam
Marcin O.
A.L.
2005-07-08 08:00:02 UTC
Permalink
On Mon, 4 Jul 2005 16:28:43 CST, "Wlodzimierz Holsztynski"
Post by Wlodzimierz Holsztynski
Post by apollyon
Nie wiem czy jest sens wywazania przez Pana drzwi,
ktore juz ktos kiedys wywazyl. Polecam darmowy pakiet
free L I P l o n g i n t e g e r p a c k a g e
napisany przez Pana Arjena K. Lenstre, profesora kryptologii,
Wiec raz jeszcze szczere dzieki za link.
Ale nie za chamska uwage o wywazaniu drzwi.
Forma "Pan" nie uczynila ja/ grzeczniejsza/.
Wlodek
Moze mamy rozne standardy, ale stwierdzenie "wywazanie otwartych
drzwi" w zadnym wypadku nie jest "chamskie".

Poza tym, rzeczywiscie, uzywanie gotowych pakietow ma sens,
zwlaszcza jak pochodza z solidnego zrodla. A ze sie nie
kompiluja?... Coz, nawet tak prosat rzecz jak kompilacja tzreba
umiec zrobic...

A.L.


======================================= Nota moderatora:

Proszę na tym zakończyć dyskusję nt. uwagi o wyważaniu otwartych drzwi.
(c)RaSz
2005-07-05 17:00:02 UTC
Permalink
"Wlodzimierz Holsztynski" napisał w
Post by Wlodzimierz Holsztynski
Pogram generujacy liczby pierwsze
metoda Eratostenesa (...)
Nie wiem czy jest sens wywazania przez Pana drzwi,
ktore juz ktos kiedys wywazyl.
Polecam (...)
Pozdrawiam
Marcin Orchel
Jako chemik powiem, że aby nie wywoływać kwasów, warto chyba trzymać się zasady,
że jeśli już zabiera się głos w dyskusji, to warto upewnić się czy wiesz... o co
w ogóle chodzi! Zaś szczególnie ważne jest to wtedy, gdy zamierza się komuś
wytknąć jakieś-tam błędy (domniemane, lub zakładane). Zanim do kogoś wygarniesz,
sprawdź dziesięć razy!! No bo - szkoda nerwów z powodu zwykłej nieświadomości
zdarzeń.

Najwyraźniej Apollyonie nie śledziłeś wcześniejszej dyskusji wcale, lub, co
najwyżej - jakoś tak jednym okiem, a i to - chyba tym gorszym. I nie buzuj się
natychmiast na moją tu ironię, bo - zasłużyłeś! Wszak nawet w cytowanym przez
Post by Wlodzimierz Holsztynski
Pogram [ten - będący przedmiotem ataku] jest
jednym z najprostszych ćwiczeń w programowaniu
- czyli: nikt nie twierdził, że zdobywamy tym matematyczny Mount Everest! Ani
choćby i Rysy... Dlatego, zanim wnerwiony znów zaczniesz strzelać z klawiatury,
to wyluzuj, załóż Google, zerknij w archiwum, i zorientuj się, o co w ogóle
biega. Albo też przyjmij na wiarę, że:

celem zaproponowanej zabawy (nazwę ją, hm... challenge ) - jest porównanie
stylów programowania, wymiana pomysłów związanych z pewnymi sztuczkami, zaś w
największym stopniu - zestawienie różnych implementacji, wykonanych w różnych
językach, tudzież programach matematycznych.

W związku z tym, przykłady wybrane jako swoiste etiudy, miały być z samego
założenia: wręcz podręcznikowo proste, znane niemal wszystkim czytelnikom, bez
względu na to, jakimi działami matematyki się zajmują... Jednak, co ważne,
powinny być niebanalne! - i nieść ze sobą jakieś iskrzące elementy. Proste, a
jednak stanowiące sobą jakieś ciekawe wyzwanie. Powszechnie znane, a jednak
ciągle sexy...

W ramach pewnego urozmaicenia właśnie, proponowałem nieco algorytm E-sita
skomplikować, dodając do niego mój pomysł (niestety, opisany jedynie czysto
werbalnie), który określiłem jako "sziftowanie" przeszukiwanej tablicy badanych
liczb... [ Natomiast w samym challenge'u chyba jednak nie wystąpię: jeśli ktoś
czytał "Gambit von Guuma" - to może pamięta co groziło przeciwnikom tytułowego
von Guuma (Gouma?)? ]

- - -

Na koniec: proponuję jednak, aby W. H. uznał, z pewnym przymrużeniem oka, głos
Apollyona za "jakoś-tam konstruktywny". Wszak nie ograniczył się on do napaści,
lecz i podał garść użytecznych linków, więc nie można się zbyt mocno upierać, że
było to czystej wody "kwękanie i narzekactwo"...
--
Pozdrawiam - (c)RaSz
p***@dionizos.zind.ikem.pwr.wroc.pl
2005-07-05 22:40:12 UTC
Permalink
Post by Wlodzimierz Holsztynski
komputer: Mac mini
System operacyjny: OS X 10.3.9
Procesor: 1.25GHz PowerPC G4
Pamiec: 512MB DDR SDRAM
Cache : 512KB
"Bus speed": 167MHz
Dla policzenia liczb pierwszych p \< S
program na opisanej maszynie zuzywa
t sekund, zgodnie z tabelka ponizej,
ktora w 3' & 4' kolumnie podaje liczbe liczb
pierwszych w danym zakresie oraz ostatnia
S t #p ostatnie p
================================
1M 1 78498 999983
4M 6 283146 3999971
16M 25 1031130 15999989
36M 59 2204262 35999993
Przy wczesniejszej okazji zamiast 6s i 59s (patrz
tabelka) program zuzyl odpowiednio 5s i 58s --
bo to zalezy od widzimisie systemu, a raczej
od innych obowiazkow, ktore akurat spelnia.
(Dodam, ze druga wersja policzyla zasieg 64M
w 141s oraz 100M w 223s).
komputer: PC
System operacyjny: Debian Sarge, Linux 2.4.26
Procesor: 1.4GHz Athlon 1600XP
Pamiec: 3*512MB SDR 133MHZ
Cache : 256 KB
"Bus speed": 133MHz

It's boring :(

http://homepages.cwi.nl/~tromp/pearls.html

S t #p ostatnie p
================================
1M 0.00 78498 999983
4M 0.01 283146 3999971
16M 0.32 1031130 15999989
32M 0.85 1973815 31999939
36M 0.94 2204262 35999993
64M 1.89 3785086 63999979
128M 4.07 7271035 127999981
1000M 37.09 50847534 999999937
2000M 76.51 98222287 1999999973 (program zużył 64M RAMu)


Niesamowity, tylko 1-2M RAM (ale wyników nie umiałem wydłubać, bo zapisuje
wszystkie):
http://www.primzahlen.de/files/referent/kw/sieb.htm

1M primes: 78498 time: 0.000 sec
4M primes: 283146 time: 0.000 sec
16M primes: 1031130 time: 0.010 sec
32M primes: 1973815 time: 0.020 sec
36M primes: 2204262 time: 0.020 sec
64M primes: 3785086 time: 0.030 sec
128M primes: 7271035 time: 0.070 sec
1000M primes: 50847534 time: 0.770 sec
2000M primes: 98222287 time: 1.830 sec
8000M primes: 367783654 time: 10.360 sec
16000M primes: 712799821 time: 25.070 sec
32000M primes: 1382799415 time: 60.430 sec
Takamura
2005-07-06 15:38:48 UTC
Permalink
***@dionizos.zind.ikem.pwr.wroc.pl nadesłal nam swoje wyniki
testowania szybkości obliczenia liczb pierwszych przy pomocy programów
dostępnych w sieci.
Post by p***@dionizos.zind.ikem.pwr.wroc.pl
Procesor: 1.4GHz Athlon 1600XP
Pamiec: 3*512MB SDR 133MHZ
.......
Post by p***@dionizos.zind.ikem.pwr.wroc.pl
http://homepages.cwi.nl/~tromp/pearls.html
S t #p ostatnie p
================================
64M 1.89 3785086 63999979
128M 4.07 7271035 127999981
1000M 37.09 50847534 999999937
2000M 76.51 98222287 1999999973 (program zużył 64M RAMu)
Szybki !
.......
Post by p***@dionizos.zind.ikem.pwr.wroc.pl
http://www.primzahlen.de/files/referent/kw/sieb.htm
128M primes: 7271035 time: 0.070 sec
1000M primes: 50847534 time: 0.770 sec
2000M primes: 98222287 time: 1.830 sec
Po spojrzeniu na ta tablicę powiedziałem sobie to niemożliwe. Program
uruchomiłem. To prawda !!. To niesamomowite.
Program oczywiście nie zapisuje tablicy bo brakło by pamięci. Można
wyniki zapisać do pliku.
Na moim komputerze (0.6 GHz) obliczenie z zakresu 100M, liczb pierwszych
zajmuje 0.11 sek a połączone z zapisem do pliku 37.4 sek ( 57 MB ).
Program ma mnóstwo opcji i można obliczać nie tylko liczby pierwsze ale
również bliżniacze itd. Obliczenia te są robione 'w biegu' i stąd są
również bardzo szybkie.
Dostępne są również żródła, więc można je modyfikowąc dla swoich
potrzeb( nie jest to jednak łatwe, gdyż program żródłowy jest duży)

Wielkie brawa należą sie mirkowi (? pisz na Berdyczów <- Witkacy), który
program znalazł i udowodnił, że jest szybki.

Sprawdziłem w Mathematice liczbę liczb pierwszych (pi(N)), dla wartości,
które podał mirek (max 32 10^9) i wszystko się zgadza. Poszedłem dalej.
Autor programu Walish Kim podał wyniki do 7 10^13. I dla tej
największej wartości też się zgadza (obliczenia trwały 311 sek). Jestem
pełen podziwu dla Matematiki. Obliczenie jednak kolejnych liczb
pierwszych dla tak dużych N zajęłoby jednak Matematice .... wieki (
obliczenie jednej liczby pierwszej dla n = 1 10^13 zajmuje jej 10 msek)
--
takamura
Loading...