Moram vas razočarati u vezi četvrtog zadatka (gdin. Proizvod i gdin. Suma). Ima 9 rešenja u intervalu [2,..,200]. To su
4, 13;
4, 61;
4, 181;
16, 73;
16,111;
16,163;
32,131;
64, 73;
64,127;
Evo i obrazloženja. Budući da g. Proizvod na početku ne zna koji su to brojevi, to znači da nisu oba prosta.
No, kako je g. Suma već znao da g. Proizvod ne zna koji su to brojevi (a ne zna ni g. Suma), to znači da se zbir tih brojeva ne može predstaviti kao zbir dva prosta broja. Kao što je Nervozna na jednoj od tema koje su se bavile ovim zadatkom primetila, odatle sledi da suma nije parna (ako je nije 2, što je ovde isključeno budući da suma mora biti bar 4), sa obzirom da radimo u dovoljno "maleckom" intervalu gde pomenuta hipoteza važi. Odatle je jedan od zamišljenih brojeva paran a drugi neparan. Njihova suma ne sme naravno biti ni neparan broj oblika 2+p, gde je p neparan prost broj. Znači, proizvod je paran.
E, da bi odavde mogao g. Proizvod da zaključi koji su to brojevi, proizvod mora imati tačno jedno razlaganje p*q za brojeve p,q iz intervala u kome radimo tako da zbir p+q ne bude zbir dva prosta broja. Naravno, tu barem jedan od brojeva p,q mora biti neparan. Budući da je proizvod paran, onda drugi od ta dva broja mora biti paran, pa je suma p+q neparna, odnosno i ne može biti suma dva neparna prosta broja. Stoga je dovoljno proveravati da li je broj p+q-2 složen. Naravno, to treba da bude tačno za jedinstvene p,q iz intervala u kome radimo, tako da im je proizvod jednak proizvodu zamišljenih brojeva (koji zna g. Proizvod).
No, da bi odavde g. Suma mogao da zaključi koji su to brojevi, onda zbir zamišljenih brojeva (koja je saopštena g. Sumi) mora da bude predstavljiva na tačno jedan način kao u+v, gde su u i v iz intervala u kome radimo, tako da proizvod u*v ima jedinstveno razlaganje sa prethodno navedenim osobinama.
Evo programa na jeziku C++
Code:
#include <iostream>
const int maximum = 200;
using namespace std;
int main();
bool slozen(int);
bool razlaganje(int);
int main()
{
int i, j;
for (i=2; i<=maximum; i+=2)
for (j=3; j<=maximum; j+=2)
{
bool nadjen = false;
int k;
if (i==2 && !slozen(j))
continue;
if (!slozen(i+j-2))
continue;
if (!razlaganje(i*j))
continue;
for (k=3; i+j-k>=2; k+=2)
if (razlaganje((i+j-k)*k))
{
nadjen = !nadjen;
if (!nadjen)
break;
}
if (!nadjen)
continue;
cout << i << " , " << j << endl;
}
}
bool slozen(int n)
{
int i;
for (i=2; i<=n/2; i++)
if (n%i == 0)
return true;
return false;
}
bool razlaganje(int n)
{
bool nadjen = false;
int i;
for (i=3; i<=n; i+=2)
if (n%i==0 && slozen(n/i+i-2))
{
nadjen = !nadjen;
if (!nadjen)
break;
}
return nadjen;
}
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.