-
Notifications
You must be signed in to change notification settings - Fork 0
/
class.complex-numbers.php
120 lines (103 loc) · 4.15 KB
/
class.complex-numbers.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
#################################################################################################################################
# _________ __ ____ __. __ __ .__ #
# / _____// |_ ____ ___________ ____ | |/ _|____ ____ _______/ |______ _____/ |_|__| ____ _______ __ #
# \_____ \\ __\/ __ \\____ \__ \ / \ | < / _ \ / \ / ___/\ __\__ \ / \ __\ |/ \ / _ \ \/ / #
# / \| | \ ___/| |_> > __ \| | \ | | ( <_> ) | \\___ \ | | / __ \| | \ | | | | ( <_> ) / #
# /_______ /|__| \___ > __(____ /___| / |____|__ \____/|___| /____ > |__| (____ /___| /__| |__|___| /\____/ \_/ #
# \/ \/|__| \/ \/ \/ \/ \/ \/ \/ \/ #
#################################################################################################################################
class complexNumber {
public $a, $b;
public function __construct($a = 0, $b = 0) {
if(is_numeric($a) and is_numeric($b)) {
$this->a = $a;
$this->b = $b;
return true;
} else
return false;
}
public function getNumber() {
return $this->a.'+'.$this->b.'*i';
}
public function add($number) {
if(is_numeric($number))
return complexNumber($this->a + $number, $this->b);
elseif(@get_class($number) == get_class($this))
return complexNumber($this->a + $number->a, $this->b + $number->b);
}
public function sub($number) {
if(is_numeric($number))
return complexNumber($this->a - $number, $this->b);
elseif(@get_class($number) == get_class($this))
return complexNumber($this->a - $number->a, $this->b - $number->b);
}
public function multiply($number) {
if(is_numeric($number))
return complexNumber($this->a*$number, $this->b*$number);
elseif(@get_class($number) == get_class($this))
return complexNumber($this->a*$number->a - $this->b*$number->b, $this->b*$number->a + $this->a*$number->b);
}
public function divide($number) {
if(is_numeric($number))
return complexNumber();
elseif(@get_class($number) == get_class($this))
return complexNumber(($this->a*$number->a + $this->b*$number->b)/($number->a*$number->a + $number->b*$number->b), ($this->b*$number->a - $this->a*$number->b)/($number->a*$number->a + $number->b*$number->b));
}
public function absolute() {
return sqrt($this->a*$this->a + $this->b*$this->b);
}
public function argument() {
if($this->a > 0)
return atan($this->b/$this->a);
elseif($this->a < 0 and $this->b >= 0)
return M_PI + atan($this->b/$this->a);
elseif($this->a < 0 and $this->b < 0)
return atan($this->b/$this->a) - M_PI;
elseif($this->a == 0 and $this->b > 0)
return M_PI/2;
elseif($this->a == 0 and $this->b < 0)
return -M_PI/2;
}
public function power($number) {
if(is_numeric($number)) {
if($number == intval($number) and $number == abs($number)) {
$out = 1;
for($i = 0; $i < $number; $i++)
$out*=$number;
return $out;
} elseif($number == intval($number) and abs($number) == -$number) {
return complexNumber(1, 0)->divide($this->power(-$number))
} elseif($number != intval($number) and abs($number) == $number) {
$tmp = explode('.', $number);
$n = 1;
for($i = 0;$i < strlen($tmp[1]);$i++) {
$n *= 10;
}
$n+=0;
$m = $tmp[0].$tmp[1];
return $this->root($n, 1)->power($m);
} elseif($number != intval($number) and abs($number) != $number) {
$tmp = explode('.', $number);
$n = 1;
for($i = 0;$i < strlen($tmp[1]);$i++) {
$n *= 10;
}
$n+=0;
$m = $tmp[0].$tmp[1];
return $this->root($n, 1)->power(-$m);
}
}
}
public function root($base = 2, $k = 0) {
if(is_numeric($base) and is_numeric($k))
return complexNumber(cos(($this->argument + 2*M_PI*$k)/$base), sin(($this->argument + 2*M_PI*$k)/$base))->multiply(realRoot($this->absolute(), $base));
}
protected function realRoot($number, $base) {
$out = $number/$base;
for($i = 0; $i < round(pow(M_E, $number)); $i++)
$out = 1/$base * round(($base-1)*x + $number/(pow($out, $base-1)));
return $out;
}
}
?>