Pythonをはじめてみる(7)

モジュール

Galクラスができたので、それをgal.pyと名前をつけてファイルにする。
それを次のように利用する。


from gal import Gal

a = Gal(-4, -2, 3, 3)
print a # (-4-2√3)/3
b = Gal(3, -1, 3, 3)
print b # (3-√3)/3
c = a / b
print c # (-9-5√3)/3
d = 1 / b
print d # (3+√3)/2

galというモジュール(ファイルgal.py)からGalという名前をインポートするという意味らしい。
こういう書き方もできる。


import gal
Gal = gal.Gal



# coding: s_jis

class Gal:
def __init__(self, a, b = 0, c = 0, d = 1):
self.a, self.b, self.c, self.d = a, b, c, d
self.normalize()

def __add__(self, a):
if isinstance(a, Gal):
f = self.GCD(self.d, a.d)
f1 = a.d / f
f2 = self.d / f
return Gal(f1 * self.a + f2 * a.a,
f1 * self.b + f2 * a.b, self.c, f2 * a.d)
else: # 第2引数は整数とみなす
return Gal(self.a + a * self.d, self.b, self.c, self.d)

def __radd__(self, a):
return Gal(self.a + a * self.d, self.b, self.c, self.d)

def __sub__(self, a):
if isinstance(a, Gal):
f = self.GCD(self.d, a.d)
f1 = a.d / f
f2 = self.d / f
return Gal(f1 * self.a - f2 * a.a,
f1 * self.b - f2 * a.b, self.c, f2 * a.d)
else: # 第2引数は整数とみなす
return Gal(self.a - a * self.d, self.b, self.c, self.d)

def __rsub__(self, a):
return Gal(-self.a + a * self.d, -self.b, self.c, self.d)

def __mul__(self, a):
if isinstance(a, Gal):
return Gal(self.a * a.a + self.b * a.b * self.c,
self.a * a.b + self.b * a.a, self.c, self.d * a.d)
else:
return Gal(self.a * a, self.b * a, self.c, self.d)

def __rmul__(self, a):
return Gal(self.a * a, self.b * a, self.c, self.d)

def __div__(self, a):
if isinstance(a, Gal):
square = a.a * a.a - a.b * a.b * a.c
return Gal((self.a * a.a - self.b * a.b * self.c) * a.d,
(-self.a * a.b + self.b * a.a) * a.d,
self.c, self.d * square)
else:
return Gal(self.a, self.b, self.c, self.d * a)

def __rdiv__(self, a):
square = self.a * self.a - self.b * self.b * self.c
a *= self.d
return Gal(a * self.a, -a * self.b, self.c, square)

def normalize(self):
f = self.GCD(self.GCD(self.a, self.b), self.d)
if self.d < 0:
f = -f
self.a /= f
self.b /= f
self.d /= f

def __str__(self):
if self.d == 1:
return self.str_core()
elif self.a == 0 or self.b == 0:
return self.str_core() + "/" + str(self.d)
else:
return "(" + self.str_core() + ")/" + str(self.d)

def str_core(self):
if self.a == 0 and self.b == 0:
result = "0",
else:
result = ""
if self.a != 0:
result = str(self.a)
if self.a != 0 and self.b > 0:
result += "+"
if self.b == 1:
result += "√" + str(self.c)
elif self.b == -1:
result += "-√" + str(self.c)
elif self.b != 0:
result += str(self.b) + "√" + str(self.c)
return result;

def GCD(self, a, b):
if a == 0:
return b
elif b == 0:
return a

a1 = abs(a)
b1 = abs(b)
while True:
a2 = a1 % b1
if a2 == 0:
return b1
b1 %= a1
if b1 == 0:
return a1
a1 = a2