制限された操作で乗算する


44

現在のベストアンサーに勝つための500人の非公式の賞金があります

ゴール

目標は、非常に限られた算術演算と変数の割り当てのみを使用して2つの数値を乗算することです。

  1. 添加 x,y -> x+y
  2. 逆数x -> 1/x(除算ではないx,y -> x/y
  3. 否定x -> -xない引き算x,y -> x-y、次の2つの操作としてそれを行うことができますがx + (-y)
  4. 定数1(他の定数は許可されません。ただし、からの操作によって生成されるものを除く1
  5. 変数の割り当て [variable] = [expression]

スコアリング:値は変数aおよびで始まりますb。あなたの目標は、できるだけ少ない操作で製品a*bを変数に保存するcことです。各操作と割り当てに+, -, /, =はポイントがかかります((1)、(2)、(3)、または(4)を使用するたびに)。定数1は無料です。最も少ないポイントのソリューションが勝ちます。タイブレークは最も早い投稿です。

手当:あなたの表現は、「ランダムな」実数aとに対して算術的に正確でなければなりませんb。これは、の尺度ゼロサブセットに失敗する可能性があるR 2にプロットされた場合に何の面積を有していない、すなわち集合a- bデカルト平面。(これが原因である可能性があります式の逆数に必要とされる可能性がある0ように1/a。)

文法:

これはです。他の操作は使用できません。特に、これは、関数、条件、ループ、または非数値データ型がないことを意味します。許可される操作の文法は次のとおりです(可能性はで区切られています|)。プログラムは<statement>sのシーケンスであり、a <statement>は次のように与えられます。

<statement>: <variable> = <expr>
<variable>: a | b | c | [string of letters of your choice]
<expr>: <arith_expr> | <variable> | <constant>
<arith_expr>: <addition_expr> | <reciprocal_expr> | <negation_expr> 
<addition_expr>: <expr> + <expr>
<reciprocal_expr>: 1/(<expr>)
<negation_expr>: -<expr>
<constant>: 1

実際に何をしているかが明確で、操作カウントが正しい限り、実際にこの正確な文法でコードを投稿する必要はありません。たとえば、2つの操作として記述a-ba+(-b)てカウントしたり、簡潔にするためにマクロを定義したりできます。

(以前の質問Multiply without Multiplyがありましたが、はるかに緩やかな操作セットが許可されていました。)


4
これも可能ですか?
Ypnypn 14

1
@Ypnypnはい、確認のために例を作成しました。
xnor 14

2
これは、最適な解決策が見つかる可能性が高い場合の課題のように感じられます(解決策が見つかったら)。それで、その場合のタイブレーカーは何ですか?
マーティンエンダー14

1
@MartinBüttnerTiebreakはその場合、最も早い投稿です。最適化の余地は十分にあると思うので、機能するものを見つけて、それをきれいに書くだけのレースになるとは思いません。少なくとも、それは私がそれを試してみて見つけたものです。多分誰かが明らかに最小限の解決策を見つけるでしょう。
xnor 14

2
私の答えが私のように面白いと誰もが思っていなかったので、私はそれを削除してコメントしました:合理的な数字はルベーグのメジャーに関するメジャーゼロセットであるため、メジャーゼロセットに関するルールはあまり賢明に選択されていません、私はお勧めします代わりに特定の割合を使用します。(または別の種類)しかし、私はこの挑戦のアイデアが完全に好きです!
flawr

回答:


34

22の操作

itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(itx + itx + 1/(1+nx)) + 1/(1/(a+nx) + 1/(b+nx)) ) #14

オンラインでお試しください!

opは、10個の加算、7個の逆、2個の否定、3個の割り当てです。

それで、どうやってこれを手に入れたの?私は、多くの以前の試みで登場したモチーフである、2つの2階建て分数の合計の有望なテンプレートから始めました。

c = 1/(1/x + 1/y) + 1/(1/z + 1/w)

合計をに制限するとx+y+z+w=0、次のような美しいキャンセルが発生します。

c = (x+z)*(y+z)/(x+y)

製品が含まれています。(最初の学位は1度であるため、取得するのt*u/vは簡単t*uです。)

この表現について考えるより対称的な方法があります。制限によりx+y+z+w=0、それらの値はp,q,r、ペアごとの合計の3つのパラメーターによって指定されます。

 p = x+y
-p = z+w
 q = x+z
-q = y+w
 r = x+w
-r = y+z

そして、我々は持っていc=-q*r/pます。和は、pペアに対応することにより、分母にあるものとして識別される(x,y)(z,w)同じ画分である変数の。

これはcinの良い表現ですp,q,rが、2階建て分数はinであるx,y,z,wため、前者を後者に関して表現する必要があります。

x = ( p + q + r)/2
y = ( p - q - r)/2
z = (-p + q - r)/2
w = (-p - q + r)/2

ここで、p,q,rc=-q*r/p等しくなるように選択しますa*b。1つの選択肢は次のとおりです。

p = -4
q = 2*a
r = 2*b

次に、との値を2倍にするqr、次のように半分になります。

x = -2 + a + b
y = -2 - a - b
z =  2 + a - b
w =  2 - a + b

2変数として保存し、tこれらを方程式にプラグインするとc、24 opのソリューションが得られます。

#24 ops
t = 1+1   #2
c = 1/(1/(-t+a+b) + 1/-(t+a+b))  +  1/(1/(-b+t+a) + 1/(-a+b+t)) #1, 10, 1, 10

12個の追加、6個の逆、4個の否定、および2個の割り当てがあります。

多くのopは、の表現x,y,z,wで費やされ1,a,bます。opsを保存するには、代わりxp,q,r(およびa,b,1)で表現し、で記述y,z,wxます。

y = -x + p
z = -x + q
w = -x + r

選ぶ

p = 1
q = a
r = b

そして、表現するcように否定してc=-q*r/p、我々が得ます

x = (1+a+b)/2
y = -x + 1
z = -x + a
w = -x + b

残念ながら、半分にするxと費用がかかります。反転し、結果をそれ自体に追加し、再度反転することで実行する必要があります。また、否定生成するnxために-xどのようなことのために、y,z,w使用。これにより、23のソリューションが得られます。

#23 ops
itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(1/(-nx) + 1/(1+nx))  +  1/(1/(a+nx) + 1/(b+nx)) ) #15

