図:EMLから導かれる初等関数(原論文から引用)
すべての論理回路は,単一のNANDゲートだけから構成することができる。
・NOT A = A NAND A
・A AND B = NOT ( A NAND B ) = ( A NAND B ) NAND ( A NAND B )
・A OR B = ( NOT A ) NAND ( NOT B ) = ( A NAND A ) NAND ( B NAND B )
ポーランドのOdrzywołekによって,この連続版が発見された。すなわち,一つの関数EMLによって,すべての初等関数が表現できるというのだ。その関数EMLというのは,
EML(x, y) = e^x - ln y
である。これに加えて,定数の 1 が利用できるものとする。
そこで,Mathematicaで確認してみた。適当に中間部品となる関数を定義して,見やすくしている。
In[1]:= eml[x_, y_] := Exp[x] - Log[y]
In[2]:= eml[x, 1]
Out[2]= E^x
In[3]:= ln[x_] := eml[1, eml[eml[1, x], 1]]
In[4]:= ng[x_] := eml[eml[1, eml[eml[1, eml[1, eml[x, 1]]], 1]], eml[eml[1, 1], 1]]
In[5]:= inv[x_] := eml[eml[eml[1, eml[eml[1, eml[1, x]], 1]], eml[eml[1, 1], 1]], 1]
In[6]:= mul[x_, y_] := eml[eml[1, eml[eml[eml[1, eml[eml[1, eml[1, x]], 1]], y], 1]], 1]
In[7]:= add[x_, y_] := ln[mul[eml[x, 1], eml[y, 1]]]
In[8]:= sub[x_, y_] := add[x, ng[y]]
In[9]:= div[x_, y_] := mul[x, inv[y]]
In[10]:= ng[1]
Out[10]= -1
In[11]:= add[1, 1]
Out[11]= 2
In[12]:= hlf = inv[add[1, 1]]
Out[12]= 1/2
In[13]:= img = ng[eml[mul[hlf, ln[ng[1]]], 1]]
Out[13]= -6.12323*10^-17 + 1. I
In[14]:= him = inv[mul[add[1, 1], img]]
Out[14]= -8.04061*10^-17 - 0.5 I
In[15]:= pai = mul[img, ln[ng[1]]]
Out[15]= E^(Log[-E^E^(-Log[2] + Log[-I \[Pi]])] + Log[-I \[Pi]])
= 3.14159 - 1.39515*10^-15 I
In[16]:= sqr[x_] := eml[mul[hlf, ln[x]], 1]
In[17]:= cs[x_] := mul[hlf, add[eml[mul[img, x], 1], eml[ng[mul[img, x]], 1]]]
In[18]:= sn[x_] := mul[him, sub[eml[mul[img, x], 1], eml[ng[mul[img, x]], 1]]]
Log[-1]の主値の取り方で論文とMathematicaの出力は符号が異ってしまうが,そこさえ調整すればよい。
0 件のコメント:
コメントを投稿