debianで円周率

■clispでは結局120桁までだったので、
 「superpi」以外に何か無いかと。。。

■「apt-cache search」は日本語検索も出来る。
 見つかったのでインストール。

$ apt-cache search "円周率"
pi - アルキメデスの定理である円周率を任意の精度で計算
$ sudo apt-get install pi

■実行(終わるの早っw)

$ for num in 10 100 1000 10000 100000 1000000;do \
     time (pi $num > pi${num}.log); \
   done
real    0m0.006s
user    0m0.004s
sys     0m0.008s

real    0m0.006s
user    0m0.004s
sys     0m0.008s

real    0m0.007s
user    0m0.000s
sys     0m0.012s

real    0m0.020s
user    0m0.020s
sys     0m0.004s

real    0m0.205s
user    0m0.200s
sys     0m0.008s

real    0m2.934s
user    0m2.888s
sys     0m0.044s

■以下のようになる

$ wc -c pi100*
    102 pi100.log
   1002 pi1000.log
  10002 pi10000.log
 100002 pi100000.log
1000002 pi1000000.log
1111110 合計

■10桁ごとに変換

$ for list in pi*.log;do \
    TXT=$(echo $list | sed s/"\.log"/"\.txt"/); \
    tail -1 $list  | awk -F\. '{print $2}' | sed s/"."/"&\n"/g | \
    awk '{if (NR % 10 == 0) print $1 ":"; else print $1}' | \
    xargs echo -n | \
    sed s/" "//g | sed s/":"/"\n"/g > $TXT; \
  done

$ wc -l *.txt
 100000 check.txt
     10 pi100.txt
    100 pi1000.txt
   1000 pi10000.txt
  10000 pi100000.txt
 100000 pi1000000.txt
 211110 合計

$ for list in pi*.txt; do \
     CHECKLOG=$(echo $list | sed s/"\.txt"/"\.check"/); \
     LINE=$(wc -l $list | awk '{print $1}'); \
     head -n $LINE check.txt > $CHECKLOG; \
   done

$ wc -l *.check
     10 pi100.check
    100 pi1000.check
   1000 pi10000.check
  10000 pi100000.check
 100000 pi1000000.check
 111110 合計

$ for list in pi*.txt; do \
    echo -n "$list : ";\
    CHECKLOG=$(echo $list | sed s/"\.txt"/"\.check"/); \
    diff -y -W 80 $list $CHECKLOG | \
    nl | grep "|" | head -1; \
  done
pi100.txt :     10      342117067                             | 3421170679
pi1000.txt :    100     216420198                             | 2164201989
pi10000.txt :   1000    525637567                             | 5256375678
pi100000.txt :  10000   549362464                             | 5493624646
pi1000000.txt : 100000  577945815                             | 5779458151

■ということは100万はこうか。

$ time (pi 1000001 >  pi.log)

real    0m2.945s
user    0m2.864s
sys     0m0.084s

■1回だけだけど、上のループを使いまわし。

$ for list in pi.log;do \
    TXT=$(echo $list | sed s/"\.log"/"\.txt"/); \
    tail -1 $list  | awk -F\. '{print $2}' | sed s/"."/"&\n"/g | \
    awk '{if (NR % 10 == 0) print $1 ":"; else print $1}' | \
    xargs echo -n | \
    sed s/" "//g | sed s/":"/"\n"/g > $TXT; \
  done

$ for list in pi.txt; do \
   echo -n "$list : "; \
   CHECKLOG=$(echo $list | sed s/"\.txt"/"\.check"/); \
   diff -y -W 80 $list $CHECKLOG | nl | grep "|" | head -1; \
 done100万までOKになった。(あっさりと。。。)

$ diff -y -W 80 --left-column pi.txt pi.check | head -1
1415926535                            (

$ diff -y -W 80 --left-column pi.txt pi.check | wc -l | awk '{print 10*$1}'
1000000