obávám se, že co teď napíšu, bude naprostá většina z vás považovat za samozřejmost a vlastně nezajímavou ptákovinu, ale já si prostě nemůžu pomoct. Mě to totiž stále udivuje.
Když jsem kdysi ještě za Husákova socíku ve druhé polovině osmdesátých let nastoupil coby studentík do prváku na VŠ (elektrofakulta), tak jsme mimo jiné měli kurz programování v Pascalu a cvika se odehrávala v terminálové učebně ADT. (tuším, že to zřejmě bylo ADT 4500, ale jistej si tím nejsem)
Vzpomínám si, že jsem tehdy napsal prográmek na generování prvočísel. Vytvořit pole s první tisícovkou prvočísel tomu počítači zabralo snad 15 minut. Je nutné podotknout, že podobnými pitomostmi jako já, to ÁDéTéčko ve stejné chvíli zatěžovalo dalších cca. 10 studentů.
Mám nový ultrabook a tak mě z čiré rozvernosti napadlo zkusit co dokáže procesor, který v něm tiká. Jedná se o Ryzen 7 PRO 7840U. Splichtil jsem teda prográmek na generování prvočísel, viz. přiložený kód....a byl jsem znova udiven jakým pokrokem za těch pár desítek let počítače prošly. Ten nepříliš dobře chlazený ultrabookový procesor s využitím pouze jediného jádra dokáže za minutu vytvořit pole prvních přibližně 26 milionů prvočísel. (jen technická pozn. - Eratostenovo síto samozřejmě znám, ale chtěl jsem zkusit podobný algoritmus jaký jsem kdysi spustil na tom zmíněném ÁDéTéčku.
Je mi jasné, že to dnes asi osloví jen málokoho, ale pro mě je tempo zvyšování rychlosti počítačů stále zdrojem údivu.
PS. Už přibližně 20 let mě psaní programů neživí, tak prosím případnou kritikou šetřete.
- Kód: Vybrat vše
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
int b;
bool neni;
static int prvocisla[30000000];
int pocet = 1;
int max_index = 0;
time_t start_time;
time_t stop_time;
start_time = time(NULL);
prvocisla[0] = 3;
for(int kandidat = 5; kandidat < 500000000; kandidat += 2) {
if (prvocisla[max_index] * prvocisla[max_index] < kandidat) max_index++;
neni = false;
int poradi = 0;
int delitel;
while(poradi <= max_index) {
delitel = prvocisla[poradi];
if (kandidat%delitel == 0) {
neni = true;
break;
}
poradi++;
}
if (!neni) prvocisla[pocet++] = kandidat;
}
stop_time = time(NULL);
double seconds = difftime(stop_time, start_time);
cout << "Hotovo!!! pocet: " << pocet << " trvalo: " << seconds << " posledni tri: " << prvocisla[pocet-3] << ", " << prvocisla[pocet-2] << ", " << prvocisla[pocet-1] << endl;
return 0;
}