class Numero_complesso:
    def __init__(self, re, im):
        self.reale = re
        self.immag = im

    def norma(self):
        a = self.reale**2
        b = self.immag**2
        return (a+b)**(1.0/2)

    def get_reale(self):
        return self.reale
        
    def get_immag(self):
        return self.immag
        
    def coniugato(self):
        a = self.get_reale()
        b = self.get_immag()
        return Numero_complesso(a, -b)
        
    def __add__(self, u):
        a = self.get_reale() + u.get_reale()
        b = self.get_immag() + u.get_immag()
        return Numero_complesso(a, b)
        
    def __mul__(self, u):
        a = self.get_reale()
        b = self.get_immag()
        c = u.get_reale()
        d = u.get_immag()
        return Numero_complesso(a*c-b*d, a*d+b*c)
        
    def __str__(self):
        a = self.get_reale()
        b = self.get_immag()
        return str(a) + " + " + str(b) + "*i"

    def __repr__(self):
        a = self.get_reale()
        b = self.get_immag()
        return "Numero complesso: " + str(a) + " + " + str(b) + "*i"
       


class Int_Gauss(Numero_complesso):
    def __init__(self, re, im):
        Numero_complesso.__init__(self, re, im)

    def norma(self):
        a = self.reale**2
        b = self.immag**2
        return a+b

    def _intero_primo(self, a):
        b = int(a**(1./2))
        for c in range(2, b+1):
            if b % c == 0:
                return False
        return True

    def _abs(self, a):
        if a > 0:
            return a;
        return -a


    def is_prime(self): 
        a = self.get_reale()
        b = self.get_immag()
        if a != 0 and b != 0:
            n = self.norma()
            return self._intero_primo(n)
        if a != 0 and b == 0:
            q = self._abs(a)
            if q % 4 != 3:
                return False
            else:
                return self._numero_primo(q)
        if a == 0 and b != 0:
            q = self._abs(b)
            if q % 4 != 3:
                return False
            else:
                return self._numero_primo(q)
        return False



print "**************** TEST ***************"
z1 = Int_Gauss(7,  2)
print z1.norma()
print z1.coniugato()

print z1.is_prime()
