mathsoftware

A course about LaTeX and SageMath
git clone https://git.tronto.net/mathsoftware
Download | Log | Files | Refs | README | LICENSE

7-SageAlgebra.tex (64003B)


      1 \documentclass[11pt]{article}
      2 
      3     \usepackage[breakable]{tcolorbox}
      4     \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour)
      5     
      6     \usepackage{iftex}
      7     \ifPDFTeX
      8     	\usepackage[T1]{fontenc}
      9     	\usepackage{mathpazo}
     10     \else
     11     	\usepackage{fontspec}
     12     \fi
     13 
     14     % Basic figure setup, for now with no caption control since it's done
     15     % automatically by Pandoc (which extracts ![](path) syntax from Markdown).
     16     \usepackage{graphicx}
     17     % Maintain compatibility with old templates. Remove in nbconvert 6.0
     18     \let\Oldincludegraphics\includegraphics
     19     % Ensure that by default, figures have no caption (until we provide a
     20     % proper Figure object with a Caption API and a way to capture that
     21     % in the conversion process - todo).
     22     \usepackage{caption}
     23     \DeclareCaptionFormat{nocaption}{}
     24     \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt}
     25 
     26     \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size
     27     \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}}
     28     \usepackage{float}
     29     \floatplacement{figure}{H} % forces figures to be placed at the correct location
     30     \usepackage{xcolor} % Allow colors to be defined
     31     \usepackage{enumerate} % Needed for markdown enumerations to work
     32     \usepackage{geometry} % Used to adjust the document margins
     33     \usepackage{amsmath} % Equations
     34     \usepackage{amssymb} % Equations
     35     \usepackage{textcomp} % defines textquotesingle
     36     % Hack from http://tex.stackexchange.com/a/47451/13684:
     37     \AtBeginDocument{%
     38         \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code
     39     }
     40     \usepackage{upquote} % Upright quotes for verbatim code
     41     \usepackage{eurosym} % defines \euro
     42     \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support
     43     \usepackage{fancyvrb} % verbatim replacement that allows latex
     44     \usepackage{grffile} % extends the file name processing of package graphics 
     45                          % to support a larger range
     46     \makeatletter % fix for grffile with XeLaTeX
     47     \def\Gread@@xetex#1{%
     48       \IfFileExists{"\Gin@base".bb}%
     49       {\Gread@eps{\Gin@base.bb}}%
     50       {\Gread@@xetex@aux#1}%
     51     }
     52     \makeatother
     53 
     54     % The hyperref package gives us a pdf with properly built
     55     % internal navigation ('pdf bookmarks' for the table of contents,
     56     % internal cross-reference links, web links for URLs, etc.)
     57     \usepackage{hyperref}
     58     % The default LaTeX title has an obnoxious amount of whitespace. By default,
     59     % titling removes some of it. It also provides customization options.
     60     \usepackage{titling}
     61     \usepackage{longtable} % longtable support required by pandoc >1.10
     62     \usepackage{booktabs}  % table support for pandoc > 1.12.2
     63     \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment)
     64     \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout)
     65                                 % normalem makes italics be italics, not underlines
     66     \usepackage{mathrsfs}
     67     
     68 
     69     
     70     % Colors for the hyperref package
     71     \definecolor{urlcolor}{rgb}{0,.145,.698}
     72     \definecolor{linkcolor}{rgb}{.71,0.21,0.01}
     73     \definecolor{citecolor}{rgb}{.12,.54,.11}
     74 
     75     % ANSI colors
     76     \definecolor{ansi-black}{HTML}{3E424D}
     77     \definecolor{ansi-black-intense}{HTML}{282C36}
     78     \definecolor{ansi-red}{HTML}{E75C58}
     79     \definecolor{ansi-red-intense}{HTML}{B22B31}
     80     \definecolor{ansi-green}{HTML}{00A250}
     81     \definecolor{ansi-green-intense}{HTML}{007427}
     82     \definecolor{ansi-yellow}{HTML}{DDB62B}
     83     \definecolor{ansi-yellow-intense}{HTML}{B27D12}
     84     \definecolor{ansi-blue}{HTML}{208FFB}
     85     \definecolor{ansi-blue-intense}{HTML}{0065CA}
     86     \definecolor{ansi-magenta}{HTML}{D160C4}
     87     \definecolor{ansi-magenta-intense}{HTML}{A03196}
     88     \definecolor{ansi-cyan}{HTML}{60C6C8}
     89     \definecolor{ansi-cyan-intense}{HTML}{258F8F}
     90     \definecolor{ansi-white}{HTML}{C5C1B4}
     91     \definecolor{ansi-white-intense}{HTML}{A1A6B2}
     92     \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF}
     93     \definecolor{ansi-default-inverse-bg}{HTML}{000000}
     94 
     95     % commands and environments needed by pandoc snippets
     96     % extracted from the output of `pandoc -s`
     97     \providecommand{\tightlist}{%
     98       \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
     99     \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
    100     % Add ',fontsize=\small' for more characters per line
    101     \newenvironment{Shaded}{}{}
    102     \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}}
    103     \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}}
    104     \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
    105     \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
    106     \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
    107     \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
    108     \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
    109     \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}}
    110     \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}}
    111     \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}}
    112     \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}}
    113     \newcommand{\RegionMarkerTok}[1]{{#1}}
    114     \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}}
    115     \newcommand{\NormalTok}[1]{{#1}}
    116     
    117     % Additional commands for more recent versions of Pandoc
    118     \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}}
    119     \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
    120     \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
    121     \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}}
    122     \newcommand{\ImportTok}[1]{{#1}}
    123     \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}}
    124     \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
    125     \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
    126     \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}}
    127     \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}}
    128     \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}}
    129     \newcommand{\BuiltInTok}[1]{{#1}}
    130     \newcommand{\ExtensionTok}[1]{{#1}}
    131     \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}}
    132     \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}}
    133     \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
    134     \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}}
    135     
    136     
    137     % Define a nice break command that doesn't care if a line doesn't already
    138     % exist.
    139     \def\br{\hspace*{\fill} \\* }
    140     % Math Jax compatibility definitions
    141     \def\gt{>}
    142     \def\lt{<}
    143     \let\Oldtex\TeX
    144     \let\Oldlatex\LaTeX
    145     \renewcommand{\TeX}{\textrm{\Oldtex}}
    146     \renewcommand{\LaTeX}{\textrm{\Oldlatex}}
    147     % Document parameters
    148     % Document title
    149     \title{Algebra and Cryptography with SageMath}
    150     \date{2021-04-23}
    151     \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}}
    152     
    153     
    154     
    155     
    156     
    157 % Pygments definitions
    158 \makeatletter
    159 \def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax%
    160     \let\PY@ul=\relax \let\PY@tc=\relax%
    161     \let\PY@bc=\relax \let\PY@ff=\relax}
    162 \def\PY@tok#1{\csname PY@tok@#1\endcsname}
    163 \def\PY@toks#1+{\ifx\relax#1\empty\else%
    164     \PY@tok{#1}\expandafter\PY@toks\fi}
    165 \def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{%
    166     \PY@it{\PY@bf{\PY@ff{#1}}}}}}}
    167 \def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}}
    168 
    169 \expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}}
    170 \expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
    171 \expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}}
    172 \expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
    173 \expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
    174 \expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}}
    175 \expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
    176 \expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
    177 \expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
    178 \expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
    179 \expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
    180 \expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
    181 \expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}}
    182 \expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
    183 \expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}}
    184 \expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}}
    185 \expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}}
    186 \expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}}
    187 \expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
    188 \expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
    189 \expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
    190 \expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
    191 \expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}}
    192 \expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}}
    193 \expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}}
    194 \expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
    195 \expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
    196 \expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
    197 \expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
    198 \expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}}
    199 \expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
    200 \expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}}
    201 \expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}}
    202 \expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit}
    203 \expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf}
    204 \expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
    205 \expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}}
    206 \expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
    207 \expandafter\def\csname PY@tok@err\endcsname{\def\PY@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}
    208 \expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
    209 \expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
    210 \expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
    211 \expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
    212 \expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
    213 \expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
    214 \expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
    215 \expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
    216 \expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
    217 \expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
    218 \expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
    219 \expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
    220 \expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
    221 \expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
    222 \expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
    223 \expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
    224 \expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
    225 \expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
    226 \expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
    227 \expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
    228 \expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
    229 \expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
    230 \expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
    231 \expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
    232 \expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
    233 \expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
    234 \expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
    235 \expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
    236 
    237 \def\PYZbs{\char`\\}
    238 \def\PYZus{\char`\_}
    239 \def\PYZob{\char`\{}
    240 \def\PYZcb{\char`\}}
    241 \def\PYZca{\char`\^}
    242 \def\PYZam{\char`\&}
    243 \def\PYZlt{\char`\<}
    244 \def\PYZgt{\char`\>}
    245 \def\PYZsh{\char`\#}
    246 \def\PYZpc{\char`\%}
    247 \def\PYZdl{\char`\$}
    248 \def\PYZhy{\char`\-}
    249 \def\PYZsq{\char`\'}
    250 \def\PYZdq{\char`\"}
    251 \def\PYZti{\char`\~}
    252 % for compatibility with earlier versions
    253 \def\PYZat{@}
    254 \def\PYZlb{[}
    255 \def\PYZrb{]}
    256 \makeatother
    257 
    258 
    259     % For linebreaks inside Verbatim environment from package fancyvrb. 
    260     \makeatletter
    261         \newbox\Wrappedcontinuationbox 
    262         \newbox\Wrappedvisiblespacebox 
    263         \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}} 
    264         \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}} 
    265         \newcommand*\Wrappedcontinuationindent {3ex } 
    266         \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox} 
    267         % Take advantage of the already applied Pygments mark-up to insert 
    268         % potential linebreaks for TeX processing. 
    269         %        {, <, #, %, $, ' and ": go to next line. 
    270         %        _, }, ^, &, >, - and ~: stay at end of broken line. 
    271         % Use of \textquotesingle for straight quote. 
    272         \newcommand*\Wrappedbreaksatspecials {% 
    273             \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}% 
    274             \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}% 
    275             \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}% 
    276             \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}% 
    277             \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}% 
    278             \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}% 
    279             \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}% 
    280             \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}% 
    281             \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}% 
    282             \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}% 
    283             \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}% 
    284             \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}% 
    285             \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}% 
    286             \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}% 
    287         } 
    288         % Some characters . , ; ? ! / are not pygmentized. 
    289         % This macro makes them "active" and they will insert potential linebreaks 
    290         \newcommand*\Wrappedbreaksatpunct {% 
    291             \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}% 
    292             \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}% 
    293             \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}% 
    294             \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}% 
    295             \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}% 
    296             \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}% 
    297             \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}% 
    298             \catcode`\.\active
    299             \catcode`\,\active 
    300             \catcode`\;\active
    301             \catcode`\:\active
    302             \catcode`\?\active
    303             \catcode`\!\active
    304             \catcode`\/\active 
    305             \lccode`\~`\~ 	
    306         }
    307     \makeatother
    308 
    309     \let\OriginalVerbatim=\Verbatim
    310     \makeatletter
    311     \renewcommand{\Verbatim}[1][1]{%
    312         %\parskip\z@skip
    313         \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}%
    314         \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}%
    315         \def\FancyVerbFormatLine ##1{\hsize\linewidth
    316             \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@
    317                 \doublehyphendemerits\z@\finalhyphendemerits\z@
    318                 \strut ##1\strut}%
    319         }%
    320         % If the linebreak is at a space, the latter will be displayed as visible
    321         % space at end of first line, and a continuation symbol starts next line.
    322         % Stretch/shrink are however usually zero for typewriter font.
    323         \def\FV@Space {%
    324             \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font
    325             \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak}
    326             {\kern\fontdimen2\font}%
    327         }%
    328         
    329         % Allow breaks at special characters using \PYG... macros.
    330         \Wrappedbreaksatspecials
    331         % Breaks at punctuation characters . , ; ? ! and / need catcode=\active 	
    332         \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]%
    333     }
    334     \makeatother
    335 
    336     % Exact colors from NB
    337     \definecolor{incolor}{HTML}{303F9F}
    338     \definecolor{outcolor}{HTML}{D84315}
    339     \definecolor{cellborder}{HTML}{CFCFCF}
    340     \definecolor{cellbackground}{HTML}{F7F7F7}
    341     
    342     % prompt
    343     \makeatletter
    344     \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep}
    345     \makeatother
    346     \newcommand{\prompt}[4]{
    347         \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip}
    348     }
    349     
    350 
    351     
    352     % Prevent overflowing lines due to hard-to-break entities
    353     \sloppy 
    354     % Setup hyperref package
    355     \hypersetup{
    356       breaklinks=true,  % so long urls are correctly broken across lines
    357       colorlinks=true,
    358       urlcolor=urlcolor,
    359       linkcolor=linkcolor,
    360       citecolor=citecolor,
    361       }
    362     % Slightly bigger margins than the latex defaults
    363     
    364     \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in}
    365     
    366     
    367 
    368 \begin{document}
    369     
    370     \maketitle
    371     
    372     
    373 
    374     
    375     This lecture's notes are in a different format: the presentations for
    376 the \(\LaTeX\) part were made with \(\LaTeX\), so this one is made with
    377 Sage, or rather with the \href{https://jupyter.org/}{Jupyter Notebook}.
    378 
    379 \hypertarget{the-jupyter-notebook}{%
    380 \section{The Jupyter Notebook}\label{the-jupyter-notebook}}
    381 
    382 \textbf{Reference:} {[}\href{https://jupyter.org/documentation}{1}{]}
    383 
    384 The Jupyter Notebook is one of the default interfaces for SageMath,
    385 along with the command line interface. You can access it via web
    386 browser, but it is running locally on your device (notice the strange
    387 url: \texttt{http://localhost:8888/notebooks...}).
    388 
    389 You can create a new notebook by clicking on
    390 \texttt{New\ \textgreater{}\ SageMath\ 9.2}. You can also create a
    391 Python 3 notebook to write Python code.
    392 
    393 Jupyter saves and reads files in the \texttt{.ipynb} format. If you
    394 download the file for this lecture you can open it and follow the
    395 examples interactively.
    396 
    397 \hypertarget{cells}{%
    398 \subsection{Cells}\label{cells}}
    399 
    400 The notebook contains one or more \emph{interactive cells} that you can
    401 run, like this one below:
    402 
    403     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    404 \prompt{In}{incolor}{2}{\boxspacing}
    405 \begin{Verbatim}[commandchars=\\\{\}]
    406 \PY{c+c1}{\PYZsh{} Exercise: modify this cell to use the print() command}
    407 \PY{l+m+mi}{2}\PY{o}{+}\PY{l+m+mi}{2}
    408 \PY{l+m+mi}{2}\PY{o}{/}\PY{l+m+mi}{5}
    409 \end{Verbatim}
    410 \end{tcolorbox}
    411 
    412             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    413 \prompt{Out}{outcolor}{2}{\boxspacing}
    414 \begin{Verbatim}[commandchars=\\\{\}]
    415 2/5
    416 \end{Verbatim}
    417 \end{tcolorbox}
    418         
    419     If you are reading this from Jupyter rather than from the pdf file, you
    420 can edit the cell above and run it again. You can also add more cells by
    421 selecting \texttt{Insert} from the menu bar.
    422 
    423 Notice that only the last statement produces an output. You can force
    424 anything to be written as output with the \texttt{print()} command,
    425 which works like in Python. As an exercise, try to modify the cell above
    426 to provide more output!
    427 
    428     \hypertarget{markdown}{%
    429 \subsection{Markdown}\label{markdown}}
    430 
    431 \href{https://en.wikipedia.org/wiki/Markdown}{Markdown} is a simple
    432 markup language - think of LaTeX or html, but much simpler. You can add
    433 text to your notebook with Markdown cells by selecting
    434 \texttt{Cell\ \textgreater{}\ Cell\ Type\ \textgreater{}\ Markdown}.
    435 
    436 You can also include some LaTeX code in Markdown cells, with dollar
    437 signs \$ or align environments:
    438 
    439 \begin{align*}
    440 \frac{(x+y)^2}{x+1} = \frac{x^2+y^2}{x+1}
    441 \end{align*}
    442 
    443 When you are done writing a Markdown cell, you can run it to see the
    444 well-formatted text. To edit the text again, double-click on the cell.
    445 Try doing it now to fix the formula above!
    446 
    447     \hypertarget{symbolic-expressions}{%
    448 \section{Symbolic expressions}\label{symbolic-expressions}}
    449 
    450 \textbf{Reference:}
    451 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{2}{]}
    452 
    453 Now, let's get started with Sage. One thing you might want to do is
    454 manipulating symbolic expressions, like the following:
    455 
    456     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    457 \prompt{In}{incolor}{3}{\boxspacing}
    458 \begin{Verbatim}[commandchars=\\\{\}]
    459 \PY{n}{f} \PY{o}{=}  \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x} \PY{o}{\PYZhy{}} \PY{l+m+mi}{5} \PY{o}{==} \PY{l+m+mi}{0}
    460 \PY{n}{solve}\PY{p}{(}\PY{n}{f}\PY{p}{,}\PY{n}{x}\PY{p}{)}
    461 \end{Verbatim}
    462 \end{tcolorbox}
    463 
    464             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    465 \prompt{Out}{outcolor}{3}{\boxspacing}
    466 \begin{Verbatim}[commandchars=\\\{\}]
    467 [x == -sqrt(6) - 1, x == sqrt(6) - 1]
    468 \end{Verbatim}
    469 \end{tcolorbox}
    470         
    471     Notice that the single \texttt{=} is part of an assignment, as in
    472 Python: we are \emph{assigning} to the variable \texttt{f} the value
    473 \texttt{x\^{}2\ +\ 2*x\ -\ 5\ \textgreater{}=\ 0}, which in this case is
    474 an equation, so it contains the symbol \texttt{==}. Keep in mind the
    475 difference between the two!
    476 
    477 \textbf{Exercise:} change the code above to solve the corresponding
    478 inequality \(x^2+2x-5\geq 0\).
    479 
    480     \hypertarget{mathematical-variables}{%
    481 \subsection{Mathematical variables}\label{mathematical-variables}}
    482 
    483 Last time we saw what \emph{variables} are in Python, and that they are
    484 a little bit different from the \emph{Mathematical variables} that you
    485 use in Mathematics. In Sage, both concepts are present, but they are
    486 still distinct. For example in the cell above \texttt{f} is a variable
    487 in the sense of computer science, while \texttt{x} is a Mathematical
    488 variable.
    489 
    490 If you want to use Mathematical variables other than \texttt{x}, you
    491 first need to \emph{declare} them with the \texttt{var()} command:
    492 
    493     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    494 \prompt{In}{incolor}{14}{\boxspacing}
    495 \begin{Verbatim}[commandchars=\\\{\}]
    496 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
    497 \PY{n}{solve}\PY{p}{(}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{p}{(}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{n}{y} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2} \PY{o}{==} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{y}\PY{p}{)}
    498 \end{Verbatim}
    499 \end{tcolorbox}
    500 
    501             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    502 \prompt{Out}{outcolor}{14}{\boxspacing}
    503 \begin{Verbatim}[commandchars=\\\{\}]
    504 [y == -1/2*x - 1/2*sqrt(x\^{}2 + 2*x + 9) - 1/2, y == -1/2*x + 1/2*sqrt(x\^{}2 + 2*x +
    505 9) - 1/2]
    506 \end{Verbatim}
    507 \end{tcolorbox}
    508         
    509     Try removing the first line in the cell above and see what error you
    510 get!
    511 
    512 Here is another example:
    513 
    514     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    515 \prompt{In}{incolor}{16}{\boxspacing}
    516 \begin{Verbatim}[commandchars=\\\{\}]
    517 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{a}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{b}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
    518 \PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{+}\PY{n}{a}\PY{o}{*}\PY{n}{x}\PY{o}{+}\PY{n}{b}
    519 \PY{n}{solve}\PY{p}{(}\PY{n}{f}\PY{p}{,}\PY{n}{x}\PY{p}{)}
    520 \end{Verbatim}
    521 \end{tcolorbox}
    522 
    523             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    524 \prompt{Out}{outcolor}{16}{\boxspacing}
    525 \begin{Verbatim}[commandchars=\\\{\}]
    526 [x == -1/2*a - 1/2*sqrt(a\^{}2 - 4*b), x == -1/2*a + 1/2*sqrt(a\^{}2 - 4*b)]
    527 \end{Verbatim}
    528 \end{tcolorbox}
    529         
    530     Some common constants are
    531 \href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{already
    532 defined} in Sage:
    533 
    534     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    535 \prompt{In}{incolor}{17}{\boxspacing}
    536 \begin{Verbatim}[commandchars=\\\{\}]
    537 \PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{n}{pi}\PY{o}{*}\PY{n}{I}\PY{p}{)}
    538 \end{Verbatim}
    539 \end{tcolorbox}
    540 
    541             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    542 \prompt{Out}{outcolor}{17}{\boxspacing}
    543 \begin{Verbatim}[commandchars=\\\{\}]
    544 -1
    545 \end{Verbatim}
    546 \end{tcolorbox}
    547         
    548     We will study symbolic expressions more in detail next time, in the
    549 context of calculus/analysis.
    550 
    551     \hypertarget{basic-rings-and-fields}{%
    552 \section{Basic rings and fields}\label{basic-rings-and-fields}}
    553 
    554 \textbf{References:}
    555 {[}\href{https://doc.sagemath.org/html/en/reference/rings_standard/index.html}{3}{]}
    556 {[}\href{https://doc.sagemath.org/html/en/reference/rings_numerical/index.html}{4}{]}
    557 {[}\href{https://doc.sagemath.org/html/en/reference/finite_rings/index.html}{5}{]}
    558 
    559 As you should know, a \emph{field} is a Mathematical structure with two
    560 operations, addition and multiplication, which respect certain rules
    561 (distributivity, associativity, commutativity\ldots). Some examples of
    562 fields are the Rational numbers \(\mathbb Q\), the Real numbers
    563 \(\mathbb R\) and the Complex numbers \(\mathbb C\), but there are many
    564 more. As you should also know, a \emph{(commutative) ring} is like a
    565 field, except not all elements different from \(0\) need have a
    566 multiplicative inverse. For example the integers
    567 \(\mathbb Z = \{ \dots, -1, 0, 1, 2, \dots\}\) are a ring, but not a
    568 field.
    569 
    570 These structures are already implemented in Sage. Some of the most
    571 common are listed in the following table:
    572 
    573 \begin{longtable}[]{@{}rcl@{}}
    574 \toprule
    575 Mathematical object & Math symbol & Sage name \\
    576 \midrule
    577 \endhead
    578 Integers & \(\mathbb Z\) & \texttt{ZZ} \\
    579 Rational numbers & \(\mathbb Q\) & \texttt{QQ} \\
    580 Real numbers & \(\mathbb R\) & \texttt{RR} \\
    581 Complex numbers & \(\mathbb C\) & \texttt{CC} \\
    582 Integers modulo \(n\) & \(\mathbb Z/n\mathbb Z\) &
    583 \texttt{Integers(n)} \\
    584 Finite fields & \(\mathbb F_p\) & GF(p) \\
    585 \(\dots\) & \(\dots\) & \(\dots\) \\
    586 \bottomrule
    587 \end{longtable}
    588 
    589     If you write a number or an expression, Sage will figure out where it
    590 ``lives'', choosing the most restrictive interpretation possible. For
    591 example \texttt{3} will be interpreted to be an integer, even if it is
    592 also a rational number, a real number and a complex number.
    593 
    594     \hypertarget{parents-and-coercion}{%
    595 \subsection{Parents and coercion}\label{parents-and-coercion}}
    596 
    597 \textbf{Reference:}
    598 {[}\href{https://doc.sagemath.org/html/en/tutorial/tour_coercion.html}{6}{]}
    599 
    600 You can check where an object ``lives'' with the \texttt{parent()}
    601 command. It works more or less like the Python command \texttt{type()},
    602 but it gives a more Mathematically inclined answer. Check the reference
    603 link {[}6{]} above if you want more details.
    604 
    605     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    606 \prompt{In}{incolor}{18}{\boxspacing}
    607 \begin{Verbatim}[commandchars=\\\{\}]
    608 \PY{c+c1}{\PYZsh{}Edit this cell to find out the type of other objects that we used}
    609 \PY{n}{parent}\PY{p}{(}\PY{l+m+mi}{3}\PY{o}{/}\PY{l+m+mi}{5}\PY{p}{)}
    610 \end{Verbatim}
    611 \end{tcolorbox}
    612 
    613             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    614 \prompt{Out}{outcolor}{18}{\boxspacing}
    615 \begin{Verbatim}[commandchars=\\\{\}]
    616 Rational Field
    617 \end{Verbatim}
    618 \end{tcolorbox}
    619         
    620     Sometimes Sage does not give you the best possible interpretation, so
    621 you can force something to be interpreted as living in a smaller ring as
    622 follows:
    623 
    624     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    625 \prompt{In}{incolor}{4}{\boxspacing}
    626 \begin{Verbatim}[commandchars=\\\{\}]
    627 \PY{n}{minus\PYZus{}one} \PY{o}{=} \PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{n}{pi}\PY{o}{*}\PY{n}{I}\PY{p}{)}
    628 \PY{n}{minus\PYZus{}one\PYZus{}coerced} \PY{o}{=} \PY{n}{ZZ}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{n}{pi}\PY{o}{*}\PY{n}{I}\PY{p}{)}\PY{p}{)}  \PY{c+c1}{\PYZsh{} coercion}
    629 \PY{n+nb}{print}\PY{p}{(}\PY{n}{parent}\PY{p}{(}\PY{n}{minus\PYZus{}one}\PY{p}{)}\PY{p}{)}
    630 \PY{n+nb}{print}\PY{p}{(}\PY{n}{parent}\PY{p}{(}\PY{n}{minus\PYZus{}one\PYZus{}coerced}\PY{p}{)}\PY{p}{)}
    631 \end{Verbatim}
    632 \end{tcolorbox}
    633 
    634     \begin{Verbatim}[commandchars=\\\{\}]
    635 Symbolic Ring
    636 Integer Ring
    637     \end{Verbatim}
    638 
    639     \textbf{Remark.} Notice that there is a fundamental difference between
    640 the rings \texttt{RR} and \texttt{CC} and all the others in the table
    641 above: the real and complex numbers are \emph{approximated}.
    642 
    643     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    644 \prompt{In}{incolor}{1}{\boxspacing}
    645 \begin{Verbatim}[commandchars=\\\{\}]
    646 \PY{n+nb}{print}\PY{p}{(}\PY{n}{QQ}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}
    647 \PY{n+nb}{print}\PY{p}{(}\PY{n}{RR}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}
    648 \end{Verbatim}
    649 \end{tcolorbox}
    650 
    651     \begin{Verbatim}[commandchars=\\\{\}]
    652 3
    653 3.00000000000000
    654     \end{Verbatim}
    655 
    656     You can also choose the precision of this approximation using the
    657 alternative name \texttt{RealField}.
    658 
    659     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    660 \prompt{In}{incolor}{4}{\boxspacing}
    661 \begin{Verbatim}[commandchars=\\\{\}]
    662 \PY{n+nb}{print}\PY{p}{(}\PY{n}{RR}\PY{p}{)}
    663 \PY{n+nb}{print}\PY{p}{(}\PY{n}{RealField}\PY{p}{(}\PY{n}{prec}\PY{o}{=}\PY{l+m+mi}{1000}\PY{p}{)}\PY{p}{)}
    664 \end{Verbatim}
    665 \end{tcolorbox}
    666 
    667     \begin{Verbatim}[commandchars=\\\{\}]
    668 Real Field with 53 bits of precision
    669 Real Field with 1000 bits of precision
    670     \end{Verbatim}
    671 
    672     \hypertarget{polynomial-rings}{%
    673 \section{Polynomial rings}\label{polynomial-rings}}
    674 
    675 \textbf{Reference:}
    676 {[}\href{https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html}{7}{]}
    677 
    678 If you want to work with polynomials over a certain ring it is better to
    679 use this specific construction, rather than the symbolic expressions
    680 introduced above.
    681 
    682     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    683 \prompt{In}{incolor}{5}{\boxspacing}
    684 \begin{Verbatim}[commandchars=\\\{\}]
    685 \PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{,}\PY{n}{z}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{RR}\PY{p}{[}\PY{p}{]}  \PY{c+c1}{\PYZsh{} Alternative: polring.\PYZlt{}x,y,z\PYZgt{} = PolynomialRing(RR)}
    686 \PY{n}{polring}
    687 \end{Verbatim}
    688 \end{tcolorbox}
    689 
    690             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    691 \prompt{Out}{outcolor}{5}{\boxspacing}
    692 \begin{Verbatim}[commandchars=\\\{\}]
    693 Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of
    694 precision
    695 \end{Verbatim}
    696 \end{tcolorbox}
    697         
    698     You can use as many variables as you like, and you can replace
    699 \texttt{RR} with any ring. In the example above \texttt{polring} is just
    700 the name of the variable (in the computer science sense) associated with
    701 this polynomial ring.
    702 
    703 \hypertarget{operations-on-polynomials}{%
    704 \subsection{Operations on polynomials}\label{operations-on-polynomials}}
    705 
    706 The usual Mathematical operations are available on polynomial rings,
    707 including Euclidean division \texttt{//} and remainder \texttt{\%}.
    708 There is also the single-slash division \texttt{/}, but the result may
    709 not be a polynomial anymore.
    710 
    711 \textbf{Exercise:} use the \texttt{parent()} command to find out what
    712 the quotient of two polynomials is.
    713 
    714 \textbf{Question:} what happens if you remove the first line in the cell
    715 below? What if we used the variable \texttt{y} instead of \texttt{x}?
    716 
    717     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    718 \prompt{In}{incolor}{6}{\boxspacing}
    719 \begin{Verbatim}[commandchars=\\\{\}]
    720 \PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{QQ}\PY{p}{[}\PY{p}{]}
    721 \PY{n}{p} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x} \PY{o}{\PYZhy{}} \PY{l+m+mi}{3}   \PY{c+c1}{\PYZsh{} Don\PYZsq{}t forget * for multiplication!}
    722 \PY{n}{q} \PY{o}{=} \PY{n}{p} \PY{o}{/}\PY{o}{/} \PY{p}{(}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{)}
    723 \PY{n}{r} \PY{o}{=} \PY{n}{p} \PY{o}{\PYZpc{}}  \PY{p}{(}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{)}
    724 \PY{n}{f} \PY{o}{=} \PY{n}{p} \PY{o}{/}  \PY{p}{(}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{)}
    725 \PY{n+nb}{print}\PY{p}{(}\PY{n}{q}\PY{p}{)}
    726 \PY{n+nb}{print}\PY{p}{(}\PY{n}{r}\PY{p}{)}
    727 \PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{)}
    728 \end{Verbatim}
    729 \end{tcolorbox}
    730 
    731     \begin{Verbatim}[commandchars=\\\{\}]
    732 x + 1
    733 -4
    734 (x\^{}2 + 2*x - 3)/(x + 1)
    735     \end{Verbatim}
    736 
    737     You can do more complex operations. Try out \texttt{roots()} and
    738 \texttt{factor} in the cell below.
    739 
    740 \textbf{Remark.} Notice how the result can change substantially if you
    741 change the base ring.
    742 
    743 \textbf{Remark.}
    744 \href{https://doc.sagemath.org/html/en/reference/structure/sage/structure/factorization.html}{Factorizations}
    745 are a particular object in Sage. They are kinda like a list, but not
    746 really. You can get a list of pairs (factor, power) with
    747 \texttt{list(factor(f))}.
    748 
    749     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    750 \prompt{In}{incolor}{7}{\boxspacing}
    751 \begin{Verbatim}[commandchars=\\\{\}]
    752 \PY{n}{polring\PYZus{}onevar}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{t}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{QQ}\PY{p}{[}\PY{p}{]}
    753 
    754 \PY{n}{f} \PY{o}{=} \PY{n}{t}\PY{o}{\PYZca{}}\PY{l+m+mi}{5} \PY{o}{+} \PY{n}{t}\PY{o}{\PYZca{}}\PY{l+m+mi}{4} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{t}\PY{o}{\PYZca{}}\PY{l+m+mi}{3} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{t}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{l+m+mi}{3}\PY{o}{*}\PY{n}{t} \PY{o}{\PYZhy{}} \PY{l+m+mi}{3}
    755 \PY{n+nb}{print}\PY{p}{(}\PY{n}{factor}\PY{p}{(}\PY{n}{f}\PY{p}{)}\PY{p}{)}
    756 \PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{roots}\PY{p}{(}\PY{p}{)}\PY{p}{)}  \PY{c+c1}{\PYZsh{} Result: list of pairs (root,multiplicity)}
    757 
    758 \PY{n}{polring\PYZus{}manyvar}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{,}\PY{n}{z}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{QQ}\PY{p}{[}\PY{p}{]}
    759 \PY{n}{factor}\PY{p}{(}\PY{n}{x}\PY{o}{*}\PY{n}{y}\PY{o}{+}\PY{n}{x}\PY{p}{)}
    760 
    761 \PY{c+c1}{\PYZsh{} The following line gives an error, because the polynomial}
    762 \PY{c+c1}{\PYZsh{} is understood to possibly have many variables:}
    763 \PY{c+c1}{\PYZsh{}(x\PYZca{}2\PYZhy{}1).roots()}
    764 \end{Verbatim}
    765 \end{tcolorbox}
    766 
    767     \begin{Verbatim}[commandchars=\\\{\}]
    768 (t + 1) * (t\^{}2 - 3) * (t\^{}2 + 1)
    769 [(-1, 1)]
    770     \end{Verbatim}
    771 
    772             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    773 \prompt{Out}{outcolor}{7}{\boxspacing}
    774 \begin{Verbatim}[commandchars=\\\{\}]
    775 (y + 1) * x
    776 \end{Verbatim}
    777 \end{tcolorbox}
    778         
    779     \hypertarget{matrices-and-vectors}{%
    780 \section{Matrices and vectors}\label{matrices-and-vectors}}
    781 
    782 \textbf{References:}
    783 {[}\href{https://doc.sagemath.org/html/en/reference/matrices/index.html}{8}{]},
    784 but in particular the subections
    785 {[}\href{https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/docs.html}{9}{]}
    786 and
    787 {[}\href{https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/matrix2.html}{10}{]}
    788 
    789 In Sage you can easily manipulate matrices and vectors
    790 
    791     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    792 \prompt{In}{incolor}{77}{\boxspacing}
    793 \begin{Verbatim}[commandchars=\\\{\}]
    794 \PY{n}{A} \PY{o}{=} \PY{n}{matrix}\PY{p}{(}\PY{p}{[}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{]}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{4}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{22}\PY{o}{/}\PY{l+m+mi}{7}\PY{p}{]}\PY{p}{]}\PY{p}{)}
    795 \PY{n}{B} \PY{o}{=} \PY{n}{matrix}\PY{p}{(}\PY{p}{[}\PY{p}{[}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{7}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{]}\PY{p}{)}
    796 \PY{n}{v} \PY{o}{=} \PY{n}{vector}\PY{p}{(}\PY{p}{[}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{)}
    797 
    798 \PY{n+nb}{print}\PY{p}{(}\PY{n}{A}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}  \PY{c+c1}{\PYZsh{} \PYZbs{}n just means \PYZdq{}newline\PYZdq{}}
    799 \PY{n+nb}{print}\PY{p}{(}\PY{n}{B}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
    800 \PY{n+nb}{print}\PY{p}{(}\PY{n}{B}\PY{o}{*}\PY{n}{v}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
    801 \PY{n+nb}{print}\PY{p}{(}\PY{n}{A}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{B} \PY{o}{\PYZhy{}} \PY{n}{A}\PY{o}{*}\PY{n}{B}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
    802 
    803 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Rank of A =}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{rank}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{p}{)} \PY{c+c1}{\PYZsh{} You can also use A.rank()}
    804 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Rank of B =}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{rank}\PY{p}{(}\PY{n}{B}\PY{p}{)}\PY{p}{)}
    805 \end{Verbatim}
    806 \end{tcolorbox}
    807 
    808     \begin{Verbatim}[commandchars=\\\{\}]
    809 [   1    2    3]
    810 [   0    0    1]
    811 [   4   -3 22/7]
    812 
    813 [1/2   0   0]
    814 [  7   0   0]
    815 [  1   1   1]
    816 
    817 (3/2, 21, 6)
    818 
    819 [  -7/2    -10   80/7]
    820 [    17     -4   15/7]
    821 [ 241/7  -18/7 869/49]
    822 
    823 Rank of A = 3
    824 Rank of B = 2
    825     \end{Verbatim}
    826 
    827     \textbf{Exercise:} in the cell above, compute the determinant, inverse
    828 and characteristic polynomial of the matrix \texttt{A}. \emph{Hint: look
    829 at the reference {[}10{]} above (the functions are listed in alphabetic
    830 order).}
    831 
    832 As for polynomials, you can specify where a matrix or a vector lives
    833 
    834     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    835 \prompt{In}{incolor}{57}{\boxspacing}
    836 \begin{Verbatim}[commandchars=\\\{\}]
    837 \PY{n}{M} \PY{o}{=} \PY{n}{matrix}\PY{p}{(}\PY{n}{CC}\PY{p}{,} \PY{p}{[}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{]}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{]}\PY{p}{)}
    838 \PY{n}{parent}\PY{p}{(}\PY{n}{M}\PY{p}{)}
    839 \end{Verbatim}
    840 \end{tcolorbox}
    841 
    842             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    843 \prompt{Out}{outcolor}{57}{\boxspacing}
    844 \begin{Verbatim}[commandchars=\\\{\}]
    845 Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of
    846 precision
    847 \end{Verbatim}
    848 \end{tcolorbox}
    849         
    850     You can also solve linear systems and compute eigenvalues and
    851 eigenvectors of a matrix
    852 
    853 \textbf{Warning.} In linear algebra there are distinct concepts of
    854 \emph{left} and \emph{right} eigenvalues (and eigenvector). The one you
    855 know is probably that of \textbf{right} eigen-\{value,vector\}, that is
    856 an element \(\lambda\) of the base field and a non-zero vector
    857 \(\mathbf v\) with \(A\mathbf v=\lambda\mathbf v\). The other concept
    858 corresponds to the equality \(\mathbf v^TA=\lambda \mathbf v\).
    859 
    860     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    861 \prompt{In}{incolor}{60}{\boxspacing}
    862 \begin{Verbatim}[commandchars=\\\{\}]
    863 \PY{n}{A} \PY{o}{=} \PY{n}{Matrix}\PY{p}{(}\PY{n}{RR}\PY{p}{,} \PY{p}{[}\PY{p}{[}\PY{n}{sqrt}\PY{p}{(}\PY{l+m+mi}{59}\PY{p}{)}\PY{p}{,}\PY{l+m+mi}{32}\PY{p}{]}\PY{p}{,}\PY{p}{[}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{o}{/}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{]}\PY{p}{]}\PY{p}{)}
    864 \PY{n}{v} \PY{o}{=} \PY{n}{vector}\PY{p}{(}\PY{n}{RR}\PY{p}{,} \PY{p}{[}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{]}\PY{p}{)}
    865 \PY{n}{A}\PY{o}{.}\PY{n}{solve\PYZus{}right}\PY{p}{(}\PY{n}{v}\PY{p}{)} \PY{c+c1}{\PYZsh{} Solve Ax=v. Alternative: A \PYZbs{} v}
    866 \end{Verbatim}
    867 \end{tcolorbox}
    868 
    869             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    870 \prompt{Out}{outcolor}{60}{\boxspacing}
    871 \begin{Verbatim}[commandchars=\\\{\}]
    872 (0.289916349448506, 0.0241596957873755)
    873 \end{Verbatim}
    874 \end{tcolorbox}
    875         
    876     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    877 \prompt{In}{incolor}{64}{\boxspacing}
    878 \begin{Verbatim}[commandchars=\\\{\}]
    879 \PY{n}{A} \PY{o}{=} \PY{n}{Matrix}\PY{p}{(}\PY{n}{QQ}\PY{p}{,} \PY{p}{[}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{]}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{]}\PY{p}{]}\PY{p}{)}
    880 \PY{n}{A}\PY{o}{.}\PY{n}{eigenspaces\PYZus{}right}\PY{p}{(}\PY{p}{)} \PY{c+c1}{\PYZsh{} Also: A.eigenvalues(), A.eigenvectors\PYZus{}right()}
    881 \end{Verbatim}
    882 \end{tcolorbox}
    883 
    884             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
    885 \prompt{Out}{outcolor}{64}{\boxspacing}
    886 \begin{Verbatim}[commandchars=\\\{\}]
    887 [
    888 (-0.3722813232690144?, Vector space of degree 2 and dimension 1 over Algebraic
    889 Field
    890 User basis matrix:
    891 [                   1 -0.6861406616345072?]),
    892 (5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic
    893 Field
    894 User basis matrix:
    895 [                 1 2.186140661634508?])
    896 ]
    897 \end{Verbatim}
    898 \end{tcolorbox}
    899         
    900     We can also extract a specific submatrix by selecting only some rows and
    901 columns, with a syntax similar to that of Python's lists. Check out more
    902 examples in the reference {[}9{]} above, and try them in the cell below.
    903 
    904     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    905 \prompt{In}{incolor}{94}{\boxspacing}
    906 \begin{Verbatim}[commandchars=\\\{\}]
    907 \PY{n}{A} \PY{o}{=} \PY{n}{MatrixSpace}\PY{p}{(}\PY{n}{ZZ}\PY{p}{,} \PY{l+m+mi}{7}\PY{p}{)}\PY{o}{.}\PY{n}{random\PYZus{}element}\PY{p}{(}\PY{p}{)}
    908 \PY{n+nb}{print}\PY{p}{(}\PY{n}{A}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
    909 \PY{n+nb}{print}\PY{p}{(}\PY{n}{A}\PY{p}{[}\PY{l+m+mi}{1}\PY{p}{:}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{:}\PY{l+m+mi}{5}\PY{p}{]}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} \PY{c+c1}{\PYZsh{} Rows from 1 to 3, columns from 2 to 5}
    910 \PY{n+nb}{print}\PY{p}{(}\PY{n}{A}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{:}\PY{p}{]}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}    \PY{c+c1}{\PYZsh{} First row, all columns}
    911 \PY{n+nb}{print}\PY{p}{(}\PY{n}{A}\PY{p}{[}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{]}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{:}\PY{l+m+mi}{5}\PY{p}{]}\PY{p}{)}   \PY{c+c1}{\PYZsh{} Rows 0, 5 and 2 (in this order) and columns 0 to 5}
    912 \end{Verbatim}
    913 \end{tcolorbox}
    914 
    915     \begin{Verbatim}[commandchars=\\\{\}]
    916 [-14   2   0  -1   1  -2  -1]
    917 [  0  -8   0   9  -2  11   1]
    918 [  0   3   1  -1   1   1 221]
    919 [ -1   2   1 -25 -10   4   0]
    920 [ -3   0   0   2  16  -1  -2]
    921 [  1  -3   3 -41   1   0   0]
    922 [ -2   1   0   0  -6   2  12]
    923 
    924 [ 0  9 -2]
    925 [ 1 -1  1]
    926 
    927 [-14   2   0  -1   1  -2  -1]
    928 
    929 [-14   2   0  -1   1]
    930 [  1  -3   3 -41   1]
    931 [  0   3   1  -1   1]
    932     \end{Verbatim}
    933 
    934     \textbf{Exercise:} write a sage function that computes the determinant
    935 of an \(n\times n\) matrix \(A=(a_{ij})\) using Laplace's rule by the
    936 first row, that is \begin{align*}
    937     \operatorname{det}A = \sum_{j=1}^n (-1)^ja_{0j}M_{0j}
    938 \end{align*} where \(M_{0j}\) is the determinant of the
    939 \((n-1)\times(n-1)\) matrix obtained by removing the \(0\)-th row and
    940 the \(j\)-th column from \(A\).
    941 
    942     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    943 \prompt{In}{incolor}{91}{\boxspacing}
    944 \begin{Verbatim}[commandchars=\\\{\}]
    945 \PY{k}{def} \PY{n+nf}{my\PYZus{}det}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{p}{:}
    946     \PY{k}{if} \PY{o+ow}{not} \PY{n}{A}\PY{o}{.}\PY{n}{is\PYZus{}square}\PY{p}{(}\PY{p}{)}\PY{p}{:}
    947         \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Error: matrix is not square}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
    948     
    949     \PY{n}{n} \PY{o}{=} \PY{n}{A}\PY{o}{.}\PY{n}{nrows}\PY{p}{(}\PY{p}{)}  \PY{c+c1}{\PYZsh{} size of the matrix}
    950     
    951     \PY{c+c1}{\PYZsh{} Continue from here!}
    952 \end{Verbatim}
    953 \end{tcolorbox}
    954 
    955     \hypertarget{number-theory}{%
    956 \section{Number Theory}\label{number-theory}}
    957 
    958 \textbf{Reference:}
    959 {[}\href{https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html}{11}{]}
    960 
    961 Sage includes a large library of functions for computing with the
    962 integers, see the link above.
    963 
    964     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
    965 \prompt{In}{incolor}{8}{\boxspacing}
    966 \begin{Verbatim}[commandchars=\\\{\}]
    967 \PY{n}{n} \PY{o}{=} \PY{l+m+mi}{123456789}
    968 \PY{n}{m} \PY{o}{=} \PY{l+m+mi}{987654321}
    969 \PY{n}{p} \PY{o}{=} \PY{l+m+mi}{3607}
    970 
    971 \PY{n+nb}{print}\PY{p}{(}\PY{n}{factor}\PY{p}{(}\PY{n}{n}\PY{p}{)}\PY{p}{)}
    972 \PY{n+nb}{print}\PY{p}{(}\PY{n}{is\PYZus{}prime}\PY{p}{(}\PY{n}{p}\PY{p}{)}\PY{p}{)}
    973 \PY{n+nb}{print}\PY{p}{(}\PY{n}{p}\PY{o}{.}\PY{n}{divides}\PY{p}{(}\PY{n}{n}\PY{p}{)}\PY{p}{)}
    974 \PY{n+nb}{print}\PY{p}{(}\PY{n}{euler\PYZus{}phi}\PY{p}{(}\PY{n}{m}\PY{p}{)}\PY{p}{)}
    975 \PY{n+nb}{print}\PY{p}{(}\PY{n}{gcd}\PY{p}{(}\PY{n}{n}\PY{p}{,} \PY{n}{m}\PY{p}{)}\PY{p}{)}
    976 \PY{n+nb}{print}\PY{p}{(}\PY{n}{lcm}\PY{p}{(}\PY{n}{n}\PY{p}{,} \PY{n}{m}\PY{p}{)}\PY{p}{)}
    977 \end{Verbatim}
    978 \end{tcolorbox}
    979 
    980     \begin{Verbatim}[commandchars=\\\{\}]
    981 3\^{}2 * 3607 * 3803
    982 True
    983 True
    984 619703040
    985 9
    986 13548070123626141
    987     \end{Verbatim}
    988 
    989     \hypertarget{primes}{%
    990 \subsection{Primes}\label{primes}}
    991 
    992 \textbf{Reference:}
    993 {[}\href{https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html}{12}{]}
    994 
    995 The set of prime numbers is called \texttt{Primes()}. It is like an
    996 infinite list: for example you can get the one-millionth prime number or
    997 you can use this list to create other lists. You can also check what the
    998 first prime number larger than a given number is.
    999 
   1000     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
   1001 \prompt{In}{incolor}{9}{\boxspacing}
   1002 \begin{Verbatim}[commandchars=\\\{\}]
   1003 \PY{n}{PP} \PY{o}{=} \PY{n}{Primes}\PY{p}{(}\PY{p}{)}
   1004 \PY{n+nb}{print}\PY{p}{(}\PY{n}{PP}\PY{p}{)}
   1005 \PY{n+nb}{print}\PY{p}{(}\PY{n}{PP}\PY{p}{[}\PY{l+m+mi}{10}\PY{p}{]}\PY{p}{,} \PY{n}{PP}\PY{p}{[}\PY{l+m+mi}{10}\PY{o}{\PYZca{}}\PY{l+m+mi}{6}\PY{p}{]}\PY{p}{)}
   1006 \PY{n+nb}{print}\PY{p}{(}\PY{n}{PP}\PY{o}{.}\PY{n}{next}\PY{p}{(}\PY{l+m+mi}{44}\PY{p}{)}\PY{p}{)}
   1007 
   1008 \PY{n}{First\PYZus{}Thousand\PYZus{}Primes} \PY{o}{=} \PY{n}{PP}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{:}\PY{l+m+mi}{1000}\PY{p}{]}
   1009 \PY{n+nb}{print}\PY{p}{(}\PY{p}{[}\PY{n}{p} \PY{k}{for} \PY{n}{p} \PY{o+ow}{in} \PY{n}{First\PYZus{}Thousand\PYZus{}Primes} \PY{k}{if} \PY{n}{p} \PY{o}{\PYZlt{}} \PY{l+m+mi}{100} \PY{o+ow}{and} \PY{n}{p} \PY{o}{\PYZgt{}} \PY{l+m+mi}{75}\PY{p}{]}\PY{p}{)}
   1010 \end{Verbatim}
   1011 \end{tcolorbox}
   1012 
   1013     \begin{Verbatim}[commandchars=\\\{\}]
   1014 Set of all prime numbers: 2, 3, 5, 7, {\ldots}
   1015 31 15485867
   1016 47
   1017 [79, 83, 89, 97]
   1018     \end{Verbatim}
   1019 
   1020     \hypertarget{the-chinese-remainder-theorem-crt}{%
   1021 \subsection{The Chinese remainder theorem
   1022 (CRT)}\label{the-chinese-remainder-theorem-crt}}
   1023 
   1024 We say that two integers \(a\) and \(b\) are \emph{congruent} modulo
   1025 another integer \(n>0\) if they have the same remainder when divided by
   1026 \(n\). We denote this by \(a\equiv b\pmod n\), or in Python/Sage syntax
   1027 \texttt{a\ \%\ n\ ==\ b\ \%\ n}.
   1028 
   1029 The Chinese remainder theorem states that if \(a,b\in\mathbb Z\) and
   1030 \(n,m\in \mathbb Z_{>0}\) are such that \(\gcd(n,m)=1\) then the system
   1031 of congruences
   1032 
   1033 \begin{align*}
   1034 \begin{cases}
   1035     x \equiv a \pmod n\\
   1036     x \equiv b \pmod m
   1037 \end{cases}
   1038 \end{align*}
   1039 
   1040 has exactly one solution modulo \(mn\). This means that there is one and
   1041 only one number \(x\) with \(0\leq x<mn\) such that \(x\equiv a\pmod n\)
   1042 and \(x\equiv b\pmod m\).
   1043 
   1044 The procedure to find such a number is not too hard to describe (you
   1045 might see it in an algebra or number theory course), but it can be a bit
   1046 long. Luckily, Sage can do this for you:
   1047 
   1048     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
   1049 \prompt{In}{incolor}{10}{\boxspacing}
   1050 \begin{Verbatim}[commandchars=\\\{\}]
   1051 \PY{n}{a} \PY{o}{=} \PY{l+m+mi}{2}
   1052 \PY{n}{b} \PY{o}{=} \PY{o}{\PYZhy{}}\PY{l+m+mi}{1}
   1053 \PY{n}{n} \PY{o}{=} \PY{l+m+mi}{172}
   1054 \PY{n}{m} \PY{o}{=} \PY{l+m+mi}{799}
   1055 
   1056 \PY{k}{if} \PY{n}{gcd}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{n}{m}\PY{p}{)} \PY{o}{!=} \PY{l+m+mi}{1}\PY{p}{:}
   1057     \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{The numbers are not comprime, I can}\PY{l+s+s2}{\PYZsq{}}\PY{l+s+s2}{t solve this!}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
   1058 \PY{k}{else}\PY{p}{:}
   1059     \PY{n}{x} \PY{o}{=} \PY{n}{crt}\PY{p}{(}\PY{n}{a}\PY{p}{,} \PY{n}{b}\PY{p}{,} \PY{n}{n}\PY{p}{,} \PY{n}{m}\PY{p}{)}
   1060     \PY{n+nb}{print}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{x}\PY{o}{\PYZpc{}}\PY{k}{n}, x\PYZpc{}m)
   1061 \end{Verbatim}
   1062 \end{tcolorbox}
   1063 
   1064     \begin{Verbatim}[commandchars=\\\{\}]
   1065 74306 2 798
   1066     \end{Verbatim}
   1067 
   1068     \textbf{Exercise.} There is a more general version of the Chinese
   1069 remainder theorem which says that if
   1070 \(a_0, a_1, \dots, a_k\in\mathbb Z\) and
   1071 \(n_0, n_2, \dots, n_k\in\mathbb Z_{>0}\) are such that
   1072 \(\gcd(n_i, n_j)=1\) for \(i\neq j\), then the system of congruences
   1073 
   1074 \begin{align*}
   1075 \begin{cases}
   1076     x \equiv a_0 \pmod {n_0}\\
   1077     x \equiv a_1 \pmod {n_1}\\
   1078     \dots \\
   1079     x \equiv a_k \pmod {n_k}
   1080 \end{cases}
   1081 \end{align*}
   1082 
   1083 has exactly one solution modulo \(\prod_{i=0}^kn_i\). Use the
   1084 \texttt{crt()} function to find a solution to such a system. *Hint:
   1085 start by running the command \texttt{help(crt)}.
   1086 
   1087     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
   1088 \prompt{In}{incolor}{127}{\boxspacing}
   1089 \begin{Verbatim}[commandchars=\\\{\}]
   1090 \PY{c+c1}{\PYZsh{}help(crt)}
   1091 \end{Verbatim}
   1092 \end{tcolorbox}
   1093 
   1094     \hypertarget{cryptography-rsa}{%
   1095 \section{Cryptography: RSA}\label{cryptography-rsa}}
   1096 
   1097 \href{https://en.wikipedia.org/wiki/Cryptography}{Cryptography} is the
   1098 discipline that studies methods to communicate secrets in such a way
   1099 that any unauthorized listener would not be able to understand the
   1100 message.
   1101 
   1102 A simple cryptographic protocol could be changing every letter of your
   1103 text following a fixed scheme (or \emph{cypher}), for example by turning
   1104 every A into a B, every B into a C and so on. However this is not a very
   1105 secure method, for many reasons. One of them is that at some point the
   1106 people who want to communicate need to agree on what method to use, and
   1107 anyone listening to that conversation would be able to decypher every
   1108 subsequent conversation. A public-key cryptographic protocol solves this
   1109 problem.
   1110 
   1111 \hypertarget{public-key-cryptography}{%
   1112 \subsection{Public-key cryptography}\label{public-key-cryptography}}
   1113 
   1114 Public-key cryptographic protocols, such as RSA, work like this: there
   1115 are two keys, a \emph{private} key that is only known to person A
   1116 (traditionally called Alice in every example), and a \emph{public} key
   1117 that does not need to be secret.
   1118 
   1119 The public key is used to \emph{encrypt} the message (that is to
   1120 ``lock'' it, or ``hyde'' it), but one needs the private key to
   1121 \emph{decrypt} it. Imagine having two keys for your door, but one can
   1122 only be used to lock it, while the other only to open it.
   1123 
   1124 The message exchange works like this: suppose that person B (Bob) wants
   1125 to send a secret message to Alice. Then Alice secretely generates a
   1126 private and a public key and sends only the public one to Bob. Now Bob
   1127 encrypts the message and sends it to Alice, who can use her private key
   1128 to decrypt it. Even if Eve (short for \emph{eavesdropper}, an
   1129 unauthorized listener) listens to every message exchanged, she won't be
   1130 able to decypher the secret: the private key has never left Alice's
   1131 house!
   1132 
   1133 Notice that such a protocol is \emph{asymmetric}: if Alice wanted to
   1134 send a secret to Bob in reply, Bob would need to generate a pair of keys
   1135 of his own.
   1136 
   1137 Let's see how we can do this in practice, using number theory!
   1138 
   1139 \hypertarget{rsa}{%
   1140 \subsection{RSA}\label{rsa}}
   1141 
   1142 As many other cryptography protocols, RSA is based on a Mathematical
   1143 process that is easy to do in one direction, but very hard to invert. In
   1144 this case the hard process is integer factorization, that is decomposing
   1145 an integer number as a product of primes.
   1146 
   1147     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
   1148 \prompt{In}{incolor}{2}{\boxspacing}
   1149 \begin{Verbatim}[commandchars=\\\{\}]
   1150 \PY{n}{p} \PY{o}{=} \PY{l+m+mi}{100003100019100043100057100069}
   1151 \PY{n}{q} \PY{o}{=} \PY{l+m+mi}{100144655312449572059845328443}
   1152 \PY{n}{n} \PY{o}{=} \PY{n}{p}\PY{o}{*}\PY{n}{q}
   1153 \PY{n+nb}{print}\PY{p}{(}\PY{n}{is\PYZus{}prime}\PY{p}{(}\PY{n}{p}\PY{p}{)}\PY{p}{,} \PY{n}{is\PYZus{}prime}\PY{p}{(}\PY{n}{q}\PY{p}{)}\PY{p}{,} \PY{n}{is\PYZus{}prime}\PY{p}{(}\PY{n}{p}\PY{o}{*}\PY{n}{q}\PY{p}{)}\PY{p}{)}
   1154 
   1155 \PY{c+c1}{\PYZsh{} Use the command below to see how long it takes}
   1156 \PY{c+c1}{\PYZsh{}timeit(\PYZdq{}factor(n)\PYZdq{}, number=1, repeat=1)}
   1157 \end{Verbatim}
   1158 \end{tcolorbox}
   1159 
   1160     \begin{Verbatim}[commandchars=\\\{\}]
   1161 True True False
   1162     \end{Verbatim}
   1163 
   1164     In order to generate the keys, Alice picks a number \(n\) which is the
   1165 product of two large primes \(p\) and \(q\) of more or less the same
   1166 size. Finding such primes is relatively easy compared to factoring the
   1167 number \(n\) she obtained. Then she computes the Euler totient
   1168 \(\varphi(n)=(p-1)(q-1)\) of \(n\), which she can do because she knows
   1169 that \(n=pq\) - it would be impossible otherwise!
   1170 
   1171 Then Alice can compute two integers \((d,e)\) such that
   1172 \(de\equiv 1\pmod{\varphi(n)}\). She will send the numbers \(n\) and
   1173 \(d\) to Bob and keep \(e\) secret. In this case the public key is the
   1174 pair \((n,d)\), while \(e\) is the private key.
   1175 
   1176 Of course, she does all of this using Sage!
   1177 
   1178     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
   1179 \prompt{In}{incolor}{105}{\boxspacing}
   1180 \begin{Verbatim}[commandchars=\\\{\}]
   1181 \PY{k}{def} \PY{n+nf}{two\PYZus{}large\PYZus{}primes}\PY{p}{(}\PY{p}{)}\PY{p}{:}
   1182     \PY{n}{p}\PY{p}{,} \PY{n}{q} \PY{o}{=} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}
   1183     \PY{c+c1}{\PYZsh{} We make sure that they are different}
   1184     \PY{k}{while} \PY{n}{p} \PY{o}{==} \PY{n}{q}\PY{p}{:}
   1185         \PY{n}{p} \PY{o}{=} \PY{n}{Primes}\PY{p}{(}\PY{p}{)}\PY{p}{[}\PY{n}{randint}\PY{p}{(}\PY{l+m+mi}{10}\PY{o}{\PYZca{}}\PY{l+m+mi}{6}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{l+m+mi}{10}\PY{o}{\PYZca{}}\PY{l+m+mi}{6}\PY{p}{)}\PY{p}{]}
   1186         \PY{n}{q} \PY{o}{=} \PY{n}{Primes}\PY{p}{(}\PY{p}{)}\PY{p}{[}\PY{n}{randint}\PY{p}{(}\PY{l+m+mi}{10}\PY{o}{\PYZca{}}\PY{l+m+mi}{6}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{l+m+mi}{10}\PY{o}{\PYZca{}}\PY{l+m+mi}{6}\PY{p}{)}\PY{p}{]}
   1187     \PY{k}{return} \PY{n}{p}\PY{p}{,} \PY{n}{q}
   1188 
   1189 \PY{k}{def} \PY{n+nf}{random\PYZus{}unit\PYZus{}mod}\PY{p}{(}\PY{n}{N}\PY{p}{)}\PY{p}{:}
   1190     \PY{n}{R} \PY{o}{=} \PY{n}{Integers}\PY{p}{(}\PY{n}{N}\PY{p}{)}
   1191     \PY{n}{d} \PY{o}{=} \PY{n}{R}\PY{p}{(}\PY{l+m+mi}{0}\PY{p}{)}
   1192     \PY{c+c1}{\PYZsh{} We make sure that it is invertible}
   1193     \PY{k}{while} \PY{o+ow}{not} \PY{n}{d}\PY{o}{.}\PY{n}{is\PYZus{}unit}\PY{p}{(}\PY{p}{)}\PY{p}{:}
   1194         \PY{n}{d} \PY{o}{=} \PY{n}{R}\PY{o}{.}\PY{n}{random\PYZus{}element}\PY{p}{(}\PY{p}{)}
   1195     \PY{k}{return} \PY{n}{d}
   1196 
   1197 \PY{k}{def} \PY{n+nf}{Alice\PYZus{}generate\PYZus{}keys}\PY{p}{(}\PY{p}{)}\PY{p}{:}
   1198     \PY{n}{p}\PY{p}{,} \PY{n}{q} \PY{o}{=} \PY{n}{two\PYZus{}large\PYZus{}primes}\PY{p}{(}\PY{p}{)}
   1199     \PY{n}{n} \PY{o}{=} \PY{n}{p}\PY{o}{*}\PY{n}{q}
   1200     \PY{n}{phi\PYZus{}n} \PY{o}{=} \PY{p}{(}\PY{n}{p}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{*}\PY{p}{(}\PY{n}{q}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{)} \PY{c+c1}{\PYZsh{} euler\PYZus{}phi(n) is slow!}
   1201     
   1202     \PY{n}{d} \PY{o}{=} \PY{n}{random\PYZus{}unit\PYZus{}mod}\PY{p}{(}\PY{n}{phi\PYZus{}n}\PY{p}{)}
   1203     \PY{n}{e} \PY{o}{=} \PY{n}{d}\PY{o}{\PYZca{}}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}
   1204     \PY{k}{return} \PY{n}{n}\PY{p}{,} \PY{n}{d}\PY{p}{,} \PY{n}{e}
   1205 
   1206 \PY{n}{Alice\PYZus{}generate\PYZus{}keys}\PY{p}{(}\PY{p}{)}
   1207 \end{Verbatim}
   1208 \end{tcolorbox}
   1209 
   1210             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
   1211 \prompt{Out}{outcolor}{105}{\boxspacing}
   1212 \begin{Verbatim}[commandchars=\\\{\}]
   1213 (419199544978969, 235530823946467, 80799425863927)
   1214 \end{Verbatim}
   1215 \end{tcolorbox}
   1216         
   1217     Now, how does Bob encrypt his message? Let's say he wants to send to
   1218 Alice the number \(m\) with \(1<m<n\) (In practice he would like to send
   1219 her some text with emojis, or maybe a voice message; but for computers
   1220 everything is a number, and there are different ways to translate any
   1221 sort of information to a number. He just chooses one of the many
   1222 standard methods that already exist, no cryptography is needed in this
   1223 step. If the message \(m\) is too long, he can split it up in some
   1224 pieces and repeat the process multiple times.)
   1225 
   1226 Now he computes \(m^d\pmod n\) and sends it back to Alice.
   1227 
   1228     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
   1229 \prompt{In}{incolor}{3}{\boxspacing}
   1230 \begin{Verbatim}[commandchars=\\\{\}]
   1231 \PY{k}{def} \PY{n+nf}{Bob\PYZus{}encrypt}\PY{p}{(}\PY{n}{m}\PY{p}{,} \PY{n}{n}\PY{p}{,} \PY{n}{d}\PY{p}{)}\PY{p}{:}
   1232     \PY{n}{R} \PY{o}{=} \PY{n}{Integers}\PY{p}{(}\PY{n}{n}\PY{p}{)}
   1233     \PY{k}{return} \PY{n}{R}\PY{p}{(}\PY{n}{m}\PY{p}{)}\PY{o}{\PYZca{}}\PY{n}{d}  \PY{c+c1}{\PYZsh{} Assume that n is large enough}
   1234     
   1235 \PY{n}{message} \PY{o}{=} \PY{l+m+mi}{42424242}
   1236 \PY{n}{Bob\PYZus{}encrypt}\PY{p}{(}\PY{n}{message}\PY{p}{,} \PY{l+m+mi}{419199544978969}\PY{p}{,} \PY{l+m+mi}{235530823946467}\PY{p}{)}
   1237 \end{Verbatim}
   1238 \end{tcolorbox}
   1239 
   1240             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
   1241 \prompt{Out}{outcolor}{3}{\boxspacing}
   1242 \begin{Verbatim}[commandchars=\\\{\}]
   1243 149461597163501
   1244 \end{Verbatim}
   1245 \end{tcolorbox}
   1246         
   1247     Since \(de\equiv 1\pmod{\varphi(n)}\), it follows that
   1248 \((m^d)^e\equiv m\pmod n\) (see
   1249 \href{https://en.wikipedia.org/wiki/Euler\%27s_theorem}{Wikipedia:
   1250 Euler's theorem}). So for Alice it is very easy to get back the original
   1251 message:
   1252 
   1253     \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
   1254 \prompt{In}{incolor}{108}{\boxspacing}
   1255 \begin{Verbatim}[commandchars=\\\{\}]
   1256 \PY{k}{def} \PY{n+nf}{Alice\PYZus{}decrypt}\PY{p}{(}\PY{n}{m\PYZus{}encrypted}\PY{p}{,} \PY{n}{n}\PY{p}{,} \PY{n}{e}\PY{p}{)}\PY{p}{:}
   1257     \PY{n}{R} \PY{o}{=} \PY{n}{Integers}\PY{p}{(}\PY{n}{n}\PY{p}{)}
   1258     \PY{k}{return} \PY{n}{R}\PY{p}{(}\PY{n}{m\PYZus{}encrypted}\PY{p}{)}\PY{o}{\PYZca{}}\PY{n}{e}
   1259 
   1260 \PY{n}{Alice\PYZus{}decrypt}\PY{p}{(}\PY{l+m+mi}{149461597163501}\PY{p}{,} \PY{l+m+mi}{419199544978969}\PY{p}{,} \PY{l+m+mi}{80799425863927}\PY{p}{)}
   1261 \end{Verbatim}
   1262 \end{tcolorbox}
   1263 
   1264             \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
   1265 \prompt{Out}{outcolor}{108}{\boxspacing}
   1266 \begin{Verbatim}[commandchars=\\\{\}]
   1267 42424242
   1268 \end{Verbatim}
   1269 \end{tcolorbox}
   1270         
   1271     Another assumption on which RSA relies is that even if one knows
   1272 \(M=m^e\) and \(e\), extracting the \(e\)-th root of \(M\) modulo \(n\)
   1273 (and thus obtaining \(m\)) is very hard. Currently the best known way to
   1274 do this is by factorizing \(n\) first, which is considered to be a very
   1275 hard problem. However, there is no proof that faster algorithms can't be
   1276 devised.
   1277 
   1278 Moreover, one day we will overcome the current technological
   1279 difficulties and quantum computers will be available. Quantum computers
   1280 are not just ``more powerful'' than classical hardware, but they work
   1281 based on completely different logical foundations and they make the
   1282 factorization problem much easier to solve: for example
   1283 \href{https://en.wikipedia.org/wiki/Shor\%27s_algorithm}{Shor's
   1284 algorithm} takes advantage of this different logic and can factorize
   1285 numbers quickly, if run on a quantum computer.
   1286 
   1287 To this day the largest number factorized with a quantum computer is
   1288 \(21=3\times 7\). Nonetheless, quantum-safe cryptography protocols
   1289 (i.e.~based on problems that are hard to solve also with quantum
   1290 computers) have already been developed.
   1291 
   1292 
   1293     % Add a bibliography block to the postdoc
   1294     
   1295     
   1296     
   1297 \end{document}