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}