このディレクトリの索引

# 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/170 # お題:分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。 # m=3 -> 1/3,1/2,2/3 # m=5 -> 1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5 # # '分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。'(_m,_整列した分数ならび) :- findall(_分子 rdiv _分母,分母ごとの既約分数(_m,_分母,_分子),_分数ならび), sort(_分数ならび,_整列した分数ならび). 分母ごとの既約分数(_m,_分母,_分子) :- between(2,_m,_分母), 分子候補を篩に掛ける(2,_分母,_篩に掛けられた分子ならび), member(_分子,_篩に掛けられた分子ならび). 分子候補を篩に掛ける(M,_分母,_篩に掛けられた分子ならび) :- 分子候補を生成(_分母,_数ならび), 分子候補を篩に掛ける(M,_分母,_数ならび,_篩に掛けられた分子ならび). 分子候補を生成(_分母,_数ならび) :- succ(_分母_1,_分母), findall(N,between(1,_分母_1,N),_数ならび). 分子候補を篩に掛ける(_分母,_分母,_篩に掛けられた分子ならび,_篩に掛けられた分子ならび) :- !. 分子候補を篩に掛ける(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび). 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2), succ(M,M_2), 分子候補を篩に掛ける(M_2,_分母,_数ならび_2,_篩に掛けられた分子ならび). 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2) :- findall(_分子候補,分子候補(M,_分母,_数ならび_1,_分子候補),_数ならび_2). 分子候補(M,_分母,_数ならび_1,_分子候補) :- member(_分子候補,_数ならび_1), 約分できない(M,_分母,_分子候補). 約分できない(M,_分母,_分子候補) :- \+(約分できる(M,_分母,_分子候補)). 約分できる(M,_分母,_分子候補) :- 0 is _分母 mod M, 0 is _分子候補 mod M.