diff --git a/Math/Number/Complex.php b/Math/Number/Complex.php index 6de4dea8e..7cc19c2e3 100644 --- a/Math/Number/Complex.php +++ b/Math/Number/Complex.php @@ -148,7 +148,9 @@ class Complex public function pow($value) : Complex { - if (is_numeric($value)) { + if (is_int($value)) { + return $this->powInteger($value); + } elseif (is_numeric($value)) { return $this->powScalar($value); } elseif ($value instanceof Complex) { return $this->powComplex($value); @@ -162,6 +164,28 @@ class Complex } + /** + * Power with integer + * + * @param int $value Power + * + * @return Complex + * + * @since 1.0.0 + */ + public function powInteger(int $value) : Complex + { + if ($value === 0) { + return new self(1, 0); + } elseif ($value === 1) { + return $this; + } + + for ($i = $value; $i > 0; --$i) { + return $this->multComplex($this->powInteger($i)); + } + } + public function powScalar() : Complex { diff --git a/tests/Math/Number/ComplexTest.php b/tests/Math/Number/ComplexTest.php index 75b02123f..d26aa6c95 100644 --- a/tests/Math/Number/ComplexTest.php +++ b/tests/Math/Number/ComplexTest.php @@ -58,6 +58,9 @@ class ComplexTest extends \PHPUnit\Framework\TestCase self::assertEquals('0.16 - 0.12i', $cpl->reciprocal()->render(2)); self::assertEquals('7.00 + 24.00i', $cpl->square()->render()); + self::assertEquals('7.00 + 24.00i', $cpl->pow(2)->render()); + self::assertEquals('-44.00 - 117.00i', $cpl->pow(3)->render()); + self::assertEquals(5, $cpl->abs(), '', 0.01); self::assertEquals('2.12 + 0.71i', $cpl->sqrt()->render());