Herhangi bir k pozitif tamsayısı için, 4t, 2t ve k pozitif tamsayılar ve t bir reel sayı olmak üzere 4t = 2t + k formunda bir tamsayı bölüntüsü bulunur.Bu formattaki ilk iki bölüntü şu şekildedir: 41 = 21 + 2 ve 41.5849625... = 21.5849625... + 6. t sayısının da tamsayı olduğu bölüntülere ise tam denir.
Herhangi bir m ≥ 1 için, k ≤ m olmak üzer tam bölüntülerin oranı P(m) ile gösterilsin. Örneğin P(6) = 1/2 dir.
Aşağıda bazı P(m) değerleri sıralanıyor:
P(5) = 1/1
P(10) = 1/2
P(15) = 2/3
P(20) = 1/2
P(25) = 1/2
P(30) = 2/5
...
P(180) = 1/4
P(185) = 3/13
P(m) < 1/12345 eşitsizliğini sağlayan en küçük m değerini bulunuz.
Cevap: 44043947822
Mathematica:
al = 0; perf = 0; k = 1; Rlvevel = 1/12345;
For[t = 3, True, t += 2,
k = (t^2 - 1)/4;
al++;
If[IntegerQ[Log[2, (t + 1)/2]], perf++];
If[al ≠ 0 && perf ≠ 0 && perf/al < Rlvevel,
Print[k]; Break[]];
];
C++:
#include "stdlib.h"
#include "stdio.h"
#include "math.h"
#include "string.h"
int main(void)
{
long a = 1, b = 1, j = 2, k = 0, m = 2, o = 4;
for(;;)
{
k++;
if(k == j)
{
a++;
j *= 2;
k = 0;
}
b++;
m += o;
o += 2;
if(12345*a < b) break;
}
printf("%li, %li -> %li\n", a, b, m);
return 0;
}
Maple:
auf207:=proc(N::integer)
local i,t;
t:=time();
i:=floor(fsolve(N*floor(log(x)/log(2))=(x-1),x=2..infinity));
print(i+1,(i+1)^2-(i+1));
print(time()-t);
end proc;
Java:
public class Puzzle207 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
long perfect = 1, total=2;
while (total<=12345*perfect) if (((total&(++total)) == 0)) perfect++;
System.out.println(total*(total+1));
System.out.println(System.currentTimeMillis()-start);
}
}