/** * Create a matrix representation of a complex number * For z = a+bi * Returns [[a, -b] * [b, a]] * * @param \Chippyash\Type\Number\Complex\ComplexType $c * @return \Chippyash\Math\Matrix\RationalMatrix */ public static function createFromComplex(ComplexType $c) { $a = clone $c->r(); $b = clone $c->i(); $b2 = clone $c->i(); $bi = new RationalType($b2->numerator()->negate(), $b->denominator()); return self::createRational([[$a, $bi], [$b, $a]]); }
public function testPolarStringForNonZeroComplexReturnsNonZeroString() { $c = new ComplexType($this->createRationalType(1), $this->createRationalType(0)); $this->assertEquals('cos 0 + i⋅sin 0', $c->polarString()); $c = new ComplexType($this->createRationalType(5), $this->createRationalType(0)); $this->assertEquals('5(cos 0 + i⋅sin 0)', $c->polarString()); $c = new ComplexType($this->createRationalType(5), $this->createRationalType(2)); $this->assertEquals('5.385165(cos 0.380506 + i⋅sin 0.380506)', $c->polarString()); }
/** * Create complex power from natural base and complex exponent * * @param int|float $base base * @param ComplexType $exp exponent * * @return NI|ComplexType */ private function complexExponent($base, ComplexType $exp) { if ($exp->isReal()) { return $this->rationalPow(RationalTypeFactory::fromFloat($base), $exp->r()); } //do the imaginary part //n^bi = cos(b.lg(n)) + i.sin(b.lg(n)) $b = $exp->i()->get(); $n = log($base); $r = cos($b * $n); $i = sin($b * $n); //no real part if ($exp->r()->get() == 0) { return new ComplexType(RationalTypeFactory::fromFloat($r), RationalTypeFactory::fromFloat($i)); } //real and imaginary part //n^a+bi = n^a(cos(b.lg(n)) + i.sin(b.lg(n))) $na = pow($base, $exp->r()->get()); $rr = $na * $r; $ii = $na * $i; return new ComplexType(RationalTypeFactory::fromFloat($rr), RationalTypeFactory::fromFloat($ii)); }
/** * Compare complex numbers. * If both operands are real then compare the real parts * else compare the modulii of the two numbers * * @param ComplexType $a * @param ComplexType $b * * @return boolean */ protected function complexCompare(ComplexType $a, ComplexType $b) { if ($a->isReal() && $b->isReal()) { return $this->rationalCompare($a->r(), $b->r()); } //hack to get around native php integer limitations //what we should be doing here is to return $this->rationalCompare($a->modulus(), $b->modulus()) //but this blows up because of the big rationals it produces $am = $a->modulus()->asFloatType()->get(); $bm = $b->modulus()->asFloatType()->get(); if ($am == $bm) { return 0; } if ($am < $bm) { return -1; } return 1; }