itxは1 /(2 * x)であり、nxです-x。テンプレートの代わりに1/xas を表現する最終的な最適化により、キャラクターが削減され、ソリューションが22オペレーションになります。itx+itx1/(-nx)


21の操作を簡単に最適化できます。itx + itx2回itx発生しますが、他のコンテキストでは発生しません。代わりに定義しix = (1+1)/(1+a+b)、2つの追加を1つに置き換えます。
ピーターテイラー

そして、抽出してm = -1、それは20を取得することが可能です:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
ピーター・テイラー

3
ああ、これらの最適化はどちらも失敗します。これは、サポートされる操作が分割ではなく相互的なものだからです。
ピーターテイラー

abが1つしか離れていない場合、a + nx = 0またはのいずれかb + nx = 0で、ソリューションがゼロで除算されます。
MooseOnTheRocks

1
@MooseOnTheRocks大丈夫です。メジャーゼロのサブセットでコードが失敗する可能性があるという課題の「許容範囲」を参照してください。そうでなければ、挑戦は不可能だと思います。
xnor

26

23操作

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
res = z+z

爆発による証拠:

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
             1/(a+1)+1/(b+1)                            == (a+b+2) / (ab+a+b+1)
          1/(1/(a+1)+1/(b+1))                           == (ab+a+b+1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1                         == (ab - 1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1)             == ab / (a+b+2)
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))            == (a+b+2) / ab
                                              1/a+1/b   == (a+b) / ab
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)  == 2 / ab
    1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)) == ab / 2

