Multiplizieren Sie mit eingeschränkten Operationen


44

Es gibt eine inoffizielle Belohnung für 500 Wiederholungen, um die aktuell beste Antwort zu schlagen .

Tor

Ihr Ziel ist es, zwei Zahlen mit nur einem sehr begrenzten Satz von Rechenoperationen und Variablenzuweisungen zu multiplizieren.

  1. Zusatz x,y -> x+y
  2. Reziproke x -> 1/x( nicht Division x,y -> x/y)
  3. Negation x -> -x( keine Subtraktion x,y -> x-y, obwohl Sie es als zwei Operationen tun können x + (-y))
  4. Die Konstante 1(keine anderen Konstanten erlaubt, außer wie durch Operationen von erzeugt 1)
  5. Variablenzuordnung [variable] = [expression]

Wertung: Die Werte beginnen in Variablen aund b. Ihr Ziel ist es, das Produkt mit so wenig Operationen wie möglich a*bin der Variablen zu speichern c. Jede Operation und Aufgabe +, -, /, =kostet einen Punkt (entsprechend jede Verwendung von (1), (2), (3) oder (4)). Konstanten 1sind frei. Die Lösung mit den wenigsten Punkten gewinnt. Tiebreak ist der früheste Beitrag.

Erlaubnis: Ihr Ausdruck muss für "zufällige" Reals aund arithmetisch korrekt sein b. Es kann auf einer Teilmenge von R 2 mit dem Maß Null fehlschlagen , dh auf einer Menge, die keine Fläche hat, wenn sie in der a- bkartesischen Ebene geplottet wird . (Dies ist wahrscheinlich erforderlich, da sich Ausdrücke möglicherweise 0wie folgt umkehren 1/a.)

Grammatik:

Dies ist ein . Andere Operationen dürfen nicht verwendet werden. Dies bedeutet insbesondere, dass keine Funktionen, Bedingungen, Schleifen oder nicht numerischen Datentypen vorhanden sind. Hier ist eine Grammatik für die erlaubten Operationen (Möglichkeiten sind durch getrennt |). Ein Programm ist eine Folge von <statement>s, wobei a <statement>wie folgt angegeben ist.

<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

Sie müssen tatsächlich keine Postleitzahl in dieser genauen Grammatik eingeben, solange klar ist, was Sie tun und Ihre Anzahl der Vorgänge richtig ist. Sie können beispielsweise a-bfür a+(-b)zwei Operationen schreiben und diese zählen oder Makros definieren, um sie zu verkürzen.

(Es gab eine frühere Frage Multiplizieren ohne Multiplizieren , aber sie erlaubte eine viel lockerere Reihe von Operationen.)


4
Ist das überhaupt möglich?
Ypnypn

1
@Ypnypn Ja, und ich habe ein Beispiel geschrieben, um sicherzugehen.
1.

2
Dies fühlt sich wie eine Herausforderung an, bei der wahrscheinlich eine optimale Lösung gefunden wird (sobald eine Lösung gefunden wurde). Also, was ist der Krawattenbrecher in diesem Fall?
Martin Ender

1
@ MartinBüttner Tiebreak ist in diesem Fall das früheste Posting. Ich denke, es gibt viel Raum für Optimierungen, also denke ich nicht, dass es nur ein Rennen sein wird, einen zu finden, der funktioniert und ihn sauber zu schreiben. Zumindest habe ich das gefunden, als ich es ausprobiert habe. vielleicht findet jemand eine klar minimale lösung.
1.

2
Ok, da nicht jeder dachte, meine Antwort sei so witzig wie ich, habe ich sie gelöscht und hier kommentiert: Die Regel für die Nullmenge der Kennzahl ist nicht sehr klug gewählt, da rationale Zahlen eine Nullmenge der Lebesgue-Kennzahl sind, würde ich vorschlagen Verwenden Sie stattdessen einen bestimmten Prozentsatz. (Oder eine andere Art) Aber ich mag die Idee dieser Herausforderung total!
Fehler

Antworten:


34

22 Operationen

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

Probieren Sie es online!

Die Operationen bestehen aus 10 Additionen, 7 Inversen, 2 Negationen und 3 Zuweisungen.

Also, wie habe ich das bekommen? Ich begann mit der vielversprechend aussehenden Vorlage aus der Summe von zwei Doppeldecker-Brüchen, ein Motiv, das in vielen früheren Versuchen aufgetaucht war.

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

Wenn wir die Summe auf einschränken x+y+z+w=0, kommt es zu schönen Stornierungen, die Folgendes ergeben:

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

welches ein Produkt enthält. (Es ist oft einfacher zu bekommen, t*u/vals t*uweil der erste Grad 1 hat.)

Es gibt eine symmetrischere Art, über diesen Ausdruck nachzudenken. Mit der Einschränkung x+y+z+w=0werden ihre Werte durch drei Parameter p,q,rihrer paarweisen Summen angegeben.

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

und wir haben c=-q*r/p. Die Summe pwird als Nenner bezeichnet, indem sie den Paaren (x,y)und (z,w)Variablen entspricht, die sich im selben Bruch befinden.

Dies ist ein netter Ausdruck für cin p,q,r, aber der Doppeldecker-Bruch ist in, x,y,z,walso müssen wir den ersteren in Bezug auf den letzteren ausdrücken:

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

Nun wollen wir so wählen p,q,r, dass es c=-q*r/pgleich ist a*b. Eine Wahl ist:

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

Dann werden die verdoppelten Werte für qund rzweckmäßigerweise halbiert in:

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

Speichern 2als Variable tund Einfügen in die Gleichung für cergibt eine 24-op-Lösung.

