このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1286978599/508
#  [1] 授業単元:数値計算 
#  [2] 問題文(含コード&リンク):窓移動法 
#  j=|k|kbitの整数。 
#  while j>=0 do 
#  if k[j]=0 then q=2*q j=j-1 
#  else do 
#  tをj-t+1<=5とk[t]=1である最少の整数とする。 
#  h[j]=(k[j]k[j-1]..k[t])_2 
#  q=(2^(j-t+1))*q+p 
#  j=t-1 
#  
# [5] その他の制限: 多倍長演算ライブラリ使用
#  巨大整数から奇数整数ビット列を抜き出すプログラムです

窓移動法(_多倍長整数,_窓のビット長,_抜き出されたビット列) :-
        二進数(_多倍長整数,_二進数ビットならび),
        length(L,_窓のビット長),
        findmin(L,(
                    append(_,L,_,_二進数ビットならび)),
                _抜き出されたビット列).

二進数(_十進数値,_二進数値ならび) :-
       二進数値の逆順ならび(_十進数値,_二進数値の逆順ならび),
       reverse(_二進数値の逆順ならび,_二進数値ならび).

二進数値の逆順ならび(0,[]) :- !.
二進数値の逆順ならび(N,[M|R]) :-
        M is N mod 2,
        N1 is N // 2,
        二進数値の逆順ならび(N1,R).