divideinto.php 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. <?php
  2. /**
  3. *
  4. * Function code for the complex division operation
  5. *
  6. * @copyright Copyright (c) 2013-2018 Mark Baker (https://github.com/MarkBaker/PHPComplex)
  7. * @license https://opensource.org/licenses/MIT MIT
  8. */
  9. namespace Complex;
  10. /**
  11. * Divides two or more complex numbers
  12. *
  13. * @param array of string|integer|float|Complex $complexValues The numbers to divide
  14. * @return Complex
  15. */
  16. function divideinto(...$complexValues)
  17. {
  18. if (count($complexValues) < 2) {
  19. throw new \Exception('This function requires at least 2 arguments');
  20. }
  21. $base = array_shift($complexValues);
  22. $result = clone Complex::validateComplexArgument($base);
  23. foreach ($complexValues as $complex) {
  24. $complex = Complex::validateComplexArgument($complex);
  25. if ($result->isComplex() && $complex->isComplex() &&
  26. $result->getSuffix() !== $complex->getSuffix()) {
  27. throw new Exception('Suffix Mismatch');
  28. }
  29. if ($result->getReal() == 0.0 && $result->getImaginary() == 0.0) {
  30. throw new \InvalidArgumentException('Division by zero');
  31. }
  32. $delta1 = ($complex->getReal() * $result->getReal()) +
  33. ($complex->getImaginary() * $result->getImaginary());
  34. $delta2 = ($complex->getImaginary() * $result->getReal()) -
  35. ($complex->getReal() * $result->getImaginary());
  36. $delta3 = ($result->getReal() * $result->getReal()) +
  37. ($result->getImaginary() * $result->getImaginary());
  38. $real = $delta1 / $delta3;
  39. $imaginary = $delta2 / $delta3;
  40. $result = new Complex(
  41. $real,
  42. $imaginary,
  43. ($imaginary == 0.0) ? null : max($result->getSuffix(), $complex->getSuffix())
  44. );
  45. }
  46. return $result;
  47. }