{ "cells": [ { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "class superelliptic:\n", " def __init__(self, f, m, p):\n", " R. = PolynomialRing(GF(p))\n", " self.polynomial = R(f)\n", " self.exponent = m\n", " self.characteristic = p\n", " \n", " def __repr__(self):\n", " f = self.polynomial\n", " m = self.exponent\n", " p = self.characteristic\n", " return 'Superelliptic curve with the equation y^' + str(m) + ' = ' + str(f)+' over finite field with ' + str(p) + ' elements.'\n", " \n", " def genus(self):\n", " r = self.polynomial.degree()\n", " m = self.exponent\n", " delta = GCD(r, m)\n", " return 1/2*((r-1)*(m-1) - delta + 1)\n", " \n", " def basis_holomorphic_differentials(self, j = 'all'):\n", " f = self.polynomial\n", " m = self.exponent\n", " p = self.characteristic\n", " r = f.degree()\n", " delta = GCD(r, m)\n", " R2. = PolynomialRing(GF(p), 2)\n", " RR = FractionField(R2)\n", " \n", " basis = {}\n", " if j == 'all':\n", " k = 0\n", " for j in range(1, m):\n", " for i in range(1, r):\n", " if (r*j - m*i >= delta):\n", " basis[k] = superelliptic_form(self, RR(x^(i-1)/y^j))\n", " k = k+1\n", " return basis\n", " else:\n", " k = 0\n", " for i in range(1, r):\n", " if (r*j - m*i >= delta):\n", " basis[k] = superelliptic_form(self, RR(x^(i-1)/y^j))\n", " k = k+1\n", " return basis\n", " \n", " def basis_de_rham(self, j = 'all'):\n", " f = self.polynomial\n", " m = self.exponent\n", " p = self.characteristic\n", " r = f.degree()\n", " delta = GCD(r, m)\n", " R. = PolynomialRing(GF(p))\n", " R1. = PolynomialRing(GF(p), 2)\n", " RR = FractionField(R1)\n", " basis = {}\n", " if j == 'all':\n", " for j in range(1, m):\n", " holo = C.basis_holomorphic_differentials(j)\n", " for k in range(0, len(holo)):\n", " basis[k] = superelliptic_cech(self, holo[k], superelliptic_function(self, R(0))) \n", " k = len(basis)\n", " \n", " for i in range(1, r):\n", " if (r*(m-j) - m*i >= delta):\n", " s = R(m-j)*R(x)*R(f.derivative()) - R(m)*R(i)*f\n", " psi = R(cut(s, i))\n", " basis[k] = superelliptic_cech(self, superelliptic_form(self, psi/y^j), superelliptic_function(self, m*y^j/x^i))\n", " k = k+1\n", " return basis\n", " \n", "def reduction(C, g):\n", " p = C.characteristic\n", " R. = PolynomialRing(GF(p), 2)\n", " RR = FractionField(R)\n", " f = C.polynomial\n", " r = f.degree()\n", " m = C.exponent\n", " g = RR(g)\n", " g1 = g.numerator()\n", " g2 = g.denominator()\n", " \n", " R1. = PolynomialRing(GF(p))\n", " R2 = FractionField(R1)\n", " R3. = PolynomialRing(R2) \n", " (A, B, C) = xgcd(R3(g2), R3(y^m - f))\n", " g = R3(g1*B/A)\n", " \n", " while(g.degree(R(y)) >= m):\n", " d = g.degree(R(y))\n", " G = coff(g, d)\n", " i = floor(d/m)\n", " g = g - G*y^d + f^i * y^(d%m) *G\n", " \n", " return(R3(g))\n", "\n", "def reduction_form(C, g):\n", " p = C.characteristic\n", " R. = PolynomialRing(GF(p), 2)\n", " RR = FractionField(R)\n", " f = C.polynomial\n", " r = f.degree()\n", " m = C.exponent\n", " g = reduction(C, g)\n", "\n", " g1 = RR(0)\n", " R1. = PolynomialRing(GF(p))\n", " R2 = FractionField(R1)\n", " R3. = PolynomialRing(R2)\n", " \n", " g = R3(g)\n", " for j in range(0, m):\n", " if j==0:\n", " G = coff(g, 0)\n", " g1 += G\n", " else:\n", " G = coff(g, j)\n", " g1 += RR(y^(j-m)*f*G)\n", " return(g1)\n", " \n", "class superelliptic_function:\n", " def __init__(self, C, g):\n", " p = C.characteristic\n", " R. = PolynomialRing(GF(p), 2)\n", " RR = FractionField(R)\n", " f = C.polynomial\n", " r = f.degree()\n", " m = C.exponent\n", " \n", " self.curve = C\n", " g = reduction(C, g)\n", " self.function = g\n", " \n", " def __repr__(self):\n", " return str(self.function)\n", " \n", " def jth_component(self, j):\n", " g = self.function\n", " R. = PolynomialRing(GF(p), 2)\n", " g = R(g)\n", " return g.coefficient(y^j)\n", " \n", " def __add__(self, other):\n", " C = self.curve\n", " g1 = self.function\n", " g2 = other.function\n", " g = reduction(C, g1 + g2)\n", " return superelliptic_function(C, g)\n", " \n", " def __sub__(self, other):\n", " C = self.curve\n", " g1 = self.function\n", " g2 = other.function\n", " g = reduction(C, g1 - g2)\n", " return superelliptic_function(C, g)\n", " \n", " def __mul__(self, other):\n", " C = self.curve\n", " g1 = self.function\n", " g2 = other.function\n", " g = reduction(C, g1 * g2)\n", " return superelliptic_function(C, g)\n", " \n", " def __truediv__(self, other):\n", " C = self.curve\n", " g1 = self.function\n", " g2 = other.function\n", " g = reduction(C, g1 / g2)\n", " return superelliptic_function(C, g)\n", " \n", "def diffn(self):\n", " C = self.curve\n", " f = C.polynomial\n", " m = C.exponent\n", " p = C.characteristic\n", " g = self.function\n", " R. = PolynomialRing(GF(p), 2)\n", " RR = FractionField(R)\n", " g = RR(g)\n", " A = g.derivative(x)\n", " B = g.derivative(y)*f.derivative(x)/(m*y^(m-1))\n", " return superelliptic_form(C, A+B)\n", " \n", "class superelliptic_form:\n", " def __init__(self, C, g):\n", " p = C.characteristic\n", " R. = PolynomialRing(GF(p), 2)\n", " RR = FractionField(R)\n", " g = RR(reduction_form(C, g))\n", " self.form = g\n", " self.curve = C \n", " \n", " def __add__(self, other):\n", " C = self.curve\n", " g1 = self.form\n", " g2 = other.form\n", " g = reduction(C, g1 + g2)\n", " return superelliptic_form(C, g)\n", " \n", " def __sub__(self, other):\n", " C = self.curve\n", " g1 = self.form\n", " g2 = other.form\n", " g = reduction(C, g1 - g2)\n", " return superelliptic_form(C, g)\n", " \n", " def __repr__(self):\n", " g = self.form\n", " if len(str(g)) == 1:\n", " return str(g) + ' dx'\n", " return '('+str(g) + ') dx'\n", " \n", " def jth_component(self, j):\n", " g = self.form\n", " R1. = PolynomialRing(GF(p))\n", " R2 = FractionField(R1)\n", " R3. = PolynomialRing(R2)\n", " R4 = FractionField(R3)\n", " R5. = PolynomialRing(R2)\n", " g = R4(g)\n", " g = g(y = 1/y_inv)\n", " g = R5(g)\n", " return coff(g, j)\n", " \n", " def is_regular_on_U0(self):\n", " C = self.curve\n", " p = C.characteristic\n", " m = C.exponent\n", " R. = PolynomialRing(GF(p))\n", " for j in range(1, m):\n", " if self.jth_component(j) not in R:\n", " return 0\n", " return 1\n", " \n", " def is_regular_on_Uinfty(self):\n", " C = self.curve\n", " p = C.characteristic\n", " m = C.exponent\n", " f = C.polynomial\n", " r = f.degree()\n", " delta = GCD(m, r)\n", " M = m/delta\n", " R = r/delta\n", " \n", " for j in range(1, m):\n", " A = self.jth_component(j)\n", " d = degree_of_rational_fctn(A)\n", " if(-d*M + j*R -(M+1)<0):\n", " return 0\n", " return 1\n", " \n", "class superelliptic_cech:\n", " def __init__(self, C, omega, fct):\n", " self.omega0 = omega\n", " self.omega8 = omega - diffn(fct)\n", " self.f = fct\n", " self.curve = C\n", " \n", "def degree_of_rational_fctn(f):\n", " R. = PolynomialRing(GF(p))\n", " RR = FractionField(R)\n", " f = RR(f)\n", " f1 = f.numerator()\n", " f2 = f.denominator()\n", " d1 = f1.degree()\n", " d2 = f2.degree()\n", " return(d1 - d2)\n", "\n", "def coff(f, d):\n", " lista = f.coefficients(sparse = false)\n", " if len(lista) <= d:\n", " return 0\n", " return lista[d]\n", "\n", "def cut(f, i):\n", " R = f.parent()\n", " coeff = f.coefficients(sparse = false)\n", " return sum(R(x^(j-i-1)) * coeff[j] for j in range(i+1, f.degree() + 1))" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{0: <__main__.superelliptic_cech object at 0x6fdcefeaf60>,\n", " 1: <__main__.superelliptic_cech object at 0x6fdcefea8d0>}" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C = superelliptic(x^3 + x + 2, 2, 5)\n", "C.basis_de_rham()\n", "#C.basis_holomorphic_differentials()" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1/y) dx\n", "1 1\n", "{0: (1/y) dx}\n" ] } ], "source": [ "licz = 0\n", "m = 2\n", "p = 5\n", "R1. = PolynomialRing(GF(p))\n", "f = R1(x^3 + x + 4)\n", "r = f.degree()\n", "C = superelliptic(f, m, p)\n", "for i in range(0, r):\n", " for j in range(1, m):\n", " omega = superelliptic_form(C, x^i/y^j)\n", " if (omega.is_regular_on_U0() and omega.is_regular_on_Uinfty()):\n", " print(omega)\n", " licz += 1\n", "print(licz, C.genus())\n", "print(C.basis_holomorphic_differentials())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "p = 5\n", "R. = PolynomialRing(GF(p), 2)\n", "g = x^6*y^2 + y^2" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [], "source": [ "omega = diffn(superelliptic_function(C, y^2))" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3*x^2 + 1" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "omega.jth_component(0)" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "y" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R. = PolynomialRing(GF(p), 2)\n", "g1 = x^3*y^7 + x^2*y^9\n", "g2 = x^2*y + y^6\n", "R1. = PolynomialRing(GF(p))\n", "R2 = FractionField(R1)\n", "R3. = PolynomialRing(R2)\n", "\n", "xgcd(R3(g1), R3(g2))[1]*R3(g1) + xgcd(R3(g1), R3(g2))[2]*R3(g2)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "H = HyperellipticCurve(x^5 - x + 1)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Hyperelliptic Curve over Finite Field of size 5 defined by y^2 = x^5 + 4*x + 1" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "f = x^3 + x + 2" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-2*x^2 + 1" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.derivative(x)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "p = 5\n", "R1. = PolynomialRing(GF(p))\n", "R2 = FractionField(R1)\n", "R3. = PolynomialRing(R2)\n", "g = y^2/x + y/(x+1) \n", "g = 1/y+x/y^2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x*z^2 + z" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R3. = PolynomialRing(R2)\n", "g(y = 1/z)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x^3 + x + 4" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'sage.rings.polynomial.polynomial_zmod_flint.Polynomial_zmod_flint' object has no attribute 'coefficient'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcoefficient\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/opt/sagemath-9.1/local/lib/python3.7/site-packages/sage/structure/element.pyx\u001b[0m in \u001b[0;36msage.structure.element.Element.__getattr__ (build/cythonized/sage/structure/element.c:4614)\u001b[0;34m()\u001b[0m\n\u001b[1;32m 485\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'LeftZeroSemigroup_with_category.element_class'\u001b[0m \u001b[0mobject\u001b[0m \u001b[0mhas\u001b[0m \u001b[0mno\u001b[0m \u001b[0mattribute\u001b[0m \u001b[0;34m'blah_blah'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 486\u001b[0m \"\"\"\n\u001b[0;32m--> 487\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetattr_from_category\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 488\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 489\u001b[0m \u001b[0mcdef\u001b[0m \u001b[0mgetattr_from_category\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/opt/sagemath-9.1/local/lib/python3.7/site-packages/sage/structure/element.pyx\u001b[0m in \u001b[0;36msage.structure.element.Element.getattr_from_category (build/cythonized/sage/structure/element.c:4723)\u001b[0;34m()\u001b[0m\n\u001b[1;32m 498\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 499\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_abstract_element_class\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 500\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mgetattr_from_other_class\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 501\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 502\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__dir__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/opt/sagemath-9.1/local/lib/python3.7/site-packages/sage/cpython/getattr.pyx\u001b[0m in \u001b[0;36msage.cpython.getattr.getattr_from_other_class (build/cythonized/sage/cpython/getattr.c:2614)\u001b[0;34m()\u001b[0m\n\u001b[1;32m 392\u001b[0m \u001b[0mdummy_error_message\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcls\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 393\u001b[0m \u001b[0mdummy_error_message\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 394\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdummy_error_message\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 395\u001b[0m \u001b[0mattribute\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m<\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m>\u001b[0m\u001b[0mattr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 396\u001b[0m \u001b[0;31m# Check for a descriptor (__get__ in Python)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: 'sage.rings.polynomial.polynomial_zmod_flint.Polynomial_zmod_flint' object has no attribute 'coefficient'" ] } ], "source": [ "f.coefficient()" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x^3 + x + 1" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x^3+x+1" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Symbolic Ring" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parent(x)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "R. = PolynomialRing(GF(5))" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "R = (x^3+x).parent()" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "R. = PolynomialRing(GF(5))\n", "RR = FractionField(R)\n", "A = RR(1/(x*y))" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-1)/(x^2*y)" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.derivative(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.1", "language": "sage", "name": "sagemath" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }