| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Complex { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private $realPart = 0; | 
					
						
							|  |  |  | 	private $imaginaryPart = 0; | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 	private $suffix = NULL; | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 	public static function _parseComplex($complexNumber) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		//	Test for real number, with no imaginary part
 | 
					
						
							|  |  |  | 		if (is_numeric($complexNumber)) | 
					
						
							|  |  |  | 			return array( $complexNumber, 0, NULL ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		//	Fix silly human errors
 | 
					
						
							|  |  |  | 		if (strpos($complexNumber,'+-') !== FALSE) | 
					
						
							|  |  |  | 			$complexNumber = str_replace('+-','-',$complexNumber); | 
					
						
							| 
									
										
										
										
											2012-03-24 23:12:51 +00:00
										 |  |  | 		if (strpos($complexNumber,'++') !== FALSE) | 
					
						
							|  |  |  | 			$complexNumber = str_replace('++','+',$complexNumber); | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 		if (strpos($complexNumber,'--') !== FALSE) | 
					
						
							|  |  |  | 			$complexNumber = str_replace('--','-',$complexNumber); | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 		//	Basic validation of string, to parse out real and imaginary parts, and any suffix
 | 
					
						
							| 
									
										
										
										
											2012-03-24 23:12:51 +00:00
										 |  |  | 		$validComplex = preg_match('/^([\-\+]?(\d+\.?\d*|\d*\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?)([\-\+]?(\d+\.?\d*|\d*\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?)?(([\-\+]?)([ij]?))$/ui',$complexNumber,$complexParts); | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (!$validComplex) { | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 			//	Neither real nor imaginary part, so test to see if we actually have a suffix
 | 
					
						
							| 
									
										
										
										
											2012-03-24 23:12:51 +00:00
										 |  |  | 			$validComplex = preg_match('/^([\-\+]?)([ij])$/ui',$complexNumber,$complexParts); | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 			if (!$validComplex) { | 
					
						
							|  |  |  | 				throw new Exception('COMPLEX: Invalid complex number'); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			//	We have a suffix, so set the real to 0, the imaginary to either 1 or -1 (as defined by the sign)
 | 
					
						
							|  |  |  | 			$imaginary = 1; | 
					
						
							|  |  |  | 			if ($complexParts[1] === '-') { | 
					
						
							|  |  |  | 				$imaginary = 0 - $imaginary; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return array(0, $imaginary, $complexParts[2]); | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 		//	If we don't have an imaginary part, identify whether it should be +1 or -1...
 | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 		if (($complexParts[4] === '') && ($complexParts[9] !== '')) { | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 			if ($complexParts[7] !== $complexParts[9]) { | 
					
						
							|  |  |  | 				$complexParts[4] = 1; | 
					
						
							|  |  |  | 				if ($complexParts[8] === '-') { | 
					
						
							|  |  |  | 					$complexParts[4] = -1; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			//	... or if we have only the real and no imaginary part (in which case our real should be the imaginary)
 | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$complexParts[4] = $complexParts[1]; | 
					
						
							|  |  |  | 				$complexParts[1] = 0; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 		//	Return real and imaginary parts and suffix as an array, and set a default suffix if user input lazily
 | 
					
						
							|  |  |  | 		return array( $complexParts[1], | 
					
						
							|  |  |  | 					  $complexParts[4], | 
					
						
							|  |  |  | 					  !empty($complexParts[9]) ? $complexParts[9] : 'i' | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 					); | 
					
						
							|  |  |  | 	}	//	function _parseComplex()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 	public function __construct($realPart, $imaginaryPart = null, $suffix = 'i') | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		if ($imaginaryPart === null) { | 
					
						
							|  |  |  | 			if (is_array($realPart)) { | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 				//	We have an array of (potentially) real and imaginary parts, and any suffix
 | 
					
						
							|  |  |  | 				list ($realPart, $imaginaryPart, $suffix) = array_values($realPart) + array(0.0, 0.0, 'i'); | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 			} elseif((is_string($realPart)) || (is_numeric($realPart))) { | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 				//	We've been given a string to parse to extract the real and imaginary parts, and any suffix
 | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 				list ($realPart, $imaginaryPart, $suffix) = self::_parseComplex($realPart); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 		//	Set parsed values in our properties
 | 
					
						
							|  |  |  | 		$this->realPart = (float) $realPart; | 
					
						
							|  |  |  | 		$this->imaginaryPart = (float) $imaginaryPart; | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 		$this->suffix = strtolower($suffix); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function getReal() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->realPart; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function getImaginary() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->imaginaryPart; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function getSuffix() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->suffix; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function __toString() { | 
					
						
							|  |  |  | 		$str = ""; | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 		if ($this->imaginaryPart != 0.0) { | 
					
						
							|  |  |  | 			if (abs($this->imaginaryPart) != 1.0) { | 
					
						
							|  |  |  | 				$str .= $this->imaginaryPart . $this->suffix; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$str .= (($this->imaginaryPart < 0.0) ? '-' : ''). $this->suffix; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 		if ($this->realPart != 0.0) { | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 			if (($str) && ($this->imaginaryPart > 0.0)) | 
					
						
							|  |  |  | 				$str = "+" . $str; | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 			$str = $this->realPart . $str; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2012-02-08 21:39:02 +00:00
										 |  |  | 		if (!$str) | 
					
						
							|  |  |  | 			$str = "0.0"; | 
					
						
							| 
									
										
										
										
											2012-01-23 23:42:32 +00:00
										 |  |  | 		return $str; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |