Average Error: 7.2 → 0.2
Time: 43.1s
Precision: 64
Internal Precision: 128
\[\left(x.re \cdot x.re - x.im \cdot x.im\right) \cdot x.re - \left(x.re \cdot x.im + x.im \cdot x.re\right) \cdot x.im\]
\[(\left(x.im + x.re\right) \cdot \left(\left(x.re - x.im\right) \cdot x.re\right) + \left(\left(x.re \cdot x.im + x.re \cdot x.im\right) \cdot \left(-x.im\right)\right))_*\]

Error

Bits error versus x.re

Bits error versus x.im

Target

Original7.2
Target0.2
Herbie0.2
\[\left(x.re \cdot x.re\right) \cdot \left(x.re - x.im\right) + \left(x.re \cdot x.im\right) \cdot \left(x.re - 3 \cdot x.im\right)\]

Derivation

  1. Initial program 7.2

    \[\left(x.re \cdot x.re - x.im \cdot x.im\right) \cdot x.re - \left(x.re \cdot x.im + x.im \cdot x.re\right) \cdot x.im\]
  2. Using strategy rm
  3. Applied difference-of-squares7.2

    \[\leadsto \color{blue}{\left(\left(x.re + x.im\right) \cdot \left(x.re - x.im\right)\right)} \cdot x.re - \left(x.re \cdot x.im + x.im \cdot x.re\right) \cdot x.im\]
  4. Applied associate-*l*0.2

    \[\leadsto \color{blue}{\left(x.re + x.im\right) \cdot \left(\left(x.re - x.im\right) \cdot x.re\right)} - \left(x.re \cdot x.im + x.im \cdot x.re\right) \cdot x.im\]
  5. Using strategy rm
  6. Applied fma-neg0.2

    \[\leadsto \color{blue}{(\left(x.re + x.im\right) \cdot \left(\left(x.re - x.im\right) \cdot x.re\right) + \left(-\left(x.re \cdot x.im + x.im \cdot x.re\right) \cdot x.im\right))_*}\]
  7. Final simplification0.2

    \[\leadsto (\left(x.im + x.re\right) \cdot \left(\left(x.re - x.im\right) \cdot x.re\right) + \left(\left(x.re \cdot x.im + x.re \cdot x.im\right) \cdot \left(-x.im\right)\right))_*\]

Reproduce

herbie shell --seed 2019022 +o rules:numerics
(FPCore (x.re x.im)
  :name "math.cube on complex, real part"

  :herbie-target
  (+ (* (* x.re x.re) (- x.re x.im)) (* (* x.re x.im) (- x.re (* 3 x.im))))

  (- (* (- (* x.re x.re) (* x.im x.im)) x.re) (* (+ (* x.re x.im) (* x.im x.re)) x.im)))

Details

Time bar (total: 41.8s)Debug log

sample86.0ms

Algorithm
intervals
Results
71.0ms450×body80valid

simplify274.0ms

Counts
1 → 1
Calls
1 calls:
Slowest
273.0ms
(- (* (- (* x.re x.re) (* x.im x.im)) x.re) (* (+ (* x.re x.im) (* x.im x.re)) x.im))

prune12.0ms

Pruning

2 alts after pruning (2 fresh and 0 done)

Merged error: 9.3b

localize41.0ms

Local error

Found 4 expressions with local error:

9.3b
(* (- (* x.re x.re) (* x.im x.im)) x.re)
0.1b
(* (+ (* x.re x.im) (* x.im x.re)) x.im)
0.1b
(- (* (- (* x.re x.re) (* x.im x.im)) x.re) (* (+ (* x.re x.im) (* x.im x.re)) x.im))
0.0b
(+ (* x.re x.im) (* x.im x.re))

rewrite41.0ms

Algorithm
rewrite-expression-head
Rules
12×associate-*l/
add-log-exp
associate-*l*
add-cube-cbrt
*-un-lft-identity
add-sqr-sqrt
flip--
log1p-expm1-u
flip-+
frac-sub
add-exp-log
add-cbrt-cube
flip3--
flip3-+
pow1
expm1-log1p-u
*-commutative
difference-of-squares
prod-diff
diff-log
fma-neg
fma-def
sub-neg
sum-log
+-commutative
Counts
4 → 65
Calls
4 calls:
Slowest
16.0ms
(- (* (- (* x.re x.re) (* x.im x.im)) x.re) (* (+ (* x.re x.im) (* x.im x.re)) x.im))
9.0ms
(* (- (* x.re x.re) (* x.im x.im)) x.re)
8.0ms
(* (+ (* x.re x.im) (* x.im x.re)) x.im)
7.0ms
(+ (* x.re x.im) (* x.im x.re))

series104.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
30.0ms
(* (- (* x.re x.re) (* x.im x.im)) x.re)
29.0ms
(- (* (- (* x.re x.re) (* x.im x.im)) x.re) (* (+ (* x.re x.im) (* x.im x.re)) x.im))
27.0ms
(* (+ (* x.re x.im) (* x.im x.re)) x.im)
18.0ms
(+ (* x.re x.im) (* x.im x.re))

simplify5.9s

Counts
34 → 77
Calls
34 calls:
Slowest
1.2s
(* (+ (* (* x.re x.re) (* x.re x.re)) (+ (* (* x.im x.im) (* x.im x.im)) (* (* x.re x.re) (* x.im x.im)))) (- (* x.re x.im) (* x.im x.re)))
554.0ms
(* (- (* (* x.re x.re) (* x.re x.re)) (* (* x.im x.im) (* x.im x.im))) x.re)
417.0ms
(fma (- x.im) (+ (* x.re x.im) (* x.im x.re)) (* x.im (+ (* x.re x.im) (* x.im x.re))))
378.0ms
(* (+ (pow (* x.re x.im) 3) (pow (* x.im x.re) 3)) x.im)
338.0ms
(- (* (* (- (* (* x.re x.re) (* x.re x.re)) (* (* x.im x.im) (* x.im x.im))) x.re) (+ (* (* x.re x.im) (* x.re x.im)) (- (* (* x.im x.re) (* x.im x.re)) (* (* x.re x.im) (* x.im x.re))))) (* (+ (* x.re x.re) (* x.im x.im)) (* (+ (pow (* x.re x.im) 3) (pow (* x.im x.re) 3)) x.im)))

prune835.0ms

Pruning

5 alts after pruning (5 fresh and 0 done)

Merged error: 0.1b

localize26.0ms

Local error

Found 4 expressions with local error:

0.1b
(* (+ x.re x.im) (* (- x.re x.im) x.re))
0.1b
(* (+ (* x.re x.im) (* x.im x.re)) x.im)
0.1b
(- (* (+ x.re x.im) (* (- x.re x.im) x.re)) (* (+ (* x.re x.im) (* x.im x.re)) x.im))
0.0b
(* (- x.re x.im) x.re)

rewrite62.0ms

Algorithm
rewrite-expression-head
Rules
44×associate-*l/
18×flip-+
18×flip3-+
16×frac-sub
12×frac-times
11×flip--
11×flip3--
associate-*l*
add-cube-cbrt
*-un-lft-identity
add-sqr-sqrt
add-log-exp
add-exp-log
associate-*r/
add-cbrt-cube
pow1
log1p-expm1-u
expm1-log1p-u
*-commutative
cbrt-unprod
prod-exp
pow-prod-down
prod-diff
associate-*r*
diff-log
fma-neg
sub-neg
Counts
4 → 87
Calls
4 calls:
Slowest
30.0ms
(- (* (+ x.re x.im) (* (- x.re x.im) x.re)) (* (+ (* x.re x.im) (* x.im x.re)) x.im))
15.0ms
(* (+ x.re x.im) (* (- x.re x.im) x.re))
9.0ms
(* (+ (* x.re x.im) (* x.im x.re)) x.im)
5.0ms
(* (- x.re x.im) x.re)

series148.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
45.0ms
(- (* (+ x.re x.im) (* (- x.re x.im) x.re)) (* (+ (* x.re x.im) (* x.im x.re)) x.im))
44.0ms
(* (+ x.re x.im) (* (- x.re x.im) x.re))
29.0ms
(* (+ (* x.re x.im) (* x.im x.re)) x.im)
29.0ms
(* (- x.re x.im) x.re)

simplify18.8s

Counts
73 → 99
Calls
73 calls:
Slowest
1.5s
(* (- x.re x.im) (+ (* (* x.re x.im) (* x.re x.im)) (- (* (* x.im x.re) (* x.im x.re)) (* (* x.re x.im) (* x.im x.re)))))
1.2s
(* (* (- x.re x.im) (+ x.re x.im)) (- (* x.re x.im) (* x.im x.re)))
1.2s
(* (+ x.re x.im) (+ (* (* x.re x.im) (* x.re x.im)) (- (* (* x.im x.re) (* x.im x.re)) (* (* x.re x.im) (* x.im x.re)))))
630.0ms
(* (+ (* x.re x.re) (+ (* x.im x.im) (* x.re x.im))) (- (* x.re x.im) (* x.im x.re)))
586.0ms
(* (+ (pow x.re 3) (pow x.im 3)) (* (- (pow x.re 3) (pow x.im 3)) x.re))

prune958.0ms

Pruning

10 alts after pruning (10 fresh and 0 done)

Merged error: 0b

localize13.0ms

Local error

Found 4 expressions with local error:

0.1b
(fma (+ x.re x.im) (* (- x.re x.im) x.re) (- (* (+ (* x.re x.im) (* x.im x.re)) x.im)))
0.1b
(* (+ (* x.re x.im) (* x.im x.re)) x.im)
0.0b
(* (- x.re x.im) x.re)
0.0b
(+ (* x.re x.im) (* x.im x.re))

rewrite19.0ms

