Sayfalar

14 Aralık 2016

Euler Projesi 207. Soru

Tamsayı bölüntü denklemleri:

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, km 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);
 }
}