# 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 templated`1/(-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, is`1/(1/x - 1/(x+1))`

which is after a bit of algebra is`x*(x+1)`

or`x*x + x`

.- When you sub everything into
`rfc`

, it's really`1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))`

which is just`1/((a+b)^2 - (a-b)^2)`

. - After difference of squares, or just plain expansion, you get that
`rfc`

is`1/(4*a*b)`

. - Finally,
`c`

is the reciprocal of 4 times`rfc`

, so`1/(4/(4*a*b))`

becomes`a*b`

.