Strona 1 z 1

Basic i zabawa z liczbami pierwszymi

: 01 sty 2020, 22:23
autor: oxygenium79
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ć...

Re: Basic i zabawa z liczbami pierwszymi

: 07 sty 2020, 20:53
autor: Nitro
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.

Re: Basic i zabawa z liczbami pierwszymi

: 08 sty 2020, 04:09
autor: 823

Re: Basic i zabawa z liczbami pierwszymi

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

Re: Basic i zabawa z liczbami pierwszymi

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

Re: Basic i zabawa z liczbami pierwszymi

: 13 sty 2020, 23:05
autor: 823
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ź.

Re: Basic i zabawa z liczbami pierwszymi

: 14 sty 2020, 07:40
autor: oxygenium79
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.

Re: Basic i zabawa z liczbami pierwszymi

: 14 sty 2020, 18:34
autor: Nitro
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ć.

Re: Basic i zabawa z liczbami pierwszymi

: 15 sty 2020, 00:48
autor: 823
Brakuje mu również wielu funkcji jak choćby obliczana pierwiastków kwadratowych