z = ab / 2 and therefore z+z = ab

私はこの美しい画像を取得するためにwolfram alphaを悪用しました(wolfram alphaはproにサブスクライブさせて保存しようとしましたが、ctrl-c ctrl-v ;-)):

スコア(+減算で追加):

z = ////++/++-+/++++-/+/
res = +

最短のソリューションおめでとうございます!
XNOR

@xnor最初に受け入れられた答えと最初の賞金をくれてありがとう!
誇りに思ってhaskeller 14

気難しいことではありませんが、...(b + 1))-1 + 1 ...および... 1))-(1 / a + ... be ...(b + 1 ))+-1 + 1 ...および... 1))+-(1 / a + ...?
tfitzger

@tfitzgerそのほうが簡単だと思います。質問は、それは問題ではないと言っています。注:私はスコアを正しく数えています(マイナスはすべて2)
誇りに思っていますhaskeller

Wolfram Alphaには7日間の無料トライアルfyiがあります。
ghosts_in_the_code

13

29オペレーション

集合{(a、b)は∈動作しないR 2は | a + b = 0またはa + b = -1またはab = 0またはab = -1}。それはおそらくゼロを測定していますか?

sum = a+b
nb = -b
diff = a+nb
rfc = 1/(1/(1/sum + -1/(sum+1)) + -1/(1/diff + -1/(diff+1)) + nb + nb)  # rfc = 1/4c
c = 1/(rfc + rfc + rfc + rfc)

# sum  is  2: =+
# nb   is  2: =-
# diff is  2: =+
# rfc  is 18: =///+-/++-//+-/+++
# c    is  5: =/+++
# total = 29 operations

rfcマクロを定義すると、(Reciprocal-Four-C)の構造がより明確になります。

s(x) = 1/(1/x + -1/(x+1))              # //+-/+ (no = in count, macros don't exist)
rfc = 1/(s(sum) + - s(diff) + nb + nb) # =/s+-s++ (6+2*s = 18)

数学をやってみましょう:

  • s(x)、数学的には、は1/(1/x - 1/(x+1))代数のビットがであるx*(x+1)かであるx*x + x
  • すべてをサブにするとrfc1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))まさにどちらがまさにになり1/((a+b)^2 - (a-b)^2)ます。
  • 平方の差、または単純な拡大の後、それが得られrfcます1/(4*a*b)
  • 最後に、c4回の逆数なrfcので、に1/(4/(4*a*b))なりa*bます。

2
+1、私はこの同一の計算を
終えようとしていた

1
それは間違いなくゼロを測定します。行の結合です。
XNOR

行の結合についてコメントするつもりはありません... @algorithmsharkこのアイデンティティをどのように思いついたのですか?どのように問題に取り組みましたか?
flawr 14

1
@flawr微積分の特性がs(x)問題の要件に適合することを思い出したので、それは二乗関数を持っていることを意味していました。いくつかのいじくり回した後、私a*bは平方の違いのトリックで用語を得ることができることを発見しました。それができたら、どの割り当てが操作を節約したかを試すだけでした。
algorithmshark 14

-13回使用するのでrfc、変数に割り当ててキャラクターをゴルフアウトできませんでしたか?
isaacg 14

9

27オペレーション

tmp = 1/(1/(1+(-1/(1/(1+(-a))+1/(1+b))))+1/(1/(1/b+(-1/a))+1/(a+(-b))))
res = tmp+tmp+(-1)

# tmp is 23: =//+-//+-+/++///+-/+/+-
# res is 4: =++-

この背後に理論はありません。私は取得しよう(const1+a*b)/const2として始めた(1/(1-a)+1/(1+b))(-1/a+1/b)


あなたtmpは実際に23であり、スコアは27です。
algorithmshark 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.