Basic i zabawa z liczbami pierwszymi

Szukasz drobnej pomocy przy kodowaniu, albo chcesz przedstawić światu swoją gotową lub w trakcie realizacji produkcję? To właściwy dział.
Wiadomość
Autor
oxygenium79
Posty: 12
Rejestracja: sob gru 28, 2019 9:06 pm

Basic i zabawa z liczbami pierwszymi

#1 Post autor: oxygenium79 » śr sty 01, 2020 10:23 pm

Taki temat na dziś. Zainspirowany przygodą z C++:
https://eduinf.waw.pl/inf/utils/010_2010/0209.php
zechciałem napisać w BASIC na C64 programik do generowania liczb pierwszych.
W powyższym artykule autor pokazuje, jak taki programik można fajnie zoptymalizować, i to rzeczywiście działa. W C++.

Natomiast gdy napisałem to w BASIC, to ku mojemu zdziwieniu, ostatnie ulepszenie zamiast jeszcze bardziej przyspieszyć generowanie, to zwolniło. Uwaga: programiki odpalam nie na C64, tylko na emulatorze CCS64 na laptopie, nie wiem czy to może mieć jakieś znaczenie, ale dla porządku podaję.

Najpierw wstawię wersję programu, która powinna działać nieco wolniej, a potem tę, która powinna działać szybciej. Każdy z nich ma za zadanie wygenerować jak najwięcej liczb pierwszych w 10 sekund:

1:

Kod: Zaznacz cały

10 print "p=6k+-1"
20 cz=time/60
30 print 2; 3; 5;
40 l=0
50 l=l+1
60 d=-1
70 p=(6*l)+d
110 for dz=5 to sqr(p)
120 w=p/dz
130 if w=int(w) goto 180
140 next dz
150 print p;
160 sr=time/60
170 if sr-cz >=10 goto 200
180 if d=-1 then d=1 : goto 70
190 goto 50
200 print "minelo 10 sekund" : stop
2:

Kod: Zaznacz cały

10 print "dz=6k+-1"
20 cz=time/60
30 print 2; 3;
40 l=0
50 l=l+1
60 d=-1
70 p=(6*l)+d
80 ldz=0
90 ldz=ldz+1
100 dp=-1
110 dz=(6*ldz)+dp
120 if dz > sqr(p) goto 170
130 w=p/dz
140 if w=int(w) goto 200
150 if dp=-1 then dp=1 : goto 110
160 goto 90
170 print p;
180 sr=time/60
190 if sr-cz >=10 goto 220
200 if d=-1 then d=1 : goto 70
210 goto 50
220 print "minelo 10 sekund" : stop
Ta druga powinna działać szybciej, bo nie sprawdza wszystkich podzielników po kolei, tylko omija te podzielne przez 2 i 3.
Być może coś zrobiłem źle.
A być może zbyt wiele czasu zajmuje generowanie podzielników.
Tyle że w C++ działało pięknie.
Ktoś z Was ma może jakiś pomysł?
Uprzedzając pytanie: sprawdzałem także dla 60 sekund. Nie widzę zysku na szybkości dla większych liczb. Chyba że dla jeszcze większych zacznie być widać...

Awatar użytkownika
Nitro
Posty: 1266
Rejestracja: śr wrz 03, 2008 8:23 pm
Grupa: Black Sun

Re: Basic i zabawa z liczbami pierwszymi

#2 Post autor: Nitro » wt sty 07, 2020 8:53 pm

Proponuje spróbować CC65
https://www.cc65.org/
Ewentualnie jakiegoś kompilowanego BASICa ale tu już nie pomogę. Jest bodajże coś na PC open source.
Finalnie cross compiler ograniczonej wersji C skrojony pod 6502:
https://gitlab.com/camelot/kickc
Z przyjemnością poczytałbym raport z implementacji takowego generatora w trzech powyższych jednocześnie.

823
Posty: 33
Rejestracja: wt lut 07, 2012 5:32 pm

Re: Basic i zabawa z liczbami pierwszymi

#3 Post autor: 823 » śr sty 08, 2020 4:09 am


oxygenium79
Posty: 12
Rejestracja: sob gru 28, 2019 9:06 pm

Re: Basic i zabawa z liczbami pierwszymi

#4 Post autor: oxygenium79 » czw sty 09, 2020 8:48 pm

Dzięki, idę testować, XC-BASiC wygląda obiecująco. Nie wiem czy podołam, ale zaraz się okaże. :-)

oxygenium79
Posty: 12
Rejestracja: sob gru 28, 2019 9:06 pm

Re: Basic i zabawa z liczbami pierwszymi

#5 Post autor: oxygenium79 » czw sty 09, 2020 9:16 pm

No niestety, bardzo szybko poległem, nie umiem tego obsłużyć. :-)
To już chyba wykracza poza moje umiejętności.

823
Posty: 33
Rejestracja: wt lut 07, 2012 5:32 pm

Re: Basic i zabawa z liczbami pierwszymi

#6 Post autor: 823 » pn sty 13, 2020 11:05 pm

https://xc-basic.net/doku.php?id=usage

Autor poleca edytor który ułatwia użytkowanie xcbasic.

Nic nie stoi na przeszkodzie aby używać go wprost z linii komend, przykład również na stronie podlinkowanej powyżej.

ZIP zawiera również binarkę dla Windows więc nie trzeba go kompilować; wystarczy wrzucić ją w PATH czy co tam jest na windows lub skonfigurować swój edytor tak aby wołał odpowiednią sekwencję komend dla build / run / coniebądź.

oxygenium79
Posty: 12
Rejestracja: sob gru 28, 2019 9:06 pm

Re: Basic i zabawa z liczbami pierwszymi

#7 Post autor: oxygenium79 » wt sty 14, 2020 7:40 am

823 pisze:https://xc-basic.net/doku.php?id=usage

Autor poleca edytor który ułatwia użytkowanie xcbasic.

Nic nie stoi na przeszkodzie aby używać go wprost z linii komend, przykład również na stronie podlinkowanej powyżej.

ZIP zawiera również binarkę dla Windows więc nie trzeba go kompilować; wystarczy wrzucić ją w PATH czy co tam jest na windows lub skonfigurować swój edytor tak aby wołał odpowiednią sekwencję komend dla build / run / coniebądź.
To wykracza poza moje umiejętności. :-)
Nie udało mi się nic zrobić w tym edytorze, poza wklejeniem kodu. Potem nie działa nic.

Awatar użytkownika
Nitro
Posty: 1266
Rejestracja: śr wrz 03, 2008 8:23 pm
Grupa: Black Sun

Re: Basic i zabawa z liczbami pierwszymi

#8 Post autor: Nitro » wt sty 14, 2020 6:34 pm

Zerknąłem szybko i ten XC basic ma inną składnie od BASICa V2 - jedynego jak wnioskuje który kolega oxygenium79 zna. I znowu na szybko pytając google tutaj mamy kompilowany commodore basic:
https://www.c64-wiki.com/wiki/MOSpeed
Na dole jest jakiś przykład jak to skonfigurować w GUI. A samych opcji optymalizacyjnych widzę miliard więc jak się uda uruchomić pierwszą wersję to potem to wszystko dodawać.

823
Posty: 33
Rejestracja: wt lut 07, 2012 5:32 pm

Re: Basic i zabawa z liczbami pierwszymi

#9 Post autor: 823 » śr sty 15, 2020 12:48 am

Brakuje mu również wielu funkcji jak choćby obliczana pierwiastków kwadratowych

ODPOWIEDZ