# Power function

(Difference between revisions)
 Revision as of 16:24, 26 February 2008 (edit)← Previous diff Current revision (15:28, 15 August 2009) (edit) (undo) (2 intermediate revisions not shown.) Line 7: Line 7: The reason is that there is no definition for the power function which covers all exotic choices for basis and exponent. The reason is that there is no definition for the power function which covers all exotic choices for basis and exponent. - It is even sensible to refine the set of power functions as it is done in the [http://darcs.haskell.org/numericprelude/ NumericPrelude] project. + It is even sensible to refine the set of power functions as it is done in the [[Numeric Prelude]] project. In mathematical notation we don't respect types and we do not distinguish between powers of different types. In mathematical notation we don't respect types and we do not distinguish between powers of different types. However if we assume the most general types for both basis and exponent, the result of the power is no longer unique. However if we assume the most general types for both basis and exponent, the result of the power is no longer unique. Line 21: Line 21: But also for real numbers there are problems: But also for real numbers there are problems: - For computing (-1)**(1/3::Double) the power implementation has to decide whether + For computing (-1)**(1/3::Double) the power implementation would have to decide whether (1/3::Double) is close enough to $\frac{1}{3}$. (1/3::Double) is close enough to $\frac{1}{3}$. If it does so it returns (-1), otherwise it fails. If it does so it returns (-1), otherwise it fails. Line 27: Line 27: It may be really meant as 333333333333333/10^15, It may be really meant as 333333333333333/10^15, and a real $10^{15}$th root of $-1$ does not exist. and a real $10^{15}$th root of $-1$ does not exist. + Fortunately, the Haskell implementation does not try to be too clever here. + But it does so at another point: + + Prelude> (-1)**2 :: Double + 1.0 + Prelude> (-1)**(2 + 1e-15 - 1e-15) :: Double + NaN + + Of course, both expressions should be evaluated to 1.0, + but a reliable check for integers is not possible with floating point numbers. So I propose some balancing: The more general the basis the less general the exponent and vice versa. So I propose some balancing: The more general the basis the less general the exponent and vice versa. Line 40: Line 50: | an algebraic field || root || ^/ || rational || list of polynomial zeros (length = denominator of the exponent) || $a^{\frac{p}{q}} = \{ x : a^p = x^q \}$ | an algebraic field || root || ^/ || rational || list of polynomial zeros (length = denominator of the exponent) || $a^{\frac{p}{q}} = \{ x : a^p = x^q \}$ |- |- - | positive real || log || ^? || any ring of characteristic zero with inverses for integers and a notion of limit || exponential series and logarithm || $a^b = \exp(b \log a) = \sum_{k \geq 0} \frac{(b \log a)^k}{k!} = \sum_{k \geq 0} \frac{\left(- b \sum_{j \geq 1} \frac{(1-a)^j}{j}\right)^k}{k!}$ + | positive real || log || ^? || any ring of characteristic zero with inverses for integers and a notion of limit || exponential series and logarithm || $a^b = \exp(b \log a) = \sum_{k \geq 0} \frac{(b \log a)^k}{k!}$ |} |}

## 1 Question

Why are there several notions of power in Haskell, namely
(^)
,
(^^)
,
(**)
?

The reason is that there is no definition for the power function which covers all exotic choices for basis and exponent. It is even sensible to refine the set of power functions as it is done in the Numeric Prelude project. In mathematical notation we don't respect types and we do not distinguish between powers of different types. However if we assume the most general types for both basis and exponent, the result of the power is no longer unique. Actually all possible solutions of say 1x, where x is irrational is dense in the complex unit circle. In the past I needed the power of two complex numbers only once, namely for the Cauchy wavelet (see also: [1]):

$f(t) = (1- i\cdot k\cdot t) ^ {-\frac{1}{2} + \frac{\mu_2}{k} + i\cdot \mu_1 }$

However, I could not use the built-in complex power function because the resulting function became discontinuous. Of course, powers of complex numbers have the problem of branch cuts and the choice of the branch built into the implementation of the complex power is quite arbitrary and might be inappropriate.

But also for real numbers there are problems:

For computing
(-1)**(1/3::Double)
the power implementation would have to decide whether
(1/3::Double)
is close enough to $\frac{1}{3}$. If it does so it returns
(-1)
, otherwise it fails. However, why shall
0.333333333333333
represent $\frac{1}{3}$? It may be really meant as
333333333333333/10^15
,

and a real 1015th root of − 1 does not exist. Fortunately, the Haskell implementation does not try to be too clever here. But it does so at another point:

Prelude> (-1)**2 :: Double
1.0
Prelude> (-1)**(2 + 1e-15 - 1e-15) :: Double
NaN
Of course, both expressions should be evaluated to
1.0
,

but a reliable check for integers is not possible with floating point numbers.

So I propose some balancing: The more general the basis the less general the exponent and vice versa. I also think the following symbols are more systematic and intuitive. They are used in NumericPrelude.

 basis type provides symbol exponent type definition any ring * ^ cardinal repeated multiplication $a^b = \prod_{i=1}^b a$ any field / ^- integer multiplication and division $a^b = \begin{cases} a^b & b\ge 0 \\ \frac{1}{a^{-b}} & b<0 \end{cases}$ an algebraic field root ^/ rational list of polynomial zeros (length = denominator of the exponent) $a^{\frac{p}{q}} = \{ x : a^p = x^q \}$ positive real log ^? any ring of characteristic zero with inverses for integers and a notion of limit exponential series and logarithm $a^b = \exp(b \log a) = \sum_{k \geq 0} \frac{(b \log a)^k}{k!}$
• examples for rings are: Polynomials, Matrices, Residue classes
• examples for fields: Fractions of polynomials (rational functions), Residue classes with respect to irreducible divisors, in fact we do not need fields, we only need the division and associativity, thus invertible Matrices are fine

That is
(^-)
replaces
(^^)
,
(^?)
replaces
(**)
,
(^)
remains and
(^/)
is new.