@@ -472,42 +472,57 @@ function add_pow!(
472
472
elseif x isa Number
473
473
return add_constant! (ls, x ^ p, elementbytes, var):: Operation
474
474
end
475
- pint = round (Int, p)
475
+ local pnum:: Int , pden:: Int
476
+ if p isa Integer
477
+ pnum = Int (p):: Int
478
+ pden = 1
479
+ else
480
+ prational = rationalize (p)
481
+ @unpack num, den = prational
482
+ pnum = convert (Int,num):: Int
483
+ pden = convert (Int,den):: Int
484
+ end
485
+ if pden == 1
486
+ nothing
487
+ elseif pden == 2
488
+ if pnum == 1
489
+ return add_compute! (ls, var, :sqrt , [xop], elementbytes)
490
+ else
491
+ xop = add_compute! (ls, gensym! (ls," root" ), :sqrt , [xop], elementbytes)
492
+ end
493
+ elseif pden == 3
494
+ if pnum == 1
495
+ return add_compute! (ls, var, :cbrt , [xop], elementbytes)
496
+ else
497
+ xop = add_compute! (ls, gensym! (ls," cbroot" ), :cbrt , [xop], elementbytes)
498
+ end
499
+ elseif pden == 4
500
+ xop = add_compute! (ls, gensym! (ls," root" ), :sqrt , [xop], elementbytes)
501
+ if pnum == 1
502
+ return add_compute! (ls, var, :sqrt , [xop], elementbytes)
503
+ else
504
+ xop = add_compute! (ls, gensym! (ls," root" ), :sqrt , [xop], elementbytes)
505
+ end
506
+ else
507
+ pop = add_constant! (ls, p, elementbytes)
508
+ return add_compute! (ls, var, :^ , [xop, pop], elementbytes)
509
+ end
510
+ pint = pnum
476
511
if pint == - 1
477
512
return add_compute! (ls, var, :inv , [xop], elementbytes)
478
513
elseif pint < 0
479
514
xop = add_compute! (ls, gensym! (ls, " inverse" ), :inv , [xop], elementbytes)
480
- p = - p
481
- pint = - pint
482
- end
483
- if p == 0.5
484
- return add_compute! (ls, var, :sqrt , [xop], elementbytes)
485
- elseif p == 1 / 3
486
- return add_compute! (ls, var, :cbrt , [xop], elementbytes)
487
- elseif p == 2 / 3
488
- xop = add_compute! (ls, gensym! (ls, " cbrt" ), :cbrt , [xop], elementbytes)
489
- return add_compute! (ls, var, :abs2_fast , [xop], elementbytes)
490
- elseif p == 0.75
491
- xop = add_compute! (ls, gensym! (ls, " root1" ), :sqrt , [xop], elementbytes)
492
- xop = add_compute! (ls, gensym! (ls, " root2" ), :sqrt , [xop], elementbytes)
493
- pint = 3
494
- elseif p == 0.25
495
- xop = add_compute! (ls, gensym! (ls, " root1" ), :sqrt , [xop], elementbytes)
496
- return add_compute! (ls, var, :sqrt , [xop], elementbytes)
497
- elseif p != pint
498
- pop = add_constant! (ls, p, elementbytes)
499
- return add_compute! (ls, var, :^ , [xop, pop], elementbytes)
515
+ pint = - pint
500
516
end
501
517
if pint == 0
502
518
op = Operation (length (operations (ls)), var, elementbytes, LOOPCONSTANT, constant, NODEPENDENCY, Symbol[], NOPARENTS)
503
519
push! (ls. preamble_funcofeltypes, (identifier (op),MULTIPLICATIVE_IN_REDUCTIONS))
504
520
return pushop! (ls, op)
505
- elseif pint == 1
521
+ elseif pint == 1 # requires `pden ≠ 1`.
506
522
return add_compute! (ls, var, :identity , [xop], elementbytes)
507
523
elseif pint == 2
508
524
return add_compute! (ls, var, :abs2_fast , [xop], elementbytes)
509
525
end
510
-
511
526
# Implementation from https://github.com/JuliaLang/julia/blob/a965580ba7fd0e8314001521df254e30d686afbf/base/intfuncs.jl#L216
512
527
t = trailing_zeros (pint) + 1
513
528
pint >>= t
0 commit comments