Mam takoveto zadaní
Slavná Goldbachova hypotéza říká, že každé sudé číslo větší než dva se dá zapsat jako součet dvou (ne nutně různých) prvočísel. Dokázat se nám ji asi nepodaří, ale pojďme si ji aspoň vyzkoušet pro malá čísla.
Na standardním vstupu jsou zadána přirozená čísla (každé na samostatném řádku, ukončena nulou). Vypište pro každé z nich buďto řádek X=A+B, kde X je zadané číslo, a A a B jsou prvočísla se součtem X, nebo, pokud rozklad neexistuje, řádek s textem "Ouch!". Můžete předpokládat, že čísla na vstupu nepřekročí 1000000.
Aby byl výstup vašeho programu jednoznačný, vypište rozklad, v němž je A≤B a A je nejmenší možné.
Poznámka: Jednička není prvočíslo :-)
Příklad: Pro vstup:
4
6
8
11
je správný výsledek:
4=2+2
6=3+3
8=3+5
Ouch!
Neni problem napsat na toto program ja mam problem s casovou slozitosti mohl by mi nekdo poradit jak to napsat co nejefektivnejsi (nejrychlejsi. Dekuji za pomoc
Fórum › Pascal
Goldbach je muj nepritel prosim o pomoc
spam je píča všichni jsou píča
no tak vygeneruj si nejdriv prvocisla do nejakyho limitu pomoci eratosthenova sita
a pak muzes uz kombinovat ... jen je otazkou zda to delat jako kazdy s kazdym z toho vysitovanyho souboru prvocisel nebo brat ty sudy cisla a zkouset je davat dohromady... hadam ale ze kombinovat ty prvocisla bude rychlejsi...
pak asi ideal bude mit jeste pole ... a budes si znacit cisla (na dane pozici v poli jako ze maji soucet...)
neco jako: (prodpoklada se ale ze uz tam budou jen prvocisla... tj index 1)
for i:=1 to 1000 do
for j:=1 to 1000 do begin
sude[ (prvocisla[i]+prvocisla[j]) div 2 ] = 1 ; (* nebudem zbytecne plytvat pameti... liche cisla netreba *)
end;
a nakonec jen projedes vse... jo pocitat s tim ze maximalni index pole bude vlastne posledni prvocislo ktery mas v poli prvocisla...
urcite to usetri hodne 1) nemusis testovat ktery cislo je prvocislo.. mas to rovnou vygenerovany
2) nemusis brat ty sudy cisla a hledat ktery dve prvocisla k nim pasujou...
nevyhoda bude pokud budes chtit treba do 100000000 tak uz to ukousne skoro pul giga ram :)
To KIIV :
já bych to -něco jako- vylepšil možná takhle abychom boostovali...
for i:=1 to 1000 do
for j:=1000 downto i do begin
suma:=prvocisla[i]+prvocisla[j];
for k:=1 to vstupu do If vstup[k]=suma then ... {mame i+j, citadlo++}
If citadlo=vstupu then konec {nebude ouch}
end;
a ta 1000 se da udelat plovouci podle numera na vstupu
Rychlost výpočtů na rychlosti počítače pochopitelně závisí, časomíra se dá udělat tak, aby nezávisela - buď standardními funkcemi Getdate a Gettime (přesnost na setinu vteřiny) nebo vlastními prostředky přes přerušení časovače (např. http://mircosoft.ic.cz/download/CAS.PAS).
Moje stránka.
Používal jsem WinAPI - milisekundy, ne setiny. GetTickCount. A není nemožné ani pohrát si trochu s objektivností měření alespoň podle frekvence CPU - viz QueryPerformanceCounter. Pod DOSem pak assemblerem a čítačem časových značek, to ale nezohledňuje samozřejmě pipeline - architekturu.
K tej Goldbachovej hypoteze ako takej.. myslim ze to uz len takym miernym zamyslenim sa vidiet ze vlastne samotna neplatnost tejto hypotezy je velmi vysoko nepravdepodobna, ked si vezmeme do uvahy ze prvocisla su vylucne neparne ( cesky liche ?? neviem :D ) a v intervale lubovolnych desat cisel ich byva 3-4 myslim a liche + liche = sude takze kombinacia by sa mala najst aj viac krat pri tych vyssich parnych ( sudych )
Ale aj ked je jej neplatnost velmi vysoka, to je asi dovod preco je to len hypoteza, platnost asi nikto nedokazal
Panove muzu vas vyrusit z akademicke diskuze? Prave tenhle priklad taky resim. Vsechno by fungovalo, ale mam problemy s casem. Jestli sem vsechno pochopil, jdou ty kroky po sobe takhle:
1. Eratosthenovo sito pro hodnoty 1 az 1000 000
2. Vytvoril sem si dalsi pole a do nej nacpal 78498 prvocisel (tolik jich je v milionu)
3. vsech nechal psat na sklo pomoci cyklu
while not seekeof do
begin
read(x);
if Sito[X] then writeln('Ouch!') else {tohle je z eratosthenova sita.. proste rve na prvocisla ouch :)}
begin
for i:=1 to 78498 do
begin
for j:=78498 downto i do
begin
Y:=prvo[i]+prvo[j];
if Y=X then begin writeln(X,'=',prvo[i],'+',prvo[j]); break end;
end;
if X=Y then break;
end;
end;
end;
Cyklus se seekeof je tam kvuli tomu, ze to vyhodnocuje aplikace a ja mam za to ze k ukonceni vraci prave eof. Nepomoh by mi to nekdo zrychlit? Aspon nejakej navrh.. diky
Já to udělal takto:
struct {int v,p;}vysl[10];
a=10; // mame jich 10 na vstupu v poli
for (i=0;i<prvocisel;i++)
for (j=prvocisel;j>i;j--)
{suma=(prvo[i]+prvo[j]);
for (b=0;b<a;b++){
if (suma==vstup)
{
vysl[vyslp].p=j;
vysl[vyslp++].v=vstup;
for (k=b;k<a-1;k++)
vstup[k]=vstup[k+1];
a--;
}
if (!a)
goto ven;
}
}
ven:
To o-lox : Zdá se mi to nebo se dneska zbláznilo uplně všechno....
A omlouvám se za jazyk C.
EDIT: delší dobu (ta necelá sekunda) mi trvá vytvoření prvočísel skrz erathostenovo síto, a pak využívám toho že hledám součet skrz pole pro všechny vstupy naráz.
To o-lox : To C je v pohode.. sice moc nepobiram co je to v tom slozenym vyrazu (C uz sem nevidel dva roky :D), ale prived si me na myslenku s tim kombinovanim dvou prvocisel.. asi tozbytecne projizdim na dvakrat.. to by mozna mohlo pomoc.. :)
To Mishak07 : Nejrychlejc sestavený síto najdeš v pascalu na Wikipedii, jinak beru ze vstupu do pole všechny čísla co mám a v tom složenym bloku je jen to, že když jedno z těch čísel v poli ze vstupu je nalezeno, tak aby při dalšim hledání nezdržovalo, je odstraněno ze seznamu. Samozřejmě po tom co je "vyfotografovaný v souvislostech". Možná to jde ještě nějak vylepšit...
Ke Goldbachvě hypotéze (dále GH)::
Uvedu tří další hypotézy.
Z platnosti těchto tří hypotéz
by vyplynula platnost GH.
1. Pokud sudé číslo splňuje GH,
pak buďto sudé číslo předchozí
nebo sudé číslo následující
nebo obě tato čísla také splňují GH.
Jinými slovy,
Pokud sudé číslo spňuje GH,
pak v jeho rozkladech do dvojic prvočísel
bude aspoň jedno (nebo více) prvočíslo
s vlastností, že číslo o dvě menší nebo
o dvě větší je opět prvočíslem.
2.Mějme sudé číslo splňující GH.
Nechť z jeho rozkladů do součtu prvočísel
není zaručeno, že následující sudé číslo
bude opět splňovat GH.ˇ(dále jen "nezaručuje dpředu")
(Žádné prvočíslo v jeho rozkladech
nemá tu vlastnost, že číslo o dvě větší je opět prvočíslem.
Je zajímavé, že nejmenší takové sudé číslo je 122.)
Pak další sudé číslo splňující GH
(ne nutně následující sudé číslo
může tam být mezera)
nezaručuje, že předchozí sudé číslo
bude spňovat GH (dále jen "nezaručuje zpět").
Jinými slovy, pokud sudé číslo spňující GH nezaručuje dopředu,
pak další sudé číslo spňující GH nezaručuje zpět.
3.Žádná mezera mezi "nezaručuje dopředu" a "nezaručuje zpět" není.
Jestliže někdo tzv. nabourá některou z těchto hypotéz, budu rád.
Mně se to zatím nepodařilo.
Nevytahujte tyhlety staré vlákna... po devíti mesících je to už trošku moc
To sputnikone : Myslím, že nalezení důkazu pro Goldbachovu hypotézu
je i po devíti měsících stále aktuální.
To Anonymní uživatel : http://bart.math.muni.cz/~fuchs/Efuchs/historie_pdf/10gold.pdf
Důkaz platnosti GH nemusí existovat.
Přesto nejspíš platí.
Nějaké vysvětlení proč by měla platit
existovat musí.
K 1. hypotéze:
Je možné, že existuje konečná množina
prvočísel složená z prvočíselných dvojčat
taková, že každý z rozkladů sudých čísel
do prvočíselných dvojic obsahuje aspoň jedno
prvočíslo z této množiny,
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Pomoc.... nějaká chybka prosím pomoc - více v podrobném popisu — založil tkstudent
Prosím pomoc — založil Michal
Prosím pomoc — založil Matej
Prosim o pomoc — založil bbeni
Prosím pomoc! — založil Tomok
Moderátoři diskuze