divideby.php 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. if (!function_exists(__NAMESPACE__ . '\\divideby')) {
  17. function divideby(...$complexValues): Complex
  18. {
  19. if (count($complexValues) < 2) {
  20. throw new \Exception('This function requires at least 2 arguments');
  21. }
  22. $base = array_shift($complexValues);
  23. $result = clone Complex::validateComplexArgument($base);
  24. foreach ($complexValues as $complex) {
  25. $complex = Complex::validateComplexArgument($complex);
  26. if ($result->isComplex() && $complex->isComplex() &&
  27. $result->getSuffix() !== $complex->getSuffix()) {
  28. throw new Exception('Suffix Mismatch');
  29. }
  30. if ($complex->getReal() == 0.0 && $complex->getImaginary() == 0.0) {
  31. throw new \InvalidArgumentException('Division by zero');
  32. }
  33. $delta1 = ($result->getReal() * $complex->getReal()) +
  34. ($result->getImaginary() * $complex->getImaginary());
  35. $delta2 = ($result->getImaginary() * $complex->getReal()) -
  36. ($result->getReal() * $complex->getImaginary());
  37. $delta3 = ($complex->getReal() * $complex->getReal()) +
  38. ($complex->getImaginary() * $complex->getImaginary());
  39. $real = $delta1 / $delta3;
  40. $imaginary = $delta2 / $delta3;
  41. $result = new Complex(
  42. $real,
  43. $imaginary,
  44. ($imaginary == 0.0) ? null : max($result->getSuffix(), $complex->getSuffix())
  45. );
  46. }
  47. return $result;
  48. }
  49. }