Algorithm
rewrite-expression-head
Rules
add-log-exp
add-cube-cbrt
associate-*l*
*-un-lft-identity
add-sqr-sqrt
log1p-expm1-u
add-exp-log
associate-*l/
add-cbrt-cube
pow1
expm1-log1p-u
flip-+
*-commutative
flip3-+
flip--
fma-udef
flip3--
fma-def
sum-log
+-commutative
Counts
4 → 54
Calls
4 calls:
Slowest
9.0ms
(* (+ (* x.re x.im) (* x.im x.re)) x.im)
5.0ms
(* (- x.re x.im) x.re)
4.0ms
(+ (* x.re x.im) (* x.im x.re))
0.0ms
(fma (+ x.re x.im) (* (- x.re x.im) x.re) (- (* (+ (* x.re x.im) (* x.im x.re)) x.im)))

series140.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
77.0ms
(fma (+ x.re x.im) (* (- x.re x.im) x.re) (- (* (+ (* x.re x.im) (* x.im x.re)) x.im)))
28.0ms
(* (+ (* x.re x.im) (* x.im x.re)) x.im)
23.0ms
(* (- x.re x.im) x.re)
12.0ms
(+ (* x.re x.im) (* x.im x.re))

simplify1.5s

Counts
21 → 66
Calls
21 calls:
Slowest
367.0ms
(* (- (* x.re x.re) (* x.im x.im)) x.re)
362.0ms
(* (+ (pow (* x.re x.im) 3) (pow (* x.im x.re) 3)) x.im)
178.0ms
(* (- (* (* x.re x.im) (* x.re x.im)) (* (* x.im x.re) (* x.im x.re))) x.im)
123.0ms
(- (pow x.re 3) (* 3 (* (pow x.im 2) x.re)))
109.0ms
(- (pow x.re 3) (* 3 (* (pow x.im 2) x.re)))

prune636.0ms

Pruning

8 alts after pruning (7 fresh and 1 done)

Merged error: 0b

localize39.0ms

Local error

Found 4 expressions with local error:

14.3b
(cbrt (+ (* x.re x.im) (* x.im x.re)))
14.3b
(cbrt (+ (* x.re x.im) (* x.im x.re)))
14.3b
(cbrt (+ (* x.re x.im) (* x.im x.re)))
0.5b
(* (cbrt (+ (* x.re x.im) (* x.im x.re))) (cbrt (+ (* x.re x.im) (* x.im x.re))))

rewrite26.0ms

Algorithm
rewrite-expression-head
Rules
18×cbrt-div
15×cbrt-prod
11×add-cube-cbrt
11×*-un-lft-identity
11×add-sqr-sqrt
flip-+
flip3-+
pow1
pow1/3
add-exp-log
associate-*l*
associate-*r*
add-log-exp
log1p-expm1-u
add-cbrt-cube
frac-times
expm1-log1p-u
pow-prod-up
associate-*r/
associate-*l/
pow-prod-down
cbrt-unprod
*-commutative
prod-exp
pow-plus
pow2
Counts
4 → 83
Calls
4 calls:
Slowest
16.0ms
(* (cbrt (+ (* x.re x.im) (* x.im x.re))) (cbrt (+ (* x.re x.im) (* x.im x.re))))
3.0ms
(cbrt (+ (* x.re x.im) (* x.im x.re)))
3.0ms
(cbrt (+ (* x.re x.im) (* x.im x.re)))
3.0ms
(cbrt (+ (* x.re x.im) (* x.im x.re)))

series581.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
163.0ms
(* (cbrt (+ (* x.re x.im) (* x.im x.re))) (cbrt (+ (* x.re x.im) (* x.im x.re))))
154.0ms
(cbrt (+ (* x.re x.im) (* x.im x.re)))
135.0ms
(cbrt (+ (* x.re x.im) (* x.im x.re)))
128.0ms
(cbrt (+ (* x.re x.im) (* x.im x.re)))

simplify8.0s

Counts
59 → 95
Calls
59 calls:
Slowest
1.2s
(cbrt (+ (* (* x.re x.im) (* x.re x.im)) (- (* (* x.im x.re) (* x.im x.re)) (* (* x.re x.im) (* x.im x.re)))))
1.1s
(* (cbrt (+ (* (* x.re x.im) (* x.re x.im)) (- (* (* x.im x.re) (* x.im x.re)) (* (* x.re x.im) (* x.im x.re))))) (cbrt (+ (* (* x.re x.im) (* x.re x.im)) (- (* (* x.im x.re) (* x.im x.re)) (* (* x.re x.im) (* x.im x.re))))))
476.0ms
(* (cbrt (+ (pow (* x.re x.im) 3) (pow (* x.im x.re) 3))) (cbrt (- (* (* x.re x.im) (* x.re x.im)) (* (* x.im x.re) (* x.im x.re)))))
470.0ms
(cbrt (+ (pow (* x.re x.im) 3) (pow (* x.im x.re) 3)))
433.0ms
(cbrt (+ (pow (* x.re x.im) 3) (pow (* x.im x.re) 3)))

prune1.2s

Pruning

8 alts after pruning (6 fresh and 2 done)

Merged error: 0b

regimes116.0ms

Accuracy

0% (0.2b remaining)

Error of 0.2b against oracle of 0.0b and baseline of 0.2b

bsearch5.0ms

end0.0ms

sample2.3s

Algorithm
intervals
Results
2.1s14391×body80valid