2014年3月23日日曜日

プロジェクトオイラー Problem 73 「ある範囲内の分数の数え上げ」 †

ndを正の整数として, 分数 n/d を考えよう. n<d かつ HCF(n,d)=1 のとき, 真既約分数と呼ぶ.
d ≤ 8 について既約分数を大きさ順に並べると, 以下を得る:
1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/82/53/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8
1/3と1/2の間には3つの分数が存在することが分かる.
では, d ≤ 12,000 について真既約分数をソートした集合では, 1/3 と 1/2 の間に何個の分数があるか?

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2073




解法
ファレイ数列を元に高速化できないかいろいろ数式変形を考えてみましたが。
纏めて計算しようとしてもΣ計算が複雑につみあがるばかりでどう考えたらいいのわからず。
結局全探索。


search(L,R):-
      L+R>12000,
      !,
      fail.
search(_,_).

search(L,R):-
      L1 is L+R,
      search(L1,R).
search(L,R):-
      !,
      R1 is L+R,
      search(L,R1).
start(1):-
      search(3,2).
main73:-
      findall(E,start(E),List),
      length(List,Ans),
      write(Ans).

0 件のコメント:

コメントを投稿