ark-ec 0.5.0

A library for elliptic curves and pairings
Documentation
# Generating test data for the hash to curve module tests
def find_a_0_and_its_ab_non_0_isogenous_of_good_size():
    p = 127
    FF = GF(p)
    for b in range(0,p):
        print(b)
        try:
            E = EllipticCurve([FF(0),FF(b)])
            if E.order() % p == 0:
                print(E)
                iso = find_iso(E)
                if (iso.codomain().order() == 127):
                    print(iso)
                    print("degree, order: ", iso.degree(), iso.codomain().order())
                    print(iso.rational_maps())
                    print("phi_x: ", convert_rational_map_to_str_array(iso.rational_maps()[0]))
                    print("phi_y: ", convert_rational_map_to_str_array(iso.rational_maps()[1]))
                    return iso
                
        except:
            pass

def find_iso(E):
    for p_test in primes(30):
        print("trying isogenies of degree %d"%p_test)
        isos = []
        for i in E.isogenies_prime_degree(p_test):            
            print("checking j-invariant of isogeny ", i)
            jinv = i.codomain().j_invariant()
            print("j-invariant is ", jinv)
            if jinv not in (0, 1728):
                isos.append(i)
                break
        
        if len(isos) > 0:
            print("found isogeny ", isos[0])
            return isos[0].dual()

    return None


def convert_rational_map_to_str_array(the_rational_map):
    rational_map_str = [ [ ], [ ] ]
    rational_map_str[0] = [str(cur_coeff) for cur_coeff in the_rational_map.numerator().coefficients()]
    rational_map_str[1] = [str(cur_coeff) for cur_coeff in the_rational_map.denominator().coefficients()]

    ordered_indcies = len(rational_map_str[0]) < len(rational_map_str[1]) and (0,1) or (1,0)
    for i in range(len(rational_map_str[ordered_indcies[0]]), len(rational_map_str[ordered_indcies[1]])):
        rational_map_str[ordered_indcies[0]].insert(0,'0')
    
    return rational_map_str