Multiply with restricted operations
22 operations
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
Try it online!
The ops are 10 additions, 7 inverses, 2 negations, and 3 assignments.
So, how did I get this? I started with the promising-looking template of the sum of two double-decker fractions, a motif that had appeared in many previous attempts.
c = 1/(1/x + 1/y) + 1/(1/z + 1/w)
When we restrict the sum to x+y+z+w=0
, a beautiful cancellations occur, giving:
c = (x+z)*(y+z)/(x+y)
,
which contains a product. (It's often easier to get t*u/v
rather than t*u
because the first has degree 1.)
There's a more symmetric way to think about this expression. With the restriction x+y+z+w=0
, their values are specified by three parameters p,q,r
of their pairwise sums.
p = x+y
-p = z+w
q = x+z
-q = y+w
r = x+w
-r = y+z
and we have c=-q*r/p
. The sum p
is distinguished as being in the denominator by corresponding to the pairs (x,y)
and (z,w)
of variables that are in the same fraction.
This is a nice expression for c
in p,q,r
, but the double-decker fraction is in x,y,z,w
so we must express the former in terms of the latter:
x = ( p + q + r)/2
y = ( p - q - r)/2
z = (-p + q - r)/2
w = (-p - q + r)/2
Now, we want to choose p,q,r
so that c=-q*r/p
equals a*b
. One choice is:
p = -4
q = 2*a
r = 2*b
Then, the doubled values for q
and r
are conveniently halved in:
x = -2 + a + b
y = -2 - a - b
z = 2 + a - b
w = 2 - a + b
Saving 2
as a variable t
and plugging these into the equation for c
gives a 24-op solution.
#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
There's 12 additions, 6 inverses, 4 negations, and 2 assignments.
A lot of ops are spent expressing x,y,z,w
in terms of 1,a,b
. To save ops, instead express x
in p,q,r
(and thus a,b,1
) and then write y,z,w
in terms of x
.
y = -x + p
z = -x + q
w = -x + r
Choosing
p = 1
q = a
r = b
and expressing c
with a negation as c=-q*r/p
, we get
x = (1+a+b)/2
y = -x + 1
z = -x + a
w = -x + b
Unfortunately, halving in x
is costly. It needs to be done by inverting, adding the result to itself, and inverting again. We also negate to produce nx
for -x
, since that's what y,z,w
use. This gives us the 23-op solution:
#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
is 1/(2*x) and nx
is -x
. A final optimization of expressing 1/x
as itx+itx
instead of the templated1/(-nx)
cuts a character and brings the solution down to 22 ops.
23 operations
z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
res = z+z
proof by 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
I abused wolfram alpha to get this beautiful image (wolfram alpha tried to get me to subscribe to pro to save it, but then ctrl-c ctrl-v ;-)):
score (with added +
on subtraction):
z = ////++/++-+/++++-/+/
res = +
29 operations
Does not work for the set \$\{(a,b) \in \mathbb{R}^2 : a\pm b=0 \text{ or } a\pm b = -1\}\$. That's probably measure zero?
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
The structure of rfc
(Reciprocal-Four-C) is more evident if we define a macro:
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)
Let's do the math:
s(x)
, mathematically, is1/(1/x - 1/(x+1))
which is after a bit of algebra isx*(x+1)
orx*x + x
.- When you sub everything into
rfc
, it's really1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))
which is just1/((a+b)^2 - (a-b)^2)
. - After difference of squares, or just plain expansion, you get that
rfc
is1/(4*a*b)
. - Finally,
c
is the reciprocal of 4 timesrfc
, so1/(4/(4*a*b))
becomesa*b
.