{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Number Fields: Towers\n", "\n", "* Author: Claus Fieker\n", "* Version: OSCAR version 1.0\n", "* Last modified: April 4, 2024" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This tutorial provides an elementary introduction to the creation of number fields.\n", "\n", "Content:\n", "1. [Creating Number Fields](#1.-Creating-Number-Fields)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ___ ____ ____ _ ____\n", " / _ \\ / ___| / ___| / \\ | _ \\ | Combining ANTIC, GAP, Polymake, Singular\n", "| | | |\\___ \\| | / _ \\ | |_) | | Type \"?Oscar\" for more information\n", "| |_| | ___) | |___ / ___ \\| _ < | Manual: https://docs.oscar-system.org\n", " \\___/ |____/ \\____/_/ \\_\\_| \\_\\ | Version 1.0.0\n" ] } ], "source": [ "using Oscar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Creating Number Fields" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In general, the creation of number fields requires polynomials. Hence, we begin by creating a polynomial and subsequently use it to define a number field. The symbol $a$ will be reserved for a primitive element. In the following example it will be a root of $x^2-10$." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Number field of degree 2 over QQ, _a)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Qx, x = QQ[\"x\"]\n", "k, a = number_field(x^2-10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To extend further, we need polynomials over $k$, then we can define an extension." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Univariate polynomial ring in t over k, t)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kt, t = k[\"t\"]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Relative number field of degree 3 over k, _$)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K, b = number_field(t^3-a*t+a+1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For many algorithms, finding a primitive element is important. The maps are the isomorphism between the relative and absolute fields and the embedding from $k$." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Number field of degree 6 over QQ, Map: Ka -> relative number field)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ka, m1 = absolute_simple_field(K)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Number field with defining polynomial x^6 + 2*x^3 - 10*x^2 + 20*x - 9\n", " over rational field" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Ka" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preimage(m1, K(a))^2" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "#7 (generic function with 1 method)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m2 = x -> preimage(m1, K(x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To check that $m_2$ is indeed the embedding, we veryify $m_2(a)^2 = 10$:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1//2*x^5 - 1//2*x^4 - 1//2*x^3 - 1//2*x^2 + 9//2*x - 11//2" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m2(a)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ans^2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Given that we did not assign a name to the primitive element of $K_a$ it is printed generically:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preimage(m1, b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us verify that this element $K_a$ indeed satisfies the equation for $b$:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ans^3-m2(a)*ans+m2(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The computation of a few invariants ensues:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-_a - 1, -14*_a - 297, -9)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "norm(b), discriminant(K), norm(b, QQ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to absolute and relative fields given via a polynomial (hence a primitive element) we also\n", "have {\\em non-simple} fields, given via the roots of several polynomials.\n", "Note: the ideal defined by the polynomials needs to be maximal. This is not verified." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Non-simple number field of degree 8 over QQ, AbsNonSimpleNumFieldElem[_$1, _$2, _$3])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k, g = number_field([x^2-3, x^2-5, x^2-7])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g[1]^2" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8-element Vector{AbsNonSimpleNumFieldElem}:\n", " 1\n", " 3\n", " 5\n", " 15\n", " 7\n", " 21\n", " 35\n", " 105" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[x^2 for x = basis(k)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similar to above, we can convert to a primitive representation:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Number field of degree 8 over QQ, Map: ks -> k)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ks, ms = simple_extension(k)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3//7552*_a^7 - 121//7552*_a^5 - 663//7552*_a^3 + 11405//7552*_a" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ms\\g[1]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ans^2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "kernelspec": { "display_name": "Julia 1.9.2", "language": "julia", "name": "julia-1.9" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.9.2" } }, "nbformat": 4, "nbformat_minor": 4 }