#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

Es gibt 12 Additionen, 6 Inverse, 4 Negationen und 2 Zuweisungen.

Viele Ops werden x,y,z,win Bezug auf ausgedrückt ausgegeben 1,a,b. So speichern ops, ausdrücken statt xin p,q,r(und damit a,b,1) und schreiben dann y,z,win Bezug auf x.

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

Auswahl

p = 1
q = a
r = b

und cmit einer Verneinung ausdrücken, wie c=-q*r/pwir bekommen

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

Leider ist eine Halbierung xteuer. Dies muss durch Invertieren, Hinzufügen des Ergebnisses zu sich selbst und erneutes Invertieren erfolgen. Wir negieren auch produzieren nxfür -x, da das ist , was den y,z,wEinsatz. Dies gibt uns die 23-op-Lösung:

#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

itxist 1 / (2 * x) und nxist -x. Eine abschließende Optimierung auszudrücken , 1/xwie itx+itxanstelle der Templat 1/(-nx)schneidet einen Charakter und bringt die Lösung auf 22 ops.


Es gibt eine einfache Optimierung für 21 Operationen. itx + itxtritt zweimal auf, itxtritt aber in keinem anderen Kontext auf. Definieren Sie stattdessen ix = (1+1)/(1+a+b)und ersetzen Sie zwei Ergänzungen durch eine.
Peter Taylor

Und durch Extrahieren ist m = -1es möglich, 20 zu erhalten:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
Peter Taylor

3
Ah, beide Optimierungen schlagen fehl, weil die unterstützte Operation eher wechselseitig als geteilt ist.
Peter Taylor

Wenn aund bnur eins sind, dann entweder a + nx = 0oder b + nx = 0, wodurch Ihre Lösung durch Null geteilt wird.
MooseOnTheRocks

1
@MooseOnTheRocks Das ist in Ordnung, sehen Sie die "Zulage" in der Herausforderung, dass der Code für eine Teilmenge von Measure-Null fehlschlagen kann. Ich denke, die Herausforderung ist sonst unmöglich.
17.

26

23 Operationen

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

Beweis durch Explosion:

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

Ich habe Wolfram Alpha missbraucht, um dieses wunderschöne Bild zu bekommen (Wolfram Alpha hat versucht, mich dazu zu bringen, Pro zu abonnieren, um es zu speichern, aber dann Strg-C Strg-V ;-)):

Punktzahl (mit hinzugefügter +Subtraktion):

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

Herzlichen Glückwunsch zur kürzesten Lösung!
Xnor

@xnor danke, dass du mir meine erste akzeptierte Antwort und mein erstes Kopfgeld gegeben hast!
stolzer Haskeller

Nicht wählerisch sein, aber nicht ... (b + 1)) - 1 + 1 ... und ... 1)) - (1 / a + ... sein ... (b + 1 )) + - 1 + 1 ... und ... 1)) + - (1 / a + ...?
tfitzger

@tfitzger Ich denke es ist einfacher so. Die Frage besagt, dass es egal ist. Hinweis Ich zähle die Punktzahl richtig (Jedes Minus ist eine Zwei)
stolzer Haskeller

Wolfram Alpha hat eine kostenlose 7-Tage-Testversion, fyi.
ghosts_in_the_code

13

29 Operationen

Funktioniert nicht für die Menge {(a, b) ∈ R 2 | a + b = 0 oder a + b = -1 oder ab = 0 oder ab = -1}. Das ist wahrscheinlich Null?

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

Die Struktur von rfc(Reciprocal-Four-C) wird deutlicher, wenn wir ein Makro definieren:

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)

Lass uns rechnen:

  • s(x)Mathematisch ist 1/(1/x - 1/(x+1))das , was nach ein bisschen Algebra ist x*(x+1)oder x*x + x.
  • Wenn Sie alles einreichen rfc, ist es wirklich 1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))das, was gerecht ist 1/((a+b)^2 - (a-b)^2).
  • Nach Differenz von Quadraten oder einfach Expansion, erhalten Sie , dass rfcist 1/(4*a*b).
  • Schließlich cist der Kehrwert der 4 - mal rfc, so 1/(4/(4*a*b))wird a*b.

2
+1, ich war mitten in der Fertigstellung dieser identischen Berechnung
Eric Tressler

1
Das ist definitiv das Maß Null. es ist eine Vereinigung von Linien.
Xnor

Ich werde keinen Kommentar zur Vereinigung von Linien abgeben ... @algorithmshark Kannst du uns mehr darüber erzählen, wie du auf diese Identität gekommen bist? Wie haben Sie das Problem angegangen?
Fehler

1
@flawr Ich erinnerte mich, dass die Eigenschaften von s(x)den Anforderungen der Frage aus der Analysis entsprechen, was bedeutete, dass ich eine quadratische Funktion hatte. Nach einigem Hin und Her stellte ich fest, dass ich einen a*bBegriff mit dem Unterschied der Quadrate bekommen konnte. Sobald ich das hatte, ging es darum, herauszufinden, welche Aufgaben Operationen retteten.
Algorithmushai

Könnten Sie einen Charakter nicht herausgolfen, indem Sie ihn einer Variablen zuweisen, da Sie ihn -1dreimal verwenden rfc?
Isaacg

9

27 Operationen

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: =++-

Dahinter steckt keine Theorie. Ich habe gerade versucht, (const1+a*b)/const2mit (1/(1-a)+1/(1+b))und zu beginnen (-1/a+1/b).


Sie tmpsind tatsächlich 23 und erzielen Ihre Punktzahl 27. Ein guter Fund.
Algorithmushai
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.