$10$adic連分数展開

$10$adic連分数展開の方法については、 $10$adic連分数展開 を参照してください。

必要な知識

Maxima:リスト、ラムダ式、rreduceの使用法
数学:10進数の基礎的知識+10adicの知識

CFList(n,N)

nの10adic連分数展開を(N-1)個の分数で切ったリストの形で結果を得る関数.

CFList(n,N):=block([list1:[],list2:[],e:0],
    for i thru N do (
        block([count2:0,count5:0],
            if n - mod(n,10)=0 then return(e:1),
            list1:endcons(mod(n,10),list1),
            n: n - mod(n,10),
            while mod(n,2)=0 do (n:n/2,count2:count2+1),
            while mod(n,5)=0 do (n:n/5,count5:count5+1),
            list2:endcons(2^count2*5^count5,list2),
            n:inv_mod(n,10^N)  
        ),
        if(e=1) then return(0)
    ),
    [list1,list2]
)$
CFList(32,5);

実行結果.

[[2,7,7,9,9],[10,20,10,10,10]]

CF(n,N,mode)

nの10adic連分数展開を(N-1)の連分数で切ったときに得られる分数を得る関数。CFList(n,N)を利用する。

mode=0とするとそのままの分数で表示。
modeを0以外の数にすると、mod 10^mode の世界で計算した結果を返す。

CF(n,N,mode):=block([list:[],list2:CFList(n,N),len,r],
    len:length(list2[1]),
    list:makelist([list2[1][i],list2[2][i]],i,1,len-1),
    list:endcons(list2[1][len]+list2[2][len],list),
    r:rreduce(lambda([x,y],x[1]+x[2]/y),list),
    if mode=0 then r else mod(num(r)*inv_mod(denom(r),10^mode),10^mode)
)$
CF(32,5,0);

実行結果.

42208/13819

GetTexCommand(n,N,Max)

nの(N-1)個の連分数展開をMaxで打ち切ったもののTeXコマンドを得る。CFList(n,N)を利用する。

GetTexCommand(n,N,Max):=block([list:[],list2:CFList(n,N)],
    list:makelist([list2[1][i],list2[2][i]],i,1,Max-1),
    list:endcons(printf(false,"~a+~a",list2[1][Max],list2[2][Max]),list),
    rreduce(lambda([x,y],printf(false,"~a+\\cfrac{~a}{~a}",x[1],x[2],y)),list)
)$
GetTexCommand(32,5,5);

実行結果.

2+\cfrac{10}{7+\cfrac{20}{7+\cfrac{10}{9+\cfrac{10}{9+10}}}}

WordなどのTeXコマンドが実行できる環境で実行すると次が表示される。

\[2+\cfrac{10}{7+\cfrac{20}{7+\cfrac{10}{9+\cfrac{10}{9+10}}}}\]