test/functional/test_framework/key.py
def add(self, p1, p2):
        """Add two Jacobian tuples p1 and p2"""
        x1, y1, z1 = p1
        x2, y2, z2 = p2
        if z1 == 0:
            return p2
        if z2 == 0:
            return p1
        if z1 == 1:
            return self.add_mixed(p2, p1)
        if z2 == 1:
            return self.add_mixed(p1, p2)
        z1_2 = (z1**2) % self.p
        z1_3 = (z1_2 * z1) % self.p
        z2_2 = (z2**2) % self.p
        z2_3 = (z2_2 * z2) % self.p
        u1 = (x1 * z2_2) % self.p
        u2 = (x2 * z1_2) % self.p
        s1 = (y1 * z2_3) % self.p
        s2 = (y2 * z1_3) % self.p
        if u1 == u2:
            if (s1 != s2):
                return (0, 1, 0)
            return self.double(p1)
        h = u2 - u1
        r = s2 - s1
        h_2 = (h**2) % self.p
        h_3 = (h_2 * h) % self.p
        u1_h_2 = (u1 * h_2) % self.p
        x3 = (r**2 - h_3 - 2 * u1_h_2) % self.p
        y3 = (r * (u1_h_2 - x3) - s1 * h_3) % self.p
        z3 = (h * z1 * z2) % self.p
        return (x3, y3, z3)
Add two Jacobian tuples p1 and p2
Add two Jacobian tuples p1 and p2
Add two Jacobian tuples p1 and p2
def add(self, p1, p2):
        x1, y1, z1 = p1
        x2, y2, z2 = p2
        if z1 == 0:
            return p2
        if z2 == 0:
            return p1
        if z1 == 1:
            return self.add_mixed(p2, p1)
        if z2 == 1:
            return self.add_mixed(p1, p2)
        z1_2 = (z1**2) % self.p
        z1_3 = (z1_2 * z1) % self.p
        z2_2 = (z2**2) % self.p
        z2_3 = (z2_2 * z2) % self.p
        u1 = (x1 * z2_2) % self.p
        u2 = (x2 * z1_2) % self.p
        s1 = (y1 * z2_3) % self.p
        s2 = (y2 * z1_3) % self.p
        if u1 == u2:
            if (s1 != s2):
                return (0, 1, 0)
            return self.double(p1)
        h = u2 - u1
        r = s2 - s1
        h_2 = (h**2) % self.p
        h_3 = (h_2 * h) % self.p
        u1_h_2 = (u1 * h_2) % self.p
        x3 = (r**2 - h_3 - 2 * u1_h_2) % self.p
        y3 = (r * (u1_h_2 - x3) - s1 * h_3) % self.p
        z3 = (h * z1 * z2) % self.p
        return (x3, y3, z3)
def add ( self , p1 , p2 ) : x1 , y1 , z1 = p1 x2 , y2 , z2 = p2 if z1 == 0 : return p2 if z2 == 0 : return p1 if z1 == 1 : return self . add_mixed ( p2 , p1 ) if z2 == 1 : return self . add_mixed ( p1 , p2 ) z1_2 = ( z1 ** 2 ) % self . p z1_3 = ( z1_2 * z1 ) % self . p z2_2 = ( z2 ** 2 ) % self . p z2_3 = ( z2_2 * z2 ) % self . p u1 = ( x1 * z2_2 ) % self . p u2 = ( x2 * z1_2 ) % self . p s1 = ( y1 * z2_3 ) % self . p s2 = ( y2 * z1_3 ) % self . p if u1 == u2 : if ( s1 != s2 ) : return ( 0 , 1 , 0 ) return self . double ( p1 ) h = u2 - u1 r = s2 - s1 h_2 = ( h ** 2 ) % self . p h_3 = ( h_2 * h ) % self . p u1_h_2 = ( u1 * h_2 ) % self . p x3 = ( r ** 2 - h_3 - 2 * u1_h_2 ) % self . p y3 = ( r * ( u1_h_2 - x3 ) - s1 * h_3 ) % self . p z3 = ( h * z1 * z2 ) % self . p return ( x3 , y3 , z3 )
Add two Jacobian tuples p1 and p2
Add two Jacobian tuples p1 and p2
"""Add two Jacobian tuples p1 and p2"""
self
p1
p2