Macr055で二進化他

次の http://parametron.blogspot.jp/2015/02/christopher-stracheygpm_8.html の記事に移って、二進化他。

二進化

{m55_define|1+|`{1|2|3|4|5|6|7|8|9|10|
  {m55_define|1|$$$1}}'}{m55_dnl}
{m55_define|1-|`{-1|0|1|2|3|4|5|6|7|8|
  {m55_define|-1|$$$1}}'}{m55_dnl}
{m55_define|lt|`{$1|
  {m55_define|$1|`{p|$1|$2|
    {m55_define|p|`{lt|{1-|$1}|$2}'}}'}
    {m55_define|-1|t}
    {m55_define|$2|f}}'}{m55_dnl}
{m55_define|b|`{{lt|$1|2}|
  {m55_define|t|`{$2|
    {m55_define|$2|`{b|$2|0}$1'}
    {m55_define|0|$1}}'}
  {m55_define|f|`{b|{1-|{1-|$1}}|{1+|$2}}'}}'}{m55_dnl}
{b|0|0}, {b|1|0}, {b|2|0}, {b|3|0}, {b|4|0}
{b|5|0}, {b|6|0}, {b|7|0}, {b|8|0}, {b|9|0}

2項係数

(現状の)M55ではローカル定義のマクロでは再帰的に展開できないため(最初の展開が終わった時点でローカル定義が消えてしまうため)bb というマクロはトップレベルで定義している。

{m55_define|1+|`{1|2|3|4|5|6|7|8|9|10|
  {m55_define|1|$$$1}}'}{m55_dnl}
{m55_define|1-|`{-1|0|1|2|3|4|5|6|7|8|
  {m55_define|-1|$$$1}}'}{m55_dnl}
{m55_define|+|`{$1|
  {m55_define|$1|`{1+|{+|{1-|$1}|$2}}'}
  {m55_define|0|$2}}'}{m55_dnl}
{m55_define|b|`{$2|
  {m55_define|$2|`{+|{b|{1-|$1}|$2}|{b|{1-|$1}|{1-|$2}}}'}
  {m55_define|0|1}
  {m55_define|$1|1}}'}{m55_dnl}
{m55_define|binom|`{bb|$1|0}'}{m55_dnl}
{m55_define|bb|`{$2|
  {m55_define|$2|`{b|$1|$2}, {bb|$1|{1+|$2}}'}
  {m55_define|$1|1}}'}{m55_dnl}
#{b|4|0}, {b|4|1}, {b|4|2}, {b|4|3}, {b|4|4}
{binom|0}
{binom|1}
{binom|2}
{binom|3}
{binom|4}
{binom|5}

素数テスト

{m55_define|1+|`{1|2|3|4|5|6|7|8|9|10|
  {m55_define|1|$$$1}}'}{m55_dnl}
{m55_define|1-|`{-1|0|1|2|3|4|5|6|7|8|
  {m55_define|-1|$$$1}}'}{m55_dnl}
{m55_define|-|`{$2|
  {m55_define|$2|`{-|{1-|$1}|{1-|$2}}'}
  {m55_define|0|$1}}'}{m55_dnl}
{m55_define|lt|`{$1|
  {m55_define|$1|`{p|$1|$2|
    {m55_define|p|`{lt|{1-|$1}|$2}'}}'}
  {m55_define|-1|t}
  {m55_define|$2|f}}'}{m55_dnl}
{m55_define|r|`{{lt|$1|$2}|
  {m55_define|t|$1}
  {m55_define|f|`{r|{-|$1|$2}|$2}'}}'}{m55_dnl}
{m55_define|p?|`{p|2|$1}'}{m55_dnl}
{m55_define|p|`{$1|
  {m55_define|$1|`{{r|$2|$1}|
    {m55_define|{r|$2|$1}|`{p|{1+|$1}|$2}'}
    {m55_define|0|f}}'}
  {m55_define|$2|t}}'}{m55_dnl}
{p?|2}
{p?|3}
{p?|4}
{p?|5}
{p?|6}
{p?|7}
{p?|8}
{p?|9}

tarai

途中経過を確認するために、マクロ展開するのではなく出力に直接書き出す特殊マクロ m55_write をM55に追加した。tarai 8 4 0 にするとすぐには待っていられないぐらい時間が掛かるので 6 3 0 としている。

{m55_define|1-|`{-1|0|1|2|3|4|5|6|7|8|
  {m55_define|-1|$$$1}}'}{m55_dnl}
{m55_define|lt|`{$1|
  {m55_define|$1|`{p|$1|$2|
    {m55_define|p|`{lt|{1-|$1}|$2}'}}'}
  {m55_define|-1|t}
  {m55_define|$2|f}}'}{m55_dnl}
{m55_define|tarai|`{m55_write|tarai $1 $2 $3
}{{lt|$2|$1}|
  {m55_define|f|$2}
  {m55_define|t|`{tarai|{tarai|{1-|$1}|$2|$3}|{tarai|{1-|$2}|$3|$1}|{tarai|{1-|$3}|$1|$2}}'}}'}{m55_dnl}
{tarai|6|3|0}

不要な空白類をstripする手段は現状無いため詰め詰めに書いているが、もし対処するとしたら、どういう仕様の特殊マクロが良いだろうか。