#4337: Better power for Rational ----------------------------------+----------------------------------------- Reporter: daniel.is.fischer | Owner: Type: proposal | Status: new Priority: normal | Component: libraries/base Version: 6.12.3 | Keywords: Rational, power, performance Testcase: | Blockedby: Os: Unknown/Multiple | Blocking: Architecture: Unknown/Multiple | Failure: Runtime performance bug ----------------------------------+----------------------------------------- Proposal: A better implementation of powers for Rational
Discussion period: Three weeks, until 16^th^ October 2010 Exponentiation by repeated squaring, as is used in `(^)` is bad for `Rational` since on each multiplication a `gcd` has to be calculated. For well-formed `Rational`s, the numerator and denominator are known to be coprime, hence all powers of the numerator and denominator are also coprime. To avoid superfluous work, I propose a special power function for `Rational`s and a rewrite rule to replace calls to `(^)` for `Rational` bases by the special function. It might also be beneficial to export the specialised function from Data.Ratio to be used if the rule doesn't fire. Proposed function and rule: {{{ ratPow :: Integral a => Rational -> a -> Rational ratPow _ e | e < 0 = error "Negative exponent" ratPow _ 0 = 1 :% 1 ratPow r 1 = r ratPow (0:%y) _ = 0 :% 1 ratPow (x:%1) e = (x^e) :% 1 ratPow (x:%y) e = (x^e) :% (y^e) {-# RULES "power/Rational" (^) = ratPow #-} }}} Like the elimination of `gcd` from recip (#4336), this would yield a great performance boost. -- Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4337> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler _______________________________________________ Glasgow-haskell-bugs mailing list Glasgow-haskell-bugs@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs