Class | Complex |
In: |
lib/complex.rb
lib/mathn.rb |
Parent: | Numeric |
The complex number class. See complex.rb for an overview.
I | = | Complex(0,1) | I is the imaginary number. It exists at point (0,1) on the complex plane. | |
Unify | = | true |
image | -> | imag |
image | [R] | The imaginary part of a complex number. |
real | [R] | The real part of a complex number. |
# File lib/complex.rb, line 124 124: def initialize(a, b) 125: raise TypeError, "non numeric 1st arg `#{a.inspect}'" if !a.kind_of? Numeric 126: raise TypeError, "`#{a.inspect}' for 1st arg" if a.kind_of? Complex 127: raise TypeError, "non numeric 2nd arg `#{b.inspect}'" if !b.kind_of? Numeric 128: raise TypeError, "`#{b.inspect}' for 2nd arg" if b.kind_of? Complex 129: @real = a 130: @image = b 131: end
Remainder after division by a real or complex number.
# File lib/complex.rb, line 247 247: def % (other) 248: if other.kind_of?(Complex) 249: Complex(@real % other.real, @image % other.image) 250: elsif Complex.generic?(other) 251: Complex(@real % other, @image % other) 252: else 253: x , y = other.coerce(self) 254: x % y 255: end 256: end
Multiplication with real or complex number.
# File lib/complex.rb, line 168 168: def * (other) 169: if other.kind_of?(Complex) 170: re = @real*other.real - @image*other.image 171: im = @real*other.image + @image*other.real 172: Complex(re, im) 173: elsif Complex.generic?(other) 174: Complex(@real * other, @image * other) 175: else 176: x , y = other.coerce(self) 177: x * y 178: end 179: end
Raise this complex number to the given (real or complex) power.
# File lib/complex.rb, line 202 202: def ** (other) 203: if other == 0 204: return Complex(1) 205: end 206: if other.kind_of?(Complex) 207: r, theta = polar 208: ore = other.real 209: oim = other.image 210: nr = Math.exp!(ore*Math.log!(r) - oim * theta) 211: ntheta = theta*ore + oim*Math.log!(r) 212: Complex.polar(nr, ntheta) 213: elsif other.kind_of?(Integer) 214: if other > 0 215: x = self 216: z = x 217: n = other - 1 218: while n != 0 219: while (div, mod = n.divmod(2) 220: mod == 0) 221: x = Complex(x.real*x.real - x.image*x.image, 2*x.real*x.image) 222: n = div 223: end 224: z *= x 225: n -= 1 226: end 227: z 228: else 229: if defined? Rational 230: (Rational(1) / self) ** -other 231: else 232: self ** Float(other) 233: end 234: end 235: elsif Complex.generic?(other) 236: r, theta = polar 237: Complex.polar(r**other, theta*other) 238: else 239: x, y = other.coerce(self) 240: x**y 241: end 242: end
Addition with real or complex number.
# File lib/complex.rb, line 136 136: def + (other) 137: if other.kind_of?(Complex) 138: re = @real + other.real 139: im = @image + other.image 140: Complex(re, im) 141: elsif Complex.generic?(other) 142: Complex(@real + other, @image) 143: else 144: x , y = other.coerce(self) 145: x + y 146: end 147: end
Subtraction with real or complex number.
# File lib/complex.rb, line 152 152: def - (other) 153: if other.kind_of?(Complex) 154: re = @real - other.real 155: im = @image - other.image 156: Complex(re, im) 157: elsif Complex.generic?(other) 158: Complex(@real - other, @image) 159: else 160: x , y = other.coerce(self) 161: x - y 162: end 163: end
Division by real or complex number.
# File lib/complex.rb, line 184 184: def / (other) 185: if other.kind_of?(Complex) 186: self*other.conjugate/other.abs2 187: elsif Complex.generic?(other) 188: Complex(@real/other, @image/other) 189: else 190: x, y = other.coerce(self) 191: x/y 192: end 193: end
Compares the absolute values of the two numbers.
# File lib/complex.rb, line 314 314: def <=> (other) 315: self.abs <=> other.abs 316: end
Test for numerical equality (a == a + 0i).
# File lib/complex.rb, line 321 321: def == (other) 322: if other.kind_of?(Complex) 323: @real == other.real and @image == other.image 324: elsif Complex.generic?(other) 325: @real == other and @image == 0 326: else 327: other == self 328: end 329: end
Absolute value (aka modulus): distance from the zero point on the complex plane.
# File lib/complex.rb, line 277 277: def abs 278: Math.hypot(@real, @image) 279: end
Square of the absolute value.
# File lib/complex.rb, line 284 284: def abs2 285: @real*@real + @image*@image 286: end
FIXME
# File lib/complex.rb, line 345 345: def denominator 346: @real.denominator.lcm(@image.denominator) 347: end
FIXME
# File lib/complex.rb, line 352 352: def numerator 353: cd = denominator 354: Complex(@real.numerator*(cd/@real.denominator), 355: @image.numerator*(cd/@image.denominator)) 356: end
Returns the absolute value and the argument.
# File lib/complex.rb, line 299 299: def polar 300: return abs, arg 301: end
# File lib/complex.rb, line 195 195: def quo(other) 196: Complex(@real.quo(1), @image.quo(1)) / other 197: end
Standard string representation of the complex number.
# File lib/complex.rb, line 361 361: def to_s 362: if @real != 0 363: if defined?(Rational) and @image.kind_of?(Rational) and @image.denominator != 1 364: if @image >= 0 365: @real.to_s+"+("+@image.to_s+")i" 366: else 367: @real.to_s+"-("+(-@image).to_s+")i" 368: end 369: else 370: if @image >= 0 371: @real.to_s+"+"+@image.to_s+"i" 372: else 373: @real.to_s+"-"+(-@image).to_s+"i" 374: end 375: end 376: else 377: if defined?(Rational) and @image.kind_of?(Rational) and @image.denominator != 1 378: "("+@image.to_s+")i" 379: else 380: @image.to_s+"i" 381: end 382: end 383: end