aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.gitignore4
-rw-r--r--Homework/Homework1.pdfbin0 -> 120157 bytes
-rw-r--r--Homework/Homework2.pdfbin0 -> 107428 bytes
-rw-r--r--Homework/Homework3.ipynb179
-rw-r--r--Homework/Homework3.pdfbin0 -> 146471 bytes
-rw-r--r--Homework/Homework4.ipynb172
-rw-r--r--Homework/Homework4.pdfbin0 -> 116266 bytes
-rw-r--r--Lectures/1-Introduction.pdfbin0 -> 183246 bytes
-rw-r--r--Lectures/2-LatexFundamentals.pdfbin0 -> 397400 bytes
-rw-r--r--Lectures/3-MoreLatex.pdfbin0 -> 331145 bytes
-rw-r--r--Lectures/4-TikZ.pdfbin0 -> 224630 bytes
-rw-r--r--Lectures/5-Beamer.pdfbin0 -> 326492 bytes
-rw-r--r--Lectures/6-PythonIntroduction.pdfbin0 -> 771892 bytes
-rw-r--r--Lectures/7-SageAlgebra.ipynb1046
-rw-r--r--Lectures/7-SageAlgebra.pdfbin0 -> 226346 bytes
-rw-r--r--Lectures/8-SageCalculus.ipynb1372
-rw-r--r--Lectures/8-SageCalculus.pdfbin0 -> 323733 bytes
-rw-r--r--Lectures/9-SageLatex.ipynb346
-rw-r--r--Lectures/9-SageLatex.pdfbin0 -> 183997 bytes
-rw-r--r--Lectures/X1-ComputationalComplexity-notebook.pdfbin0 -> 53271 bytes
-rw-r--r--Lectures/X1-ComputationalComplexity.pdfbin0 -> 1769406 bytes
-rw-r--r--Lectures/X2-StudentsRequests-notebook.pdfbin0 -> 65165 bytes
-rw-r--r--Lectures/X2-StudentsRequests.pdfbin0 -> 271722 bytes
-rw-r--r--README.md78
-rw-r--r--Resources/amsthdoc.pdf (renamed from resources/amsthdoc.pdf)bin177495 -> 177495 bytes
-rw-r--r--Resources/pgfmanual.pdf (renamed from resources/pgfmanual.pdf)bin10580316 -> 10580316 bytes
-rw-r--r--Resources/symbols.pdf (renamed from resources/symbols.pdf)bin261478 -> 261478 bytes
-rw-r--r--Resources/tikz-cd-doc.pdf (renamed from resources/tikz-cd-doc.pdf)bin266756 -> 266756 bytes
-rw-r--r--src/Homework1/Homework1.aux4
-rw-r--r--src/Homework1/Homework1.log257
-rw-r--r--src/Homework1/Homework1.pdfbin0 -> 120157 bytes
-rw-r--r--src/Homework1/Homework1.tex143
-rw-r--r--src/Homework2/Homework2.aux2
-rw-r--r--src/Homework2/Homework2.log584
-rw-r--r--src/Homework2/Homework2.pdfbin0 -> 107428 bytes
-rw-r--r--src/Homework2/Homework2.tex174
-rw-r--r--src/Homework3/.ipynb_checkpoints/Homework3-checkpoint.ipynb179
-rw-r--r--src/Homework3/.ipynb_checkpoints/solution-checkpoint.ipynb166
-rw-r--r--src/Homework3/Homework3.aux20
-rw-r--r--src/Homework3/Homework3.ipynb179
-rw-r--r--src/Homework3/Homework3.log962
-rw-r--r--src/Homework3/Homework3.out0
-rw-r--r--src/Homework3/Homework3.pdfbin0 -> 146471 bytes
-rw-r--r--src/Homework3/Homework3.tex552
-rw-r--r--src/Homework4/.ipynb_checkpoints/Homework4-checkpoint.ipynb172
-rw-r--r--src/Homework4/.ipynb_checkpoints/Homework4-solutions-checkpoint.ipynb61
-rw-r--r--src/Homework4/.ipynb_checkpoints/Untitled-checkpoint.ipynb6
-rw-r--r--src/Homework4/Homework4.aux20
-rw-r--r--src/Homework4/Homework4.ipynb172
-rw-r--r--src/Homework4/Homework4.log953
-rw-r--r--src/Homework4/Homework4.out0
-rw-r--r--src/Homework4/Homework4.pdfbin0 -> 116266 bytes
-rw-r--r--src/Homework4/Homework4.tex530
-rw-r--r--src/Lecture1/live/live.aux9
-rw-r--r--src/Lecture1/live/live.log249
-rw-r--r--src/Lecture1/live/live.pdfbin0 -> 148821 bytes
-rw-r--r--src/Lecture1/live/live.tex168
-rw-r--r--src/Lecture1/slides/1-Introduction.aux58
-rw-r--r--src/Lecture1/slides/1-Introduction.log1126
-rw-r--r--src/Lecture1/slides/1-Introduction.nav34
-rw-r--r--src/Lecture1/slides/1-Introduction.out5
-rw-r--r--src/Lecture1/slides/1-Introduction.pdfbin0 -> 183246 bytes
-rw-r--r--src/Lecture1/slides/1-Introduction.snm0
-rw-r--r--src/Lecture1/slides/1-Introduction.tex115
-rw-r--r--src/Lecture1/slides/1-Introduction.toc5
-rw-r--r--src/Lecture1/slides/1-Introduction.vrb14
-rw-r--r--src/Lecture1/slides/2-LatexFundamentals.aux70
-rw-r--r--src/Lecture1/slides/2-LatexFundamentals.log1174
-rw-r--r--src/Lecture1/slides/2-LatexFundamentals.nav51
-rw-r--r--src/Lecture1/slides/2-LatexFundamentals.out0
-rw-r--r--src/Lecture1/slides/2-LatexFundamentals.pdfbin0 -> 397400 bytes
-rw-r--r--src/Lecture1/slides/2-LatexFundamentals.snm0
-rw-r--r--src/Lecture1/slides/2-LatexFundamentals.tex340
-rw-r--r--src/Lecture1/slides/2-LatexFundamentals.toc0
-rw-r--r--src/Lecture1/slides/2-LatexFundamentals.vrb18
-rw-r--r--src/Lecture1/slides/img/example2-preamble-edited.pngbin0 -> 51405 bytes
-rw-r--r--src/Lecture1/slides/img/example2-preamble.pngbin0 -> 38211 bytes
-rw-r--r--src/Lecture1/slides/img/latex.pngbin0 -> 12080 bytes
-rw-r--r--src/Lecture1/slides/img/sage.svg72
-rw-r--r--src/Lecture1/slides/img/thm_pdf.pngbin0 -> 70598 bytes
-rw-r--r--src/Lecture1/slides/img/thm_pre.pngbin0 -> 46625 bytes
-rw-r--r--src/Lecture1/slides/img/thm_tex.pngbin0 -> 47632 bytes
-rw-r--r--src/Lecture1/slides/img/unilu.jpgbin0 -> 41957 bytes
-rw-r--r--src/Lecture1/slides/svg-inkscape/sage_svg-tex.pdfbin0 -> 13760 bytes
-rw-r--r--src/Lecture1/slides/svg-inkscape/sage_svg-tex.pdf_tex58
-rw-r--r--src/Lecture2/live/biblio1.aux10
-rw-r--r--src/Lecture2/live/biblio1.log203
-rw-r--r--src/Lecture2/live/biblio1.pdfbin0 -> 42218 bytes
-rw-r--r--src/Lecture2/live/biblio1.synctex.gzbin0 -> 2216 bytes
-rw-r--r--src/Lecture2/live/biblio1.tex34
-rw-r--r--src/Lecture2/live/biblio2.aux10
-rw-r--r--src/Lecture2/live/biblio2.bbl18
-rw-r--r--src/Lecture2/live/biblio2.blg46
-rw-r--r--src/Lecture2/live/biblio2.log203
-rw-r--r--src/Lecture2/live/biblio2.pdfbin0 -> 40599 bytes
-rw-r--r--src/Lecture2/live/biblio2.synctex.gzbin0 -> 1930 bytes
-rw-r--r--src/Lecture2/live/biblio2.tex18
-rw-r--r--src/Lecture2/live/commands.aux2
-rw-r--r--src/Lecture2/live/commands.log215
-rw-r--r--src/Lecture2/live/commands.pdfbin0 -> 34332 bytes
-rw-r--r--src/Lecture2/live/commands.synctex.gzbin0 -> 1213 bytes
-rw-r--r--src/Lecture2/live/commands.tex27
-rw-r--r--src/Lecture2/live/me.jpgbin0 -> 103112 bytes
-rw-r--r--src/Lecture2/live/my_biblio.bib36
-rw-r--r--src/Lecture2/live/new.aux8
-rw-r--r--src/Lecture2/live/new.log245
-rw-r--r--src/Lecture2/live/new.pdfbin0 -> 114184 bytes
-rw-r--r--src/Lecture2/live/new.synctex.gzbin0 -> 3436 bytes
-rw-r--r--src/Lecture2/live/new.tex99
-rw-r--r--src/Lecture2/live/old.aux10
-rw-r--r--src/Lecture2/live/old.log284
-rw-r--r--src/Lecture2/live/old.pdfbin0 -> 165455 bytes
-rw-r--r--src/Lecture2/live/old.synctex.gzbin0 -> 11493 bytes
-rw-r--r--src/Lecture2/live/old.tex176
-rw-r--r--src/Lecture2/live/pic.aux3
-rw-r--r--src/Lecture2/live/pic.log300
-rw-r--r--src/Lecture2/live/pic.pdfbin0 -> 131626 bytes
-rw-r--r--src/Lecture2/live/pic.synctex.gzbin0 -> 28231 bytes
-rw-r--r--src/Lecture2/live/pic.tex34
-rw-r--r--src/Lecture2/live/sentencecounter.aux6
-rw-r--r--src/Lecture2/live/sentencecounter.bbl0
-rw-r--r--src/Lecture2/live/sentencecounter.blg48
-rw-r--r--src/Lecture2/live/sentencecounter.log256
-rw-r--r--src/Lecture2/live/sentencecounter.pdfbin0 -> 76925 bytes
-rw-r--r--src/Lecture2/live/sentencecounter.synctex.gzbin0 -> 3189 bytes
-rw-r--r--src/Lecture2/live/sentencecounter.tex66
-rw-r--r--src/Lecture2/slides/3-MoreLatex.aux69
-rw-r--r--src/Lecture2/slides/3-MoreLatex.log1193
-rw-r--r--src/Lecture2/slides/3-MoreLatex.nav51
-rw-r--r--src/Lecture2/slides/3-MoreLatex.out0
-rw-r--r--src/Lecture2/slides/3-MoreLatex.pdfbin0 -> 331145 bytes
-rw-r--r--src/Lecture2/slides/3-MoreLatex.snm0
-rw-r--r--src/Lecture2/slides/3-MoreLatex.tex478
-rw-r--r--src/Lecture2/slides/3-MoreLatex.toc0
-rw-r--r--src/Lecture2/slides/img/thm_pdf.pngbin0 -> 70598 bytes
-rw-r--r--src/Lecture2/slides/img/thm_pre.pngbin0 -> 46625 bytes
-rw-r--r--src/Lecture2/slides/img/thm_tex.pngbin0 -> 47632 bytes
-rw-r--r--src/Lecture2/slides/img/unilu.jpgbin0 -> 41957 bytes
-rw-r--r--src/Lecture3/live/beamer.aux36
-rw-r--r--src/Lecture3/live/beamer.log944
-rw-r--r--src/Lecture3/live/beamer.nav16
-rw-r--r--src/Lecture3/live/beamer.out1
-rw-r--r--src/Lecture3/live/beamer.pdfbin0 -> 110030 bytes
-rw-r--r--src/Lecture3/live/beamer.snm0
-rw-r--r--src/Lecture3/live/beamer.synctex.gzbin0 -> 9846 bytes
-rw-r--r--src/Lecture3/live/beamer.tex84
-rw-r--r--src/Lecture3/live/beamer.toc1
-rw-r--r--src/Lecture3/live/tikz.aux2
-rw-r--r--src/Lecture3/live/tikz.bbl0
-rw-r--r--src/Lecture3/live/tikz.blg48
-rw-r--r--src/Lecture3/live/tikz.log544
-rw-r--r--src/Lecture3/live/tikz.pdfbin0 -> 55498 bytes
-rw-r--r--src/Lecture3/live/tikz.synctex.gzbin0 -> 4167 bytes
-rw-r--r--src/Lecture3/live/tikz.tex84
-rw-r--r--src/Lecture3/live/unilu.jpgbin0 -> 41957 bytes
-rw-r--r--src/Lecture3/slides/4-TikZ.aux65
-rw-r--r--src/Lecture3/slides/4-TikZ.bbl0
-rw-r--r--src/Lecture3/slides/4-TikZ.blg48
-rw-r--r--src/Lecture3/slides/4-TikZ.log1201
-rw-r--r--src/Lecture3/slides/4-TikZ.nav47
-rw-r--r--src/Lecture3/slides/4-TikZ.out0
-rw-r--r--src/Lecture3/slides/4-TikZ.pdfbin0 -> 224630 bytes
-rw-r--r--src/Lecture3/slides/4-TikZ.snm0
-rw-r--r--src/Lecture3/slides/4-TikZ.tex420
-rw-r--r--src/Lecture3/slides/4-TikZ.toc0
-rw-r--r--src/Lecture3/slides/4-TikZ.vrb24
-rw-r--r--src/Lecture3/slides/5-Beamer.aux49
-rw-r--r--src/Lecture3/slides/5-Beamer.log1132
-rw-r--r--src/Lecture3/slides/5-Beamer.nav31
-rw-r--r--src/Lecture3/slides/5-Beamer.out0
-rw-r--r--src/Lecture3/slides/5-Beamer.pdfbin0 -> 326492 bytes
-rw-r--r--src/Lecture3/slides/5-Beamer.snm0
-rw-r--r--src/Lecture3/slides/5-Beamer.tex203
-rw-r--r--src/Lecture3/slides/5-Beamer.toc0
-rw-r--r--src/Lecture3/slides/5-Beamer.vrb18
-rw-r--r--src/Lecture3/slides/img/beamer.pngbin0 -> 97226 bytes
-rw-r--r--src/Lecture3/slides/img/diophantus.jpgbin0 -> 72123 bytes
-rw-r--r--src/Lecture3/slides/img/unilu.jpgbin0 -> 41957 bytes
-rw-r--r--src/Lecture4/live/live.zipbin0 -> 2264 bytes
-rw-r--r--src/Lecture4/live/live1.py17
-rw-r--r--src/Lecture4/live/live2.py7
-rw-r--r--src/Lecture4/live/live3.py9
-rw-r--r--src/Lecture4/live/live4.py39
-rw-r--r--src/Lecture4/live/live_interactive.py172
-rw-r--r--src/Lecture4/slides/6-PythonIntroduction.aux76
-rw-r--r--src/Lecture4/slides/6-PythonIntroduction.log1283
-rw-r--r--src/Lecture4/slides/6-PythonIntroduction.nav57
-rw-r--r--src/Lecture4/slides/6-PythonIntroduction.out0
-rw-r--r--src/Lecture4/slides/6-PythonIntroduction.pdfbin0 -> 771892 bytes
-rw-r--r--src/Lecture4/slides/6-PythonIntroduction.snm0
-rw-r--r--src/Lecture4/slides/6-PythonIntroduction.tex466
-rw-r--r--src/Lecture4/slides/6-PythonIntroduction.toc0
-rw-r--r--src/Lecture4/slides/6-PythonIntroduction.vrb32
-rw-r--r--src/Lecture4/slides/img/calc.jpgbin0 -> 104819 bytes
-rw-r--r--src/Lecture4/slides/img/equal.pngbin0 -> 8229 bytes
-rw-r--r--src/Lecture4/slides/img/geany.pngbin0 -> 85066 bytes
-rw-r--r--src/Lecture4/slides/img/laptop.pngbin0 -> 158008 bytes
-rw-r--r--src/Lecture4/slides/img/python.pngbin0 -> 129327 bytes
-rw-r--r--src/Lecture4/slides/img/sage.svg72
-rw-r--r--src/Lecture4/slides/img/term.pngbin0 -> 45939 bytes
-rw-r--r--src/Lecture4/slides/img/unilu.jpgbin0 -> 41957 bytes
-rw-r--r--src/Lecture4/slides/svg-inkscape/sage_svg-tex.pdfbin0 -> 13760 bytes
-rw-r--r--src/Lecture4/slides/svg-inkscape/sage_svg-tex.pdf_tex58
-rw-r--r--src/Lecture5/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb1067
-rw-r--r--src/Lecture5/live/7-SageAlgebra-modified+solutions.ipynb1099
-rw-r--r--src/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb1046
-rw-r--r--src/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-modified+solutions-checkpoint.ipynb1099
-rw-r--r--src/Lecture5/notebook/.ipynb_checkpoints/scratchpad-checkpoint.ipynb52
-rw-r--r--src/Lecture5/notebook/7-SageAlgebra.aux56
-rw-r--r--src/Lecture5/notebook/7-SageAlgebra.ipynb1046
-rw-r--r--src/Lecture5/notebook/7-SageAlgebra.log967
-rw-r--r--src/Lecture5/notebook/7-SageAlgebra.out16
-rw-r--r--src/Lecture5/notebook/7-SageAlgebra.pdfbin0 -> 226346 bytes
-rw-r--r--src/Lecture5/notebook/7-SageAlgebra.tex1297
-rw-r--r--src/Lecture6/live/8-SageCalculus-modified.ipynb1614
-rw-r--r--src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb1372
-rw-r--r--src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb1614
-rw-r--r--src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb339
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.aux58
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.ipynb1372
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.log1106
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.out19
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.pdfbin0 -> 323733 bytes
-rw-r--r--src/Lecture6/notebook/8-SageCalculus.tex1456
-rw-r--r--src/Lecture6/notebook/9-SageLatex.aux32
-rw-r--r--src/Lecture6/notebook/9-SageLatex.ipynb346
-rw-r--r--src/Lecture6/notebook/9-SageLatex.log954
-rw-r--r--src/Lecture6/notebook/9-SageLatex.out6
-rw-r--r--src/Lecture6/notebook/9-SageLatex.pdfbin0 -> 183997 bytes
-rw-r--r--src/Lecture6/notebook/9-SageLatex.tex634
-rw-r--r--src/Lecture6/notebook/output_75_0.pngbin0 -> 16225 bytes
-rw-r--r--src/Lecture6/notebook/output_77_0.pngbin0 -> 19822 bytes
-rw-r--r--src/Lecture6/notebook/output_80_0.pngbin0 -> 20185 bytes
-rw-r--r--src/Lecture6/notebook/output_82_0.pngbin0 -> 11723 bytes
-rw-r--r--src/Lecture6/notebook/output_84_0.pngbin0 -> 22962 bytes
-rw-r--r--src/Lecture6/notebook/output_86_0.pngbin0 -> 21648 bytes
-rw-r--r--src/Lecture6/notebook/output_88_0.pngbin0 -> 17372 bytes
-rw-r--r--src/Lecture7/notebook/X1-ComputationalComplexity-notebook.ipynb412
-rw-r--r--src/Lecture7/notebook/X2-StudentsRequests-notebook.ipynb516
-rw-r--r--src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-checkpoint.ipynb394
-rw-r--r--src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-notebook-checkpoint.ipynb412
-rw-r--r--src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-checkpoint.ipynb165
-rw-r--r--src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-notebook-checkpoint.ipynb298
-rw-r--r--src/Lecture7/slides/X1-ComputationalComplexity.aux100
-rw-r--r--src/Lecture7/slides/X1-ComputationalComplexity.log1513
-rw-r--r--src/Lecture7/slides/X1-ComputationalComplexity.nav81
-rw-r--r--src/Lecture7/slides/X1-ComputationalComplexity.out0
-rw-r--r--src/Lecture7/slides/X1-ComputationalComplexity.pdfbin0 -> 1769406 bytes
-rw-r--r--src/Lecture7/slides/X1-ComputationalComplexity.snm0
-rw-r--r--src/Lecture7/slides/X1-ComputationalComplexity.tex608
-rw-r--r--src/Lecture7/slides/X1-ComputationalComplexity.toc0
-rw-r--r--src/Lecture7/slides/X1-ComputationalComplexity.vrb10
-rw-r--r--src/Lecture7/slides/X2-StudentsRequests.aux67
-rw-r--r--src/Lecture7/slides/X2-StudentsRequests.log1307
-rw-r--r--src/Lecture7/slides/X2-StudentsRequests.nav47
-rw-r--r--src/Lecture7/slides/X2-StudentsRequests.out0
-rw-r--r--src/Lecture7/slides/X2-StudentsRequests.pdfbin0 -> 271722 bytes
-rw-r--r--src/Lecture7/slides/X2-StudentsRequests.snm0
-rw-r--r--src/Lecture7/slides/X2-StudentsRequests.tex309
-rw-r--r--src/Lecture7/slides/X2-StudentsRequests.toc0
-rw-r--r--src/Lecture7/slides/X2-StudentsRequests.vrb10
-rw-r--r--src/Lecture7/slides/img/DH.svg181
-rw-r--r--src/Lecture7/slides/img/plot1.pngbin0 -> 393818 bytes
-rw-r--r--src/Lecture7/slides/img/plot2.pngbin0 -> 217408 bytes
-rw-r--r--src/Lecture7/slides/img/plot3.pngbin0 -> 286064 bytes
-rw-r--r--src/Lecture7/slides/img/plot4.pngbin0 -> 363125 bytes
-rw-r--r--src/Lecture7/slides/img/plot5.pngbin0 -> 319660 bytes
-rw-r--r--src/Lecture7/slides/img/unilu.jpgbin0 -> 41957 bytes
-rw-r--r--src/Lecture7/slides/svg-inkscape/DH_svg-tex.pdfbin0 -> 29915 bytes
-rw-r--r--src/Lecture7/slides/svg-inkscape/DH_svg-tex.pdf_tex58
270 files changed, 48486 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index 25a5897..0fce46b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
1administration 1Administration
2homework_submissions 2Homework_submissions
diff --git a/Homework/Homework1.pdf b/Homework/Homework1.pdf
new file mode 100644
index 0000000..9a8228a
--- /dev/null
+++ b/Homework/Homework1.pdf
Binary files differ
diff --git a/Homework/Homework2.pdf b/Homework/Homework2.pdf
new file mode 100644
index 0000000..1164333
--- /dev/null
+++ b/Homework/Homework2.pdf
Binary files differ
diff --git a/Homework/Homework3.ipynb b/Homework/Homework3.ipynb
new file mode 100644
index 0000000..13bad44
--- /dev/null
+++ b/Homework/Homework3.ipynb
@@ -0,0 +1,179 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "*For this exercise you should have received this text in .ipynb format. Complete the exercises by modifying this file, and submit the modified version*"
8 ]
9 },
10 {
11 "cell_type": "markdown",
12 "metadata": {},
13 "source": [
14 "**Exercise 1**\n",
15 "\n",
16 "Use SageMath to solve the following problems:\n",
17 "\n",
18 "(a) Find the roots of the following polynomial over $\\mathbb Q$:\n",
19 "\\begin{align*}\n",
20 " p = 4 x^{7} + 4 x^{6} + 3 x^{5} - 13 x^{4} - 13 x^{3} - 9 x^{2} + 3 x + 3 \\in \\mathbb Q[x]\n",
21 "\\end{align*}\n",
22 "\n",
23 "(b) Find the roots of the same polynomial $p$ over $\\mathbb R$ and over $\\mathbb C$.\n",
24 "\n",
25 "(c) Find the determinant, the trace and the characteristic polynomial of the following matrix:\n",
26 "\\begin{align*}\n",
27 "A=\\left(\\begin{array}{rrrr}\n",
28 "-1 & 1 & -1 & 0 \\\\\n",
29 "1 & \\frac{1}{2} & 1 & 0 \\\\\n",
30 "\\frac{1}{2} & -\\frac{1}{2} & -2 & 1 \\\\\n",
31 "0 & 0 & 1 & 1\n",
32 "\\end{array}\\right)\n",
33 "\\end{align*}\n",
34 "\n",
35 "(d) Find a solution to the linear system $A\\mathbf x =\\mathbf v$, where $A$ is the matrix above and $\\mathbf v=(1, 2, 3, 4)$.\n",
36 "\n",
37 "Write your code in the cell below."
38 ]
39 },
40 {
41 "cell_type": "code",
42 "execution_count": null,
43 "metadata": {},
44 "outputs": [],
45 "source": []
46 },
47 {
48 "cell_type": "markdown",
49 "metadata": {},
50 "source": [
51 "**Exercise 2**\n",
52 "\n",
53 "After exchanging messages with the RSA protocol seen in class, Alice and Bob decide to meet and play their favorite game: flip a coin. They like this game very much because it does not take long to set it up and they have exactly the same chances of winning.\n",
54 "\n",
55 "Unfortunately, due to the COVID-19 pandemic they cannot meet in person, and despite being good friends they don't trust each other enough to play this game via Webex call. Luckily, Alice is an expert in cryptography and she knows how to play this game using the Chinese remainder theorem.\n",
56 "\n",
57 "The game plays out as follows:\n",
58 "\n",
59 "(A1) Alice picks two large prime numbers $p$ and $q$, she computes $n=pq$ and sends $n$ to Bob, keeping $p$ and $q$ secret.\n",
60 "\n",
61 "(B1) Bob picks a random number $a$ with $1<a<n$ and $\\gcd(a,n)=1$, computes $b=a^2\\mod n$ and sends $b$ to Alice, keeping $a$ secret.\n",
62 "\n",
63 "(A2) Alice computes two numbers $x$ and $y$ such that $x^2\\equiv b\\pmod p$ and $y^2\\equiv b\\pmod q$ and she uses the Chinese remainder theorem to compute a number $z$ such that $z\\equiv x\\pmod p$ and $z\\equiv y\\pmod q$, so that $z^2\\equiv b\\pmod n$. Then she sends $z$ to Bob.\n",
64 "\n",
65 "Since $n$ is the product of two primes, there are $4$ possible square roots of $b$ modulo $n$, corresponding to the solutions of the four systems of congruences (one for each possible combination of $\\pm$)\n",
66 "\\begin{align*}\\begin{cases}\n",
67 "z\\equiv \\pm x\\pmod p\\\\\n",
68 "z \\equiv \\pm y\\pmod q\n",
69 "\\end{cases}\\end{align*}\n",
70 "\n",
71 "One of those solutions is $a$ and another is $-a$, and Bob knows them. Alice is picking one of the $4$ possible roots at random (she chooses between $x$ and $-x$ and between $y$ and $-y$), so she has $50\\%$ chance of picking one that Bob already knows. This corresponds to Alice flipping a coin, and she wins if she picks $\\pm a$:\n",
72 "\n",
73 "(B2) If $z\\equiv\\pm a\\pmod n$, Bob declares to have lost. Otherwise, Bob claims to have won, and as proof he produces one prime factor of $n$ by computing $g=\\gcd(n,a+z)$. *(One can prove that in this situation $g$ is always one of the two prime factors of $n$.)*\n",
74 "\n",
75 "Since factoring a number without extra information is very hard, Alice will be convinced that she must have given Bob one of the square roots that he did not know, so she admits the loss.\n",
76 "\n",
77 "Now to the actual exercise:\n",
78 "\n",
79 "(a) Write the code for the functions A1, B1 and B2 as indicated in the cell below. The function A2 is already written.\n",
80 "\n",
81 "(b) Modify the functions B1, A2 and B2 to check that the opponent is not cheating. More precisely:\n",
82 "* In B1, Bob should check that $n$ is not a prime power. *(This is the only way Alice can try to cheat: if she sends Bob a number $n$ that is the product of more than two primes, than she has less than $50\\%$ chance of winning!)*\n",
83 "* In A2, Alice should check that $b$ is a square modulo $n$.\n",
84 "* In B2, Bob should check that $z^2\\equiv a^2\\pmod n$.\n",
85 "\n",
86 "In case cheating is detected, a message should be printed saying that the person is cheating."
87 ]
88 },
89 {
90 "cell_type": "code",
91 "execution_count": 1,
92 "metadata": {
93 "collapsed": true
94 },
95 "outputs": [
96 {
97 "ename": "IndentationError",
98 "evalue": "expected an indented block (<ipython-input-1-60f510bf175f>, line 7)",
99 "output_type": "error",
100 "traceback": [
101 "\u001b[1;36m File \u001b[1;32m\"<ipython-input-1-60f510bf175f>\"\u001b[1;36m, line \u001b[1;32m7\u001b[0m\n\u001b[1;33m def B1(n):\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mIndentationError\u001b[0m\u001b[1;31m:\u001b[0m expected an indented block\n"
102 ]
103 }
104 ],
105 "source": [
106 "# Alice needs this to compute the square roots\n",
107 "from sage.rings.finite_rings.integer_mod import square_root_mod_prime\n",
108 "\n",
109 "def A1():\n",
110 " # This function must return two distinct primes and their product.\n",
111 " \n",
112 "def B1(n):\n",
113 " # This function must return a random integer a\n",
114 " # with 1<a<n and gcd(a,n)=1.\n",
115 "\n",
116 "def A2(b, p, q):\n",
117 " x = ZZ(square_root_mod_prime(Integers(p)(b), p))\n",
118 " y = ZZ(square_root_mod_prime(Integers(q)(b), q))\n",
119 " return crt(x, y, p, q)\n",
120 "\n",
121 "def B2(a, z, n):\n",
122 " # This function must print out one of two messages:\n",
123 " # \"Bob has lost\" if z is congruent to a or -a modulo n.\n",
124 " # \"Bob has won, proof: \" followed by a prime factor of n otherwise.\n",
125 " # In this case the prime must be calculated as explained above.\n",
126 "\n",
127 "\n",
128 "# This is how the game plays out:\n",
129 "p, q, n = A1()\n",
130 "print(\"Alice picked n =\", n)\n",
131 "print(\"[[ Alice's secret:\", p, q, \"]]\")\n",
132 "a = B1(n)\n",
133 "b = a^2 % n\n",
134 "print(\"Bob picked b =\", b)\n",
135 "print(\"[[ Bob's secret:\", a, \"]]\")\n",
136 "z = A2(b, p, q)\n",
137 "print(\"Alice picked z =\", z)\n",
138 "B2(a, z, n)"
139 ]
140 },
141 {
142 "cell_type": "markdown",
143 "metadata": {},
144 "source": [
145 "**Grading**\n",
146 "\n",
147 "This homework assignment is worth $20\\%$ of your final grade. Exercise 1 is worth 4 points (one for each part) and Exercise 2 is worth 12 points (8 points for part (a) and 4 points for part (b)), for a total of **16 points**."
148 ]
149 },
150 {
151 "cell_type": "code",
152 "execution_count": null,
153 "metadata": {},
154 "outputs": [],
155 "source": []
156 }
157 ],
158 "metadata": {
159 "kernelspec": {
160 "display_name": "SageMath 9.2",
161 "language": "sage",
162 "name": "sagemath"
163 },
164 "language_info": {
165 "codemirror_mode": {
166 "name": "ipython",
167 "version": 3
168 },
169 "file_extension": ".py",
170 "mimetype": "text/x-python",
171 "name": "python",
172 "nbconvert_exporter": "python",
173 "pygments_lexer": "ipython3",
174 "version": "3.8.5"
175 }
176 },
177 "nbformat": 4,
178 "nbformat_minor": 4
179}
diff --git a/Homework/Homework3.pdf b/Homework/Homework3.pdf
new file mode 100644
index 0000000..13d55cf
--- /dev/null
+++ b/Homework/Homework3.pdf
Binary files differ
diff --git a/Homework/Homework4.ipynb b/Homework/Homework4.ipynb
new file mode 100644
index 0000000..99481b9
--- /dev/null
+++ b/Homework/Homework4.ipynb
@@ -0,0 +1,172 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "*For this exercise you should have received this text in .ipynb format. Complete the exercises by modifying this file, and submit the modified version*\n",
8 "\n",
9 "**Deadline:** Sunday, June 6."
10 ]
11 },
12 {
13 "cell_type": "markdown",
14 "metadata": {},
15 "source": [
16 "**Exercise 1 (6 points)**\n",
17 "\n",
18 "Use Sage to find the intersection points *in the real plane* (that is, only those points such that *both* coordinates are real numbers) of the following pairs of geometric objects:\n",
19 "\n",
20 "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2\\right)^2 + (2y)^2 = 4$.\n",
21 "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2-2\\right)^2 + (2y)^2 = 4$.\n",
22 "* The curve of equation $y^2 = x^3 -x +1$ and the horizontal line $y=10$.\n",
23 "* The $x$-axis and the graph of the function $f(x)=\\log(x) - e^{-x}$. *Hint: $f(x)$ has only one real zero.*"
24 ]
25 },
26 {
27 "cell_type": "code",
28 "execution_count": null,
29 "metadata": {},
30 "outputs": [],
31 "source": []
32 },
33 {
34 "cell_type": "markdown",
35 "metadata": {},
36 "source": [
37 "**Exercise 2 (6 points)**\n",
38 "\n",
39 "(a) Use Sage to compute\n",
40 "* the derivative\n",
41 "* a primite (i.e. integral)\n",
42 "* the power series expansion around $0$ up to order $4$\n",
43 "\n",
44 "of the following functions:\n",
45 "* $f(x) = e^x$\n",
46 "* $f(x) = \\sin(x)$\n",
47 "* $f(x) = \\cos(x)$\n",
48 "* $f(x) = \\tan(x)$\n",
49 "* $f(x) = \\log(1+x)$\n",
50 "* $f(x) = \\sqrt[3]{1+x}$\n",
51 "\n",
52 "(b) Use Sage to get the Latex code that represents the objects you computed above.\n",
53 "\n",
54 "(c) Arrange the results of the previous points in a table in Latex. The table should have 4 columns (function, derivative, integral, series) and one row for each of the functions above. *Note: when including Latex in a Markdown cell in Jupyter you will not receive any warning if you make mistakes; instead the Latex will simply not be rendered and it will appear as plain text. If you have troubles making this work you can send me a separate .tex (and .pdf) file.*"
55 ]
56 },
57 {
58 "cell_type": "code",
59 "execution_count": null,
60 "metadata": {},
61 "outputs": [],
62 "source": [
63 "# Compute derivatives etc..."
64 ]
65 },
66 {
67 "cell_type": "code",
68 "execution_count": null,
69 "metadata": {},
70 "outputs": [],
71 "source": [
72 "# Compute Latex code"
73 ]
74 },
75 {
76 "cell_type": "markdown",
77 "metadata": {},
78 "source": [
79 "(Write your table here)"
80 ]
81 },
82 {
83 "cell_type": "markdown",
84 "metadata": {},
85 "source": [
86 "**Exercise 3 (4 points)**\n",
87 "\n",
88 "The equation\n",
89 "\\begin{align*}\n",
90 "y^2+x^{16}=1\n",
91 "\\end{align*}\n",
92 "determines a closed curve in $\\mathbb R^2$ that looks like a rounded square. Determine the area of that shape, giving both an exact value (which might depend on some functions that Sage knows, but you don't) and an approximate value."
93 ]
94 },
95 {
96 "cell_type": "code",
97 "execution_count": null,
98 "metadata": {},
99 "outputs": [],
100 "source": []
101 },
102 {
103 "cell_type": "markdown",
104 "metadata": {},
105 "source": [
106 "**Exercise 4 (12 points)**\n",
107 "\n",
108 "A team of biologists is monitoring the population of river shrimps in the Alzette. At first they thought that the size $P(t)$ of their population on day $t$ would satisfy the differential equation $P'(t)=P(t)/10$. However this does not work well with the data they have collected, so they now believe that the population of shrimps follows the formula $P'(t)=P(t)/10-b$ for some value of $b$ between 1 and 100. They need your help here.\n",
109 "\n",
110 "(a) Using Sage, find a solution for the differential equation with initial conditions\n",
111 "\\begin{align*}\n",
112 "\\begin{cases}\n",
113 "P'(t)&=\\frac{P(t)}{10}-b\\\\\n",
114 "P(1)&=1000\n",
115 "\\end{cases}\n",
116 "\\end{align*}\n",
117 "where $b$ is a generic constant.\n",
118 "\n",
119 "(b) The list `data` in the cell below contains the actual number of shrimps that was measured every day from day $1$ (the $0$ at the beginning is meaningless, but it will help to keep it there). Plot in one single picture, possibly using different colors for each:\n",
120 "* The data as a bar chart.\n",
121 "* A curve that interpolates the data, using one of the methods shown in class.\n",
122 "* The solution of the differential equation for $b=0$.\n",
123 "* The solution of the differential equation for a value of $b$ of your choice ($1\\leq b\\leq 100$) that fits the data better than $b=0$. *(For this last point there is no right or wrong choice, just pick one that looks good)*"
124 ]
125 },
126 {
127 "cell_type": "code",
128 "execution_count": null,
129 "metadata": {},
130 "outputs": [],
131 "source": [
132 "data = [0, 1000, 1123, 1223, 1190, 1432, 1553, 1709, 1826, 1980, 2146, 2172, 2383, 2588, 2822, 3401, 3330, 4157, 3994, 4995, 5392, 5910, 6468, 7128, 7325, 7984, 9634, 10473, 11761, 12777]\n"
133 ]
134 },
135 {
136 "cell_type": "markdown",
137 "metadata": {},
138 "source": [
139 "**Grading**\n",
140 "\n",
141 "This homework assignment is worth $28$ ($24+4$) points, distributed as described above.\n",
142 "\n",
143 "Your final grade for the course will be the total of points you obtained (notice that the maximum is $20+20+16+28=84$) divided by $4$, rounded to the nearest integer. More precisely\n",
144 "\n",
145 "\\begin{align*}\n",
146 "\\operatorname{grade} = \\operatorname{min}\\left(20, \\left\\lfloor \\frac{\\operatorname{total}}{4} + 0.5\\right\\rfloor\\right)\n",
147 "\\end{align*}"
148 ]
149 }
150 ],
151 "metadata": {
152 "kernelspec": {
153 "display_name": "SageMath 9.0",
154 "language": "sage",
155 "name": "sagemath"
156 },
157 "language_info": {
158 "codemirror_mode": {
159 "name": "ipython",
160 "version": 3
161 },
162 "file_extension": ".py",
163 "mimetype": "text/x-python",
164 "name": "python",
165 "nbconvert_exporter": "python",
166 "pygments_lexer": "ipython3",
167 "version": "3.8.5"
168 }
169 },
170 "nbformat": 4,
171 "nbformat_minor": 4
172}
diff --git a/Homework/Homework4.pdf b/Homework/Homework4.pdf
new file mode 100644
index 0000000..ff8ecd2
--- /dev/null
+++ b/Homework/Homework4.pdf
Binary files differ
diff --git a/Lectures/1-Introduction.pdf b/Lectures/1-Introduction.pdf
new file mode 100644
index 0000000..17eaaa8
--- /dev/null
+++ b/Lectures/1-Introduction.pdf
Binary files differ
diff --git a/Lectures/2-LatexFundamentals.pdf b/Lectures/2-LatexFundamentals.pdf
new file mode 100644
index 0000000..a96f172
--- /dev/null
+++ b/Lectures/2-LatexFundamentals.pdf
Binary files differ
diff --git a/Lectures/3-MoreLatex.pdf b/Lectures/3-MoreLatex.pdf
new file mode 100644
index 0000000..2c95ed9
--- /dev/null
+++ b/Lectures/3-MoreLatex.pdf
Binary files differ
diff --git a/Lectures/4-TikZ.pdf b/Lectures/4-TikZ.pdf
new file mode 100644
index 0000000..fde2b8c
--- /dev/null
+++ b/Lectures/4-TikZ.pdf
Binary files differ
diff --git a/Lectures/5-Beamer.pdf b/Lectures/5-Beamer.pdf
new file mode 100644
index 0000000..caf8aea
--- /dev/null
+++ b/Lectures/5-Beamer.pdf
Binary files differ
diff --git a/Lectures/6-PythonIntroduction.pdf b/Lectures/6-PythonIntroduction.pdf
new file mode 100644
index 0000000..873c99a
--- /dev/null
+++ b/Lectures/6-PythonIntroduction.pdf
Binary files differ
diff --git a/Lectures/7-SageAlgebra.ipynb b/Lectures/7-SageAlgebra.ipynb
new file mode 100644
index 0000000..59ea033
--- /dev/null
+++ b/Lectures/7-SageAlgebra.ipynb
@@ -0,0 +1,1046 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "This lecture's notes are in a different format: the presentations for the $\\LaTeX$ part were made with $\\LaTeX$, so this one is made with Sage, or rather with the [Jupyter Notebook](https://jupyter.org/).\n",
8 "\n",
9 "# The Jupyter Notebook\n",
10 "**Reference:** [[1](https://jupyter.org/documentation)]\n",
11 "\n",
12 "The Jupyter Notebook is one of the default interfaces for SageMath, along with the command line interface. You can access it via web browser, but it is running locally on your device (notice the strange url: `http://localhost:8888/notebooks...`).\n",
13 "\n",
14 "You can create a new notebook by clicking on `New > SageMath 9.2`. You can also create a Python 3 notebook to write Python code.\n",
15 "\n",
16 "Jupyter saves and reads files in the `.ipynb` format. If you download the file for this lecture you can open it and follow the examples interactively.\n",
17 "\n",
18 "## Cells\n",
19 "\n",
20 "The notebook contains one or more *interactive cells* that you can run, like this one below:"
21 ]
22 },
23 {
24 "cell_type": "code",
25 "execution_count": 2,
26 "metadata": {},
27 "outputs": [
28 {
29 "data": {
30 "text/plain": [
31 "2/5"
32 ]
33 },
34 "execution_count": 2,
35 "metadata": {},
36 "output_type": "execute_result"
37 }
38 ],
39 "source": [
40 "# Exercise: modify this cell to use the print() command\n",
41 "2+2\n",
42 "2/5"
43 ]
44 },
45 {
46 "cell_type": "markdown",
47 "metadata": {},
48 "source": [
49 "If you are reading this from Jupyter rather than from the pdf file, you can edit the cell above and run it again. You can also add more cells by selecting `Insert` from the menu bar.\n",
50 "\n",
51 "Notice that only the last statement produces an output. You can force anything to be written as output with the `print()` command, which works like in Python. As an exercise, try to modify the cell above to provide more output!"
52 ]
53 },
54 {
55 "cell_type": "markdown",
56 "metadata": {},
57 "source": [
58 "## Markdown\n",
59 "\n",
60 "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n",
61 "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n",
62 "\n",
63 "You can also include some LaTeX code in Markdown cells, with dollar signs $ or align environments:\n",
64 "\n",
65 "\\begin{align*}\n",
66 "\\frac{(x+y)^2}{x+1} = \\frac{x^2+y^2}{x+1}\n",
67 "\\end{align*}\n",
68 "\n",
69 "When you are done writing a Markdown cell, you can run it to see the well-formatted text. To edit the text again, double-click on the cell. Try doing it now to fix the formula above!"
70 ]
71 },
72 {
73 "cell_type": "markdown",
74 "metadata": {},
75 "source": [
76 "# Symbolic expressions\n",
77 "\n",
78 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
79 "\n",
80 "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:"
81 ]
82 },
83 {
84 "cell_type": "code",
85 "execution_count": 3,
86 "metadata": {},
87 "outputs": [
88 {
89 "data": {
90 "text/plain": [
91 "[x == -sqrt(6) - 1, x == sqrt(6) - 1]"
92 ]
93 },
94 "execution_count": 3,
95 "metadata": {},
96 "output_type": "execute_result"
97 }
98 ],
99 "source": [
100 "f = x^2 + 2*x - 5 == 0\n",
101 "solve(f,x)"
102 ]
103 },
104 {
105 "cell_type": "markdown",
106 "metadata": {},
107 "source": [
108 "Notice that the single `=` is part of an assignment, as in Python: we are *assigning* to the variable `f` the value `x^2 + 2*x - 5 >= 0`, which in this case is an equation, so it contains the symbol `==`. Keep in mind the difference between the two!\n",
109 "\n",
110 "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$."
111 ]
112 },
113 {
114 "cell_type": "markdown",
115 "metadata": {},
116 "source": [
117 "## Mathematical variables\n",
118 "\n",
119 "Last time we saw what *variables* are in Python, and that they are a little bit different from the *Mathematical variables* that you use in Mathematics. In Sage, both concepts are present, but they are still distinct. For example in the cell above `f` is a variable in the sense of computer science, while `x` is a Mathematical variable.\n",
120 "\n",
121 "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:"
122 ]
123 },
124 {
125 "cell_type": "code",
126 "execution_count": 14,
127 "metadata": {},
128 "outputs": [
129 {
130 "data": {
131 "text/plain": [
132 "[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 + 9) - 1/2]"
133 ]
134 },
135 "execution_count": 14,
136 "metadata": {},
137 "output_type": "execute_result"
138 }
139 ],
140 "source": [
141 "var('y')\n",
142 "solve(y^2 + (x+1)*y - 2 == 0, y)"
143 ]
144 },
145 {
146 "cell_type": "markdown",
147 "metadata": {},
148 "source": [
149 "Try removing the first line in the cell above and see what error you get!\n",
150 "\n",
151 "Here is another example:"
152 ]
153 },
154 {
155 "cell_type": "code",
156 "execution_count": 16,
157 "metadata": {},
158 "outputs": [
159 {
160 "data": {
161 "text/plain": [
162 "[x == -1/2*a - 1/2*sqrt(a^2 - 4*b), x == -1/2*a + 1/2*sqrt(a^2 - 4*b)]"
163 ]
164 },
165 "execution_count": 16,
166 "metadata": {},
167 "output_type": "execute_result"
168 }
169 ],
170 "source": [
171 "var('a', 'b')\n",
172 "f = x^2+a*x+b\n",
173 "solve(f,x)"
174 ]
175 },
176 {
177 "cell_type": "markdown",
178 "metadata": {},
179 "source": [
180 "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:"
181 ]
182 },
183 {
184 "cell_type": "code",
185 "execution_count": 17,
186 "metadata": {},
187 "outputs": [
188 {
189 "data": {
190 "text/plain": [
191 "-1"
192 ]
193 },
194 "execution_count": 17,
195 "metadata": {},
196 "output_type": "execute_result"
197 }
198 ],
199 "source": [
200 "e^(pi*I)"
201 ]
202 },
203 {
204 "cell_type": "markdown",
205 "metadata": {},
206 "source": [
207 "We will study symbolic expressions more in detail next time, in the context of calculus/analysis."
208 ]
209 },
210 {
211 "cell_type": "markdown",
212 "metadata": {},
213 "source": [
214 "# Basic rings and fields\n",
215 "\n",
216 "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n",
217 "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n",
218 "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n",
219 "\n",
220 "As you should know, a *field* is a Mathematical structure with two operations, addition and multiplication, which respect certain rules (distributivity, associativity, commutativity...). Some examples of fields are the Rational numbers $\\mathbb Q$, the Real numbers $\\mathbb R$ and the Complex numbers $\\mathbb C$, but there are many more. As you should also know, a *(commutative) ring* is like a field, except not all elements different from $0$ need have a multiplicative inverse. For example the integers $\\mathbb Z = \\{ \\dots, -1, 0, 1, 2, \\dots\\}$ are a ring, but not a field.\n",
221 "\n",
222 "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n",
223 "\n",
224 "|Mathematical object|Math symbol|Sage name|\n",
225 "|------------------:|:---------:|:--------|\n",
226 "|Integers|$\\mathbb Z$|`ZZ`|\n",
227 "|Rational numbers|$\\mathbb Q$|`QQ`|\n",
228 "|Real numbers|$\\mathbb R$|`RR`|\n",
229 "|Complex numbers|$\\mathbb C$|`CC`|\n",
230 "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n",
231 "|Finite fields|$\\mathbb F_p$|GF(p)|\n",
232 "|$\\dots$|$\\dots$|$\\dots$|"
233 ]
234 },
235 {
236 "cell_type": "markdown",
237 "metadata": {},
238 "source": [
239 "If you write a number or an expression, Sage will figure out where it \"lives\", choosing the most restrictive interpretation possible. For example `3` will be interpreted to be an integer, even if it is also a rational number, a real number and a complex number."
240 ]
241 },
242 {
243 "cell_type": "markdown",
244 "metadata": {},
245 "source": [
246 "## Parents and coercion\n",
247 "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n",
248 "\n",
249 "You can check where an object \"lives\" with the `parent()` command. It works more or less like the Python command `type()`, but it gives a more Mathematically inclined answer. Check the reference link [6] above if you want more details."
250 ]
251 },
252 {
253 "cell_type": "code",
254 "execution_count": 18,
255 "metadata": {},
256 "outputs": [
257 {
258 "data": {
259 "text/plain": [
260 "Rational Field"
261 ]
262 },
263 "execution_count": 18,
264 "metadata": {},
265 "output_type": "execute_result"
266 }
267 ],
268 "source": [
269 "#Edit this cell to find out the type of other objects that we used\n",
270 "parent(3/5)"
271 ]
272 },
273 {
274 "cell_type": "markdown",
275 "metadata": {},
276 "source": [
277 "Sometimes Sage does not give you the best possible interpretation, so you can force something to be interpreted as living in a smaller ring as follows:"
278 ]
279 },
280 {
281 "cell_type": "code",
282 "execution_count": 4,
283 "metadata": {},
284 "outputs": [
285 {
286 "name": "stdout",
287 "output_type": "stream",
288 "text": [
289 "Symbolic Ring\n",
290 "Integer Ring\n"
291 ]
292 }
293 ],
294 "source": [
295 "minus_one = e^(pi*I)\n",
296 "minus_one_coerced = ZZ(e^(pi*I)) # coercion\n",
297 "print(parent(minus_one))\n",
298 "print(parent(minus_one_coerced))"
299 ]
300 },
301 {
302 "cell_type": "markdown",
303 "metadata": {},
304 "source": [
305 "**Remark.** Notice that there is a fundamental difference between the rings `RR` and `CC` and all the others in the table above: the real and complex numbers are *approximated*."
306 ]
307 },
308 {
309 "cell_type": "code",
310 "execution_count": 1,
311 "metadata": {},
312 "outputs": [
313 {
314 "name": "stdout",
315 "output_type": "stream",
316 "text": [
317 "3\n",
318 "3.00000000000000\n"
319 ]
320 }
321 ],
322 "source": [
323 "print(QQ(3))\n",
324 "print(RR(3))"
325 ]
326 },
327 {
328 "cell_type": "markdown",
329 "metadata": {},
330 "source": [
331 "You can also choose the precision of this approximation using the alternative name `RealField`."
332 ]
333 },
334 {
335 "cell_type": "code",
336 "execution_count": 4,
337 "metadata": {},
338 "outputs": [
339 {
340 "name": "stdout",
341 "output_type": "stream",
342 "text": [
343 "Real Field with 53 bits of precision\n",
344 "Real Field with 1000 bits of precision\n"
345 ]
346 }
347 ],
348 "source": [
349 "print(RR)\n",
350 "print(RealField(prec=1000))"
351 ]
352 },
353 {
354 "cell_type": "markdown",
355 "metadata": {},
356 "source": [
357 "# Polynomial rings\n",
358 "\n",
359 "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n",
360 "\n",
361 "If you want to work with polynomials over a certain ring it is better to use this specific construction, rather than the symbolic expressions introduced above."
362 ]
363 },
364 {
365 "cell_type": "code",
366 "execution_count": 5,
367 "metadata": {},
368 "outputs": [
369 {
370 "data": {
371 "text/plain": [
372 "Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of precision"
373 ]
374 },
375 "execution_count": 5,
376 "metadata": {},
377 "output_type": "execute_result"
378 }
379 ],
380 "source": [
381 "polring.<x,y,z> = RR[] # Alternative: polring.<x,y,z> = PolynomialRing(RR)\n",
382 "polring"
383 ]
384 },
385 {
386 "cell_type": "markdown",
387 "metadata": {},
388 "source": [
389 "You can use as many variables as you like, and you can replace `RR` with any ring. In the example above `polring` is just the name of the variable (in the computer science sense) associated with this polynomial ring.\n",
390 "\n",
391 "## Operations on polynomials\n",
392 "\n",
393 "The usual Mathematical operations are available on polynomial rings, including Euclidean division `//` and remainder `%`. There is also the single-slash division `/`, but the result may not be a polynomial anymore.\n",
394 "\n",
395 "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n",
396 "\n",
397 "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?"
398 ]
399 },
400 {
401 "cell_type": "code",
402 "execution_count": 6,
403 "metadata": {},
404 "outputs": [
405 {
406 "name": "stdout",
407 "output_type": "stream",
408 "text": [
409 "x + 1\n",
410 "-4\n",
411 "(x^2 + 2*x - 3)/(x + 1)\n"
412 ]
413 }
414 ],
415 "source": [
416 "polring.<x> = QQ[]\n",
417 "p = x^2 + 2*x - 3 # Don't forget * for multiplication!\n",
418 "q = p // (x+1)\n",
419 "r = p % (x+1)\n",
420 "f = p / (x+1)\n",
421 "print(q)\n",
422 "print(r)\n",
423 "print(f)"
424 ]
425 },
426 {
427 "cell_type": "markdown",
428 "metadata": {},
429 "source": [
430 "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n",
431 "\n",
432 "**Remark.** Notice how the result can change substantially if you change the base ring.\n",
433 "\n",
434 "**Remark.** [Factorizations](https://doc.sagemath.org/html/en/reference/structure/sage/structure/factorization.html) are a particular object in Sage. They are kinda like a list, but not really. You can get a list of pairs (factor, power) with `list(factor(f))`."
435 ]
436 },
437 {
438 "cell_type": "code",
439 "execution_count": 7,
440 "metadata": {},
441 "outputs": [
442 {
443 "name": "stdout",
444 "output_type": "stream",
445 "text": [
446 "(t + 1) * (t^2 - 3) * (t^2 + 1)\n",
447 "[(-1, 1)]\n"
448 ]
449 },
450 {
451 "data": {
452 "text/plain": [
453 "(y + 1) * x"
454 ]
455 },
456 "execution_count": 7,
457 "metadata": {},
458 "output_type": "execute_result"
459 }
460 ],
461 "source": [
462 "polring_onevar.<t> = QQ[]\n",
463 "\n",
464 "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n",
465 "print(factor(f))\n",
466 "print(f.roots()) # Result: list of pairs (root,multiplicity)\n",
467 "\n",
468 "polring_manyvar.<x,y,z> = QQ[]\n",
469 "factor(x*y+x)\n",
470 "\n",
471 "# The following line gives an error, because the polynomial\n",
472 "# is understood to possibly have many variables:\n",
473 "#(x^2-1).roots()"
474 ]
475 },
476 {
477 "cell_type": "markdown",
478 "metadata": {},
479 "source": [
480 "# Matrices and vectors\n",
481 "\n",
482 "**References:** [[8](https://doc.sagemath.org/html/en/reference/matrices/index.html)], but in particular the subections [[9](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/docs.html)] and [[10](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/matrix2.html)]\n",
483 "\n",
484 "In Sage you can easily manipulate matrices and vectors"
485 ]
486 },
487 {
488 "cell_type": "code",
489 "execution_count": 77,
490 "metadata": {},
491 "outputs": [
492 {
493 "name": "stdout",
494 "output_type": "stream",
495 "text": [
496 "[ 1 2 3]\n",
497 "[ 0 0 1]\n",
498 "[ 4 -3 22/7] \n",
499 "\n",
500 "[1/2 0 0]\n",
501 "[ 7 0 0]\n",
502 "[ 1 1 1] \n",
503 "\n",
504 "(3/2, 21, 6) \n",
505 "\n",
506 "[ -7/2 -10 80/7]\n",
507 "[ 17 -4 15/7]\n",
508 "[ 241/7 -18/7 869/49] \n",
509 "\n",
510 "Rank of A = 3\n",
511 "Rank of B = 2\n"
512 ]
513 }
514 ],
515 "source": [
516 "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n",
517 "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n",
518 "v = vector([3,4,-1])\n",
519 "\n",
520 "print(A, \"\\n\") # \\n just means \"newline\"\n",
521 "print(B, \"\\n\")\n",
522 "print(B*v, \"\\n\")\n",
523 "print(A^2 + 2*B - A*B, \"\\n\")\n",
524 "\n",
525 "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n",
526 "print(\"Rank of B =\", rank(B))"
527 ]
528 },
529 {
530 "cell_type": "markdown",
531 "metadata": {},
532 "source": [
533 "**Exercise:** in the cell above, compute the determinant, inverse and characteristic polynomial of the matrix `A`. *Hint: look at the reference [10] above (the functions are listed in alphabetic order).*\n",
534 "\n",
535 "As for polynomials, you can specify where a matrix or a vector lives"
536 ]
537 },
538 {
539 "cell_type": "code",
540 "execution_count": 57,
541 "metadata": {},
542 "outputs": [
543 {
544 "data": {
545 "text/plain": [
546 "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision"
547 ]
548 },
549 "execution_count": 57,
550 "metadata": {},
551 "output_type": "execute_result"
552 }
553 ],
554 "source": [
555 "M = matrix(CC, [[0,1],[1,0]])\n",
556 "parent(M)"
557 ]
558 },
559 {
560 "cell_type": "markdown",
561 "metadata": {},
562 "source": [
563 "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n",
564 "\n",
565 "**Warning.** In linear algebra there are distinct concepts of *left* and *right* eigenvalues (and eigenvector). The one you know is probably that of **right** eigen-{value,vector}, that is an element $\\lambda$ of the base field and a non-zero vector $\\mathbf v$ with $A\\mathbf v=\\lambda\\mathbf v$. The other concept corresponds to the equality $\\mathbf v^TA=\\lambda \\mathbf v$."
566 ]
567 },
568 {
569 "cell_type": "code",
570 "execution_count": 60,
571 "metadata": {},
572 "outputs": [
573 {
574 "data": {
575 "text/plain": [
576 "(0.289916349448506, 0.0241596957873755)"
577 ]
578 },
579 "execution_count": 60,
580 "metadata": {},
581 "output_type": "execute_result"
582 }
583 ],
584 "source": [
585 "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n",
586 "v = vector(RR, [3,0])\n",
587 "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v"
588 ]
589 },
590 {
591 "cell_type": "code",
592 "execution_count": 64,
593 "metadata": {},
594 "outputs": [
595 {
596 "data": {
597 "text/plain": [
598 "[\n",
599 "(-0.3722813232690144?, Vector space of degree 2 and dimension 1 over Algebraic Field\n",
600 "User basis matrix:\n",
601 "[ 1 -0.6861406616345072?]),\n",
602 "(5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic Field\n",
603 "User basis matrix:\n",
604 "[ 1 2.186140661634508?])\n",
605 "]"
606 ]
607 },
608 "execution_count": 64,
609 "metadata": {},
610 "output_type": "execute_result"
611 }
612 ],
613 "source": [
614 "A = Matrix(QQ, [[1,2],[3,4]])\n",
615 "A.eigenspaces_right() # Also: A.eigenvalues(), A.eigenvectors_right()"
616 ]
617 },
618 {
619 "cell_type": "markdown",
620 "metadata": {},
621 "source": [
622 "We can also extract a specific submatrix by selecting only some rows and columns, with a syntax similar to that of Python's lists. Check out more examples in the reference [9] above, and try them in the cell below."
623 ]
624 },
625 {
626 "cell_type": "code",
627 "execution_count": 94,
628 "metadata": {},
629 "outputs": [
630 {
631 "name": "stdout",
632 "output_type": "stream",
633 "text": [
634 "[-14 2 0 -1 1 -2 -1]\n",
635 "[ 0 -8 0 9 -2 11 1]\n",
636 "[ 0 3 1 -1 1 1 221]\n",
637 "[ -1 2 1 -25 -10 4 0]\n",
638 "[ -3 0 0 2 16 -1 -2]\n",
639 "[ 1 -3 3 -41 1 0 0]\n",
640 "[ -2 1 0 0 -6 2 12] \n",
641 "\n",
642 "[ 0 9 -2]\n",
643 "[ 1 -1 1] \n",
644 "\n",
645 "[-14 2 0 -1 1 -2 -1] \n",
646 "\n",
647 "[-14 2 0 -1 1]\n",
648 "[ 1 -3 3 -41 1]\n",
649 "[ 0 3 1 -1 1]\n"
650 ]
651 }
652 ],
653 "source": [
654 "A = MatrixSpace(ZZ, 7).random_element()\n",
655 "print(A, \"\\n\")\n",
656 "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n",
657 "print(A[0,0:], \"\\n\") # First row, all columns\n",
658 "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5"
659 ]
660 },
661 {
662 "cell_type": "markdown",
663 "metadata": {},
664 "source": [
665 "**Exercise:** write a sage function that computes the determinant of an $n\\times n$ matrix $A=(a_{ij})$ using Laplace's rule by the first row, that is \n",
666 "\\begin{align*}\n",
667 " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n",
668 "\\end{align*}\n",
669 "where $M_{0j}$ is the determinant of the $(n-1)\\times(n-1)$ matrix obtained by removing the $0$-th row and the $j$-th column from $A$."
670 ]
671 },
672 {
673 "cell_type": "code",
674 "execution_count": 91,
675 "metadata": {},
676 "outputs": [],
677 "source": [
678 "def my_det(A):\n",
679 " if not A.is_square():\n",
680 " print(\"Error: matrix is not square\")\n",
681 " \n",
682 " n = A.nrows() # size of the matrix\n",
683 " \n",
684 " # Continue from here!"
685 ]
686 },
687 {
688 "cell_type": "markdown",
689 "metadata": {},
690 "source": [
691 "# Number Theory\n",
692 "\n",
693 "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n",
694 "\n",
695 "Sage includes a large library of functions for computing with the integers, see the link above."
696 ]
697 },
698 {
699 "cell_type": "code",
700 "execution_count": 8,
701 "metadata": {},
702 "outputs": [
703 {
704 "name": "stdout",
705 "output_type": "stream",
706 "text": [
707 "3^2 * 3607 * 3803\n",
708 "True\n",
709 "True\n",
710 "619703040\n",
711 "9\n",
712 "13548070123626141\n"
713 ]
714 }
715 ],
716 "source": [
717 "n = 123456789\n",
718 "m = 987654321\n",
719 "p = 3607\n",
720 "\n",
721 "print(factor(n))\n",
722 "print(is_prime(p))\n",
723 "print(p.divides(n))\n",
724 "print(euler_phi(m))\n",
725 "print(gcd(n, m))\n",
726 "print(lcm(n, m))"
727 ]
728 },
729 {
730 "cell_type": "markdown",
731 "metadata": {},
732 "source": [
733 "## Primes\n",
734 "\n",
735 "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n",
736 "\n",
737 "The set of prime numbers is called `Primes()`. It is like an infinite list: for example you can get the one-millionth prime number or you can use this list to create other lists. You can also check what the first prime number larger than a given number is."
738 ]
739 },
740 {
741 "cell_type": "code",
742 "execution_count": 9,
743 "metadata": {},
744 "outputs": [
745 {
746 "name": "stdout",
747 "output_type": "stream",
748 "text": [
749 "Set of all prime numbers: 2, 3, 5, 7, ...\n",
750 "31 15485867\n",
751 "47\n",
752 "[79, 83, 89, 97]\n"
753 ]
754 }
755 ],
756 "source": [
757 "PP = Primes()\n",
758 "print(PP)\n",
759 "print(PP[10], PP[10^6])\n",
760 "print(PP.next(44))\n",
761 "\n",
762 "First_Thousand_Primes = PP[0:1000]\n",
763 "print([p for p in First_Thousand_Primes if p < 100 and p > 75])"
764 ]
765 },
766 {
767 "cell_type": "markdown",
768 "metadata": {},
769 "source": [
770 "## The Chinese remainder theorem (CRT)\n",
771 "\n",
772 "We say that two integers $a$ and $b$ are *congruent* modulo another integer $n>0$ if they have the same remainder when divided by $n$. We denote this by $a\\equiv b\\pmod n$, or in Python/Sage syntax `a % n == b % n`.\n",
773 "\n",
774 "The Chinese remainder theorem states that if $a,b\\in\\mathbb Z$ and $n,m\\in \\mathbb Z_{>0}$ are such that $\\gcd(n,m)=1$ then the system of congruences\n",
775 "\n",
776 "\\begin{align*}\n",
777 "\\begin{cases}\n",
778 " x \\equiv a \\pmod n\\\\\n",
779 " x \\equiv b \\pmod m\n",
780 "\\end{cases}\n",
781 "\\end{align*}\n",
782 "\n",
783 "has exactly one solution modulo $mn$. This means that there is one and only one number $x$ with $0\\leq x<mn$ such that $x\\equiv a\\pmod n$ and $x\\equiv b\\pmod m$.\n",
784 "\n",
785 "The procedure to find such a number is not too hard to describe (you might see it in an algebra or number theory course), but it can be a bit long. Luckily, Sage can do this for you:"
786 ]
787 },
788 {
789 "cell_type": "code",
790 "execution_count": 10,
791 "metadata": {},
792 "outputs": [
793 {
794 "name": "stdout",
795 "output_type": "stream",
796 "text": [
797 "74306 2 798\n"
798 ]
799 }
800 ],
801 "source": [
802 "a = 2\n",
803 "b = -1\n",
804 "n = 172\n",
805 "m = 799\n",
806 "\n",
807 "if gcd(n,m) != 1:\n",
808 " print(\"The numbers are not comprime, I can't solve this!\")\n",
809 "else:\n",
810 " x = crt(a, b, n, m)\n",
811 " print(x, x%n, x%m)"
812 ]
813 },
814 {
815 "cell_type": "markdown",
816 "metadata": {},
817 "source": [
818 "**Exercise.** There is a more general version of the Chinese remainder theorem which says that if $a_0, a_1, \\dots, a_k\\in\\mathbb Z$ and $n_0, n_2, \\dots, n_k\\in\\mathbb Z_{>0}$ are such that $\\gcd(n_i, n_j)=1$ for $i\\neq j$, then the system of congruences\n",
819 "\n",
820 "\\begin{align*}\n",
821 "\\begin{cases}\n",
822 " x \\equiv a_0 \\pmod {n_0}\\\\\n",
823 " x \\equiv a_1 \\pmod {n_1}\\\\\n",
824 " \\dots \\\\\n",
825 " x \\equiv a_k \\pmod {n_k}\n",
826 "\\end{cases}\n",
827 "\\end{align*}\n",
828 "\n",
829 "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n",
830 "*Hint: start by running the command `help(crt)`."
831 ]
832 },
833 {
834 "cell_type": "code",
835 "execution_count": 127,
836 "metadata": {},
837 "outputs": [],
838 "source": [
839 "#help(crt)"
840 ]
841 },
842 {
843 "cell_type": "markdown",
844 "metadata": {},
845 "source": [
846 "# Cryptography: RSA\n",
847 "\n",
848 "[Cryptography](https://en.wikipedia.org/wiki/Cryptography) is the discipline that studies methods to communicate secrets in such a way that any unauthorized listener would not be able to understand the message.\n",
849 "\n",
850 "A simple cryptographic protocol could be changing every letter of your text following a fixed scheme (or *cypher*), for example by turning every A into a B, every B into a C and so on. However this is not a very secure method, for many reasons. One of them is that at some point the people who want to communicate need to agree on what method to use, and anyone listening to that conversation would be able to decypher every subsequent conversation. A public-key cryptographic protocol solves this problem.\n",
851 "\n",
852 "## Public-key cryptography\n",
853 "\n",
854 "Public-key cryptographic protocols, such as RSA, work like this: there are two keys, a *private* key that is only known to person A (traditionally called Alice in every example), and a *public* key that does not need to be secret.\n",
855 "\n",
856 "The public key is used to *encrypt* the message (that is to \"lock\" it, or \"hyde\" it), but one needs the private key to *decrypt* it. Imagine having two keys for your door, but one can only be used to lock it, while the other only to open it.\n",
857 "\n",
858 "The message exchange works like this: suppose that person B (Bob) wants to send a secret message to Alice. Then Alice secretely generates a private and a public key and sends only the public one to Bob. Now Bob encrypts the message and sends it to Alice, who can use her private key to decrypt it. Even if Eve (short for *eavesdropper*, an unauthorized listener) listens to every message exchanged, she won't be able to decypher the secret: the private key has never left Alice's house!\n",
859 "\n",
860 "Notice that such a protocol is *asymmetric*: if Alice wanted to send a secret to Bob in reply, Bob would need to generate a pair of keys of his own.\n",
861 "\n",
862 "Let's see how we can do this in practice, using number theory!\n",
863 "\n",
864 "## RSA\n",
865 "\n",
866 "As many other cryptography protocols, RSA is based on a Mathematical process that is easy to do in one direction, but very hard to invert. In this case the hard process is integer factorization, that is decomposing an integer number as a product of primes."
867 ]
868 },
869 {
870 "cell_type": "code",
871 "execution_count": 2,
872 "metadata": {},
873 "outputs": [
874 {
875 "name": "stdout",
876 "output_type": "stream",
877 "text": [
878 "True True False\n"
879 ]
880 }
881 ],
882 "source": [
883 "p = 100003100019100043100057100069\n",
884 "q = 100144655312449572059845328443\n",
885 "n = p*q\n",
886 "print(is_prime(p), is_prime(q), is_prime(p*q))\n",
887 "\n",
888 "# Use the command below to see how long it takes\n",
889 "#timeit(\"factor(n)\", number=1, repeat=1)"
890 ]
891 },
892 {
893 "cell_type": "markdown",
894 "metadata": {},
895 "source": [
896 "In order to generate the keys, Alice picks a number $n$ which is the product of two large primes $p$ and $q$ of more or less the same size. Finding such primes is relatively easy compared to factoring the number $n$ she obtained. Then she computes the Euler totient $\\varphi(n)=(p-1)(q-1)$ of $n$, which she can do because she knows that $n=pq$ - it would be impossible otherwise!\n",
897 "\n",
898 "Then Alice can compute two integers $(d,e)$ such that $de\\equiv 1\\pmod{\\varphi(n)}$. She will send the numbers $n$ and $d$ to Bob and keep $e$ secret. In this case the public key is the pair $(n,d)$, while $e$ is the private key.\n",
899 "\n",
900 "Of course, she does all of this using Sage!"
901 ]
902 },
903 {
904 "cell_type": "code",
905 "execution_count": 105,
906 "metadata": {},
907 "outputs": [
908 {
909 "data": {
910 "text/plain": [
911 "(419199544978969, 235530823946467, 80799425863927)"
912 ]
913 },
914 "execution_count": 105,
915 "metadata": {},
916 "output_type": "execute_result"
917 }
918 ],
919 "source": [
920 "def two_large_primes():\n",
921 " p, q = 0, 0\n",
922 " # We make sure that they are different\n",
923 " while p == q:\n",
924 " p = Primes()[randint(10^6, 2*10^6)]\n",
925 " q = Primes()[randint(10^6, 2*10^6)]\n",
926 " return p, q\n",
927 "\n",
928 "def random_unit_mod(N):\n",
929 " R = Integers(N)\n",
930 " d = R(0)\n",
931 " # We make sure that it is invertible\n",
932 " while not d.is_unit():\n",
933 " d = R.random_element()\n",
934 " return d\n",
935 "\n",
936 "def Alice_generate_keys():\n",
937 " p, q = two_large_primes()\n",
938 " n = p*q\n",
939 " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n",
940 " \n",
941 " d = random_unit_mod(phi_n)\n",
942 " e = d^-1\n",
943 " return n, d, e\n",
944 "\n",
945 "Alice_generate_keys()"
946 ]
947 },
948 {
949 "cell_type": "markdown",
950 "metadata": {},
951 "source": [
952 "Now, how does Bob encrypt his message? Let's say he wants to send to Alice the number $m$ with $1<m<n$ (In practice he would like to send her some text with emojis, or maybe a voice message; but for computers everything is a number, and there are different ways to translate any sort of information to a number. He just chooses one of the many standard methods that already exist, no cryptography is needed in this step. If the message $m$ is too long, he can split it up in some pieces and repeat the process multiple times.)\n",
953 "\n",
954 "Now he computes $m^d\\pmod n$ and sends it back to Alice."
955 ]
956 },
957 {
958 "cell_type": "code",
959 "execution_count": 3,
960 "metadata": {},
961 "outputs": [
962 {
963 "data": {
964 "text/plain": [
965 "149461597163501"
966 ]
967 },
968 "execution_count": 3,
969 "metadata": {},
970 "output_type": "execute_result"
971 }
972 ],
973 "source": [
974 "def Bob_encrypt(m, n, d):\n",
975 " R = Integers(n)\n",
976 " return R(m)^d # Assume that n is large enough\n",
977 " \n",
978 "message = 42424242\n",
979 "Bob_encrypt(message, 419199544978969, 235530823946467)"
980 ]
981 },
982 {
983 "cell_type": "markdown",
984 "metadata": {},
985 "source": [
986 "Since $de\\equiv 1\\pmod{\\varphi(n)}$, it follows that $(m^d)^e\\equiv m\\pmod n$ (see [Wikipedia: Euler's theorem](https://en.wikipedia.org/wiki/Euler%27s_theorem)). So for Alice it is very easy to get back the original message:"
987 ]
988 },
989 {
990 "cell_type": "code",
991 "execution_count": 108,
992 "metadata": {},
993 "outputs": [
994 {
995 "data": {
996 "text/plain": [
997 "42424242"
998 ]
999 },
1000 "execution_count": 108,
1001 "metadata": {},
1002 "output_type": "execute_result"
1003 }
1004 ],
1005 "source": [
1006 "def Alice_decrypt(m_encrypted, n, e):\n",
1007 " R = Integers(n)\n",
1008 " return R(m_encrypted)^e\n",
1009 "\n",
1010 "Alice_decrypt(149461597163501, 419199544978969, 80799425863927)"
1011 ]
1012 },
1013 {
1014 "cell_type": "markdown",
1015 "metadata": {},
1016 "source": [
1017 "Another assumption on which RSA relies is that even if one knows $M=m^e$ and $e$, extracting the $e$-th root of $M$ modulo $n$ (and thus obtaining $m$) is very hard. Currently the best known way to do this is by factorizing $n$ first, which is considered to be a very hard problem. However, there is no proof that faster algorithms can't be devised.\n",
1018 "\n",
1019 "Moreover, one day we will overcome the current technological difficulties and quantum computers will be available. Quantum computers are not just \"more powerful\" than classical hardware, but they work based on completely different logical foundations and they make the factorization problem much easier to solve: for example [Shor's algorithm](https://en.wikipedia.org/wiki/Shor%27s_algorithm) takes advantage of this different logic and can factorize numbers quickly, if run on a quantum computer.\n",
1020 "\n",
1021 "To this day the largest number factorized with a quantum computer is $21=3\\times 7$. Nonetheless, quantum-safe cryptography protocols (i.e. based on problems that are hard to solve also with quantum computers) have already been developed."
1022 ]
1023 }
1024 ],
1025 "metadata": {
1026 "kernelspec": {
1027 "display_name": "SageMath 9.2",
1028 "language": "sage",
1029 "name": "sagemath"
1030 },
1031 "language_info": {
1032 "codemirror_mode": {
1033 "name": "ipython",
1034 "version": 3
1035 },
1036 "file_extension": ".py",
1037 "mimetype": "text/x-python",
1038 "name": "python",
1039 "nbconvert_exporter": "python",
1040 "pygments_lexer": "ipython3",
1041 "version": "3.8.5"
1042 }
1043 },
1044 "nbformat": 4,
1045 "nbformat_minor": 4
1046}
diff --git a/Lectures/7-SageAlgebra.pdf b/Lectures/7-SageAlgebra.pdf
new file mode 100644
index 0000000..3b9d17c
--- /dev/null
+++ b/Lectures/7-SageAlgebra.pdf
Binary files differ
diff --git a/Lectures/8-SageCalculus.ipynb b/Lectures/8-SageCalculus.ipynb
new file mode 100644
index 0000000..4b81998
--- /dev/null
+++ b/Lectures/8-SageCalculus.ipynb
@@ -0,0 +1,1372 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Symbolic expressions\n",
8 "\n",
9 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
10 "\n",
11 "Last time we saw the basics of symbolic expressions:\n",
12 "* How to define and manipulate symbolic expressions\n",
13 "* How to introduce new variables (in the Mathematical sense) with `var()`\n",
14 "* How to solve equations and inequalities\n",
15 "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n",
16 "\n",
17 "Here are some examples to remind you of these basic things:"
18 ]
19 },
20 {
21 "cell_type": "code",
22 "execution_count": 2,
23 "metadata": {},
24 "outputs": [
25 {
26 "name": "stdout",
27 "output_type": "stream",
28 "text": [
29 "[\n",
30 "x == -sqrt(-pi),\n",
31 "x == sqrt(-pi)\n",
32 "]\n",
33 "[\n",
34 "z == -sqrt(pi + x^2),\n",
35 "z == sqrt(pi + x^2)\n",
36 "]\n",
37 "[[y < -2], [y > 1]]\n",
38 "2*pi + e is approximately 9.00146713563863\n"
39 ]
40 }
41 ],
42 "source": [
43 "var('y', 'z') # Define new variables (x is already defined by Sage)\n",
44 "f = x^2 + pi\n",
45 "g = y^2 + y - 2 > 0\n",
46 "print( solve(f==0, x) )\n",
47 "print( solve(z^2 - f, z) )\n",
48 "print( solve(g, y) )\n",
49 "print( 2*pi + e, \"is approximately\", n(2*pi + e) )"
50 ]
51 },
52 {
53 "cell_type": "markdown",
54 "metadata": {},
55 "source": [
56 "Now we will see some more details about solving equations and manipulating their solutions."
57 ]
58 },
59 {
60 "cell_type": "markdown",
61 "metadata": {},
62 "source": [
63 "## Solving equations and inequalities\n",
64 "\n",
65 "**Reference** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)] for the details of `solve()` and `find_root()`, [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html#solving)] for examples.\n",
66 "\n",
67 "Other than equations and inequalities, we can also solve systems: it is enough to give Sage a list of expressions and a list of variables with respect to which we want to solve. For example the system\n",
68 "\n",
69 "\\begin{align*}\n",
70 " \\begin{cases}\n",
71 " x + y = 2 \\\\\n",
72 " 2x - y = 6\n",
73 " \\end{cases}\n",
74 "\\end{align*}\n",
75 "\n",
76 "Can be solved as"
77 ]
78 },
79 {
80 "cell_type": "code",
81 "execution_count": 40,
82 "metadata": {},
83 "outputs": [
84 {
85 "data": {
86 "text/plain": [
87 "[[x == (8/3), y == (-2/3)]]"
88 ]
89 },
90 "execution_count": 40,
91 "metadata": {},
92 "output_type": "execute_result"
93 }
94 ],
95 "source": [
96 "solve([x+y == 2, 2*x - y == 6], [x,y])"
97 ]
98 },
99 {
100 "cell_type": "markdown",
101 "metadata": {},
102 "source": [
103 "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x^2+1$."
104 ]
105 },
106 {
107 "cell_type": "markdown",
108 "metadata": {},
109 "source": [
110 "### The set of solutions\n",
111 "\n",
112 "One would expect the result of `solve()` to be a list of solutions, but it is actually a list of expressions (technically it is not a list but a different type of Python collection, but this is not so important)"
113 ]
114 },
115 {
116 "cell_type": "code",
117 "execution_count": 37,
118 "metadata": {},
119 "outputs": [
120 {
121 "data": {
122 "text/plain": [
123 "x == -3"
124 ]
125 },
126 "execution_count": 37,
127 "metadata": {},
128 "output_type": "execute_result"
129 }
130 ],
131 "source": [
132 "solutions = solve(x^2-9 == 0, x)\n",
133 "solutions[0] # This is the expression 'x == -3'"
134 ]
135 },
136 {
137 "cell_type": "markdown",
138 "metadata": {},
139 "source": [
140 "To read the actual solution without the `x ==` part you can use the `rhs()` or `lhs()` functions, which can be applied to any expression containing a relation operator (like `==`, `<`, `>=`...) and return the *right hand side* and *left hand side* of the expression, respectively"
141 ]
142 },
143 {
144 "cell_type": "code",
145 "execution_count": 41,
146 "metadata": {},
147 "outputs": [
148 {
149 "name": "stdout",
150 "output_type": "stream",
151 "text": [
152 "rhs: 2\n",
153 "lhs: x\n"
154 ]
155 }
156 ],
157 "source": [
158 "f = x == 2\n",
159 "print(\"rhs:\", f.rhs())\n",
160 "print(\"lhs:\", f.lhs())"
161 ]
162 },
163 {
164 "cell_type": "markdown",
165 "metadata": {},
166 "source": [
167 "When you solve an inequality or a system, the set of solutions can be more complicated to describe. In this case the result is a list containing lists of expressions that have to be `True` at the same time. It is easier to explain with an example:"
168 ]
169 },
170 {
171 "cell_type": "code",
172 "execution_count": 38,
173 "metadata": {},
174 "outputs": [
175 {
176 "name": "stdout",
177 "output_type": "stream",
178 "text": [
179 "Simple inequality: [[x < -3], [x > 3]]\n",
180 "System of inequalities:\n",
181 " [\n",
182 "[3 < x, x < 6],\n",
183 "[x < -3]\n",
184 "]\n"
185 ]
186 }
187 ],
188 "source": [
189 "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n",
190 "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))"
191 ]
192 },
193 {
194 "cell_type": "markdown",
195 "metadata": {},
196 "source": [
197 "In the last example (system of inequalities), Sage is telling us that the system\n",
198 "\\begin{align*}\n",
199 " \\begin{cases}\n",
200 " x^2-9 > 9 \\\\\n",
201 " x < 6\n",
202 " \\end{cases}\n",
203 "\\end{align*}\n",
204 "has two solutions:\n",
205 "* $x$ is between $3$ and $6$;\n",
206 "* $x$ is less than $-3$.\n",
207 "\n",
208 "Since in Sage (and in Python) expressions can have at most on relational operator like `<`, the first solution requires two expressions to be described. Hence the \"list of lists\".\n"
209 ]
210 },
211 {
212 "cell_type": "markdown",
213 "metadata": {},
214 "source": [
215 "**Exercise.** In the first exercise you were asked to solve a system of equations, but some of its solutions were complex numbers. Select only the real solutions and print them as pairs $(x,y)$."
216 ]
217 },
218 {
219 "cell_type": "markdown",
220 "metadata": {},
221 "source": [
222 "When solving a system of equations (not inequalities), you can use the option `solution_dict=True` to have the solutions arranged as a *dictionary*, which is a type of Python collection that we did not treat in this course"
223 ]
224 },
225 {
226 "cell_type": "code",
227 "execution_count": 44,
228 "metadata": {},
229 "outputs": [
230 {
231 "data": {
232 "text/plain": [
233 "[{x: 8/3, y: -2/3}]"
234 ]
235 },
236 "execution_count": 44,
237 "metadata": {},
238 "output_type": "execute_result"
239 }
240 ],
241 "source": [
242 "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)"
243 ]
244 },
245 {
246 "cell_type": "markdown",
247 "metadata": {},
248 "source": [
249 "### Alternative method for real roots: `find_root()`\n",
250 "\n",
251 "The `solve()` method is very useful when solving *symbolic* equations, for example when you have two variables and you want to solve for one of them in terms of the other. However, it does not always find explicit solutions.\n",
252 "\n",
253 "When you want to find an explicit, even if approximate, solution, it can be better to use `find_root()`. This function works *numerically*, which means that it finds an approximation of the root. It only works for real solutions and you need to specify an interval where you want the root to be searched:"
254 ]
255 },
256 {
257 "cell_type": "code",
258 "execution_count": 52,
259 "metadata": {},
260 "outputs": [
261 {
262 "name": "stdout",
263 "output_type": "stream",
264 "text": [
265 "Using solve():\n",
266 " [\n",
267 "x == -e^x + 10\n",
268 "]\n",
269 "Using find_root(): 2.070579904980303\n"
270 ]
271 }
272 ],
273 "source": [
274 "f = e^x + x - 10\n",
275 "print(\"Using solve():\\n\", solve(f, x))\n",
276 "print(\"Using find_root():\", f.find_root(0,100))"
277 ]
278 },
279 {
280 "cell_type": "markdown",
281 "metadata": {},
282 "source": [
283 "## Evaluating functions\n",
284 "\n",
285 "If an expression contains only one variable you can evaluate it easily, even if it is not a function."
286 ]
287 },
288 {
289 "cell_type": "code",
290 "execution_count": 21,
291 "metadata": {},
292 "outputs": [
293 {
294 "name": "stdout",
295 "output_type": "stream",
296 "text": [
297 "1\n",
298 "y + 3 > (y + 3)^2\n"
299 ]
300 }
301 ],
302 "source": [
303 "var('y')\n",
304 "f = x^2-3\n",
305 "g = x > x^2\n",
306 "\n",
307 "print(f(2))\n",
308 "print(g(3+y))"
309 ]
310 },
311 {
312 "cell_type": "markdown",
313 "metadata": {},
314 "source": [
315 "If an expression contains more than one variable, you can specify a value for each of them and they will be substituted in alphabetic order. You can also specify a value only for some of the variables."
316 ]
317 },
318 {
319 "cell_type": "code",
320 "execution_count": 38,
321 "metadata": {},
322 "outputs": [
323 {
324 "name": "stdout",
325 "output_type": "stream",
326 "text": [
327 "-2 == 0\n",
328 "3*y == 2\n"
329 ]
330 }
331 ],
332 "source": [
333 "var('y','z')\n",
334 "\n",
335 "f = y*z^2 - y == z\n",
336 "print(f(2, 0))\n",
337 "print(f(z=2))"
338 ]
339 },
340 {
341 "cell_type": "markdown",
342 "metadata": {},
343 "source": [
344 "## Symbolic computations\n",
345 "\n",
346 "Sage can understand and simplify symbolic expressions such as sums (finite or infinite) and products. In the following cell, we compute the following sums using the [`sum()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.sum) function:\n",
347 "\n",
348 "\\begin{align*}\n",
349 " \\begin{array}{llcc}\n",
350 " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n",
351 " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n",
352 " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n",
353 " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n",
354 " \\end{array}\n",
355 "\\end{align*}"
356 ]
357 },
358 {
359 "cell_type": "code",
360 "execution_count": 22,
361 "metadata": {},
362 "outputs": [
363 {
364 "name": "stdout",
365 "output_type": "stream",
366 "text": [
367 "(1) 1/2*n^2 + 1/2*n\n",
368 "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n",
369 "(3) 2^n\n",
370 "(4) 1/6*pi^2\n"
371 ]
372 }
373 ],
374 "source": [
375 "var('k', 'n') # Remember to declare all variables\n",
376 "\n",
377 "s = []\n",
378 "s.append( sum(k, k, 0, n) )\n",
379 "s.append( sum(k^4, k, 0, n) )\n",
380 "s.append( sum(binomial(n,k), k, 0, n) )\n",
381 "s.append( sum(1/k^2, k, 1, infinity) )\n",
382 "\n",
383 "for i in range(len(s)):\n",
384 " print(\"({}) {}\".format(i+1, s[i]))"
385 ]
386 },
387 {
388 "cell_type": "markdown",
389 "metadata": {},
390 "source": [
391 "An alternative notation is `expression.sum(k, a, b)`. There is an analogous [`prod()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.prod) for products."
392 ]
393 },
394 {
395 "cell_type": "markdown",
396 "metadata": {},
397 "source": [
398 "Sometimes Sage tries to keep an expression in its original form without expanding out sums and products. To change this behavior you can use the [`expand()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.expand) function:"
399 ]
400 },
401 {
402 "cell_type": "code",
403 "execution_count": 30,
404 "metadata": {},
405 "outputs": [
406 {
407 "name": "stdout",
408 "output_type": "stream",
409 "text": [
410 "(x + 1)^2 - (x - 1)^2\n",
411 "4*x\n"
412 ]
413 }
414 ],
415 "source": [
416 "f = (x+1)^2 - (x-1)^2\n",
417 "print(f)\n",
418 "print(f.expand())"
419 ]
420 },
421 {
422 "cell_type": "markdown",
423 "metadata": {},
424 "source": [
425 "### The Symbolic Ring\n",
426 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n",
427 "\n",
428 "The symbolic expressions that we have seen so far live in a ring called *symbolic ring* and denoted by `SR` in Sage. This ring works like the ring `ZZ` of integers or `RR` of reals numbers. In particular, you can define matrices and other objects using it as a \"basis\"."
429 ]
430 },
431 {
432 "cell_type": "code",
433 "execution_count": 45,
434 "metadata": {},
435 "outputs": [
436 {
437 "name": "stdout",
438 "output_type": "stream",
439 "text": [
440 "-b*c + a*d\n",
441 "[(-a, 2)]\n"
442 ]
443 }
444 ],
445 "source": [
446 "var('a', 'b', 'c', 'd')\n",
447 "\n",
448 "M = matrix([[a,b], [c,d]])\n",
449 "print(M.determinant())\n",
450 "\n",
451 "polring.<x> = SR[]\n",
452 "f = x^2 + 2*a*x + a^2\n",
453 "print(f.roots())"
454 ]
455 },
456 {
457 "cell_type": "markdown",
458 "metadata": {},
459 "source": [
460 "**Exercise.** Compute the eigenvalues of the matrix\n",
461 "\\begin{align*}\n",
462 "\\begin{pmatrix}\n",
463 "\\cos \\alpha & \\sin \\alpha\\\\\n",
464 "-\\sin\\alpha & \\cos \\alpha\n",
465 "\\end{pmatrix}\n",
466 "\\end{align*}"
467 ]
468 },
469 {
470 "cell_type": "markdown",
471 "metadata": {},
472 "source": [
473 "# Calculus\n",
474 "**Reference:** [[4](https://doc.sagemath.org/html/en/reference/calculus/index.html)] for an overview, but most functions are described in [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]"
475 ]
476 },
477 {
478 "cell_type": "markdown",
479 "metadata": {},
480 "source": [
481 "## Limits and series\n",
482 "\n",
483 "**References:** [[5](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html#sage.calculus.calculus.limit)] for limits, [[6](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.series)] for series\n",
484 "\n",
485 "You can compute limits"
486 ]
487 },
488 {
489 "cell_type": "code",
490 "execution_count": 54,
491 "metadata": {},
492 "outputs": [
493 {
494 "name": "stdout",
495 "output_type": "stream",
496 "text": [
497 "1\n",
498 "0\n"
499 ]
500 }
501 ],
502 "source": [
503 "f = sin(x)/x\n",
504 "# print(f(0)) # This one gives an error\n",
505 "print( f.limit(x=0) )\n",
506 "\n",
507 "print( (e^(-x)).limit(x=infinity) )"
508 ]
509 },
510 {
511 "cell_type": "markdown",
512 "metadata": {},
513 "source": [
514 "**Exercise.** Compute the constant $e$ using a limit."
515 ]
516 },
517 {
518 "cell_type": "markdown",
519 "metadata": {},
520 "source": [
521 "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit."
522 ]
523 },
524 {
525 "cell_type": "code",
526 "execution_count": 55,
527 "metadata": {},
528 "outputs": [
529 {
530 "name": "stdout",
531 "output_type": "stream",
532 "text": [
533 "und\n",
534 "1\n",
535 "-1\n"
536 ]
537 }
538 ],
539 "source": [
540 "f = abs(x)/x # 1 if x>0, -1 if x<0\n",
541 "print( f.limit(x=0) ) # undefined\n",
542 "print( f.limit(x=0, dir=\"+\") )\n",
543 "print( f.limit(x=0, dir=\"-\") )"
544 ]
545 },
546 {
547 "cell_type": "markdown",
548 "metadata": {},
549 "source": [
550 "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`."
551 ]
552 },
553 {
554 "cell_type": "markdown",
555 "metadata": {},
556 "source": [
557 "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does."
558 ]
559 },
560 {
561 "cell_type": "code",
562 "execution_count": 56,
563 "metadata": {},
564 "outputs": [
565 {
566 "name": "stdout",
567 "output_type": "stream",
568 "text": [
569 "1 + 1*x + 1/2*x^2 + Order(x^3)\n",
570 "(-2) + 1*x + 1*x^2 + (-1/6)*x^3 + (-1/12)*x^4 + 1/120*x^5 + 1/360*x^6 + Order(x^7)\n",
571 "1*(x - 1) + (-1/2)*(x - 1)^2 + Order((x - 1)^3)\n"
572 ]
573 }
574 ],
575 "source": [
576 "f = e^x\n",
577 "g = sin(x) - 2*cos(x)\n",
578 "h = log(x)\n",
579 "\n",
580 "print(f.series(x==0, 3))\n",
581 "print(g.series(x==0, 7))\n",
582 "print(h.series(x==1, 3))"
583 ]
584 },
585 {
586 "cell_type": "markdown",
587 "metadata": {},
588 "source": [
589 "## Derivatives\n",
590 "**References:** [[7](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.derivative)] and [[8](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html#sage.calculus.functional.derivative)] for derivatives, [[9](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html#sage.calculus.functions.jacobian)] for the Jacobian matrix and [[10](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.hessian)] for the Hessian."
591 ]
592 },
593 {
594 "cell_type": "markdown",
595 "metadata": {},
596 "source": [
597 "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one."
598 ]
599 },
600 {
601 "cell_type": "code",
602 "execution_count": 57,
603 "metadata": {},
604 "outputs": [
605 {
606 "name": "stdout",
607 "output_type": "stream",
608 "text": [
609 "8*y^3\n",
610 "6*x^2 - 1\n"
611 ]
612 }
613 ],
614 "source": [
615 "var('y')\n",
616 "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n",
617 "print( (2*x^3-x+2).derivative() )"
618 ]
619 },
620 {
621 "cell_type": "markdown",
622 "metadata": {},
623 "source": [
624 "You can also compute higher order derivatives:"
625 ]
626 },
627 {
628 "cell_type": "code",
629 "execution_count": 58,
630 "metadata": {},
631 "outputs": [
632 {
633 "name": "stdout",
634 "output_type": "stream",
635 "text": [
636 "6*x\n",
637 "84*x^5*y + 10*y^4 + 24*x^2*y\n",
638 "1680*x^3 + 48\n"
639 ]
640 }
641 ],
642 "source": [
643 "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n",
644 "\n",
645 "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n",
646 "print( f.derivative(x, x, y) ) # Twice in x, once in y\n",
647 "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y"
648 ]
649 },
650 {
651 "cell_type": "markdown",
652 "metadata": {},
653 "source": [
654 "Jacobian and Hessian matrices are also easy to compute:"
655 ]
656 },
657 {
658 "cell_type": "code",
659 "execution_count": 59,
660 "metadata": {},
661 "outputs": [
662 {
663 "name": "stdout",
664 "output_type": "stream",
665 "text": [
666 "[-2*x + 2*y 2*x]\n",
667 "[ 0 3*y^2]\n",
668 "[ y + 1 x + 1] \n",
669 "\n",
670 "[ 2 -4*y + 1]\n",
671 "[ -4*y + 1 -4*x + 6*y]\n"
672 ]
673 }
674 ],
675 "source": [
676 "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n",
677 "print( jacobian(f, [x,y]), \"\\n\" )\n",
678 "\n",
679 "g = x^2 + x*y + y^3 -2*x*y^2 -3\n",
680 "print( g.hessian() )"
681 ]
682 },
683 {
684 "cell_type": "markdown",
685 "metadata": {},
686 "source": [
687 "*Note:* the notation `f.jacobian([x,y])` is also valid, but only if you specify that `f` is vector by declaring it as `f = vector([...])`."
688 ]
689 },
690 {
691 "cell_type": "markdown",
692 "metadata": {},
693 "source": [
694 "## Integrals\n",
695 "**References:** [[11](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html)] for symbolic integration and [[12](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html)] for numerical methods.\n",
696 "\n",
697 "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n",
698 "When using a computer software to solve your integrals, you have two choices:\n",
699 "\n",
700 "1. You can try to compute a primitive function exactly, and then (if you are computing a definite integral) substitute the endpoints of your integration interval to get the result. We can call this *symbolic integration*.\n",
701 "2. You can get an *approximated* result with a *numerical method*. This method always gives some kind of result, but it cannot be used to compute indefinite integrals.\n",
702 "\n",
703 "Sage can do both of these things, although people that work in numerical analysis and use often the second method tend to prefer other programs, such as Matlab (or its open-source clone Octave)."
704 ]
705 },
706 {
707 "cell_type": "markdown",
708 "metadata": {},
709 "source": [
710 "### Symbolic integration\n",
711 "\n",
712 "Symbolic integrals work more or less like derivatives. You must specify an integration variable, but the endpoints of the integration interval are optional. If they are not given you get an indefinite integral."
713 ]
714 },
715 {
716 "cell_type": "code",
717 "execution_count": 60,
718 "metadata": {},
719 "outputs": [
720 {
721 "name": "stdout",
722 "output_type": "stream",
723 "text": [
724 "1/2*x^2 - cos(x)\n",
725 "0\n",
726 "-1/2*a^2 + 1/2*b^2 + cos(a) - cos(b)\n"
727 ]
728 }
729 ],
730 "source": [
731 "var('a', 'b')\n",
732 "f = x + sin(x)\n",
733 "print( f.integral(x) ) # Alternative: integral(f, x)\n",
734 "print( f.integral(x, -10, 10) )\n",
735 "print( f.integral(x, a, b) )"
736 ]
737 },
738 {
739 "cell_type": "markdown",
740 "metadata": {},
741 "source": [
742 "Your endpoints can also be $\\pm\\infty$:"
743 ]
744 },
745 {
746 "cell_type": "code",
747 "execution_count": 61,
748 "metadata": {},
749 "outputs": [
750 {
751 "name": "stdout",
752 "output_type": "stream",
753 "text": [
754 "1\n",
755 "sqrt(pi)\n"
756 ]
757 }
758 ],
759 "source": [
760 "print( integral(e^(-x), x, 0, infinity) )\n",
761 "print( integral(e^(-x^2), x, -infinity, infinity) )"
762 ]
763 },
764 {
765 "cell_type": "markdown",
766 "metadata": {},
767 "source": [
768 "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:"
769 ]
770 },
771 {
772 "cell_type": "code",
773 "execution_count": 65,
774 "metadata": {},
775 "outputs": [
776 {
777 "name": "stdout",
778 "output_type": "stream",
779 "text": [
780 "1/2*sqrt(pi)*erf(x)\n",
781 "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n"
782 ]
783 }
784 ],
785 "source": [
786 "print( integral(e^(-x^2), x) )\n",
787 "print( integral(e^(-x^2), x, 1, 2) )"
788 ]
789 },
790 {
791 "cell_type": "markdown",
792 "metadata": {},
793 "source": [
794 "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)."
795 ]
796 },
797 {
798 "cell_type": "markdown",
799 "metadata": {},
800 "source": [
801 "### Numerical integration\n",
802 "\n",
803 "In order to get an explicit value for the computations above, we can use a *numerical* method.\n",
804 "\n",
805 "The word \"numerical\" does not have much to do with numbers, but it refers to the fact that we are trying to compute explicit results rather than symbolic or algebraic ones. [Numerical analysis](https://en.wikipedia.org/wiki/Numerical_analysis) is the branch of mathematics that studies methods to approximate computations over the real or complex numbers. With these methods there is usually a trade-off between speed and precision.\n",
806 "\n",
807 "The Sage function [`numerical_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.numerical_integral) takes as a parameter a real-valued one-variable function and the integration endpoints, and it returns both an approximate value for the integral and an error estimate."
808 ]
809 },
810 {
811 "cell_type": "code",
812 "execution_count": 40,
813 "metadata": {},
814 "outputs": [
815 {
816 "data": {
817 "text/plain": [
818 "(0.13525725794999466, 1.5016572202374808e-15)"
819 ]
820 },
821 "execution_count": 40,
822 "metadata": {},
823 "output_type": "execute_result"
824 }
825 ],
826 "source": [
827 "numerical_integral(e^(-x^2), 1, 2)"
828 ]
829 },
830 {
831 "cell_type": "markdown",
832 "metadata": {},
833 "source": [
834 "The result above means, in symbols\n",
835 "\\begin{align*}\n",
836 "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n",
837 "\\end{align*}\n",
838 "\n",
839 "There is also a [`monte_carlo_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.monte_carlo_integral) method for functions with more than one variable."
840 ]
841 },
842 {
843 "cell_type": "markdown",
844 "metadata": {},
845 "source": [
846 "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$."
847 ]
848 },
849 {
850 "cell_type": "markdown",
851 "metadata": {},
852 "source": [
853 "## Differential equations\n",
854 "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n",
855 "\n",
856 "A [differential equation](https://en.wikipedia.org/wiki/Differential_equation) is an equation involving an unknwon function and its derivatives. They can be of two kinds: *ordinary* differential equations ([ODE](https://en.wikipedia.org/wiki/Ordinary_differential_equation)) and *partial* differential equations ([PDE](https://en.wikipedia.org/wiki/Partial_differential_equation)). The latter involve multivariate functions and their partial derivatives.\n",
857 "\n",
858 "Differential equations are in general hard to solve *exactly* (or *symbolically*): even a simple equation of the form $f'(x)=g(x)$, where $g(x)$ is someknown function, requires solving the integral $\\int g(x)\\mathrm{d}x$ in order to find $f$, which as we know is not always easy!\n",
859 "\n",
860 "Theoretical results on differential equations usually ensure the existence and/or uniquess of a solution under certain conditions, but in general they do not give a way to solve them. There exits many methods to find approximate solutions, and some of them are implemented in Sage as well (see [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]). However we will focus on the simple ODEs that can be solved exactly.\n",
861 "\n",
862 "Let's start with a simple example. Let's find all functions $f(x)$ such that $f'(x)=f(x)$. In order to do so, we need to use the `function()` construct, which allows us to define an \"unknwon\" function inside Sage, like we define variables with `var()`."
863 ]
864 },
865 {
866 "cell_type": "code",
867 "execution_count": 4,
868 "metadata": {},
869 "outputs": [
870 {
871 "data": {
872 "text/plain": [
873 "_C*e^x"
874 ]
875 },
876 "execution_count": 4,
877 "metadata": {},
878 "output_type": "execute_result"
879 }
880 ],
881 "source": [
882 "var('x')\n",
883 "function('f')\n",
884 "equation = derivative(f(x)) == f(x)\n",
885 "desolve(equation, f(x)) # f is the unknown function"
886 ]
887 },
888 {
889 "cell_type": "markdown",
890 "metadata": {},
891 "source": [
892 "As you can expect, they are all the functions $Ce^x$ for some constant $C$. The constant $C$ plays the same role as the constant in the solution of an integral, but in this case Sage writes it explicitly.\n",
893 "\n",
894 "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:"
895 ]
896 },
897 {
898 "cell_type": "code",
899 "execution_count": 5,
900 "metadata": {},
901 "outputs": [
902 {
903 "data": {
904 "text/plain": [
905 "3*e^x"
906 ]
907 },
908 "execution_count": 5,
909 "metadata": {},
910 "output_type": "execute_result"
911 }
912 ],
913 "source": [
914 "desolve(equation, f(x), (0,3))"
915 ]
916 },
917 {
918 "cell_type": "markdown",
919 "metadata": {},
920 "source": [
921 "You can also solve *second order* equations, that is equations where the second derivative also appears. In this case if you want to specify an initial condition you should write the triple of values $(x_0, f(x_0), f'(x_0))$."
922 ]
923 },
924 {
925 "cell_type": "code",
926 "execution_count": 6,
927 "metadata": {},
928 "outputs": [
929 {
930 "data": {
931 "text/plain": [
932 "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)"
933 ]
934 },
935 "execution_count": 6,
936 "metadata": {},
937 "output_type": "execute_result"
938 }
939 ],
940 "source": [
941 "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n",
942 "desolve(equation, f(x), (0, 0, 0))"
943 ]
944 },
945 {
946 "cell_type": "markdown",
947 "metadata": {},
948 "source": [
949 "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n",
950 "\\begin{align*}\n",
951 " \\begin{array}{rlcrl}\n",
952 " (A) &\n",
953 " \\begin{cases}\n",
954 " f(0) &= 1\\\\\n",
955 " f'(0) &= 0\\\\\n",
956 " f''(x) &= -f(x)\n",
957 " \\end{cases}\n",
958 " & \\qquad \\qquad &\n",
959 " (B) &\n",
960 " \\begin{cases}\n",
961 " f(0) &= 0\\\\\n",
962 " f'(0) &= 1\\\\\n",
963 " f''(x) &= -f(x)\n",
964 " \\end{cases}\n",
965 " \\end{array}\n",
966 "\\end{align*}"
967 ]
968 },
969 {
970 "cell_type": "code",
971 "execution_count": null,
972 "metadata": {},
973 "outputs": [],
974 "source": []
975 },
976 {
977 "cell_type": "markdown",
978 "metadata": {},
979 "source": [
980 "### A real-world example\n",
981 "\n",
982 "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n",
983 "\n",
984 "Consider an object moving with constant acceleration $a$. Its velocity at time $t$ is described by the formula $v(t) = v(0) + at$. For example an object falling from the sky has acceleration $g\\sim 9.8 m/s^2$ towards the ground, so its velocity is $v(t) = -gt$.\n",
985 "\n",
986 "However in the real world you need to take into account the air's resistance, which depends (among other things) on the velocity of the object. In this case the acceleration $a(t)$ is not constant anymore, and it satisfies an equation of the form $a(t)=-g -kv(t)$, where $k$ is some constant that may depend on the shape and mass of the object (in practice it may be more complicated than this).\n",
987 "\n",
988 "Since the acceleration is the derivative of the velocity, we have a differential equation\n",
989 "\\begin{align*}\n",
990 " v'(t) = -g -kv(t)\n",
991 "\\end{align*}\n",
992 "and we can try to solve it with Sage!"
993 ]
994 },
995 {
996 "cell_type": "code",
997 "execution_count": 7,
998 "metadata": {},
999 "outputs": [
1000 {
1001 "data": {
1002 "text/plain": [
1003 "-98/15*(e^(3/2*t) - 1)*e^(-3/2*t)"
1004 ]
1005 },
1006 "execution_count": 7,
1007 "metadata": {},
1008 "output_type": "execute_result"
1009 }
1010 ],
1011 "source": [
1012 "var('t')\n",
1013 "function('v')\n",
1014 "g = 9.8\n",
1015 "k = 1.5\n",
1016 "conditions = (0, 0) # Start with velocity 0\n",
1017 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)"
1018 ]
1019 },
1020 {
1021 "cell_type": "markdown",
1022 "metadata": {},
1023 "source": [
1024 "If you want to solve this equation symbolically (that is, keeping $g$ and $k$ in symbols) you need to specify that $t$ is the *independent variable* of the equation:"
1025 ]
1026 },
1027 {
1028 "cell_type": "code",
1029 "execution_count": 10,
1030 "metadata": {},
1031 "outputs": [
1032 {
1033 "data": {
1034 "text/plain": [
1035 "-(g*e^(k*t) - g)*e^(-k*t)/k"
1036 ]
1037 },
1038 "execution_count": 10,
1039 "metadata": {},
1040 "output_type": "execute_result"
1041 }
1042 ],
1043 "source": [
1044 "var('t', 'g', 'k')\n",
1045 "function('v')\n",
1046 "conditions = (0, 0) # Start with velocity 0\n",
1047 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)"
1048 ]
1049 },
1050 {
1051 "cell_type": "markdown",
1052 "metadata": {},
1053 "source": [
1054 "# Basic data analysis and visualization\n",
1055 "\n",
1056 "## Statistics\n",
1057 "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n",
1058 "\n",
1059 "Sage includes the most basic functions for statistical analysis."
1060 ]
1061 },
1062 {
1063 "cell_type": "code",
1064 "execution_count": 20,
1065 "metadata": {},
1066 "outputs": [
1067 {
1068 "name": "stdout",
1069 "output_type": "stream",
1070 "text": [
1071 "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1072 "Mean:\t\t\t 5/13\n",
1073 "Median:\t\t\t 1\n",
1074 "Mode:\t\t\t [3]\n",
1075 "Standard deviation:\t 2*sqrt(29/13)\n",
1076 "Variance:\t\t 116/13\n",
1077 "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n"
1078 ]
1079 }
1080 ],
1081 "source": [
1082 "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1083 "\n",
1084 "print(\"Values:\\t\", L)\n",
1085 "\n",
1086 "print(\"Mean:\\t\\t\\t\", mean(L))\n",
1087 "print(\"Median:\\t\\t\\t\", median(L))\n",
1088 "print(\"Mode:\\t\\t\\t\", mode(L))\n",
1089 "\n",
1090 "print(\"Standard deviation:\\t\", std(L))\n",
1091 "print(\"Variance:\\t\\t\", variance(L))\n",
1092 "\n",
1093 "print(\"Moving average (5):\", moving_average(L,5))"
1094 ]
1095 },
1096 {
1097 "cell_type": "markdown",
1098 "metadata": {},
1099 "source": [
1100 "You can also compare your data to a probability distribution, see [this page](https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html). If you need to do more advanced statistics you should consider using [R](https://www.r-project.org/); you can also use it inside Sage."
1101 ]
1102 },
1103 {
1104 "cell_type": "markdown",
1105 "metadata": {},
1106 "source": [
1107 "## Plotting\n",
1108 "**Reference:** [[15](https://doc.sagemath.org/html/en/reference/plotting/index.html)], more specifically the subsection [[16](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html)].\n",
1109 "\n",
1110 "Some Sage objects can be plotted:"
1111 ]
1112 },
1113 {
1114 "cell_type": "code",
1115 "execution_count": 21,
1116 "metadata": {},
1117 "outputs": [
1118 {
1119 "data": {
1120 "image/png": "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\n",
1121 "text/plain": [
1122 "Graphics object consisting of 1 graphics primitive"
1123 ]
1124 },
1125 "execution_count": 21,
1126 "metadata": {},
1127 "output_type": "execute_result"
1128 }
1129 ],
1130 "source": [
1131 "f = sin(x)\n",
1132 "plot(f)"
1133 ]
1134 },
1135 {
1136 "cell_type": "markdown",
1137 "metadata": {},
1138 "source": [
1139 "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n",
1140 "\n",
1141 "You can give a number of options to adjust the aspect of your plot, see [here](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html#sage.plot.plot.plot). Let's see some of them:"
1142 ]
1143 },
1144 {
1145 "cell_type": "code",
1146 "execution_count": 67,
1147 "metadata": {},
1148 "outputs": [
1149 {
1150 "data": {
1151 "image/png": "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\n",
1152 "text/plain": [
1153 "Graphics object consisting of 1 graphics primitive"
1154 ]
1155 },
1156 "execution_count": 67,
1157 "metadata": {},
1158 "output_type": "execute_result"
1159 }
1160 ],
1161 "source": [
1162 "f = sin(x)\n",
1163 "plot(f,\n",
1164 " -2*pi, 2*pi, # bounds for x\n",
1165 " ymin = -0.7, ymax = 0.7, # bounds for y\n",
1166 " color = \"red\",\n",
1167 " title = \"The sin function\",\n",
1168 " )"
1169 ]
1170 },
1171 {
1172 "cell_type": "markdown",
1173 "metadata": {},
1174 "source": [
1175 "Some of the options are not described precisely in Sage's documentation, but you can find them on [matplotlib's documentation](https://matplotlib.org/stable/contents.html). You can find many examples online for adjusting your plot as you like!"
1176 ]
1177 },
1178 {
1179 "cell_type": "markdown",
1180 "metadata": {},
1181 "source": [
1182 "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:"
1183 ]
1184 },
1185 {
1186 "cell_type": "code",
1187 "execution_count": 36,
1188 "metadata": {},
1189 "outputs": [
1190 {
1191 "data": {
1192 "image/png": "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\n",
1193 "text/plain": [
1194 "Graphics object consisting of 2 graphics primitives"
1195 ]
1196 },
1197 "metadata": {},
1198 "output_type": "display_data"
1199 }
1200 ],
1201 "source": [
1202 "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n",
1203 "exponential = plot(exp(x), (x,-2,0.5))\n",
1204 "\n",
1205 "show(cosine + exponential)"
1206 ]
1207 },
1208 {
1209 "cell_type": "markdown",
1210 "metadata": {},
1211 "source": [
1212 "Finally, there are other types of plots that you can use, like [scatter plots](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html#sage.plot.scatter_plot.scatter_plot) and [bar charts](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html#sage.plot.bar_chart.bar_chart). You can also add [text](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html#sage.plot.text.text) to your plot:"
1213 ]
1214 },
1215 {
1216 "cell_type": "code",
1217 "execution_count": 53,
1218 "metadata": {},
1219 "outputs": [
1220 {
1221 "data": {
1222 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkcAAAGGCAYAAABxHyV7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAtOElEQVR4nO3dfZhcdX338fd3d8MGhAyBalVYS1QUNoEQIEErJkEUFEGw0oIPuYUqtBCrctfbCLWCogYK1QisDwhEqpBETW0Rq1IoBAENEBKQBuQpIdiIIEg2xTiE7O/+Y3Y3J7sz+5DM7uyceb+u61yzM+fMzPfMCexnf+d3vhMpJSRJklTSVOsCJEmSxhLDkSRJUobhSJIkKcNwJEmSlGE4kiRJyjAcSZIkZRiOJEmSMgxHkiRJGQ0djqJkQkRErWuRJEljQ0utCxhBg7b+3rBhA4VCgQ0bNoxGPZIkqbaGNBjS0CNHkiRJfdV1OIqI3SJiQUQ8HhGbIuKOiJhe67okSVL9qvfTalcAU4A5wHrgA8CNEdHuF+pKkqTtUbfhKCJ2Bt4DHJ9SurX74fMi4gTgjJoVJkmS6lrdhiNKtTcDf+zz+Cbg8HJPKBaLFIvF3vudnZ0jVpwkSapPdTvnKKW0Efg58I8R8cqIaI6IDwCHAa8o95z58+dTKBR6l7a2ttEsWZKkHRYxekujinqemxMRrwGuAmYCW4B7gIeAg1NK+/fdvtzIUVtbGxs2bGDChAmjVLUkSdtvNENLHUeESob06dXzaTVSSo8CsyLiJcCElNJvImIJsAboF45aW1tpbW0d7TIlSVIdqdvTalkppee7g9FE4Gjg32tdkyRJqk91HY4i4uiIeHtETIqItwE3A78CFta4NEmSVKfqOhwBBaADeBD4F+A24KiU0uaaViVJkupWvc85+i7w3VrXIUmS8qPeR44kSZKqqiHDUUdHB+3t7Uyf7tewSZKkbdV1n6NBDLpjnZ2dFAoF+xxJkuqGfY52yJA+vYYcOZIkSarEcCRJkpRhOJIkScowHEmSJGUYjiRJkjIMR5IkSRkNGY7scyRJkiqxz5F9jiRJdcQ+RzvEPkeSJEnDZTiSJEnKMBxJkiRlGI4kSZIyDEeSJEkZhiNJkqSMhgxH9jmSJEmV2OfIPkeSpDpin6MdYp8jVV9EEBGcd955tS5lSGbPnk1EMHv27FqXIkmqE4YjaZSdcsopvSFz7dq1tS5HktSH4UjaAWvXru0NOt/61rdqXY4kqQoMR5IkSRmGI0mSpAzDkSRJUsawwlFE/CgiUkT8vML6w7vXp4h4LiKay2wzMSK6ureZW+F1XhoRn4+Ild2v88eIWBsR346Iwwd4Ts97/025bT784Q/3zg/ZY489yvY5WrBgARFBS0sLnZ2dA34e2+u5557jC1/4Am984xuZOHEi48aN46UvfSnt7e28+93v5mtf+xpPPfVUv+cN9UqxoV6htXbtWubNm8chhxzCnnvuyfjx45k0aRJHHHEE//zP/8y6desG3Ze77rqL9773vey99960tray1157MWfOHB544IFBnzuQ8847r3d/ofSZnXvuuUyePJldd92VPfbYg9mzZ3PNNdfs0Pv0uO2225gzZw777LMP48ePZ/fdd2fatGl8+tOf5umnny77nIhg0qRJvfdPPfXU3prr7ao+SY1gY60LqB8ppSEvwP+j1D9oM7BrmfWf7l7fsxxaZpsTMuunlFl/FLChz+v0XS4Dmso897+71y9OZbzmNa/pfY3JkyenDRs2JCBt2LChd5vjjz8+AemQQw4p9xI7bPXq1emVr3zlQPuWgHTppZf2e27PunPPPXfA95g1a1YC0qxZsypuc9FFF6Vx48YNWEO552druPTSS1NLS0vZ5+6yyy5p2bJlw/x0tjr33HN7X+uxxx7b5tj1XU488cS0efPm7fostmzZkubOnTvg51AoFNINN9xQ8bMYaCl3rD74wQ/2rl+zZs12f0aSGlOp+9Bwl3sSjOu+HfrzcmhIeadlyCmqZFn3bQtwOPCTPutnl7l/d4VtfkcpzPSKiIOAHwI7UQpgHcC/A88D04BPAZOAud2PzStTXzswq2/h//M//8Ojjz7ae3/16tX87ne/22ablBI/+9nPSkWOUF+cOXPmsH79esaNG8dpp53GO97xDl7+8pfT1dXF+vXrufPOO1m6dOmIvHeP888/n8985jMA7L777px55pkcccQR7Lnnnjz33HPcc889/OAHP+gdtSnnpz/9KcuXL+fAAw/kYx/7GAcccACbNm3iBz/4AV/5ylf4wx/+wJw5c3j44YfZaaeddqjek046iTVr1vC3f/u3nHjiiRQKBe677z4uvPBCHnroIb7//e/zile8gksuuWTYr/2pT32Kjo4OACZN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i2XLlvGJT3yCY489li1btrDTTjv1m6cG0NLS0huYrrrqKhYtWsQDDzzAI488wiOPPFKVq9skafjWsYWVFGkmcSFd3AgcTBc3kbiAIs1s4R7giVoXOjYNtZV234XSXKPsVzx8osJ2N2W2eY4yXxjbZ/vt/uLZ7PKhD32od/uISE899VS/HuKrV6/e5nX/7u/+bsCe41/96ld7t73kkksG3LachQsXDrRPvcvhhx+ennnmmbKv8aUvfani8yZOnJiWLVs2pC+e/eIXv1jxS2N7lsG+eHYgQ6lhIH2/eHbSpEkV63zPe96zQ188e+aZZw74ORQKhfTTn/60Yq3XX399ioiyz/WLZ6XRN/yv19ixZWzu3xMJjkmwvML6X3Svf2JM7dsoqP7Xh/RxJ5DtXHhLhe1uzvxcab5Rr1T62pDXAl+k9D1snUARWEepc9WbU0ofGex1siNFfecb9dhrr722uT/YfKOf/7x0JnHixImccsopA25bzvve9z5uvvlmzjnnHN785jczadIkdtllF3baaSf23ntv3vWud3HttdeybNmyildFnXXWWfzkJz/h6KOPZuLEibS2tjJp0iTmzp3LqlWrhtyG4Oyzz2b16tV8/OMfZ8qUKUyYMIHx48fz6le/miOPPJIFCxawePHiYe/jSJg0aRIrVqzgnHPOYf/992eXXXahUCgwc+ZMvvOd7/D973+flpbtm1jY1NRER0cHt956K+9///t51ate1dsL66CDDuKcc87h4Ycf5qijjqr4Gu985zu56aabOP7443nlK1/Z2zBSkmpnb+BHbL1+qa/DutdX/pqoRhapiv1bxpiKO9bR0UFHRwdbtmzhoYceYsOGDUPqObPPPvvw+OOP89nPfrb3W+01Ms4777ze0385/jcqaQSM9kWko/2/qNHcvxz+73dIn96OjBzVrblz57J69ephfYnounXrePzxxykUCnzsYx8bweokSVItNWQ42h49HbQ/+tGP9nY4liRJ+WMHqCGaM2fOmLl6S5IkjRxHjiRJkjIMR5IkSRkNebVaj87OTgqFwpCvVpMkjX1erVY9OYwIXq0mSZI0XA0Zjjo6Omhvb+/3PVmSJEmeVvO0miTliqfVqieHEcHTapIkScNlOJIkScowHEmSJGUYjiRJkjIMR5IkSRmGI0mSpIyGDEf2OZIkSZXY58g+R5KUK/Y5qp4c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\n",
1223 "text/plain": [
1224 "Graphics object consisting of 3 graphics primitives"
1225 ]
1226 },
1227 "metadata": {},
1228 "output_type": "display_data"
1229 }
1230 ],
1231 "source": [
1232 "b = bar_chart(range(1,10))\n",
1233 "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n",
1234 " marker = \"*\", # symbol\n",
1235 " markersize = 100,\n",
1236 " edgecolor = \"black\",\n",
1237 " facecolor = \"red\"\n",
1238 " )\n",
1239 "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n",
1240 "show(b + s + t)"
1241 ]
1242 },
1243 {
1244 "cell_type": "markdown",
1245 "metadata": {},
1246 "source": [
1247 "## Interpolation\n",
1248 "**References:** [[17](https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial)] and [[18](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html)].\n",
1249 "\n",
1250 "When you need to work with a discrete set of data, like measurements of real-world quantities, it can be useful to visualize a \"smoothed out\" version of this data, for example by plotting a function that approximates it.\n",
1251 "\n",
1252 "One way to do so is finding the lowest-degree polynomial that passes through all your points. This is called [Lagrange Polynomial](https://en.wikipedia.org/wiki/Lagrange_polynomial)."
1253 ]
1254 },
1255 {
1256 "cell_type": "code",
1257 "execution_count": 65,
1258 "metadata": {},
1259 "outputs": [
1260 {
1261 "data": {
1262 "image/png": "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uFx7LaSnw+LFbicpGhVKIiIS8tavt7/IH34YIiLcThNcqlWDNm3s2K9A5DeFUnx8PDExMcTGxrodRUREQsz48XYj15493U4SnK67Dj7+GBIT3U5SeBrMLSIiIW3DBjj/fHjlFejTx+00wWnXLqhd26523quX22kyaTC3iIhIfp58EurWVWuSN9WqBRdeGJjLBKhQEhGRkLV9O/zvfzBqlMYmeVvXrvDRR3DsmNtJCkeFkoiIhKz//heqVoXbbnM7SfC76io4dAhWrnQ7SeGoUBIRkZC0axe8+ircey+ULu12muDXrBlUrw7vved2ksJRoSQiIiFp0iQoVw7uvtvtJKHBceDqq+Hdd91OUjgqlEREJOT89RfMnAlDh0L58m6nCR1XXw07dtixYYFChZKIiIScadPsZq1DhridJLR07Gi7OQOpVUmFkoiIhJTERHjuORgwACpVcjtNaClTBi69VIWS5OKvv/6iYcOGhIeHMz9Q13L3Y8888wyO43DxxRdz5MgRt+MEJd3DEgymT4fkZBgxwu0koenqq+3Mt3/+cTtJwQRMobRgwQIuv/xyKleujOM4bNiwIcfj1qxZw6WXXkrZsmU57bTTaN++PcnJyVmOSU5OpkyZMmzbto1Vq1bRunVrKlWqRGRkJA0bNmTKlCk5nrt9+/ZFzn/o0CG6dOlC5cqVGTduHL169WLZsmV5vmbChAk4jsOwYcOKfN2C+t///kezZs0oU6YMderU4amnnsry+eXLl+M4TrbHtm3bsp1r3Lhx3HTTTQDcfffd1KtXj8jISE4//XTi4uJyfM3y5csZN25ckfO//vrr3H///TzzzDMcPHiQ6667juPHj2c55sCBA1xxxRVUr16dUqVKUatWLQYPHkxSUlKRr5th+vTpnHfeeURFRREVFUWrVq1YunRprsfffffdOI7D1KlTsz1fkPfr5HsYICUlhQcffJA6depQqlQp6tWrx0svvZTtdb64hydMmEBsbCzly5enSpUqXHvttfzwww9Fvm5BHD16lNtuu40mTZoQERHBtddem+Nx8fHxnHvuuURGRnLOOefw6quvZvn85s2bue6666hbt26O35+T3XbbbYwePTrz3++99x4tW7YkMjKSypUr071792yvefnll3n55ZeL8iV61J49e+jZsyfnnHMOYWFhPvkZ4y+OHoWpU6FvXzjjDLfT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hx9o06YNAMePH+eXX37J1n2W20y+t956iwULFrB8+XJuvPFGHnvsMcaPH59rhvLly1P+pH03ypcvT8WKFb3yfgWDnTth/ny7yGQuP0bFBZ07w6hR8MUX0KGD22ly541CqQy2u+1kaRRzKYKDBw/y22+/8ccffwBkFkTVqlWjWrVqOI7D/fffz9ixY2natCnNmjXjlVdeYdu2bcybNw+wP+A6depEmTJlMs8bHx9P7dq1M6dSr1q1iqeffpohBVzXPj4+njVr1vDdd99Rq1atzKn2a9euzTKupCDKly+fbRxH2bJlqVSpklfHd+zfv5958+bRvn17jh49yuzZs3n77bf5/PPPM4+ZOnUqdevWpVGjRhw7dow5c+Ywf/78zEUHU1NTWbp0aZZ1dXbu3Mlbb71F586dOf300/n999+ZOHEikZGRXHnllfnmOnToELfccgtDhgyhS5cu1K5dmxYtWnD11VfTo0ePQn+d77//Pnv37iU2NpZy5cqxZcsWRo4cSevWralbt26hz3eyBx54gC5dulCrVi0OHTrE3LlzWb58OR988AEAlSpVotIpSwCXKFGCatWqcc455wAFe79yuod79uzJY489Rt++fRk/fjz79+/n/vvv5/bbbycyMjLf7J68hwEGDRrEG2+8weLFiylfvjx//vknANHR0QXKU1Rbtmzh2LFjHDx4kEOHDmWutdasWTPAFo9fffUVLVu25O+//2by5Mls2rQpS+F97NgxtmzZkvnfv//+Oxs2bKBcuXLUr1+fffv2sW7dOhYtWpT5mqioKPr378/YsWOpVatWlnXICnKf7t69mwEDBjBx4kTatGnDyy+/zFVXXUWXLl246KKLPPPm5CDj/Tl8+DB//fUXGzZsoGTJkkUukP3Z1KlQsSLceqvbSeRk550HVarYcUr+XCh5o+vtZWA3/788QDfgL2BiQdrBcpv1Nnv27BzHMp3aXTNhwgRTs2ZNU6ZMGdOqVasszeFt2rTJNpvtmWeeMY0aNTJlypQxUVFR5vzzzzcJCQkFmpa7detWExkZmaVbJDEx0dStW9eMHDmyIF9uvnwx6+2vv/4yF110kSlbtqwpU6aM6dixo/nyyy+zHDNx4kRTr149U7p0aVOhQgXTpk0b895772V+ftmyZdmm2f/++++mS5cupkqVKqZEiRKmZs2apmfPnmbbtm0FytW3b1/TpEmTLFPSp02bZipWrGh2795d4K8vw6effmpatWploqOjTenSpU2DBg3MqFGj8l3yoCBuv/12U6dOHVOyZElz+umnm44dO2ZbsuBUp3btFOT9yukeNsbei506dTKRkZGmZs2aZsSIEdm6rXPijXs4p/9PgVy7nHJSlFlvderUyfG6GbZs2WKaNWtmIiMjTVRUlImLi8t2L2Z07Z/6yOiynDVrVo7LCRw7dszce++9pkqVKqZ8+fKmU6dO2Wa95SQ9Pd107NjRXH755ZlLcRhjzPDhw029evXMoUOHCvS1F2XWW05fZ17dwIFq/37bvVPESYHiZb16GXPBBa5dvkB1jWNOdD14iuM45YHHThRIVYA/gDeBR40xOfdvnCQpKYno6GgSExML1fWWn/3793PGGWewa9euPBeSk6IZOnQoqampJCQkuB0laOkedt8111xDmzZtGDlypNtRpICeeAIefxx+/dW2Xoh/efVV29K3bx+cfrrPL+8U5CCPd70ZYw4Bw048/MbBgweZPHmyfsF4SePGjWnVqpXbMYKa7mH3tWnThptvvtntGFJAR4/Cs8/aX8QqkvxTxtDNTz+FG290N0tuPN6ilI98L+atFiUREQktL74I/frBtm1w9tlup5HcnHMOXHqp3azYxwrUohQwm+KKiIgUlDEwZQp07aoiyd916AC5TMj1CyqUREQk6Hz6KWzeDPfc43YSyU+HDrbV78RGEH5HhZKIiASdadOgSRM/n3YuALRrZz+etCKNX1GhJCIiQeXHH+Hdd21rklOgUSjipmrV4Nxz4bPP3E6SMxVKIiISVJ591i4w2bOn20mkoNq3999xSiqUREQkaCQlwezZ0L8/eHEhePGwDh1g+3Y4sfmGX1GhJCIiQeOllyA5GQYOdDuJFEbGOCV/bFVSoSQiIkEhLc12u/XoAdWru51GCqNKFWjUyD/HKXljU1wRERGfe+892LkT3nzT7SRSFB06wIl9xP2K37QoxcfHExMTQ2xsrNtRREQkAE2dChddBBde6HYSKYp27eyMxd9/dztJVtrCREREAt5330HTprY16aab3E4jRfHnn3DGGfDWW3DDDT65pLYwERGR0PDMM1CjBlx3ndtJpKiqVYP69WHVKreTZKVCSUREAtpff8GcOTBoEJQo4XYaKY42bVQoiYiIeNTMmXYF7rvucjuJFFeb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H40xX58Yd7sRuCeXwz1y/6pQCiLGmGPAN9jZFie7DPiiEKc6H9scLMW3huzfj87A18aY4y7kCQW6f3PgWM9hu3cuNcb8XICX6f4thCK+xznRPVxwDlAql8955P5V11vwmQy85jjO19ib5C6gNrYvF8dxJgA1jDF9Tvx7GPALsBkoCfTGNmdq+m8OHMcpB9Q/6akzHcdpBhw0xvx26vuLfd8HO44zGXgBO7jwDuBmH8YOGIV9f3X/Fko80BOIAw45jpPxl3aiMSYZsv98QPdvYRX6PdY9XHCO4/wHWArswi5MfRPQHrjixOe9c/8aY/QIsgcwEPs/Xgq2hantSZ97GVh+0r9HAj8CydiZGSuBK93+Gvz1ceJ/SpPD4+Wc3t8Tz7UD1p/4fvwM9Hf76/DXR2HfX92/hXpvc3pfDXDbScfo/vXxe6x7uFDv74sn/W7bBywDLsvtvT3xXLHvX62jJCIiIpILjVESERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERycX/AcX86mbC2eHsAAAAAElFTkSuQmCC\n",
1263 "text/plain": [
1264 "Graphics object consisting of 3 graphics primitives"
1265 ]
1266 },
1267 "metadata": {},
1268 "output_type": "display_data"
1269 }
1270 ],
1271 "source": [
1272 "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n",
1273 "polring.<x> = QQ[] # you need to specify a polynomial ring\n",
1274 "lp = polring.lagrange_polynomial(points)\n",
1275 "show(scatter_plot(points, facecolor=\"red\")\n",
1276 " + plot(lp, 0, 3) # slightly different notation for polynomials\n",
1277 " + text(lp, (1,8), color=\"black\")\n",
1278 " )"
1279 ]
1280 },
1281 {
1282 "cell_type": "markdown",
1283 "metadata": {},
1284 "source": [
1285 "One can compute the Lagrange Polynomial over any base ring, and it has the advantage that it is a very \"nice\" function (continuous and differentiable as much as you like, with easily computable derivatives and primitives).\n",
1286 "\n",
1287 "However, it does not always give you good approximation of your data:"
1288 ]
1289 },
1290 {
1291 "cell_type": "code",
1292 "execution_count": 2,
1293 "metadata": {},
1294 "outputs": [
1295 {
1296 "data": {
1297 "image/png": "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\n",
1298 "text/plain": [
1299 "Graphics object consisting of 2 graphics primitives"
1300 ]
1301 },
1302 "metadata": {},
1303 "output_type": "display_data"
1304 }
1305 ],
1306 "source": [
1307 "R = [x/10 for x in range(-10,10)]\n",
1308 "L = [1/(1+25*x^2) for x in R]\n",
1309 "points = [(R[i], L[i]) for i in range(len(L))]\n",
1310 "polring.<x> = RR[]\n",
1311 "lp = polring.lagrange_polynomial(points)\n",
1312 "\n",
1313 "show(plot(lp, -0.82, 0.72) + scatter_plot(points))"
1314 ]
1315 },
1316 {
1317 "cell_type": "markdown",
1318 "metadata": {},
1319 "source": [
1320 "This particular example is called [Runge's phenomenon](https://en.wikipedia.org/wiki/Runge%27s_phenomenon). For a better approximation you can use a [spline](https://en.wikipedia.org/wiki/Spline_(mathematics)), which is a *piecewise* polynomial function:"
1321 ]
1322 },
1323 {
1324 "cell_type": "code",
1325 "execution_count": 90,
1326 "metadata": {},
1327 "outputs": [
1328 {
1329 "data": {
1330 "image/png": "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\n",
1331 "text/plain": [
1332 "Graphics object consisting of 2 graphics primitives"
1333 ]
1334 },
1335 "metadata": {},
1336 "output_type": "display_data"
1337 }
1338 ],
1339 "source": [
1340 "show(plot(spline(points), -1, 1) + scatter_plot(points))"
1341 ]
1342 },
1343 {
1344 "cell_type": "markdown",
1345 "metadata": {},
1346 "source": [
1347 "A detailed explanation of splines is a good topic for a course of numerical analysis. For this course it is enough that you know that they exist and they can be plotted."
1348 ]
1349 }
1350 ],
1351 "metadata": {
1352 "kernelspec": {
1353 "display_name": "SageMath 9.2",
1354 "language": "sage",
1355 "name": "sagemath"
1356 },
1357 "language_info": {
1358 "codemirror_mode": {
1359 "name": "ipython",
1360 "version": 3
1361 },
1362 "file_extension": ".py",
1363 "mimetype": "text/x-python",
1364 "name": "python",
1365 "nbconvert_exporter": "python",
1366 "pygments_lexer": "ipython3",
1367 "version": "3.8.5"
1368 }
1369 },
1370 "nbformat": 4,
1371 "nbformat_minor": 4
1372}
diff --git a/Lectures/8-SageCalculus.pdf b/Lectures/8-SageCalculus.pdf
new file mode 100644
index 0000000..5b533b6
--- /dev/null
+++ b/Lectures/8-SageCalculus.pdf
Binary files differ
diff --git a/Lectures/9-SageLatex.ipynb b/Lectures/9-SageLatex.ipynb
new file mode 100644
index 0000000..63ea8c6
--- /dev/null
+++ b/Lectures/9-SageLatex.ipynb
@@ -0,0 +1,346 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "It can happen that you need to include the results of your Sage computations and/or Sage code inside a LaTeX document. Luckily Sage provides some functions to translate its objects into LaTeX, and the listings package for LaTeX can be used to include any code (Sage, Python or any other language) in a LaTeX document.\n",
8 "\n",
9 "In this document we will describe some of these interactions between LaTeX and Sage."
10 ]
11 },
12 {
13 "cell_type": "markdown",
14 "metadata": {},
15 "source": [
16 "# The `show()` command\n",
17 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/repl/sage/repl/display/pretty_print.html)] (`show()` is just an alternative name for `pretty_print()`).\n",
18 "\n",
19 "With this command Sage will generate a picture displaying the object. The result depends on the object itself: most of them will be typeset in Latex, but for example graphics primitives (such as plots) will be displayed as pictures.\n",
20 "\n",
21 "You can see it as an alternative to `print()`."
22 ]
23 },
24 {
25 "cell_type": "code",
26 "execution_count": 4,
27 "metadata": {},
28 "outputs": [
29 {
30 "name": "stdout",
31 "output_type": "stream",
32 "text": [
33 "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)\n"
34 ]
35 },
36 {
37 "data": {
38 "text/html": [
39 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)</script></html>"
40 ],
41 "text/latex": [
42 "\\begin{math}\n",
43 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n",
44 "\\end{math}"
45 ],
46 "text/plain": [
47 "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)"
48 ]
49 },
50 "metadata": {},
51 "output_type": "display_data"
52 },
53 {
54 "name": "stdout",
55 "output_type": "stream",
56 "text": [
57 "[ 1 2 3]\n",
58 "[ 4 5 6]\n",
59 "[ 8 9 10]\n"
60 ]
61 },
62 {
63 "data": {
64 "text/html": [
65 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n",
66 "1 & 2 & 3 \\\\\n",
67 "4 & 5 & 6 \\\\\n",
68 "8 & 9 & 10\n",
69 "\\end{array}\\right)</script></html>"
70 ],
71 "text/latex": [
72 "\\begin{math}\n",
73 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n",
74 "1 & 2 & 3 \\\\\n",
75 "4 & 5 & 6 \\\\\n",
76 "8 & 9 & 10\n",
77 "\\end{array}\\right)\n",
78 "\\end{math}"
79 ],
80 "text/plain": [
81 "[ 1 2 3]\n",
82 "[ 4 5 6]\n",
83 "[ 8 9 10]"
84 ]
85 },
86 "metadata": {},
87 "output_type": "display_data"
88 },
89 {
90 "name": "stdout",
91 "output_type": "stream",
92 "text": [
93 "pi\n"
94 ]
95 },
96 {
97 "data": {
98 "text/html": [
99 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi</script></html>"
100 ],
101 "text/latex": [
102 "\\begin{math}\n",
103 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi\n",
104 "\\end{math}"
105 ],
106 "text/plain": [
107 "pi"
108 ]
109 },
110 "metadata": {},
111 "output_type": "display_data"
112 }
113 ],
114 "source": [
115 "s = (e^x).series(x==0, 4)\n",
116 "M = matrix([[1,2,3],[4,5,6],[8,9,10]])\n",
117 "print(s)\n",
118 "show(s)\n",
119 "print(M)\n",
120 "show(M)\n",
121 "print(pi)\n",
122 "show(pi)"
123 ]
124 },
125 {
126 "cell_type": "markdown",
127 "metadata": {},
128 "source": [
129 "In a Jupyter notebook, the results above are displayed using [MathJax](https://www.mathjax.org/).\n",
130 "\n",
131 "If you are running this code in an interactive console (terminal) instead of a Jupyter notebook, you will get the Latex source code for those objects. You can force this behavior by using the `latex()` command."
132 ]
133 },
134 {
135 "cell_type": "markdown",
136 "metadata": {},
137 "source": [
138 "# The `latex()` command\n",
139 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html)]\n",
140 "\n",
141 "This command is potentially very useful if you need to include the results of Sage computations in a Latex file, especially with complex objects like matrices or very large polynomials.\n",
142 "\n",
143 "Technically, this is a function that returns a string, so you need to `print()` it to see the result."
144 ]
145 },
146 {
147 "cell_type": "code",
148 "execution_count": 5,
149 "metadata": {},
150 "outputs": [
151 {
152 "name": "stdout",
153 "output_type": "stream",
154 "text": [
155 "1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n",
156 "\n",
157 "\n",
158 "\\left(\\begin{array}{rrr}\n",
159 "1 & 2 & 3 \\\\\n",
160 "4 & 5 & 6 \\\\\n",
161 "8 & 9 & 10\n",
162 "\\end{array}\\right)\n"
163 ]
164 }
165 ],
166 "source": [
167 "print(latex(s))\n",
168 "print(\"\\n\")\n",
169 "print(latex(M))"
170 ]
171 },
172 {
173 "cell_type": "markdown",
174 "metadata": {},
175 "source": [
176 "Interestingly, Sage can use matplotlib's PGF backend to generate Latex code for a plot. (PGF is the graphics language underlying TikZ, like TeX is the language underlying Latex)."
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": 15,
182 "metadata": {},
183 "outputs": [],
184 "source": [
185 "#latex(plot(x^2)) # The output is more than 20 pages long"
186 ]
187 },
188 {
189 "cell_type": "markdown",
190 "metadata": {},
191 "source": [
192 "It is probably easier to just generate the picture and include that in your Latex document with `\\includegraphics`."
193 ]
194 },
195 {
196 "cell_type": "markdown",
197 "metadata": {},
198 "source": [
199 "## A Latex name for your variables\n",
200 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html)]\n",
201 "\n",
202 "Sometimes you might want to use variables and functions that have, for example, a Greek letter as a name. You can tell Sage that you want them displayed this way when you declare them:"
203 ]
204 },
205 {
206 "cell_type": "code",
207 "execution_count": 16,
208 "metadata": {},
209 "outputs": [
210 {
211 "name": "stdout",
212 "output_type": "stream",
213 "text": [
214 "phi1(epsilon)\n"
215 ]
216 },
217 {
218 "data": {
219 "text/html": [
220 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)</script></html>"
221 ],
222 "text/latex": [
223 "\\begin{math}\n",
224 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)\n",
225 "\\end{math}"
226 ],
227 "text/plain": [
228 "e^epsilon + phi1(epsilon)"
229 ]
230 },
231 "metadata": {},
232 "output_type": "display_data"
233 },
234 {
235 "data": {
236 "text/plain": [
237 "e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)"
238 ]
239 },
240 "execution_count": 16,
241 "metadata": {},
242 "output_type": "execute_result"
243 }
244 ],
245 "source": [
246 "var('epsilon', latex_name=\"\\\\varepsilon\")\n",
247 "function('phi1', latex_name=\"\\\\phi_1\")\n",
248 "\n",
249 "print(phi1(epsilon))\n",
250 "show(phi1(epsilon) + e^epsilon)\n",
251 "latex(phi1(epsilon) + e^epsilon)"
252 ]
253 },
254 {
255 "cell_type": "markdown",
256 "metadata": {},
257 "source": [
258 "**Warning:** You need to use two backspaces `\\\\`. The reason is that in Python (like in many other programming languages) the backslash symbol inside a string is used to print special characters, such as a newline `\\n`."
259 ]
260 },
261 {
262 "cell_type": "markdown",
263 "metadata": {},
264 "source": [
265 "# From Jupyter to Latex\n",
266 "**Reference:** [[4](https://nbconvert.readthedocs.io/en/latest/)]\n",
267 "\n",
268 "From the Jupyter menu `File > Download as` you can choose to download your work in many formats, among which there are also Latex and pdf. Personally I prefer downloading the .tex file, so then I can change the title, add an author name and make any other change I like before compiling it into a pdf file.\n",
269 "\n",
270 "If you choose to download the pdf file, you might need to install some extra packages. For example I had to install [`pandoc`](https://pandoc.org/), `texlive-XeTeX` and `texlive-Xdvi`, but this depends on your operating system and Latex distribution."
271 ]
272 },
273 {
274 "cell_type": "markdown",
275 "metadata": {},
276 "source": [
277 "# SageTex\n",
278 "**Reference:** [[5](https://doc.sagemath.org/html/en/tutorial/sagetex.html)]\n",
279 "\n",
280 "With SageTex it is possible to run Sage commands directly inside Latex, using the `\\sage{}` command. In this way you don't need to run your Sage code first and then copy the results in Latex. It can be useful especially for short Sage commands.\n",
281 "\n",
282 "You might need to take some extra steps to make this work on your system, see the link above."
283 ]
284 },
285 {
286 "cell_type": "markdown",
287 "metadata": {},
288 "source": [
289 "# The Latex `listings` package\n",
290 "**References:** [[6](https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings)] and [[7](https://ftp.snt.utwente.nl/pub/software/tex/macros/latex/contrib/listings/listings.pdf)]\n",
291 "\n",
292 "If you want to include some code (Sage, Python or anything else) in a Latex document you can use the listings package.\n",
293 "\n",
294 "```\n",
295 "\\usepackage{listings}\n",
296 "\n",
297 "...\n",
298 "\n",
299 "\\begin{lstlisting}[language=Python]\n",
300 "for i in range(0,100):\n",
301 " if i%5 == 0:\n",
302 " print(\"Multiple of 5!\")\n",
303 "\\end{lstlisting}\n",
304 "```\n",
305 "\n",
306 "You need to specify the language you are using with the `language=` option. This option can also be set at the beginning of the document using the `\\lstset{language=Python}` command.\n",
307 "\n",
308 "As an alternative, you can include a file directly without copying the code into the tex file, like you would do for a picture:\n",
309 "\n",
310 "```\n",
311 "\\lstinputlisting[language=Python]{file.py}\n",
312 "```\n",
313 "\n",
314 "It is technically possible to include Latex listings in a markdown cell of the Jupyter notebook using [this package](https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html), but it does not make much sense. So we will move to a Latex editor for the examples."
315 ]
316 },
317 {
318 "cell_type": "code",
319 "execution_count": null,
320 "metadata": {},
321 "outputs": [],
322 "source": []
323 }
324 ],
325 "metadata": {
326 "kernelspec": {
327 "display_name": "SageMath 9.2",
328 "language": "sage",
329 "name": "sagemath"
330 },
331 "language_info": {
332 "codemirror_mode": {
333 "name": "ipython",
334 "version": 3
335 },
336 "file_extension": ".py",
337 "mimetype": "text/x-python",
338 "name": "python",
339 "nbconvert_exporter": "python",
340 "pygments_lexer": "ipython3",
341 "version": "3.8.5"
342 }
343 },
344 "nbformat": 4,
345 "nbformat_minor": 4
346}
diff --git a/Lectures/9-SageLatex.pdf b/Lectures/9-SageLatex.pdf
new file mode 100644
index 0000000..3f81775
--- /dev/null
+++ b/Lectures/9-SageLatex.pdf
Binary files differ
diff --git a/Lectures/X1-ComputationalComplexity-notebook.pdf b/Lectures/X1-ComputationalComplexity-notebook.pdf
new file mode 100644
index 0000000..93c32f1
--- /dev/null
+++ b/Lectures/X1-ComputationalComplexity-notebook.pdf
Binary files differ
diff --git a/Lectures/X1-ComputationalComplexity.pdf b/Lectures/X1-ComputationalComplexity.pdf
new file mode 100644
index 0000000..fe67ff6
--- /dev/null
+++ b/Lectures/X1-ComputationalComplexity.pdf
Binary files differ
diff --git a/Lectures/X2-StudentsRequests-notebook.pdf b/Lectures/X2-StudentsRequests-notebook.pdf
new file mode 100644
index 0000000..a424837
--- /dev/null
+++ b/Lectures/X2-StudentsRequests-notebook.pdf
Binary files differ
diff --git a/Lectures/X2-StudentsRequests.pdf b/Lectures/X2-StudentsRequests.pdf
new file mode 100644
index 0000000..8b5793e
--- /dev/null
+++ b/Lectures/X2-StudentsRequests.pdf
Binary files differ
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..da4e154
--- /dev/null
+++ b/README.md
@@ -0,0 +1,78 @@
1# Mathematical software
2
3Course given in Spring 2021 at the University of Luxembourg.
4
5If you just want to check out the notes for the course, see the `Lectures`
6folder and the `Videos` section below. If you want to teach a similar course,
7see the `Teaching` section below.
8
9## Description
10
11The goal of the course is to teach the basics of
12[LaTeX](https://en.wikipedia.org/wiki/LaTeX) and
13[SageMath](https://www.sagemath.org/), so that the students reach a broad
14understanding of these tools and can use them whenever needed, such as if they
15need to write a Thesis, prepare slides for a presentation or carry out
16intense computations.
17
18### LaTeX
19
20LaTeX is a markup language to write and format documents of any type. It is
21particularly well-suited for scientific documents, but it can be used for any
22type of document, including books, CVs and even presentation slides.
23It can be used together with a graphical front-end (such as TexMaker,
24TexStudio, Overleaf...) to immediately see the pdf output. The main advantage
25over a more classical word processor such as Microsoft Word, besides a much
26better support for writing mathematical formulas and theorems, is that in
27LaTeX [What you see is what you mean](https://en.wikipedia.org/wiki/WYSIWYM):
28by typing commands instead of
29visually changing the appearence of the text, the "compiler" will always try to
30produce an output that is faithful to what the user indicated, so the user does
31not have to manually adjust the result after every major modification.
32
33### SageMath
34
35SageMath is a free and open-source mathematical software system which builds
36on top of many existing ones: NumPy, SciPy, matplotlib, Sympy, Pari/GP, GAP, R
37and many more. Thanks to it, all the features all these languages can be
38accessed from a common Python-based interface.
39In practice, the SageMath "language" is almost identical to Python, but it
40provides a complete set of libraries to deal with many mathematical objects and
41computations.
42
43## Videos
44
45For the first few lectures I have filmed some videos which are a shorter
46version of what explained in class. You can find all of them in [this YouTube
47channel](https://www.youtube.com/channel/UCUPWzPfoW5UJInqZcqGCigg).
48
49* [Getting started with LaTeX](https://www.youtube.com/watch?v=HVvQpZEeIDI)
50* [LaTeX bibliography](https://www.youtube.com/watch?v=-KrNY7BXdPo)
51* [Defining commands in LaTeX](https://www.youtube.com/watch?v=IFt259434Zg)
52* [LaTeX theorem numbering](https://www.youtube.com/watch?v=pjm18Ceg6lg)
53* [Graphics with TikZ](https://www.youtube.com/watch?v=mWqhB6qOIk0)
54* [Introduction to Python](https://www.youtube.com/watch?v=b7k3hlW2DMs)
55
56## Files
57
58The files in this repository are organized as follows:
59
60* `Lectures` contains the slides and notes I have made and used during the
61 lectures. Some of them are classic (Beamer) slides, some other are
62 [Jupyter Notebook](https://jupyter.org/) files.
63* `Homework` contains the four homework assignment given during the course.
64 They accounted for 100% of the final grade.
65* `Resources` contains some random files (tutorials, reference manual) that I
66 have found online. All credits go to the original authors.
67* `src` contains the LaTeX and (and Sage) source code for the files in the
68 `Lectures` and `Homework` folders, as well as some "scratchpad" LaTeX file
69 written during the lectures as a live example.
70
71## Teaching
72
73INS guidelines for teachers who want to do something similar (including how long
74each lecture was etc.)
75
76INS also stuff about license (use my personal email address instead of unilu)
77
78INS also list of topics for each lecture (take from moodle)
diff --git a/resources/amsthdoc.pdf b/Resources/amsthdoc.pdf
index c9209b0..c9209b0 100644
--- a/resources/amsthdoc.pdf
+++ b/Resources/amsthdoc.pdf
Binary files differ
diff --git a/resources/pgfmanual.pdf b/Resources/pgfmanual.pdf
index 47b3273..47b3273 100644
--- a/resources/pgfmanual.pdf
+++ b/Resources/pgfmanual.pdf
Binary files differ
diff --git a/resources/symbols.pdf b/Resources/symbols.pdf
index 7dab684..7dab684 100644
--- a/resources/symbols.pdf
+++ b/Resources/symbols.pdf
Binary files differ
diff --git a/resources/tikz-cd-doc.pdf b/Resources/tikz-cd-doc.pdf
index e4f8c8d..e4f8c8d 100644
--- a/resources/tikz-cd-doc.pdf
+++ b/Resources/tikz-cd-doc.pdf
Binary files differ
diff --git a/src/Homework1/Homework1.aux b/src/Homework1/Homework1.aux
new file mode 100644
index 0000000..cde7be1
--- /dev/null
+++ b/src/Homework1/Homework1.aux
@@ -0,0 +1,4 @@
1\relax
2\newlabel{prop:fta}{{1}{1}}
3\newlabel{eq:fubini}{{2}{1}}
4\gdef \@abspage@last{2}
diff --git a/src/Homework1/Homework1.log b/src/Homework1/Homework1.log
new file mode 100644
index 0000000..644875f
--- /dev/null
+++ b/src/Homework1/Homework1.log
@@ -0,0 +1,257 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 1 APR 2021 11:38
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**homework1.tex
6(./homework1.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size12.clo
12File: size12.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2020/08/01 v1.3d Input encoding file
28\inpenc@prehook=\toks15
29\inpenc@posthook=\toks16
30)
31(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/09/23 v2.17i AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks17
42\ex@=\dimen139
43))
44(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen140
47)
48(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count185
52LaTeX Info: Redefining \frac on input line 234.
53\uproot@=\count186
54\leftroot@=\count187
55LaTeX Info: Redefining \overline on input line 399.
56\classnum@=\count188
57\DOTSCASE@=\count189
58LaTeX Info: Redefining \ldots on input line 496.
59LaTeX Info: Redefining \dots on input line 499.
60LaTeX Info: Redefining \cdots on input line 620.
61\Mathstrutbox@=\box47
62\strutbox@=\box48
63\big@size=\dimen141
64LaTeX Font Info: Redeclaring font encoding OML on input line 743.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
66\macc@depth=\count190
67\c@MaxMatrixCols=\count191
68\dotsspace@=\muskip16
69\c@parentequation=\count192
70\dspbrk@lvl=\count193
71\tag@help=\toks18
72\row@=\count194
73\column@=\count195
74\maxfields@=\count196
75\andhelp@=\toks19
76\eqnshift@=\dimen142
77\alignsep@=\dimen143
78\tagshift@=\dimen144
79\tagwidth@=\dimen145
80\totwidth@=\dimen146
81\lineht@=\dimen147
82\@envbody=\toks20
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks21
86LaTeX Info: Redefining \[ on input line 2923.
87LaTeX Info: Redefining \] on input line 2924.
88)
89(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty
101Package: amsthm 2020/05/29 v2.20.6
102\thm@style=\toks22
103\thm@bodyfont=\toks23
104\thm@headfont=\toks24
105\thm@notefont=\toks25
106\thm@headpunct=\toks26
107\thm@preskip=\skip52
108\thm@postskip=\skip53
109\thm@headsep=\skip54
110\dth@everypar=\toks27
111)
112(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
113Package: geometry 2020/01/02 v5.9 Page Geometry
114
115(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
116Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
117\KV@toks@=\toks28
118)
119(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
120Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
121
122(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
123Package: iftex 2020/03/06 v1.0d TeX engine tests
124))
125\Gm@cnth=\count197
126\Gm@cntv=\count198
127\c@Gm@tempcnt=\count199
128\Gm@bindingoffset=\dimen148
129\Gm@wd@mp=\dimen149
130\Gm@odd@mp=\dimen150
131\Gm@even@mp=\dimen151
132\Gm@layoutwidth=\dimen152
133\Gm@layoutheight=\dimen153
134\Gm@layouthoffset=\dimen154
135\Gm@layoutvoffset=\dimen155
136\Gm@dimlist=\toks29
137)
138\c@thm=\count266
139\c@ex=\count267
140
141(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
142File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
143\l__kernel_color_stack_int=\count268
144\l__pdf_internal_box=\box49
145)
146(./homework1.aux)
147\openout1 = `homework1.aux'.
148
149LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 21.
150LaTeX Font Info: ... okay on input line 21.
151LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 21.
152LaTeX Font Info: ... okay on input line 21.
153LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 21.
154LaTeX Font Info: ... okay on input line 21.
155LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 21.
156LaTeX Font Info: ... okay on input line 21.
157LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 21.
158LaTeX Font Info: ... okay on input line 21.
159LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 21.
160LaTeX Font Info: ... okay on input line 21.
161LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 21.
162LaTeX Font Info: ... okay on input line 21.
163
164*geometry* driver: auto-detecting
165*geometry* detected driver: pdftex
166*geometry* verbose mode - [ preamble ] result:
167* driver: pdftex
168* paper: a4paper
169* layout: <same size as paper>
170* layoutoffset:(h,v)=(0.0pt,0.0pt)
171* modes:
172* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt)
173* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt)
174* \paperwidth=597.50787pt
175* \paperheight=845.04684pt
176* \textwidth=483.69687pt
177* \textheight=731.23584pt
178* \oddsidemargin=-15.36449pt
179* \evensidemargin=-15.36449pt
180* \topmargin=-52.36449pt
181* \headheight=12.0pt
182* \headsep=25.0pt
183* \topskip=12.0pt
184* \footskip=30.0pt
185* \marginparwidth=35.0pt
186* \marginparsep=10.0pt
187* \columnsep=10.0pt
188* \skip\footins=10.8pt plus 4.0pt minus 2.0pt
189* \hoffset=0.0pt
190* \voffset=0.0pt
191* \mag=1000
192* \@twocolumnfalse
193* \@twosidefalse
194* \@mparswitchfalse
195* \@reversemarginfalse
196* (1in=72.27pt=25.4mm, 1cm=28.453pt)
197
198LaTeX Font Info: Trying to load font information for U+msa on input line 31.
199
200(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
201File: umsa.fd 2013/01/14 v3.01 AMS symbols A
202)
203LaTeX Font Info: Trying to load font information for U+msb on input line 31.
204
205
206(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
207File: umsb.fd 2013/01/14 v3.01 AMS symbols B
208)
209LaTeX Font Info: Trying to load font information for OMS+cmtt on input line
21049.
211LaTeX Font Info: No file OMScmtt.fd. on input line 49.
212
213
214LaTeX Font Warning: Font shape `OMS/cmtt/m/n' undefined
215(Font) using `OMS/cmsy/m/n' instead
216(Font) for symbol `textbackslash' on input line 49.
217
218[1
219
220{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
221
222LaTeX Font Warning: Font shape `OMS/cmtt/m/it' undefined
223(Font) using `OMS/cmtt/m/n' instead
224(Font) for symbol `textbackslash' on input line 139.
225
226[2] (./homework1.aux)
227
228LaTeX Font Warning: Some font shapes were not available, defaults substituted.
229
230 )
231Here is how much of TeX's memory you used:
232 2221 strings out of 479383
233 29071 string characters out of 5875799
234 312548 words of memory out of 5000000
235 19342 multiletter control sequences out of 15000+600000
236 410962 words of font info for 55 fonts, out of 8000000 for 9000
237 1141 hyphenation exceptions out of 8191
238 66i,12n,72p,226b,343s stack positions out of 5000i,500n,10000p,200000b,80000s
239{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/share/
240texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf-dist/fon
241ts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/texmf-dist/fonts/type1/publi
242c/amsfonts/cm/cmitt10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm
243/cmmi12.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb></u
244sr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb></usr/share/texmf-
245dist/fonts/type1/public/amsfonts/cm/cmr8.pfb></usr/share/texmf-dist/fonts/type1
246/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfon
247ts/cm/cmsy8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmti12.pf
248b></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt12.pfb></usr/share/
249texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb></usr/share/texmf-dis
250t/fonts/type1/public/cm-super/sfrm1200.pfb>
251Output written on homework1.pdf (2 pages, 120157 bytes).
252PDF statistics:
253 64 PDF objects out of 1000 (max. 8388607)
254 46 compressed objects within 1 object stream
255 0 named destinations out of 1000 (max. 500000)
256 1 words of extra memory for PDF output out of 10000 (max. 10000000)
257
diff --git a/src/Homework1/Homework1.pdf b/src/Homework1/Homework1.pdf
new file mode 100644
index 0000000..9a8228a
--- /dev/null
+++ b/src/Homework1/Homework1.pdf
Binary files differ
diff --git a/src/Homework1/Homework1.tex b/src/Homework1/Homework1.tex
new file mode 100644
index 0000000..961a80d
--- /dev/null
+++ b/src/Homework1/Homework1.tex
@@ -0,0 +1,143 @@
1\documentclass[12pt,a4paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage{amsthm}
7\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
8
9\title{Mathematical software - homework 1}
10\author{Sebastiano Tronto}
11
12\newtheorem{thm}{Theorem}
13\newtheorem{prop}[thm]{Proposition}
14
15\theoremstyle{definition}
16\newtheorem{ex}{Exercise}
17
18\theoremstyle{definition}
19\newtheorem*{remark}{Remark}
20
21\begin{document}
22
23\noindent\hrulefill
24
25\begin{center}
26\Huge{\textbf{Mathematical Software - Homework 1}}
27\end{center}
28
29\noindent\hrulefill
30\begin{center}
31\begin{tabular}{lcr}
32\texttt{sebastiano.tronto@uni.lu} & \qquad \qquad \qquad \qquad &
33\textbf{Deadline: Sunday, March 28th}
34\end{tabular}
35\end{center}
36
37\vspace{1cm}
38
39\begin{center}
40 \emph{\large
41 For each of the following exercises submit a .tex and a .pdf file.
42 }
43\end{center}
44
45\vspace{1cm}
46
47\begin{ex}
48 Write a short Latex document that contains the following theorem-like
49 environments using the \texttt{\textbackslash newtheorem} command of the
50 \texttt{amsthm} package (the box around the text is not needed):
51 \begin{center}
52 \fbox{\parbox{0.95\textwidth}{
53 \begin{prop}[Fundamental Theorem of Algebra]
54 \label{prop:fta}
55 Let \(p(x)\) be a non-constant polynomial with coefficients in
56 $\mathbb C$. Then there is \(z\in\mathbb C\) such that $p(z)=0$.
57 \end{prop}
58
59 \begin{remark}
60 Proposition \ref{prop:fta} is not true for polynomials with
61 coefficients in $\mathbb R$. For example
62 \begin{align}
63 p(x) = x^2+1
64 \end{align}
65 does not have real roots.
66 \end{remark}
67
68 \begin{thm}
69 If $X$ and $Y$ are $\sigma$-finite measure spaces and $f:X\times Y\to
70 \mathbb R$ is measurable and such that
71 \begin{align*}
72 \int_{X\times Y}|f(x,y)|\mathrm d(x,y) < \infty
73 \end{align*}
74 then
75 \begin{align}
76 \label{eq:fubini}
77 \int_X\left(\int_Yf(x,y)\mathrm d y\right)\mathrm d x =
78 \int_Y\left(\int_Xf(x,y)\mathrm d x\right)\mathrm d y =
79 \int_{X\times Y} f(x,y)\mathrm d(x,y)\,.
80 \end{align}
81 \end{thm}
82
83 \begin{remark}
84 In practice, equation \eqref{eq:fubini} means that we can switch the
85 order of integration in a double integral.
86 \end{remark}
87 }}
88 \end{center}
89 Notice that Propositions, Theorems and some of the equations are numbered,
90 and some of them are referred to in the Remarks. This numbering should change
91 accordingly if more numbered Theorems and equations are added before this
92 part of the text.
93\end{ex}
94
95\vspace{0.8cm}
96
97\begin{ex}
98[This is basically a ``do whatever you want, just do something'' exercise]
99Write a Mathematical document in Latex, where ``Mathematical'' means any text
100that contains both inline and displaystyle symbols and formulas, and where most
101of the sentences contain a Mathematical symbol.
102For example, you can submit (part of) your homework or notes for another course
103that you are following at the moment.
104
105You must follow the following rules:
106\begin{itemize}
107 \item Your document must be at least 2 pages long.
108 \item Use the following in your preamble:
109 \begin{verbatim}
110\documentaclass[12pt,a4paper]{article}
111\usepackage[left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm]{geometry}
112 \end{verbatim}
113\end{itemize}
114The document itself can be about any area of Mathematics, Physics or similar.
115The correctness of the Mathematics itself will not be judged for this course.
116\end{ex}
117
118\section*{Grading}
119
120This homework assignment is worth 25\% of your final grade.
121
122\vspace{0.3cm}
123\textbf{Exercise 1 (10 points).}
124\begin{itemize}
125 \item A correct use of the \texttt{\textbackslash newtheorem} command is
126 worth 4 out of 10 points.
127 \item A correct use of the labelling and reference system is worth 4 points.
128 \item Reproducing correctly the mathematical formulas is worth 2 points.
129\end{itemize}
130
131\textbf{Exercise 2 (10 points).}
132\begin{itemize}
133 \item A resulting pdf file that looks readable and correct is worth 6 out of
134 10 points.
135 \item The correct use of latex commands and environments is worth 4 out of
136 10 points. \emph{Examples of mistakes in this sense: adjusting manually
137 the size of parenthesis instead of using \texttt{\textbackslash left}
138 and \texttt{\textbackslash right}; using \texttt{\textbackslash Sigma}
139 when you actually want to write a sum symbol.}
140\end{itemize}
141
142
143\end{document} \ No newline at end of file
diff --git a/src/Homework2/Homework2.aux b/src/Homework2/Homework2.aux
new file mode 100644
index 0000000..a79beaf
--- /dev/null
+++ b/src/Homework2/Homework2.aux
@@ -0,0 +1,2 @@
1\relax
2\gdef \@abspage@last{3}
diff --git a/src/Homework2/Homework2.log b/src/Homework2/Homework2.log
new file mode 100644
index 0000000..37f3d4a
--- /dev/null
+++ b/src/Homework2/Homework2.log
@@ -0,0 +1,584 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 26 MAR 2021 11:12
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**homework2.tex
6(./homework2.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size12.clo
12File: size12.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2020/08/01 v1.3d Input encoding file
28\inpenc@prehook=\toks15
29\inpenc@posthook=\toks16
30)
31(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/09/23 v2.17i AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks17
42\ex@=\dimen139
43))
44(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen140
47)
48(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count185
52LaTeX Info: Redefining \frac on input line 234.
53\uproot@=\count186
54\leftroot@=\count187
55LaTeX Info: Redefining \overline on input line 399.
56\classnum@=\count188
57\DOTSCASE@=\count189
58LaTeX Info: Redefining \ldots on input line 496.
59LaTeX Info: Redefining \dots on input line 499.
60LaTeX Info: Redefining \cdots on input line 620.
61\Mathstrutbox@=\box47
62\strutbox@=\box48
63\big@size=\dimen141
64LaTeX Font Info: Redeclaring font encoding OML on input line 743.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
66\macc@depth=\count190
67\c@MaxMatrixCols=\count191
68\dotsspace@=\muskip16
69\c@parentequation=\count192
70\dspbrk@lvl=\count193
71\tag@help=\toks18
72\row@=\count194
73\column@=\count195
74\maxfields@=\count196
75\andhelp@=\toks19
76\eqnshift@=\dimen142
77\alignsep@=\dimen143
78\tagshift@=\dimen144
79\tagwidth@=\dimen145
80\totwidth@=\dimen146
81\lineht@=\dimen147
82\@envbody=\toks20
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks21
86LaTeX Info: Redefining \[ on input line 2923.
87LaTeX Info: Redefining \] on input line 2924.
88)
89(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty
101Package: amsthm 2020/05/29 v2.20.6
102\thm@style=\toks22
103\thm@bodyfont=\toks23
104\thm@headfont=\toks24
105\thm@notefont=\toks25
106\thm@headpunct=\toks26
107\thm@preskip=\skip52
108\thm@postskip=\skip53
109\thm@headsep=\skip54
110\dth@everypar=\toks27
111)
112(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
113Package: geometry 2020/01/02 v5.9 Page Geometry
114
115(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
116Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
117\KV@toks@=\toks28
118)
119(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
120Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
121
122(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
123Package: iftex 2020/03/06 v1.0d TeX engine tests
124))
125\Gm@cnth=\count197
126\Gm@cntv=\count198
127\c@Gm@tempcnt=\count199
128\Gm@bindingoffset=\dimen148
129\Gm@wd@mp=\dimen149
130\Gm@odd@mp=\dimen150
131\Gm@even@mp=\dimen151
132\Gm@layoutwidth=\dimen152
133\Gm@layoutheight=\dimen153
134\Gm@layouthoffset=\dimen154
135\Gm@layoutvoffset=\dimen155
136\Gm@dimlist=\toks29
137)
138(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty
139Package: enumitem 2019/06/20 v3.9 Customized lists
140\labelindent=\skip55
141\enit@outerparindent=\dimen156
142\enit@toks=\toks30
143\enit@inbox=\box49
144\enit@count@id=\count266
145\enitdp@description=\count267
146)
147(/usr/share/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
148(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
149(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
150(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
151\pgfutil@everybye=\toks31
152\pgfutil@tempdima=\dimen157
153\pgfutil@tempdimb=\dimen158
154
155(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
156(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
157\pgfutil@abb=\box50
158)
159(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
160(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
161Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
162))
163Package: pgf 2020/12/01 v3.1.7a (3.1.7a)
164
165(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
166(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
167Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
168
169(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
170Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
171
172(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
173Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
174)
175(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
176File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
177)
178Package graphics Info: Driver file: pdftex.def on input line 105.
179
180(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
181File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
182))
183\Gin@req@height=\dimen159
184\Gin@req@width=\dimen160
185)
186(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
187(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
188Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
189
190(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
191\pgfkeys@pathtoks=\toks32
192\pgfkeys@temptoks=\toks33
193
194(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
195\pgfkeys@tmptoks=\toks34
196))
197\pgf@x=\dimen161
198\pgf@y=\dimen162
199\pgf@xa=\dimen163
200\pgf@ya=\dimen164
201\pgf@xb=\dimen165
202\pgf@yb=\dimen166
203\pgf@xc=\dimen167
204\pgf@yc=\dimen168
205\pgf@xd=\dimen169
206\pgf@yd=\dimen170
207\w@pgf@writea=\write3
208\r@pgf@reada=\read2
209\c@pgf@counta=\count268
210\c@pgf@countb=\count269
211\c@pgf@countc=\count270
212\c@pgf@countd=\count271
213\t@pgf@toka=\toks35
214\t@pgf@tokb=\toks36
215\t@pgf@tokc=\toks37
216\pgf@sys@id@count=\count272
217
218(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
219File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
220)
221Driver file for pgf: pgfsys-pdftex.def
222
223(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
224File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
225
226(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
227File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
228)))
229(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
230File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
231\pgfsyssoftpath@smallbuffer@items=\count273
232\pgfsyssoftpath@bigbuffer@items=\count274
233)
234(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
235File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
236))
237(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
238Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
239
240(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
241File: color.cfg 2016/01/02 v1.6 sample color configuration
242)
243Package xcolor Info: Driver file: pdftex.def on input line 225.
244Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
245Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
246Package xcolor Info: Model `RGB' extended on input line 1364.
247Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
248Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
249Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
250Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
251Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
252Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
253)
254(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
255Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
256
257(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
258(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
259(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
260(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
261\pgfmath@dimen=\dimen171
262\pgfmath@count=\count275
263\pgfmath@box=\box51
264\pgfmath@toks=\toks38
265\pgfmath@stack@operand=\toks39
266\pgfmath@stack@operation=\toks40
267)
268(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
269(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
270(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
271.tex)
272(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
273(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
274x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
275(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
276(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
277(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
278.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
279\c@pgfmathroundto@lastzeros=\count276
280)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
281(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
282File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
283\pgf@picminx=\dimen172
284\pgf@picmaxx=\dimen173
285\pgf@picminy=\dimen174
286\pgf@picmaxy=\dimen175
287\pgf@pathminx=\dimen176
288\pgf@pathmaxx=\dimen177
289\pgf@pathminy=\dimen178
290\pgf@pathmaxy=\dimen179
291\pgf@xx=\dimen180
292\pgf@xy=\dimen181
293\pgf@yx=\dimen182
294\pgf@yy=\dimen183
295\pgf@zx=\dimen184
296\pgf@zy=\dimen185
297)
298(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
299File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
300\pgf@path@lastx=\dimen186
301\pgf@path@lasty=\dimen187
302) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
303File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
304\pgf@shorten@end@additional=\dimen188
305\pgf@shorten@start@additional=\dimen189
306)
307(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
308File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
309\pgfpic=\box52
310\pgf@hbox=\box53
311\pgf@layerbox@main=\box54
312\pgf@picture@serial@count=\count277
313)
314(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
315File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
316\pgflinewidth=\dimen190
317)
318(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
319ex
320File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
321\pgf@pt@x=\dimen191
322\pgf@pt@y=\dimen192
323\pgf@pt@temp=\dimen193
324) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
325File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
326)
327(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
328File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
329)
330(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
331x
332File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
333) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
334File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
335\pgfarrowsep=\dimen194
336)
337(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
338File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
339\pgf@max=\dimen195
340\pgf@sys@shading@range@num=\count278
341\pgf@shadingcount=\count279
342)
343(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
344File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
345
346(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
347File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
348\pgfexternal@startupbox=\box55
349))
350(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
351File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
352)
353(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
354File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
355) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
356File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
357)
358(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
359File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
360)))
361(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
362File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
363\pgfnodeparttextbox=\box56
364)
365(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
366File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a)
367)
368(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
369Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a)
370\pgf@nodesepstart=\dimen196
371\pgf@nodesepend=\dimen197
372)
373(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
374Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a)
375))
376(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
377(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
378(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex))
379(/usr/share/texmf-dist/tex/latex/pgf/math/pgfmath.sty
380(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
381(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
382Package: pgffor 2020/12/01 v3.1.7a (3.1.7a)
383
384(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
385\pgffor@iter=\dimen198
386\pgffor@skip=\dimen199
387\pgffor@stack=\toks41
388\pgffor@toks=\toks42
389))
390(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
391Package: tikz 2020/12/01 v3.1.7a (3.1.7a)
392
393(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.te
394x
395File: pgflibraryplothandlers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
396\pgf@plot@mark@count=\count280
397\pgfplotmarksize=\dimen256
398)
399\tikz@lastx=\dimen257
400\tikz@lasty=\dimen258
401\tikz@lastxsaved=\dimen259
402\tikz@lastysaved=\dimen260
403\tikz@lastmovetox=\dimen261
404\tikz@lastmovetoy=\dimen262
405\tikzleveldistance=\dimen263
406\tikzsiblingdistance=\dimen264
407\tikz@figbox=\box57
408\tikz@figbox@bg=\box58
409\tikz@tempbox=\box59
410\tikz@tempbox@bg=\box60
411\tikztreelevel=\count281
412\tikznumberofchildren=\count282
413\tikznumberofcurrentchild=\count283
414\tikz@fig@count=\count284
415 (/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
416File: pgfmodulematrix.code.tex 2020/12/01 v3.1.7a (3.1.7a)
417\pgfmatrixcurrentrow=\count285
418\pgfmatrixcurrentcolumn=\count286
419\pgf@matrix@numberofcolumns=\count287
420)
421\tikz@expandcount=\count288
422
423(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary
424topaths.code.tex
425File: tikzlibrarytopaths.code.tex 2020/12/01 v3.1.7a (3.1.7a)
426))) (/usr/share/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty
427Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ
428
429(/usr/share/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex
430(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary
431matrix.code.tex
432File: tikzlibrarymatrix.code.tex 2020/12/01 v3.1.7a (3.1.7a)
433)
434(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary
435quotes.code.tex
436File: tikzlibraryquotes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
437)
438(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex
439File: pgflibraryarrows.meta.code.tex 2020/12/01 v3.1.7a (3.1.7a)
440\pgfarrowinset=\dimen265
441\pgfarrowlength=\dimen266
442\pgfarrowwidth=\dimen267
443\pgfarrowlinewidth=\dimen268
444))) (/usr/share/texmf-dist/tex/latex/url/url.sty
445\Urlmuskip=\muskip17
446Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
447)
448\c@thm=\count289
449\c@ex=\count290
450
451(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
452File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
453\l__kernel_color_stack_int=\count291
454\l__pdf_internal_box=\box61
455)
456(./homework2.aux)
457\openout1 = `homework2.aux'.
458
459LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 27.
460LaTeX Font Info: ... okay on input line 27.
461LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 27.
462LaTeX Font Info: ... okay on input line 27.
463LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 27.
464LaTeX Font Info: ... okay on input line 27.
465LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 27.
466LaTeX Font Info: ... okay on input line 27.
467LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 27.
468LaTeX Font Info: ... okay on input line 27.
469LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 27.
470LaTeX Font Info: ... okay on input line 27.
471LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 27.
472LaTeX Font Info: ... okay on input line 27.
473
474*geometry* driver: auto-detecting
475*geometry* detected driver: pdftex
476*geometry* verbose mode - [ preamble ] result:
477* driver: pdftex
478* paper: a4paper
479* layout: <same size as paper>
480* layoutoffset:(h,v)=(0.0pt,0.0pt)
481* modes:
482* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt)
483* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt)
484* \paperwidth=597.50787pt
485* \paperheight=845.04684pt
486* \textwidth=483.69687pt
487* \textheight=731.23584pt
488* \oddsidemargin=-15.36449pt
489* \evensidemargin=-15.36449pt
490* \topmargin=-52.36449pt
491* \headheight=12.0pt
492* \headsep=25.0pt
493* \topskip=12.0pt
494* \footskip=30.0pt
495* \marginparwidth=35.0pt
496* \marginparsep=10.0pt
497* \columnsep=10.0pt
498* \skip\footins=10.8pt plus 4.0pt minus 2.0pt
499* \hoffset=0.0pt
500* \voffset=0.0pt
501* \mag=1000
502* \@twocolumnfalse
503* \@twosidefalse
504* \@mparswitchfalse
505* \@reversemarginfalse
506* (1in=72.27pt=25.4mm, 1cm=28.453pt)
507
508(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
509[Loading MPS to PDF converter (version 2006.09.02).]
510\scratchcounter=\count292
511\scratchdimen=\dimen269
512\scratchbox=\box62
513\nofMPsegments=\count293
514\nofMParguments=\count294
515\everyMPshowfont=\toks43
516\MPscratchCnt=\count295
517\MPscratchDim=\dimen270
518\MPnumerator=\count296
519\makeMPintoPDFobject=\count297
520\everyMPtoPDFconversion=\toks44
521) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
522Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
523Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
52485.
525
526(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
527File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
528e
529))
530LaTeX Font Info: Trying to load font information for U+msa on input line 37.
531
532
533(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
534File: umsa.fd 2013/01/14 v3.01 AMS symbols A
535)
536LaTeX Font Info: Trying to load font information for U+msb on input line 37.
537
538
539(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
540File: umsb.fd 2013/01/14 v3.01 AMS symbols B
541)
542LaTeX Font Info: Trying to load font information for OMS+cmtt on input line
54359.
544LaTeX Font Info: No file OMScmtt.fd. on input line 59.
545
546
547LaTeX Font Warning: Font shape `OMS/cmtt/m/n' undefined
548(Font) using `OMS/cmsy/m/n' instead
549(Font) for symbol `textbackslash' on input line 59.
550
551Missing character: There is no ; in font nullfont!
552[1
553
554{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [2] [3]
555(./homework2.aux)
556
557LaTeX Font Warning: Some font shapes were not available, defaults substituted.
558
559 )
560Here is how much of TeX's memory you used:
561 14867 strings out of 479383
562 301095 string characters out of 5875799
563 572478 words of memory out of 5000000
564 31720 multiletter control sequences out of 15000+600000
565 410794 words of font info for 54 fonts, out of 8000000 for 9000
566 1141 hyphenation exceptions out of 8191
567 108i,15n,111p,410b,1144s stack positions out of 5000i,500n,10000p,200000b,80000s
568{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/share/
569texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf-dist/fon
570ts/type1/public/amsfonts/cm/cmmi12.pfb></usr/share/texmf-dist/fonts/type1/publi
571c/amsfonts/cm/cmmi6.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c
572mmi8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb></usr/
573share/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-di
574st/fonts/type1/public/amsfonts/cm/cmsy6.pfb></usr/share/texmf-dist/fonts/type1/
575public/amsfonts/cm/cmsy8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts
576/cm/cmti12.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt12.pfb
577></usr/share/texmf-dist/fonts/type1/public/cm-super/sfrm1200.pfb>
578Output written on homework2.pdf (3 pages, 107428 bytes).
579PDF statistics:
580 62 PDF objects out of 1000 (max. 8388607)
581 45 compressed objects within 1 object stream
582 0 named destinations out of 1000 (max. 500000)
583 13 words of extra memory for PDF output out of 10000 (max. 10000000)
584
diff --git a/src/Homework2/Homework2.pdf b/src/Homework2/Homework2.pdf
new file mode 100644
index 0000000..1164333
--- /dev/null
+++ b/src/Homework2/Homework2.pdf
Binary files differ
diff --git a/src/Homework2/Homework2.tex b/src/Homework2/Homework2.tex
new file mode 100644
index 0000000..e36214d
--- /dev/null
+++ b/src/Homework2/Homework2.tex
@@ -0,0 +1,174 @@
1\documentclass[12pt,a4paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage{amsthm}
7\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
8\usepackage{enumitem}
9\usepackage{tikz}
10\usepackage{tikz-cd}
11\usepackage{url}
12
13\title{Mathematical software - homework 2}
14\author{Sebastiano Tronto}
15
16\newtheorem{thm}{Theorem}
17\newtheorem{prop}[thm]{Proposition}
18
19\theoremstyle{definition}
20\newtheorem{ex}{Exercise}
21
22\theoremstyle{definition}
23\newtheorem*{remark}{Remark}
24
25\newcommand{\bs}{\textbackslash}
26
27\begin{document}
28
29\noindent\hrulefill
30
31\begin{center}
32\Huge{\textbf{Mathematical Software - Homework 2}}
33\end{center}
34
35\noindent\hrulefill
36\begin{center}
37\begin{tabular}{lcr}
38\texttt{sebastiano.tronto@uni.lu} & \qquad \qquad \qquad \qquad &
39\textbf{Deadline: Sunday, April 18th}
40\end{tabular}
41\end{center}
42
43\vspace{1cm}
44
45\begin{center}
46 \emph{\large
47 For each of the following exercises submit a .tex and a .pdf file.
48 }
49\end{center}
50
51\vspace{1cm}
52
53\begin{ex}
54 Create a Latex document containing the following pictures:
55 \begin{enumerate}[label=(\alph*)]
56 \item The regular polygon with $N$-sides centered at the origin of the
57 plane (see below).
58 The number $N$ of sides must be easy to change at will: you should
59 use the \texttt{\textbackslash pgfmathsetmacro} command to set a
60 value for $N$ at the beginning, so that changing only that number
61 makes the whole picture change accordingly.
62 \begin{center}
63 \begin{tikzpicture}[scale=1]
64 \pgfmathsetmacro{\N}{6}
65 \pgfmathsetmacro{\an}{360/\N}
66 \pgfmathsetmacro{\r}{4}
67
68 \draw[lightgray!30,thin] (-6,-6) grid (6,6);
69 \draw[->] (-5,0) -- (5,0);
70 \draw[->] (0,-5) -- (0,5);
71
72 \filldraw[draw=green,fill=green!30,thick] (0.3*\r,0)
73 arc[radius=0.3*\r,start angle=0, end angle=\an]
74 -- node[right] {$\alpha=\an$}(0,0) -- cycle;
75 \draw[thin] (\an:\r) -- (0,0) circle[radius=\r] -- (\r,0);
76 \draw[line width=1.1pt]
77 (\r,0) \foreach \x in {1,2,...,\N} { -- (\x*\an:\r) };
78 \foreach \x in {1,...,\N} {
79 \filldraw[red] (\x*\an:\r) circle[radius=0.1];
80 };
81 \end{tikzpicture}
82 \end{center}
83 \item The following commutative diagram:
84 \begin{tikzcd}
85 0 \ar[r] & A' \ar[r,hook] \ar[d] & A \ar[r,two heads] \ar[d,"\sim"] &
86 A'' \ar[r] \ar[d] \ar[l,dashed,"s"',bend right] & 0 \\
87 0 \ar[r] & A' \ar[r,hook,"i_{A'}"'] & A'\oplus A''
88 \ar[r,two heads,"\pi_{A''}"'] & A'' \ar[r] & 0
89 \end{tikzcd}
90 \end{enumerate}
91\end{ex}
92
93\vspace{0.8cm}
94
95\begin{ex}
96 Suppose you have to give a short presentation (10 minutes) on a topic of
97 your choice related to your study programme (you will not be asked to
98 actually perform this presentation). You can choose to talk about a theorem
99 you find important, a result you have seen in class or something else (see
100 below for a list of possible topics). For example, if you talk about an
101 important theorem you can give the theorem statement, explain why this
102 theorem is important and/or possible applications of this result, and
103 optionally an idea of the proof; but you can also deviate from this and talk
104 for example about the historical background that lead to the development of
105 this theorem.
106
107 Your task is to prepare slides for such a presentation using Beamer (Latex).
108 Since the time for the (imaginary) presentation is very short, you should
109 write 5-8 slides (you can have more if some contain very few or no
110 words).
111
112 If you feel like certain slides do not make sense without your explanation
113 (for example if you have one slide with just one picture and you plan to
114 talk with the picture in background), you can write some comments in the
115 .tex file.
116
117 If you can't think of a topic that you like, you can pick one of the
118 following:
119 \begin{itemize}
120 \item The fundamental theorem of arithmetic (about prime numbers)
121 \item The central limit theorem (probability theory)
122 \item Differential equations (what they are, applications,
123 methods to solve them...)
124 \end{itemize}
125\end{ex}
126
127\newpage
128\section*{Grading}
129
130This homework assignment is worth 25\% of your final grade.
131
132\vspace{0.3cm}
133\noindent\textbf{Exercise 1 (10 points).}
134Part (a) is worth 5 points, divided as follows:
135\begin{itemize}
136 \item 3 points for obtaining a regular polygon whose number of sides
137 can be changed by setting a variable with \texttt{\bs pgfmathsetmacro}
138 (or in a similarly easy way).
139 \item 1.5 points for other features of the picture (verteces, angle) that
140 also change accordingly to the same variable.
141 \item 0.5 points for the style of the other elements of the picture. This is
142 a matter of personal preference and it does not need to be exactly the
143 same as the picture, but some key features should remain (e.g.
144 the grid lines should be less visible than the rest of the picture,
145 the circle line style should be different from the polygon).
146\end{itemize}
147Part (b) is worth 5 points, divided as follows:
148\begin{itemize}
149 \item 3 points if the nodes and arrows of the diagram are correct from a
150 mathematical point of view (that is, the arrows point to the correct
151 object).
152 \item 1 point if the labels of the arrows are placed as shown in the picture
153 above.
154 \item 1 point for the correct style of the arrows (dashed, curved).
155\end{itemize}
156
157\vspace{0.2cm}
158\noindent\textbf{Exercise 2 (10 points).}
159\begin{itemize}
160 \item Producing a presentation that contains at least 4 slides is worth
161 5 points (but within reason: for example, the slides must not be empty).
162 \item Up to 3 more points are given if the presentation is of a suitable
163 length (watch out: both a presentation too short and one too long can
164 loose points!).
165 Comments in the .tex file can help me understand how long you plan to
166 spend on each slide. If you are not sure how long your presentation is
167 going to take, try it and write down how long each slide took.
168 \item Up to 2 more points will be given if the slides ``look nice'' from
169 the audience's perspective (e.g. not too many words on the same slides,
170 are there nice pictures, etc).
171\end{itemize}
172
173
174\end{document} \ No newline at end of file
diff --git a/src/Homework3/.ipynb_checkpoints/Homework3-checkpoint.ipynb b/src/Homework3/.ipynb_checkpoints/Homework3-checkpoint.ipynb
new file mode 100644
index 0000000..13bad44
--- /dev/null
+++ b/src/Homework3/.ipynb_checkpoints/Homework3-checkpoint.ipynb
@@ -0,0 +1,179 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "*For this exercise you should have received this text in .ipynb format. Complete the exercises by modifying this file, and submit the modified version*"
8 ]
9 },
10 {
11 "cell_type": "markdown",
12 "metadata": {},
13 "source": [
14 "**Exercise 1**\n",
15 "\n",
16 "Use SageMath to solve the following problems:\n",
17 "\n",
18 "(a) Find the roots of the following polynomial over $\\mathbb Q$:\n",
19 "\\begin{align*}\n",
20 " p = 4 x^{7} + 4 x^{6} + 3 x^{5} - 13 x^{4} - 13 x^{3} - 9 x^{2} + 3 x + 3 \\in \\mathbb Q[x]\n",
21 "\\end{align*}\n",
22 "\n",
23 "(b) Find the roots of the same polynomial $p$ over $\\mathbb R$ and over $\\mathbb C$.\n",
24 "\n",
25 "(c) Find the determinant, the trace and the characteristic polynomial of the following matrix:\n",
26 "\\begin{align*}\n",
27 "A=\\left(\\begin{array}{rrrr}\n",
28 "-1 & 1 & -1 & 0 \\\\\n",
29 "1 & \\frac{1}{2} & 1 & 0 \\\\\n",
30 "\\frac{1}{2} & -\\frac{1}{2} & -2 & 1 \\\\\n",
31 "0 & 0 & 1 & 1\n",
32 "\\end{array}\\right)\n",
33 "\\end{align*}\n",
34 "\n",
35 "(d) Find a solution to the linear system $A\\mathbf x =\\mathbf v$, where $A$ is the matrix above and $\\mathbf v=(1, 2, 3, 4)$.\n",
36 "\n",
37 "Write your code in the cell below."
38 ]
39 },
40 {
41 "cell_type": "code",
42 "execution_count": null,
43 "metadata": {},
44 "outputs": [],
45 "source": []
46 },
47 {
48 "cell_type": "markdown",
49 "metadata": {},
50 "source": [
51 "**Exercise 2**\n",
52 "\n",
53 "After exchanging messages with the RSA protocol seen in class, Alice and Bob decide to meet and play their favorite game: flip a coin. They like this game very much because it does not take long to set it up and they have exactly the same chances of winning.\n",
54 "\n",
55 "Unfortunately, due to the COVID-19 pandemic they cannot meet in person, and despite being good friends they don't trust each other enough to play this game via Webex call. Luckily, Alice is an expert in cryptography and she knows how to play this game using the Chinese remainder theorem.\n",
56 "\n",
57 "The game plays out as follows:\n",
58 "\n",
59 "(A1) Alice picks two large prime numbers $p$ and $q$, she computes $n=pq$ and sends $n$ to Bob, keeping $p$ and $q$ secret.\n",
60 "\n",
61 "(B1) Bob picks a random number $a$ with $1<a<n$ and $\\gcd(a,n)=1$, computes $b=a^2\\mod n$ and sends $b$ to Alice, keeping $a$ secret.\n",
62 "\n",
63 "(A2) Alice computes two numbers $x$ and $y$ such that $x^2\\equiv b\\pmod p$ and $y^2\\equiv b\\pmod q$ and she uses the Chinese remainder theorem to compute a number $z$ such that $z\\equiv x\\pmod p$ and $z\\equiv y\\pmod q$, so that $z^2\\equiv b\\pmod n$. Then she sends $z$ to Bob.\n",
64 "\n",
65 "Since $n$ is the product of two primes, there are $4$ possible square roots of $b$ modulo $n$, corresponding to the solutions of the four systems of congruences (one for each possible combination of $\\pm$)\n",
66 "\\begin{align*}\\begin{cases}\n",
67 "z\\equiv \\pm x\\pmod p\\\\\n",
68 "z \\equiv \\pm y\\pmod q\n",
69 "\\end{cases}\\end{align*}\n",
70 "\n",
71 "One of those solutions is $a$ and another is $-a$, and Bob knows them. Alice is picking one of the $4$ possible roots at random (she chooses between $x$ and $-x$ and between $y$ and $-y$), so she has $50\\%$ chance of picking one that Bob already knows. This corresponds to Alice flipping a coin, and she wins if she picks $\\pm a$:\n",
72 "\n",
73 "(B2) If $z\\equiv\\pm a\\pmod n$, Bob declares to have lost. Otherwise, Bob claims to have won, and as proof he produces one prime factor of $n$ by computing $g=\\gcd(n,a+z)$. *(One can prove that in this situation $g$ is always one of the two prime factors of $n$.)*\n",
74 "\n",
75 "Since factoring a number without extra information is very hard, Alice will be convinced that she must have given Bob one of the square roots that he did not know, so she admits the loss.\n",
76 "\n",
77 "Now to the actual exercise:\n",
78 "\n",
79 "(a) Write the code for the functions A1, B1 and B2 as indicated in the cell below. The function A2 is already written.\n",
80 "\n",
81 "(b) Modify the functions B1, A2 and B2 to check that the opponent is not cheating. More precisely:\n",
82 "* In B1, Bob should check that $n$ is not a prime power. *(This is the only way Alice can try to cheat: if she sends Bob a number $n$ that is the product of more than two primes, than she has less than $50\\%$ chance of winning!)*\n",
83 "* In A2, Alice should check that $b$ is a square modulo $n$.\n",
84 "* In B2, Bob should check that $z^2\\equiv a^2\\pmod n$.\n",
85 "\n",
86 "In case cheating is detected, a message should be printed saying that the person is cheating."
87 ]
88 },
89 {
90 "cell_type": "code",
91 "execution_count": 1,
92 "metadata": {
93 "collapsed": true
94 },
95 "outputs": [
96 {
97 "ename": "IndentationError",
98 "evalue": "expected an indented block (<ipython-input-1-60f510bf175f>, line 7)",
99 "output_type": "error",
100 "traceback": [
101 "\u001b[1;36m File \u001b[1;32m\"<ipython-input-1-60f510bf175f>\"\u001b[1;36m, line \u001b[1;32m7\u001b[0m\n\u001b[1;33m def B1(n):\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mIndentationError\u001b[0m\u001b[1;31m:\u001b[0m expected an indented block\n"
102 ]
103 }
104 ],
105 "source": [
106 "# Alice needs this to compute the square roots\n",
107 "from sage.rings.finite_rings.integer_mod import square_root_mod_prime\n",
108 "\n",
109 "def A1():\n",
110 " # This function must return two distinct primes and their product.\n",
111 " \n",
112 "def B1(n):\n",
113 " # This function must return a random integer a\n",
114 " # with 1<a<n and gcd(a,n)=1.\n",
115 "\n",
116 "def A2(b, p, q):\n",
117 " x = ZZ(square_root_mod_prime(Integers(p)(b), p))\n",
118 " y = ZZ(square_root_mod_prime(Integers(q)(b), q))\n",
119 " return crt(x, y, p, q)\n",
120 "\n",
121 "def B2(a, z, n):\n",
122 " # This function must print out one of two messages:\n",
123 " # \"Bob has lost\" if z is congruent to a or -a modulo n.\n",
124 " # \"Bob has won, proof: \" followed by a prime factor of n otherwise.\n",
125 " # In this case the prime must be calculated as explained above.\n",
126 "\n",
127 "\n",
128 "# This is how the game plays out:\n",
129 "p, q, n = A1()\n",
130 "print(\"Alice picked n =\", n)\n",
131 "print(\"[[ Alice's secret:\", p, q, \"]]\")\n",
132 "a = B1(n)\n",
133 "b = a^2 % n\n",
134 "print(\"Bob picked b =\", b)\n",
135 "print(\"[[ Bob's secret:\", a, \"]]\")\n",
136 "z = A2(b, p, q)\n",
137 "print(\"Alice picked z =\", z)\n",
138 "B2(a, z, n)"
139 ]
140 },
141 {
142 "cell_type": "markdown",
143 "metadata": {},
144 "source": [
145 "**Grading**\n",
146 "\n",
147 "This homework assignment is worth $20\\%$ of your final grade. Exercise 1 is worth 4 points (one for each part) and Exercise 2 is worth 12 points (8 points for part (a) and 4 points for part (b)), for a total of **16 points**."
148 ]
149 },
150 {
151 "cell_type": "code",
152 "execution_count": null,
153 "metadata": {},
154 "outputs": [],
155 "source": []
156 }
157 ],
158 "metadata": {
159 "kernelspec": {
160 "display_name": "SageMath 9.2",
161 "language": "sage",
162 "name": "sagemath"
163 },
164 "language_info": {
165 "codemirror_mode": {
166 "name": "ipython",
167 "version": 3
168 },
169 "file_extension": ".py",
170 "mimetype": "text/x-python",
171 "name": "python",
172 "nbconvert_exporter": "python",
173 "pygments_lexer": "ipython3",
174 "version": "3.8.5"
175 }
176 },
177 "nbformat": 4,
178 "nbformat_minor": 4
179}
diff --git a/src/Homework3/.ipynb_checkpoints/solution-checkpoint.ipynb b/src/Homework3/.ipynb_checkpoints/solution-checkpoint.ipynb
new file mode 100644
index 0000000..41ee2ea
--- /dev/null
+++ b/src/Homework3/.ipynb_checkpoints/solution-checkpoint.ipynb
@@ -0,0 +1,166 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "**Exercise 1**\n",
8 "\n",
9 "Use SageMath to solve the following problems:\n",
10 "\n",
11 "(a) Find the roots of the following polynomial over $\\mathbb Q$:\n",
12 "\\begin{align*}\n",
13 " p = 4 x^{7} + 4 x^{6} + 3 x^{5} - 13 x^{4} - 13 x^{3} - 9 x^{2} + 3 x + 3 \\in \\mathbb Q[x]\n",
14 "\\end{align*}\n",
15 "\n",
16 "(b) Find the roots of the same polynomial $p$ over $\\mathbb R$ and over $\\mathbb C$.\n",
17 "\n",
18 "(c) Find the determinant, the trace and the characteristic polynomial of the following matrix:\n",
19 "\\begin{align*}\n",
20 "A=\\left(\\begin{array}{rrrr}\n",
21 "-1 & 1 & -1 & 0 \\\\\n",
22 "1 & \\frac{1}{2} & 1 & 0 \\\\\n",
23 "\\frac{1}{2} & -\\frac{1}{2} & -2 & 1 \\\\\n",
24 "0 & 0 & 1 & 1\n",
25 "\\end{array}\\right)\n",
26 "\\end{align*}\n",
27 "\n",
28 "(d) Find a solution to the linear system $A\\mathbf x =\\mathbf v$, where $A$ is the matrix above and $\\mathbf v=(1, 2, 3, 4)$.\n",
29 "\n",
30 "Write your code in the cell below."
31 ]
32 },
33 {
34 "cell_type": "code",
35 "execution_count": null,
36 "metadata": {},
37 "outputs": [],
38 "source": []
39 },
40 {
41 "cell_type": "markdown",
42 "metadata": {},
43 "source": [
44 "**Exercise 2**\n",
45 "\n",
46 "*(Yes, I know that the exercise is long to read, but it will not be so long to solve. It is a cool application of cryptography which, similarly to RSA, is based on the fact that factoring a number is hard.)*\n",
47 "\n",
48 "After exchanging messages with the RSA protocol seen in class, Alice and Bob decide to meet and play their favorite game: flip a coin. They like this game very much because it does not take much time to set it up and they have exactly the same chances of winning.\n",
49 "\n",
50 "Unfortunately, due to the COVID-19 pandemic they cannot meet in person, and they despite being good friends they don't trust each other enough to play this game via videocall. Luckily, Alice is an expert in cryptography and she knows how to play this game using the Chinese remainder theorem.\n",
51 "\n",
52 "The game plays as follows:\n",
53 "\n",
54 "(A1) Alice picks two large prime numbers $p$ and $q$, she computes $n=pq$ and sends $n$ to Bob, keeping $p$ and $q$ secret.\n",
55 "\n",
56 "(B1) Bob picks a random number $a$ with $1<a<n$ and $\\gcd(a,n)=1$, computes $b=a^2\\mod n$ and sends $b$ to Alice, keeping $a$ secret.\n",
57 "\n",
58 "(A2) Alice computes two numbers $x$ and $y$ such that $x^2\\equiv b\\pmod p$ and $y^2\\equiv b\\pmod q$ and she uses the Chinese remainder theorem to compute a number $z$ such that $z\\equiv x\\pmod p$ and $z\\equiv y\\pmod q$. Then she sends $z$ to Bob.\n",
59 "\n",
60 "Since $n$ is the product of two primes, there are $4$ possible square roots of $b$ modulo $n$, corresponding to the solutions of the four systems of congruences (one for each possible combination of $\\pm$)\n",
61 "\\begin{align*}\\begin{cases}\n",
62 "z\\equiv \\pm x\\pmod p\\\\\n",
63 "z \\equiv \\pm y\\pmod q\n",
64 "\\end{cases}\\end{align*}\n",
65 "\n",
66 "One of those solutions is $a$ and another is $-a$, and Bob knows them. Since Alice is picking one of the $4$ possible roots at random (she chooses between $x$ and $-x$ and between $y$ and $-y$), so she has $50\\%$ chance of picking one that Bob already knows. She will win if she picks $\\pm a$:\n",
67 "\n",
68 "(B2) If $z\\equiv\\pm a\\pmod n$, Bob declares to have lost. Otherwise, Bob claims to have won, and as proof he produces one prime factor of $n$ by computing $g=\\gcd(n,a+z)$. *(One can prove that in this situation $g$ is always one of the two prime factors of $n$)*\n",
69 "\n",
70 "Since factoring a number without extra information is very hard, Alice will be convinced that she must have given Bob one of the square roots that he did not know, so she admits the loss.\n",
71 "\n"
72 ]
73 },
74 {
75 "cell_type": "code",
76 "execution_count": 12,
77 "metadata": {},
78 "outputs": [
79 {
80 "name": "stdout",
81 "output_type": "stream",
82 "text": [
83 "Alice picked n = 239880868500983\n",
84 "(Alice's secret: 15489269 15486907 )\n",
85 "Bob picked b = 19945704365802\n",
86 "(Bob's secret: 3040890259756 )\n",
87 "Alice picked z = 3040890259756\n",
88 "Bob has lost\n"
89 ]
90 }
91 ],
92 "source": [
93 "# Alice needs this to compute the square roots\n",
94 "from sage.rings.finite_rings.integer_mod import square_root_mod_prime\n",
95 "\n",
96 "def A1():\n",
97 " # This function must return two distinct primes and their product\n",
98 " p, q = 0, 0\n",
99 " while p == q:\n",
100 " p = Primes()[10^6+randint(1,1000)]\n",
101 " q = Primes()[10^6+randint(1,1000)]\n",
102 " return p, q, p*q\n",
103 " \n",
104 "def B1(n):\n",
105 " a = 0\n",
106 " while gcd(a,n) != 1:\n",
107 " a = randint(2,n-1)\n",
108 " return a\n",
109 "\n",
110 "def A2(b, p, q):\n",
111 " x = ZZ(square_root_mod_prime(Integers(p)(b), p))\n",
112 " y = ZZ(square_root_mod_prime(Integers(q)(b), q))\n",
113 " return crt(x, y, p, q)\n",
114 "\n",
115 "def B2(a, z, n):\n",
116 " # This function must print out one of two messages:\n",
117 " # \"Bob has lost\" if z is congruent to a or -a modulo n\n",
118 " # \"Bob has won, proof: \" followed by a prime factor of n otherwise\n",
119 " if a%n == z%n or a%n == (-z)%n:\n",
120 " print(\"Bob has lost\")\n",
121 " else:\n",
122 " print(\"Bob has won, proof:\", gcd(n, a+z))\n",
123 "\n",
124 "# This is how the game plays:\n",
125 "p, q, n = A1() # p and q are secret to Alice\n",
126 "print(\"Alice picked n =\", n)\n",
127 "print(\"(Alice's secret:\", p, q, \")\")\n",
128 "a = B1(n) # a is secret to Bob\n",
129 "b = a^2 % n\n",
130 "print(\"Bob picked b =\", b)\n",
131 "print(\"(Bob's secret:\", a, \")\")\n",
132 "z = A2(b, p, q)\n",
133 "print(\"Alice picked z =\", z)\n",
134 "B2(a, z, n)"
135 ]
136 },
137 {
138 "cell_type": "code",
139 "execution_count": null,
140 "metadata": {},
141 "outputs": [],
142 "source": []
143 }
144 ],
145 "metadata": {
146 "kernelspec": {
147 "display_name": "SageMath 9.2",
148 "language": "sage",
149 "name": "sagemath"
150 },
151 "language_info": {
152 "codemirror_mode": {
153 "name": "ipython",
154 "version": 3
155 },
156 "file_extension": ".py",
157 "mimetype": "text/x-python",
158 "name": "python",
159 "nbconvert_exporter": "python",
160 "pygments_lexer": "ipython3",
161 "version": "3.8.5"
162 }
163 },
164 "nbformat": 4,
165 "nbformat_minor": 4
166}
diff --git a/src/Homework3/Homework3.aux b/src/Homework3/Homework3.aux
new file mode 100644
index 0000000..e781ffd
--- /dev/null
+++ b/src/Homework3/Homework3.aux
@@ -0,0 +1,20 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\providecommand \oddpage@label [2]{}
20\gdef \@abspage@last{3}
diff --git a/src/Homework3/Homework3.ipynb b/src/Homework3/Homework3.ipynb
new file mode 100644
index 0000000..13bad44
--- /dev/null
+++ b/src/Homework3/Homework3.ipynb
@@ -0,0 +1,179 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "*For this exercise you should have received this text in .ipynb format. Complete the exercises by modifying this file, and submit the modified version*"
8 ]
9 },
10 {
11 "cell_type": "markdown",
12 "metadata": {},
13 "source": [
14 "**Exercise 1**\n",
15 "\n",
16 "Use SageMath to solve the following problems:\n",
17 "\n",
18 "(a) Find the roots of the following polynomial over $\\mathbb Q$:\n",
19 "\\begin{align*}\n",
20 " p = 4 x^{7} + 4 x^{6} + 3 x^{5} - 13 x^{4} - 13 x^{3} - 9 x^{2} + 3 x + 3 \\in \\mathbb Q[x]\n",
21 "\\end{align*}\n",
22 "\n",
23 "(b) Find the roots of the same polynomial $p$ over $\\mathbb R$ and over $\\mathbb C$.\n",
24 "\n",
25 "(c) Find the determinant, the trace and the characteristic polynomial of the following matrix:\n",
26 "\\begin{align*}\n",
27 "A=\\left(\\begin{array}{rrrr}\n",
28 "-1 & 1 & -1 & 0 \\\\\n",
29 "1 & \\frac{1}{2} & 1 & 0 \\\\\n",
30 "\\frac{1}{2} & -\\frac{1}{2} & -2 & 1 \\\\\n",
31 "0 & 0 & 1 & 1\n",
32 "\\end{array}\\right)\n",
33 "\\end{align*}\n",
34 "\n",
35 "(d) Find a solution to the linear system $A\\mathbf x =\\mathbf v$, where $A$ is the matrix above and $\\mathbf v=(1, 2, 3, 4)$.\n",
36 "\n",
37 "Write your code in the cell below."
38 ]
39 },
40 {
41 "cell_type": "code",
42 "execution_count": null,
43 "metadata": {},
44 "outputs": [],
45 "source": []
46 },
47 {
48 "cell_type": "markdown",
49 "metadata": {},
50 "source": [
51 "**Exercise 2**\n",
52 "\n",
53 "After exchanging messages with the RSA protocol seen in class, Alice and Bob decide to meet and play their favorite game: flip a coin. They like this game very much because it does not take long to set it up and they have exactly the same chances of winning.\n",
54 "\n",
55 "Unfortunately, due to the COVID-19 pandemic they cannot meet in person, and despite being good friends they don't trust each other enough to play this game via Webex call. Luckily, Alice is an expert in cryptography and she knows how to play this game using the Chinese remainder theorem.\n",
56 "\n",
57 "The game plays out as follows:\n",
58 "\n",
59 "(A1) Alice picks two large prime numbers $p$ and $q$, she computes $n=pq$ and sends $n$ to Bob, keeping $p$ and $q$ secret.\n",
60 "\n",
61 "(B1) Bob picks a random number $a$ with $1<a<n$ and $\\gcd(a,n)=1$, computes $b=a^2\\mod n$ and sends $b$ to Alice, keeping $a$ secret.\n",
62 "\n",
63 "(A2) Alice computes two numbers $x$ and $y$ such that $x^2\\equiv b\\pmod p$ and $y^2\\equiv b\\pmod q$ and she uses the Chinese remainder theorem to compute a number $z$ such that $z\\equiv x\\pmod p$ and $z\\equiv y\\pmod q$, so that $z^2\\equiv b\\pmod n$. Then she sends $z$ to Bob.\n",
64 "\n",
65 "Since $n$ is the product of two primes, there are $4$ possible square roots of $b$ modulo $n$, corresponding to the solutions of the four systems of congruences (one for each possible combination of $\\pm$)\n",
66 "\\begin{align*}\\begin{cases}\n",
67 "z\\equiv \\pm x\\pmod p\\\\\n",
68 "z \\equiv \\pm y\\pmod q\n",
69 "\\end{cases}\\end{align*}\n",
70 "\n",
71 "One of those solutions is $a$ and another is $-a$, and Bob knows them. Alice is picking one of the $4$ possible roots at random (she chooses between $x$ and $-x$ and between $y$ and $-y$), so she has $50\\%$ chance of picking one that Bob already knows. This corresponds to Alice flipping a coin, and she wins if she picks $\\pm a$:\n",
72 "\n",
73 "(B2) If $z\\equiv\\pm a\\pmod n$, Bob declares to have lost. Otherwise, Bob claims to have won, and as proof he produces one prime factor of $n$ by computing $g=\\gcd(n,a+z)$. *(One can prove that in this situation $g$ is always one of the two prime factors of $n$.)*\n",
74 "\n",
75 "Since factoring a number without extra information is very hard, Alice will be convinced that she must have given Bob one of the square roots that he did not know, so she admits the loss.\n",
76 "\n",
77 "Now to the actual exercise:\n",
78 "\n",
79 "(a) Write the code for the functions A1, B1 and B2 as indicated in the cell below. The function A2 is already written.\n",
80 "\n",
81 "(b) Modify the functions B1, A2 and B2 to check that the opponent is not cheating. More precisely:\n",
82 "* In B1, Bob should check that $n$ is not a prime power. *(This is the only way Alice can try to cheat: if she sends Bob a number $n$ that is the product of more than two primes, than she has less than $50\\%$ chance of winning!)*\n",
83 "* In A2, Alice should check that $b$ is a square modulo $n$.\n",
84 "* In B2, Bob should check that $z^2\\equiv a^2\\pmod n$.\n",
85 "\n",
86 "In case cheating is detected, a message should be printed saying that the person is cheating."
87 ]
88 },
89 {
90 "cell_type": "code",
91 "execution_count": 1,
92 "metadata": {
93 "collapsed": true
94 },
95 "outputs": [
96 {
97 "ename": "IndentationError",
98 "evalue": "expected an indented block (<ipython-input-1-60f510bf175f>, line 7)",
99 "output_type": "error",
100 "traceback": [
101 "\u001b[1;36m File \u001b[1;32m\"<ipython-input-1-60f510bf175f>\"\u001b[1;36m, line \u001b[1;32m7\u001b[0m\n\u001b[1;33m def B1(n):\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mIndentationError\u001b[0m\u001b[1;31m:\u001b[0m expected an indented block\n"
102 ]
103 }
104 ],
105 "source": [
106 "# Alice needs this to compute the square roots\n",
107 "from sage.rings.finite_rings.integer_mod import square_root_mod_prime\n",
108 "\n",
109 "def A1():\n",
110 " # This function must return two distinct primes and their product.\n",
111 " \n",
112 "def B1(n):\n",
113 " # This function must return a random integer a\n",
114 " # with 1<a<n and gcd(a,n)=1.\n",
115 "\n",
116 "def A2(b, p, q):\n",
117 " x = ZZ(square_root_mod_prime(Integers(p)(b), p))\n",
118 " y = ZZ(square_root_mod_prime(Integers(q)(b), q))\n",
119 " return crt(x, y, p, q)\n",
120 "\n",
121 "def B2(a, z, n):\n",
122 " # This function must print out one of two messages:\n",
123 " # \"Bob has lost\" if z is congruent to a or -a modulo n.\n",
124 " # \"Bob has won, proof: \" followed by a prime factor of n otherwise.\n",
125 " # In this case the prime must be calculated as explained above.\n",
126 "\n",
127 "\n",
128 "# This is how the game plays out:\n",
129 "p, q, n = A1()\n",
130 "print(\"Alice picked n =\", n)\n",
131 "print(\"[[ Alice's secret:\", p, q, \"]]\")\n",
132 "a = B1(n)\n",
133 "b = a^2 % n\n",
134 "print(\"Bob picked b =\", b)\n",
135 "print(\"[[ Bob's secret:\", a, \"]]\")\n",
136 "z = A2(b, p, q)\n",
137 "print(\"Alice picked z =\", z)\n",
138 "B2(a, z, n)"
139 ]
140 },
141 {
142 "cell_type": "markdown",
143 "metadata": {},
144 "source": [
145 "**Grading**\n",
146 "\n",
147 "This homework assignment is worth $20\\%$ of your final grade. Exercise 1 is worth 4 points (one for each part) and Exercise 2 is worth 12 points (8 points for part (a) and 4 points for part (b)), for a total of **16 points**."
148 ]
149 },
150 {
151 "cell_type": "code",
152 "execution_count": null,
153 "metadata": {},
154 "outputs": [],
155 "source": []
156 }
157 ],
158 "metadata": {
159 "kernelspec": {
160 "display_name": "SageMath 9.2",
161 "language": "sage",
162 "name": "sagemath"
163 },
164 "language_info": {
165 "codemirror_mode": {
166 "name": "ipython",
167 "version": 3
168 },
169 "file_extension": ".py",
170 "mimetype": "text/x-python",
171 "name": "python",
172 "nbconvert_exporter": "python",
173 "pygments_lexer": "ipython3",
174 "version": "3.8.5"
175 }
176 },
177 "nbformat": 4,
178 "nbformat_minor": 4
179}
diff --git a/src/Homework3/Homework3.log b/src/Homework3/Homework3.log
new file mode 100644
index 0000000..78a76b4
--- /dev/null
+++ b/src/Homework3/Homework3.log
@@ -0,0 +1,962 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.4.20) 22 APR 2021 12:53
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**Homework3.tex
6(./Homework3.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size11.clo
12File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty
27Package: tcolorbox 2020/10/09 version 4.42 text color boxes
28
29(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
30(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
31(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
32\pgfutil@everybye=\toks15
33\pgfutil@tempdima=\dimen139
34\pgfutil@tempdimb=\dimen140
35
36(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
37(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
38\pgfutil@abb=\box47
39)
40(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
41(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
42Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
43))
44Package: pgf 2020/12/01 v3.1.7a (3.1.7a)
45
46(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
47(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
48Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
49
50(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
51Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
52\KV@toks@=\toks16
53)
54(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
55Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
56
57(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
58Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
59)
60(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
61File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
62)
63Package graphics Info: Driver file: pdftex.def on input line 105.
64
65(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
66File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
67))
68\Gin@req@height=\dimen141
69\Gin@req@width=\dimen142
70)
71(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
72(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
73Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
74
75(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
76\pgfkeys@pathtoks=\toks17
77\pgfkeys@temptoks=\toks18
78
79(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
80\pgfkeys@tmptoks=\toks19
81))
82\pgf@x=\dimen143
83\pgf@y=\dimen144
84\pgf@xa=\dimen145
85\pgf@ya=\dimen146
86\pgf@xb=\dimen147
87\pgf@yb=\dimen148
88\pgf@xc=\dimen149
89\pgf@yc=\dimen150
90\pgf@xd=\dimen151
91\pgf@yd=\dimen152
92\w@pgf@writea=\write3
93\r@pgf@reada=\read2
94\c@pgf@counta=\count185
95\c@pgf@countb=\count186
96\c@pgf@countc=\count187
97\c@pgf@countd=\count188
98\t@pgf@toka=\toks20
99\t@pgf@tokb=\toks21
100\t@pgf@tokc=\toks22
101\pgf@sys@id@count=\count189
102
103(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
104File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
105)
106Driver file for pgf: pgfsys-pdftex.def
107
108(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
109File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
110
111(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
112File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
113)))
114(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
115File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
116\pgfsyssoftpath@smallbuffer@items=\count190
117\pgfsyssoftpath@bigbuffer@items=\count191
118)
119(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
120File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
121))
122(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
123Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
124
125(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
126File: color.cfg 2016/01/02 v1.6 sample color configuration
127)
128Package xcolor Info: Driver file: pdftex.def on input line 225.
129Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
130Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
131Package xcolor Info: Model `RGB' extended on input line 1364.
132Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
133Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
134Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
135Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
136Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
137Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
138)
139(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
140Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
141
142(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
143(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
144(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
145(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
146\pgfmath@dimen=\dimen153
147\pgfmath@count=\count192
148\pgfmath@box=\box48
149\pgfmath@toks=\toks23
150\pgfmath@stack@operand=\toks24
151\pgfmath@stack@operation=\toks25
152)
153(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
154(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
155(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
156.tex)
157(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
158(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
159x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
160(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
161(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
162(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
163.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
164\c@pgfmathroundto@lastzeros=\count193
165)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
166(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
167File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
168\pgf@picminx=\dimen154
169\pgf@picmaxx=\dimen155
170\pgf@picminy=\dimen156
171\pgf@picmaxy=\dimen157
172\pgf@pathminx=\dimen158
173\pgf@pathmaxx=\dimen159
174\pgf@pathminy=\dimen160
175\pgf@pathmaxy=\dimen161
176\pgf@xx=\dimen162
177\pgf@xy=\dimen163
178\pgf@yx=\dimen164
179\pgf@yy=\dimen165
180\pgf@zx=\dimen166
181\pgf@zy=\dimen167
182)
183(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
184File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
185\pgf@path@lastx=\dimen168
186\pgf@path@lasty=\dimen169
187) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
188File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
189\pgf@shorten@end@additional=\dimen170
190\pgf@shorten@start@additional=\dimen171
191)
192(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
193File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
194\pgfpic=\box49
195\pgf@hbox=\box50
196\pgf@layerbox@main=\box51
197\pgf@picture@serial@count=\count194
198)
199(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
200File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
201\pgflinewidth=\dimen172
202)
203(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
204ex
205File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
206\pgf@pt@x=\dimen173
207\pgf@pt@y=\dimen174
208\pgf@pt@temp=\dimen175
209) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
210File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
211)
212(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
213File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
214)
215(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
216x
217File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
218) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
219File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
220\pgfarrowsep=\dimen176
221)
222(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
223File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
224\pgf@max=\dimen177
225\pgf@sys@shading@range@num=\count195
226\pgf@shadingcount=\count196
227)
228(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
229File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
230
231(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
232File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
233\pgfexternal@startupbox=\box52
234))
235(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
236File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
237)
238(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
239File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
240) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
241File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
242)
243(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
244File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
245)))
246(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
247File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
248\pgfnodeparttextbox=\box53
249)
250(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
251File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a)
252)
253(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
254Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a)
255\pgf@nodesepstart=\dimen178
256\pgf@nodesepend=\dimen179
257)
258(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
259Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a)
260))
261(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty
262Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements
263\every@verbatim=\toks26
264\verbatim@line=\toks27
265\verbatim@in@stream=\read3
266)
267(/usr/share/texmf-dist/tex/latex/environ/environ.sty
268Package: environ 2014/05/04 v0.3 A new way to define environments
269
270(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty
271Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
272)
273\@envbody=\toks28
274)
275(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
276Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
277\etb@tempcnta=\count197
278)
279\tcb@titlebox=\box54
280\tcb@upperbox=\box55
281\tcb@lowerbox=\box56
282\tcb@phantombox=\box57
283\c@tcbbreakpart=\count198
284\c@tcblayer=\count199
285\c@tcolorbox@number=\count266
286\tcb@temp=\box58
287\tcb@temp=\box59
288\tcb@temp=\box60
289\tcb@temp=\box61
290\tcb@out=\write4
291\tcb@record@out=\write5
292
293(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex
294Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42'
295(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty
296Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO)
297
298(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
299Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO)
300)
301(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
302Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
303)
304(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
305Package: iftex 2020/03/06 v1.0d TeX engine tests
306))
307Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23.
308\tcb@testbox=\box62
309\tcb@totalupperbox=\box63
310\tcb@totallowerbox=\box64
311))
312(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty
313Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments
314
315(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
316Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)
317
318(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
319Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
320)))
321(/usr/share/texmf-dist/tex/latex/base/fontenc.sty
322Package: fontenc 2020/08/10 v2.0s Standard LaTeX package
323)
324(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
325Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS)
326\symupright=\mathgroup4
327)
328(/usr/share/texmf-dist/tex/latex/caption/caption.sty
329Package: caption 2020/10/26 v3.5g Customizing captions (AR)
330
331(/usr/share/texmf-dist/tex/latex/caption/caption3.sty
332Package: caption3 2020/10/21 v2.2e caption3 kernel (AR)
333\captionmargin=\dimen180
334\captionmargin@=\dimen181
335\captionwidth=\dimen182
336\caption@tempdima=\dimen183
337\caption@indent=\dimen184
338\caption@parindent=\dimen185
339\caption@hangindent=\dimen186
340Package caption Info: Standard document class detected.
341)
342\c@caption@flags=\count267
343\c@continuedfloat=\count268
344)
345(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty
346Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...)
347
348(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty
349Package: xkeyval 2020/11/20 v2.8 package option processing (HA)
350
351(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex
352(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex
353\XKV@toks=\toks29
354\XKV@tempa@toks=\toks30
355)
356\XKV@depth=\count269
357File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
358))
359(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty
360Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back
361-ends (calc, etex, pgfmath)
362)
363(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty
364Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material
365
366(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty
367Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes
368\collectedbox=\box65
369)
370\tc@llx=\dimen187
371\tc@lly=\dimen188
372\tc@urx=\dimen189
373\tc@ury=\dimen190
374Package trimclip Info: Using driver 'tc-pdftex.def'.
375
376(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def
377File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex
378))
379\adjbox@Width=\dimen191
380\adjbox@Height=\dimen192
381\adjbox@Depth=\dimen193
382\adjbox@Totalheight=\dimen194
383\adjbox@pwidth=\dimen195
384\adjbox@pheight=\dimen196
385\adjbox@pdepth=\dimen197
386\adjbox@ptotalheight=\dimen198
387
388(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty
389Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection
390\c@checkoddpage=\count270
391)
392(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty
393Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages
394\@vwid@box=\box66
395\sift@deathcycles=\count271
396\@vwid@loff=\dimen199
397\@vwid@roff=\dimen256
398))
399(/usr/share/texmf-dist/tex/latex/float/float.sty
400Package: float 2001/11/08 v1.3d Float enhancements (AL)
401\c@float@type=\count272
402\float@exts=\toks31
403\float@box=\box67
404\@float@everytoks=\toks32
405\@floatcapt=\box68
406)
407(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty
408Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
409\@enLab=\toks33
410)
411(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
412Package: geometry 2020/01/02 v5.9 Page Geometry
413
414(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
415Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
416)
417\Gm@cnth=\count273
418\Gm@cntv=\count274
419\c@Gm@tempcnt=\count275
420\Gm@bindingoffset=\dimen257
421\Gm@wd@mp=\dimen258
422\Gm@odd@mp=\dimen259
423\Gm@even@mp=\dimen260
424\Gm@layoutwidth=\dimen261
425\Gm@layoutheight=\dimen262
426\Gm@layouthoffset=\dimen263
427\Gm@layoutvoffset=\dimen264
428\Gm@dimlist=\toks34
429)
430(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
431Package: amsmath 2020/09/23 v2.17i AMS math features
432\@mathmargin=\skip49
433
434For additional information on amsmath, use the `?' option.
435(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
436Package: amstext 2000/06/29 v2.01 AMS text
437
438(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
439File: amsgen.sty 1999/11/30 v2.0 generic functions
440\@emptytoks=\toks35
441\ex@=\dimen265
442))
443(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
444Package: amsbsy 1999/11/29 v1.2d Bold Symbols
445\pmbraise@=\dimen266
446)
447(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
448Package: amsopn 2016/03/08 v2.02 operator names
449)
450\inf@bad=\count276
451LaTeX Info: Redefining \frac on input line 234.
452\uproot@=\count277
453\leftroot@=\count278
454LaTeX Info: Redefining \overline on input line 399.
455\classnum@=\count279
456\DOTSCASE@=\count280
457LaTeX Info: Redefining \ldots on input line 496.
458LaTeX Info: Redefining \dots on input line 499.
459LaTeX Info: Redefining \cdots on input line 620.
460\Mathstrutbox@=\box69
461\strutbox@=\box70
462\big@size=\dimen267
463LaTeX Font Info: Redeclaring font encoding OML on input line 743.
464LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
465\macc@depth=\count281
466\c@MaxMatrixCols=\count282
467\dotsspace@=\muskip16
468\c@parentequation=\count283
469\dspbrk@lvl=\count284
470\tag@help=\toks36
471\row@=\count285
472\column@=\count286
473\maxfields@=\count287
474\andhelp@=\toks37
475\eqnshift@=\dimen268
476\alignsep@=\dimen269
477\tagshift@=\dimen270
478\tagwidth@=\dimen271
479\totwidth@=\dimen272
480\lineht@=\dimen273
481\@envbody=\toks38
482\multlinegap=\skip50
483\multlinetaggap=\skip51
484\mathdisplay@stack=\toks39
485LaTeX Info: Redefining \[ on input line 2923.
486LaTeX Info: Redefining \] on input line 2924.
487)
488(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
489Package: amssymb 2013/01/14 v3.01 AMS font symbols
490
491(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
492Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
493\symAMSa=\mathgroup5
494\symAMSb=\mathgroup6
495LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
496LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
497(Font) U/euf/m/n --> U/euf/b/n on input line 106.
498))
499(/usr/share/texmf-dist/tex/latex/base/textcomp.sty
500Package: textcomp 2020/02/02 v2.0n Standard LaTeX package
501)
502(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty
503Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba
504tim
505)
506(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty
507Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro''
508\@eurobox=\box71
509)
510(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty
511Package: ucs 2013/05/11 v2.2 UCS: Unicode input support
512
513(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def
514File: uni-global.def 2013/05/13 UCS: Unicode global data
515)
516\uc@secondtry=\count288
517\uc@combtoks=\toks40
518\uc@combtoksb=\toks41
519\uc@temptokena=\toks42
520)
521(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
522Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv)
523\FV@CodeLineNo=\count289
524\FV@InFile=\read4
525\FV@TabBox=\box72
526\c@FancyVerbLine=\count290
527\FV@StepNumber=\count291
528\FV@OutFile=\write6
529)
530(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty
531Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac
532y)
533Package grffile Info: This package is an empty stub for compatibility on input
534line 40.
535)
536(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
537Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX
538
539(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
540Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO
541)
542Package pdftexcmds Info: \pdf@primitive is available.
543Package pdftexcmds Info: \pdf@ifprimitive is available.
544Package pdftexcmds Info: \pdfdraftmode found.
545)
546(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
547Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
548)
549(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
550Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
551)
552(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
553Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
554)
555(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
556Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
557)
558(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
559Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
560)
561\@linkdim=\dimen274
562\Hy@linkcounter=\count292
563\Hy@pagecounter=\count293
564
565(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
566File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO)
567Now handling font encoding PD1 ...
568... no UTF-8 mapping file for font encoding PD1
569)
570(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
571Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
572)
573(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty
574Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
575)
576\Hy@SavedSpaceFactor=\count294
577Package hyperref Info: Hyper figures OFF on input line 4464.
578Package hyperref Info: Link nesting OFF on input line 4469.
579Package hyperref Info: Hyper index ON on input line 4472.
580Package hyperref Info: Plain pages OFF on input line 4479.
581Package hyperref Info: Backreferencing OFF on input line 4484.
582Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
583Package hyperref Info: Bookmarks ON on input line 4717.
584\c@Hy@tempcnt=\count295
585
586(/usr/share/texmf-dist/tex/latex/url/url.sty
587\Urlmuskip=\muskip17
588Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
589)
590LaTeX Info: Redefining \url on input line 5076.
591\XeTeXLinkMargin=\dimen275
592
593(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty
594Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
595
596(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
597Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
598)
599))
600\Fld@menulength=\count296
601\Field@Width=\dimen276
602\Fld@charsize=\dimen277
603Package hyperref Info: Hyper figures OFF on input line 6347.
604Package hyperref Info: Link nesting OFF on input line 6352.
605Package hyperref Info: Hyper index ON on input line 6355.
606Package hyperref Info: backreferencing OFF on input line 6362.
607Package hyperref Info: Link coloring OFF on input line 6367.
608Package hyperref Info: Link coloring with OCG OFF on input line 6372.
609Package hyperref Info: PDF/A mode OFF on input line 6377.
610LaTeX Info: Redefining \ref on input line 6417.
611LaTeX Info: Redefining \pageref on input line 6421.
612
613(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty
614Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa
615ge
616with kernel methods
617)
618\Hy@abspage=\count297
619\c@Item=\count298
620\c@Hfootnote=\count299
621)
622Package hyperref Info: Driver (autodetected): hpdftex.
623
624(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
625File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX
626
627(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty
628Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag
629e
630with kernel methods
631)
632\Fld@listcount=\count300
633\c@bookmark@seq@number=\count301
634
635(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
636Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
637
638(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
639Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
640)
641Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
64286.
643)
644\Hy@SectionHShift=\skip52
645)
646(/usr/share/texmf-dist/tex/latex/titling/titling.sty
647Package: titling 2009/09/04 v2.1d maketitle typesetting
648\thanksmarkwidth=\skip53
649\thanksmargin=\skip54
650\droptitle=\skip55
651)
652(/usr/share/texmf-dist/tex/latex/tools/longtable.sty
653Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC)
654\LTleft=\skip56
655\LTright=\skip57
656\LTpre=\skip58
657\LTpost=\skip59
658\LTchunksize=\count302
659\LTcapwidth=\dimen278
660\LT@head=\box73
661\LT@firsthead=\box74
662\LT@foot=\box75
663\LT@lastfoot=\box76
664\LT@cols=\count303
665\LT@rows=\count304
666\c@LT@tables=\count305
667\c@LT@chunks=\count306
668\LT@p@ftn=\toks43
669)
670(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty
671Package: booktabs 2020/01/12 v1.61803398 Publication quality tables
672\heavyrulewidth=\dimen279
673\lightrulewidth=\dimen280
674\cmidrulewidth=\dimen281
675\belowrulesep=\dimen282
676\belowbottomsep=\dimen283
677\aboverulesep=\dimen284
678\abovetopsep=\dimen285
679\cmidrulesep=\dimen286
680\cmidrulekern=\dimen287
681\defaultaddspace=\dimen288
682\@cmidla=\count307
683\@cmidlb=\count308
684\@aboverulesep=\dimen289
685\@belowrulesep=\dimen290
686\@thisruleclass=\count309
687\@lastruleclass=\count310
688\@thisrulewidth=\dimen291
689)
690(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty
691Package: enumitem 2019/06/20 v3.9 Customized lists
692\labelindent=\skip60
693\enit@outerparindent=\dimen292
694\enit@toks=\toks44
695\enit@inbox=\box77
696\enit@count@id=\count311
697\enitdp@description=\count312
698)
699(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty
700\UL@box=\box78
701\UL@hyphenbox=\box79
702\UL@skip=\skip61
703\UL@hook=\toks45
704\UL@height=\dimen293
705\UL@pe=\count313
706\UL@pixel=\dimen294
707\ULC@box=\box80
708Package: ulem 2019/11/18
709\ULdepth=\dimen295
710)
711(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty
712Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk)
713\symrsfs=\mathgroup7
714)
715\Wrappedcontinuationbox=\box81
716\Wrappedvisiblespacebox=\box82
717Package hyperref Info: Option `breaklinks' set `true' on input line 360.
718Package hyperref Info: Option `colorlinks' set `true' on input line 360.
719LaTeX Font Info: Trying to load font information for T1+ppl on input line 36
7207.
721
722(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
723File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
724)
725(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
726File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
727\l__kernel_color_stack_int=\count314
728\l__pdf_internal_box=\box83
729)
730(./Homework3.aux)
731\openout1 = `Homework3.aux'.
732
733LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 367.
734LaTeX Font Info: ... okay on input line 367.
735LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 367.
736LaTeX Font Info: ... okay on input line 367.
737LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 367.
738LaTeX Font Info: ... okay on input line 367.
739LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 367.
740LaTeX Font Info: ... okay on input line 367.
741LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 367.
742LaTeX Font Info: ... okay on input line 367.
743LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 367.
744LaTeX Font Info: ... okay on input line 367.
745LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 367.
746LaTeX Font Info: ... okay on input line 367.
747LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 367.
748LaTeX Font Info: ... okay on input line 367.
749 (/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
750[Loading MPS to PDF converter (version 2006.09.02).]
751\scratchcounter=\count315
752\scratchdimen=\dimen296
753\scratchbox=\box84
754\nofMPsegments=\count316
755\nofMParguments=\count317
756\everyMPshowfont=\toks46
757\MPscratchCnt=\count318
758\MPscratchDim=\dimen297
759\MPnumerator=\count319
760\makeMPintoPDFobject=\count320
761\everyMPtoPDFconversion=\toks47
762) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
763Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
764Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
76585.
766
767(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
768File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
769e
770))
771Package caption Info: Begin \AtBeginDocument code.
772Package caption Info: float package is loaded.
773Package caption Info: hyperref package is loaded.
774Package caption Info: longtable package is loaded.
775
776(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty
777Package: ltcaption 2020/05/30 v1.4b longtable captions (AR)
778)
779Package caption Info: End \AtBeginDocument code.
780
781*geometry* driver: auto-detecting
782*geometry* detected driver: pdftex
783*geometry* verbose mode - [ preamble ] result:
784* driver: pdftex
785* paper: <default>
786* layout: <same size as paper>
787* layoutoffset:(h,v)=(0.0pt,0.0pt)
788* modes:
789* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)
790* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)
791* \paperwidth=614.295pt
792* \paperheight=794.96999pt
793* \textwidth=469.75502pt
794* \textheight=650.43001pt
795* \oddsidemargin=0.0pt
796* \evensidemargin=0.0pt
797* \topmargin=-37.0pt
798* \headheight=12.0pt
799* \headsep=25.0pt
800* \topskip=11.0pt
801* \footskip=30.0pt
802* \marginparwidth=59.0pt
803* \marginparsep=10.0pt
804* \columnsep=10.0pt
805* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
806* \hoffset=0.0pt
807* \voffset=0.0pt
808* \mag=1000
809* \@twocolumnfalse
810* \@twosidefalse
811* \@mparswitchfalse
812* \@reversemarginfalse
813* (1in=72.27pt=25.4mm, 1cm=28.453pt)
814
815(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def
816File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3
817)
818Package hyperref Info: Link coloring ON on input line 367.
819
820(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
821Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
822
823(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty
824Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
825)
826(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
827Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
828)
829\c@section@level=\count321
830)
831LaTeX Info: Redefining \ref on input line 367.
832LaTeX Info: Redefining \pageref on input line 367.
833LaTeX Info: Redefining \nameref on input line 367.
834
835(./Homework3.out) (./Homework3.out)
836\@outlinefile=\write7
837\openout7 = `Homework3.out'.
838
839LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3
84069.
841
842(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
843File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
844)
845LaTeX Font Info: Trying to load font information for OML+zplm on input line
846369.
847
848(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
849File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
850)
851LaTeX Font Info: Trying to load font information for OMS+zplm on input line
852369.
853
854(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd
855File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
856)
857LaTeX Font Info: Trying to load font information for OMX+zplm on input line
858369.
859
860(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
861File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
862)
863LaTeX Font Info: Trying to load font information for OT1+zplm on input line
864369.
865
866(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
867File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
868)
869LaTeX Font Info: Font shape `U/msa/m/n' will be
870(Font) scaled to size 12.50409pt on input line 369.
871LaTeX Font Info: Font shape `U/msa/m/n' will be
872(Font) scaled to size 9.37807pt on input line 369.
873LaTeX Font Info: Font shape `U/msa/m/n' will be
874(Font) scaled to size 7.29405pt on input line 369.
875LaTeX Font Info: Font shape `U/msb/m/n' will be
876(Font) scaled to size 12.50409pt on input line 369.
877LaTeX Font Info: Font shape `U/msb/m/n' will be
878(Font) scaled to size 9.37807pt on input line 369.
879LaTeX Font Info: Font shape `U/msb/m/n' will be
880(Font) scaled to size 7.29405pt on input line 369.
881LaTeX Font Info: Trying to load font information for U+rsfs on input line 36
8829.
883
884(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd
885File: ursfs.fd 1998/03/24 rsfs font definition file (jk)
886)
887
888LaTeX Warning: No \author given.
889
890LaTeX Font Info: Font shape `U/msa/m/n' will be
891(Font) scaled to size 11.40997pt on input line 387.
892LaTeX Font Info: Font shape `U/msa/m/n' will be
893(Font) scaled to size 8.33606pt on input line 387.
894LaTeX Font Info: Font shape `U/msa/m/n' will be
895(Font) scaled to size 6.25204pt on input line 387.
896LaTeX Font Info: Font shape `U/msb/m/n' will be
897(Font) scaled to size 11.40997pt on input line 387.
898LaTeX Font Info: Font shape `U/msb/m/n' will be
899(Font) scaled to size 8.33606pt on input line 387.
900LaTeX Font Info: Font shape `U/msb/m/n' will be
901(Font) scaled to size 6.25204pt on input line 387.
902LaTeX Font Info: Trying to load font information for U+fplmbb on input line
903387.
904(/usr/share/texmf-dist/tex/latex/psnfss/ufplmbb.fd
905File: ufplmbb.fd 2003/10/30 Fontinst v1.914 font definitions for U/fplmbb.
906)
907LaTeX Font Info: Trying to load font information for T1+cmtt on input line 4
90812.
909
910(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd
911File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
912)
913LaTeX Font Info: Font shape `U/msa/m/n' will be
914(Font) scaled to size 5.21004pt on input line 413.
915LaTeX Font Info: Font shape `U/msb/m/n' will be
916(Font) scaled to size 5.21004pt on input line 413.
917 [1
918
919{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
920LaTeX Font Info: Trying to load font information for TS1+ppl on input line 4
92187.
922
923(/usr/share/texmf-dist/tex/latex/psnfss/ts1ppl.fd
924File: ts1ppl.fd 2001/06/04 font definitions for TS1/ppl.
925) [2]
926LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available
927(Font) Font shape `T1/cmtt/m/n' tried instead on input line 507.
928LaTeX Font Info: Trying to load font information for TS1+cmtt on input line
929531.
930
931(/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd
932File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
933) [3] (./Homework3.aux)
934Package rerunfilecheck Info: File `Homework3.out' has not changed.
935(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0.
936 )
937Here is how much of TeX's memory you used:
938 21220 strings out of 479383
939 386765 string characters out of 5875798
940 724227 words of memory out of 5000000
941 37854 multiletter control sequences out of 15000+600000
942 436783 words of font info for 121 fonts, out of 8000000 for 9000
943 1141 hyphenation exceptions out of 8191
944 107i,14n,111p,502b,594s stack positions out of 5000i,500n,10000p,200000b,80000s
945{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/
946texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/usr/share/texmf-dist/font
947s/enc/dvips/base/8r.enc}</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c
948mex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></us
949r/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-d
950ist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type
9511/public/mathpazo/fplmbb.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super
952/sfit1095.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb><
953/usr/share/texmf-dist/fonts/type1/urw/palatino/uplb8a.pfb></usr/share/texmf-dis
954t/fonts/type1/urw/palatino/uplr8a.pfb></usr/share/texmf-dist/fonts/type1/urw/pa
955latino/uplri8a.pfb>
956Output written on Homework3.pdf (3 pages, 146471 bytes).
957PDF statistics:
958 77 PDF objects out of 1000 (max. 8388607)
959 61 compressed objects within 1 object stream
960 10 named destinations out of 1000 (max. 500000)
961 13 words of extra memory for PDF output out of 10000 (max. 10000000)
962
diff --git a/src/Homework3/Homework3.out b/src/Homework3/Homework3.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Homework3/Homework3.out
diff --git a/src/Homework3/Homework3.pdf b/src/Homework3/Homework3.pdf
new file mode 100644
index 0000000..13d55cf
--- /dev/null
+++ b/src/Homework3/Homework3.pdf
Binary files differ
diff --git a/src/Homework3/Homework3.tex b/src/Homework3/Homework3.tex
new file mode 100644
index 0000000..a2b3d02
--- /dev/null
+++ b/src/Homework3/Homework3.tex
@@ -0,0 +1,552 @@
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{Mathematical Software - Homework 3}
150 \date{Deadline: Sunday, May 9th}
151
152
153
154
155
156% Pygments definitions
157\makeatletter
158\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax%
159 \let\PY@ul=\relax \let\PY@tc=\relax%
160 \let\PY@bc=\relax \let\PY@ff=\relax}
161\def\PY@tok#1{\csname PY@tok@#1\endcsname}
162\def\PY@toks#1+{\ifx\relax#1\empty\else%
163 \PY@tok{#1}\expandafter\PY@toks\fi}
164\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{%
165 \PY@it{\PY@bf{\PY@ff{#1}}}}}}}
166\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}}
167
168\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}}
169\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
170\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}}
171\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
172\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
173\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}}
174\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
175\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
176\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
177\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
178\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
179\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
180\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}}
181\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
182\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}}
183\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}}
184\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}}
185\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}}
186\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
187\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
188\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
189\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
190\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}}
191\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}}
192\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}}
193\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
194\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
195\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
196\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
197\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}}
198\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
199\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}}
200\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}}
201\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit}
202\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf}
203\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
204\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}}
205\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
206\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}}}
207\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
208\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
209\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
210\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
211\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
212\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
213\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
214\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
215\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
216\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
217\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
218\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
219\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
220\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
221\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
222\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
223\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
224\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
225\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
226\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
227\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
228\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
229\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
230\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
231\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
232\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
233\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
234\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
235
236\def\PYZbs{\char`\\}
237\def\PYZus{\char`\_}
238\def\PYZob{\char`\{}
239\def\PYZcb{\char`\}}
240\def\PYZca{\char`\^}
241\def\PYZam{\char`\&}
242\def\PYZlt{\char`\<}
243\def\PYZgt{\char`\>}
244\def\PYZsh{\char`\#}
245\def\PYZpc{\char`\%}
246\def\PYZdl{\char`\$}
247\def\PYZhy{\char`\-}
248\def\PYZsq{\char`\'}
249\def\PYZdq{\char`\"}
250\def\PYZti{\char`\~}
251% for compatibility with earlier versions
252\def\PYZat{@}
253\def\PYZlb{[}
254\def\PYZrb{]}
255\makeatother
256
257
258 % For linebreaks inside Verbatim environment from package fancyvrb.
259 \makeatletter
260 \newbox\Wrappedcontinuationbox
261 \newbox\Wrappedvisiblespacebox
262 \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}}
263 \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}}
264 \newcommand*\Wrappedcontinuationindent {3ex }
265 \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox}
266 % Take advantage of the already applied Pygments mark-up to insert
267 % potential linebreaks for TeX processing.
268 % {, <, #, %, $, ' and ": go to next line.
269 % _, }, ^, &, >, - and ~: stay at end of broken line.
270 % Use of \textquotesingle for straight quote.
271 \newcommand*\Wrappedbreaksatspecials {%
272 \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}%
273 \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}%
274 \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}%
275 \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}%
276 \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}%
277 \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}%
278 \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}%
279 \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}%
280 \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}%
281 \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}%
282 \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}%
283 \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}%
284 \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}%
285 \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}%
286 }
287 % Some characters . , ; ? ! / are not pygmentized.
288 % This macro makes them "active" and they will insert potential linebreaks
289 \newcommand*\Wrappedbreaksatpunct {%
290 \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}%
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 \catcode`\.\active
298 \catcode`\,\active
299 \catcode`\;\active
300 \catcode`\:\active
301 \catcode`\?\active
302 \catcode`\!\active
303 \catcode`\/\active
304 \lccode`\~`\~
305 }
306 \makeatother
307
308 \let\OriginalVerbatim=\Verbatim
309 \makeatletter
310 \renewcommand{\Verbatim}[1][1]{%
311 %\parskip\z@skip
312 \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}%
313 \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}%
314 \def\FancyVerbFormatLine ##1{\hsize\linewidth
315 \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@
316 \doublehyphendemerits\z@\finalhyphendemerits\z@
317 \strut ##1\strut}%
318 }%
319 % If the linebreak is at a space, the latter will be displayed as visible
320 % space at end of first line, and a continuation symbol starts next line.
321 % Stretch/shrink are however usually zero for typewriter font.
322 \def\FV@Space {%
323 \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font
324 \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak}
325 {\kern\fontdimen2\font}%
326 }%
327
328 % Allow breaks at special characters using \PYG... macros.
329 \Wrappedbreaksatspecials
330 % Breaks at punctuation characters . , ; ? ! and / need catcode=\active
331 \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]%
332 }
333 \makeatother
334
335 % Exact colors from NB
336 \definecolor{incolor}{HTML}{303F9F}
337 \definecolor{outcolor}{HTML}{D84315}
338 \definecolor{cellborder}{HTML}{CFCFCF}
339 \definecolor{cellbackground}{HTML}{F7F7F7}
340
341 % prompt
342 \makeatletter
343 \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep}
344 \makeatother
345 \newcommand{\prompt}[4]{
346 \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip}
347 }
348
349
350
351 % Prevent overflowing lines due to hard-to-break entities
352 \sloppy
353 % Setup hyperref package
354 \hypersetup{
355 breaklinks=true, % so long urls are correctly broken across lines
356 colorlinks=true,
357 urlcolor=urlcolor,
358 linkcolor=linkcolor,
359 citecolor=citecolor,
360 }
361 % Slightly bigger margins than the latex defaults
362
363 \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in}
364
365
366
367\begin{document}
368
369 \maketitle
370
371
372
373 \begin{center}
374 \emph{For this exercise you should have received this text in .ipynb
375format. Complete the exercises by modifying this file, and submit the
376modified version}
377 \end{center}
378
379 \vspace{1cm}
380 \textbf{Exercise 1}
381
382Use SageMath to solve the following problems:
383
384\begin{enumerate}
385\def\labelenumi{(\alph{enumi})}
386\item
387 Find the roots of the following polynomial over \(\mathbb Q\):
388 \begin{align*}
389 p = 4 x^{7} + 4 x^{6} + 3 x^{5} - 13 x^{4} - 13 x^{3} - 9 x^{2} + 3 x + 3 \in \mathbb Q[x]
390 \end{align*}
391\item
392 Find the roots of the same polynomial \(p\) over \(\mathbb R\) and
393 over \(\mathbb C\).
394\item
395 Find the determinant, the trace and the characteristic polynomial of
396 the following matrix: \begin{align*}
397 A=\left(\begin{array}{rrrr}
398 -1 & 1 & -1 & 0 \\
399 1 & \frac{1}{2} & 1 & 0 \\
400 \frac{1}{2} & -\frac{1}{2} & -2 & 1 \\
401 0 & 0 & 1 & 1
402 \end{array}\right)
403 \end{align*}
404\item
405 Find a solution to the linear system \(A\mathbf x =\mathbf v\), where
406 \(A\) is the matrix above and \(\mathbf v=(1, 2, 3, 4)\).
407\end{enumerate}
408
409Write your code in the cell below.
410
411 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
412\prompt{In}{incolor}{ }{\boxspacing}
413\begin{Verbatim}[commandchars=\\\{\}]
414
415\end{Verbatim}
416\end{tcolorbox}
417
418 \vspace{1cm}
419 \textbf{Exercise 2}
420
421After exchanging messages with the RSA protocol seen in class, Alice and
422Bob decide to meet and play their favorite game: flip a coin. They like
423this game very much because it does not take long to set it up and they
424have exactly the same chances of winning.
425
426Unfortunately, due to the COVID-19 pandemic they cannot meet in person,
427and despite being good friends they don't trust each other enough to
428play this game via Webex call. Luckily, Alice is an expert in
429cryptography and she knows how to play this game using the Chinese
430remainder theorem.
431
432The game plays out as follows:
433
434\begin{itemize}
435\item[(A1)] Alice picks two large prime numbers \(p\) and \(q\), she computes
436\(n=pq\) and sends \(n\) to Bob, keeping \(p\) and \(q\) secret.
437
438\item[(B1)] Bob picks a random number \(a\) with \(1<a<n\) and \(\gcd(a,n)=1\),
439computes \(b=a^2\mod n\) and sends \(b\) to Alice, keeping \(a\) secret.
440
441\item[(A2)] Alice computes two numbers \(x\) and \(y\) such that
442\(x^2\equiv b\pmod p\) and \(y^2\equiv b\pmod q\) and she uses the
443Chinese remainder theorem to compute a number \(z\) such that
444\(z\equiv x\pmod p\) and \(z\equiv y\pmod q\), so that
445\(z^2\equiv b\pmod n\). Then she sends \(z\) to Bob.
446
447Since \(n\) is the product of two primes, there are \(4\) possible
448square roots of \(b\) modulo \(n\), corresponding to the solutions of
449the four systems of congruences (one for each possible combination of
450\(\pm\)) \begin{align*}\begin{cases}
451z\equiv \pm x\pmod p\\
452z \equiv \pm y\pmod q
453\end{cases}\end{align*}
454
455One of those solutions is \(a\) and another is \(-a\), and Bob knows
456them. Alice is picking one of the \(4\) possible roots at random (she
457chooses between \(x\) and \(-x\) and between \(y\) and \(-y\)), so she
458has \(50\%\) chance of picking one that Bob already knows. This
459corresponds to Alice flipping a coin, and she wins if she picks
460\(\pm a\):
461
462\item[(B2)] If \(z\equiv\pm a\pmod n\), Bob declares to have lost. Otherwise,
463Bob claims to have won, and as proof he produces one prime factor of
464\(n\) by computing \(g=\gcd(n,a+z)\). \emph{(One can prove that in this
465situation \(g\) is always one of the two prime factors of \(n\).)}
466
467Since factoring a number without extra information is very hard, Alice
468will be convinced that she must have given Bob one of the square roots
469that he did not know, so she admits the loss.
470
471\end{itemize}
472
473Now to the actual exercise:
474
475\begin{enumerate}
476\def\labelenumi{(\alph{enumi})}
477\item
478 Write the code for the functions A1, B1 and B2 as indicated in the
479 cell below. The function A2 is already written.
480\item
481 Modify the functions B1, A2 and B2 to check that the opponent is not
482 cheating. More precisely:
483
484\begin{itemize}
485\tightlist
486\item
487 In B1, Bob should check that \(n\) is not a prime power. \emph{(This
488 is the only way Alice can try to cheat: if she sends Bob a number
489 \(n\) that is the product of more than two primes, than she has less
490 than \(50\%\) chance of winning!)}
491\item
492 In A2, Alice should check that \(b\) is a square modulo \(n\).
493\item
494 In B2, Bob should check that \(z^2\equiv a^2\pmod n\).
495\end{itemize}
496
497In case cheating is detected, a message should be printed saying that
498the person is cheating.
499\end{enumerate}
500
501\newpage
502
503 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
504\prompt{In}{incolor}{1}{\boxspacing}
505\begin{Verbatim}[commandchars=\\\{\}]
506\PY{c+c1}{\PYZsh{} Alice needs this to compute the square roots}
507\PY{k+kn}{from} \PY{n+nn}{sage}\PY{n+nn}{.}\PY{n+nn}{rings}\PY{n+nn}{.}\PY{n+nn}{finite\PYZus{}rings}\PY{n+nn}{.}\PY{n+nn}{integer\PYZus{}mod} \PY{k}{import} \PY{n}{square\PYZus{}root\PYZus{}mod\PYZus{}prime}
508
509\PY{k}{def} \PY{n+nf}{A1}\PY{p}{(}\PY{p}{)}\PY{p}{:}
510 \PY{c+c1}{\PYZsh{} This function must return two distinct primes and their product.}
511
512\PY{k}{def} \PY{n+nf}{B1}\PY{p}{(}\PY{n}{n}\PY{p}{)}\PY{p}{:}
513 \PY{c+c1}{\PYZsh{} This function must return a random integer a}
514 \PY{c+c1}{\PYZsh{} with 1\PYZlt{}a\PYZlt{}n and gcd(a,n)=1.}
515
516\PY{k}{def} \PY{n+nf}{A2}\PY{p}{(}\PY{n}{b}\PY{p}{,} \PY{n}{p}\PY{p}{,} \PY{n}{q}\PY{p}{)}\PY{p}{:}
517 \PY{n}{x} \PY{o}{=} \PY{n}{ZZ}\PY{p}{(}\PY{n}{square\PYZus{}root\PYZus{}mod\PYZus{}prime}\PY{p}{(}\PY{n}{Integers}\PY{p}{(}\PY{n}{p}\PY{p}{)}\PY{p}{(}\PY{n}{b}\PY{p}{)}\PY{p}{,} \PY{n}{p}\PY{p}{)}\PY{p}{)}
518 \PY{n}{y} \PY{o}{=} \PY{n}{ZZ}\PY{p}{(}\PY{n}{square\PYZus{}root\PYZus{}mod\PYZus{}prime}\PY{p}{(}\PY{n}{Integers}\PY{p}{(}\PY{n}{q}\PY{p}{)}\PY{p}{(}\PY{n}{b}\PY{p}{)}\PY{p}{,} \PY{n}{q}\PY{p}{)}\PY{p}{)}
519 \PY{k}{return} \PY{n}{crt}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{y}\PY{p}{,} \PY{n}{p}\PY{p}{,} \PY{n}{q}\PY{p}{)}
520
521\PY{k}{def} \PY{n+nf}{B2}\PY{p}{(}\PY{n}{a}\PY{p}{,} \PY{n}{z}\PY{p}{,} \PY{n}{n}\PY{p}{)}\PY{p}{:}
522 \PY{c+c1}{\PYZsh{} This function must print out one of two messages:}
523 \PY{c+c1}{\PYZsh{} \PYZdq{}Bob has lost\PYZdq{} if z is congruent to a or \PYZhy{}a modulo n.}
524 \PY{c+c1}{\PYZsh{} \PYZdq{}Bob has won, proof: \PYZdq{} followed by a prime factor of n otherwise.}
525 \PY{c+c1}{\PYZsh{} In this case the prime must be calculated as explained above.}
526
527
528\PY{c+c1}{\PYZsh{} This is how the game plays out:}
529\PY{n}{p}\PY{p}{,} \PY{n}{q}\PY{p}{,} \PY{n}{n} \PY{o}{=} \PY{n}{A1}\PY{p}{(}\PY{p}{)}
530\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Alice picked n =}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{n}\PY{p}{)}
531\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{[[ Alice}\PY{l+s+s2}{\PYZsq{}}\PY{l+s+s2}{s secret:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{p}\PY{p}{,} \PY{n}{q}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{]]}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
532\PY{n}{a} \PY{o}{=} \PY{n}{B1}\PY{p}{(}\PY{n}{n}\PY{p}{)}
533\PY{n}{b} \PY{o}{=} \PY{n}{a}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZpc{}} \PY{n}{n}
534\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Bob picked b =}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{b}\PY{p}{)}
535\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{[[ Bob}\PY{l+s+s2}{\PYZsq{}}\PY{l+s+s2}{s secret:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{a}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{]]}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
536\PY{n}{z} \PY{o}{=} \PY{n}{A2}\PY{p}{(}\PY{n}{b}\PY{p}{,} \PY{n}{p}\PY{p}{,} \PY{n}{q}\PY{p}{)}
537\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Alice picked z =}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{z}\PY{p}{)}
538\PY{n}{B2}\PY{p}{(}\PY{n}{a}\PY{p}{,} \PY{n}{z}\PY{p}{,} \PY{n}{n}\PY{p}{)}
539\end{Verbatim}
540\end{tcolorbox}
541
542 \vspace{1cm}
543 \textbf{Grading}
544
545This homework assignment is worth \(20\%\) of your final grade. Exercise
5461 is worth 4 points (one for each part) and Exercise 2 is worth 12
547points (8 points for part (a) and 4 points for part (b)), for a total of
548\textbf{16 points}.
549
550
551
552\end{document}
diff --git a/src/Homework4/.ipynb_checkpoints/Homework4-checkpoint.ipynb b/src/Homework4/.ipynb_checkpoints/Homework4-checkpoint.ipynb
new file mode 100644
index 0000000..47f63cf
--- /dev/null
+++ b/src/Homework4/.ipynb_checkpoints/Homework4-checkpoint.ipynb
@@ -0,0 +1,172 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "*For this exercise you should have received this text in .ipynb format. Complete the exercises by modifying this file, and submit the modified version*\n",
8 "\n",
9 "**Deadline:** Sunday, June 6."
10 ]
11 },
12 {
13 "cell_type": "markdown",
14 "metadata": {},
15 "source": [
16 "**Exercise 1 (6 points)**\n",
17 "\n",
18 "Use Sage to find the intersection points *in the real plane* (that is, only those points such that *both* coordinates are real numbers) of the following pairs of geometric objects:\n",
19 "\n",
20 "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2\\right)^2 + (2y)^2 = 4$.\n",
21 "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2-2\\right)^2 + (2y)^2 = 4$.\n",
22 "* The curve of equation $y^2 = x^3 -x +1$ and the horizontal line $y=10$.\n",
23 "* The $x$-axis and the graph of the function $f(x)=\\log(x) - e^{-x}$. *Hint: $f(x)$ has only one real zero.*"
24 ]
25 },
26 {
27 "cell_type": "code",
28 "execution_count": null,
29 "metadata": {},
30 "outputs": [],
31 "source": []
32 },
33 {
34 "cell_type": "markdown",
35 "metadata": {},
36 "source": [
37 "**Exercise 2 (6 points)**\n",
38 "\n",
39 "(a) Use Sage to compute\n",
40 "* the derivative\n",
41 "* a primite (i.e. integral)\n",
42 "* the power series expansion around $0$ up to order $4$\n",
43 "\n",
44 "of the following functions:\n",
45 "* $f(x) = e^x$\n",
46 "* $f(x) = \\sin(x)$\n",
47 "* $f(x) = \\cos(x)$\n",
48 "* $f(x) = \\tan(x)$\n",
49 "* $f(x) = \\log(1+x)$\n",
50 "* $f(x) = \\sqrt[3]{1+x}$\n",
51 "\n",
52 "(b) Use Sage to get the Latex code that represents the objects you computed above.\n",
53 "\n",
54 "(c) Arrange the results of the previous points in a table in Latex. The table should have 4 columns (function, derivative, integral, series) and one row for each of the functions above. *Note: when including Latex in a Markdown cell in Jupyter you will not receive any warning if you make mistakes; instead the Latex will simply not be rendered and it will appear as plain text. If you have troubles making this work you can send me a separate .tex (and .pdf) file.*"
55 ]
56 },
57 {
58 "cell_type": "code",
59 "execution_count": null,
60 "metadata": {},
61 "outputs": [],
62 "source": [
63 "# Compute derivatives etc..."
64 ]
65 },
66 {
67 "cell_type": "code",
68 "execution_count": null,
69 "metadata": {},
70 "outputs": [],
71 "source": [
72 "# Compute Latex code"
73 ]
74 },
75 {
76 "cell_type": "markdown",
77 "metadata": {},
78 "source": [
79 "(Write your table here)"
80 ]
81 },
82 {
83 "cell_type": "markdown",
84 "metadata": {},
85 "source": [
86 "**Exercise 3 (4 points)**\n",
87 "\n",
88 "The equation\n",
89 "\\begin{align*}\n",
90 "y^2+x^{16}=1\n",
91 "\\end{align*}\n",
92 "determines a closed curve in $\\mathbb R^2$ that looks like a rounded square. Determine the area of that shape, giving both an exact value (which might depend on some functions that Sage knows, but you don't) and an approximate value."
93 ]
94 },
95 {
96 "cell_type": "code",
97 "execution_count": null,
98 "metadata": {},
99 "outputs": [],
100 "source": []
101 },
102 {
103 "cell_type": "markdown",
104 "metadata": {},
105 "source": [
106 "**Exercise 4 (12 points)**\n",
107 "\n",
108 "A team of biologists is monitoring the population of river shrimps in the Alzette. At first they thought that the size $P(t)$ of their population on day $t$ would satisfy the differential equation $P'(t)=P(t)/10$. However this does not work well with the data they have collected, so they now believe that the population of shrimps follows the formula $P'(t)=P(t)/10-b$ for some value of $b$ between 1 and 100. They need your help here.\n",
109 "\n",
110 "(a) Using Sage, find a solution for the differential equation with initial conditions\n",
111 "\\begin{align*}\n",
112 "\\begin{cases}\n",
113 "P'(t)&=\\frac{P(t)}{10}-b\\\\\n",
114 "P(1)&=1000\n",
115 "\\end{cases}\n",
116 "\\end{align*}\n",
117 "where $b$ is a generic constant.\n",
118 "\n",
119 "(b) The list `data` in the cell below contains the actual number of shrimps that was measured every day from day $1$ (the $0$ at the beginning is meaningless, but it will help to keep it there). Plot in one single picture, possibly using different colors for each:\n",
120 "* The data as a bar chart.\n",
121 "* A curve that interpolates the data, using one of the methods shown in class.\n",
122 "* The solution of the differential equation for $b=0$.\n",
123 "* The solution of the differential equation for a value of $b$ of your choice ($1\\leq b\\leq 100$) that fits the data better than $b=0$. *(For this last point there is no right or wrong choice, just pick one that looks good)*"
124 ]
125 },
126 {
127 "cell_type": "code",
128 "execution_count": null,
129 "metadata": {},
130 "outputs": [],
131 "source": [
132 "data = [0, 1000, 1123, 1223, 1190, 1432, 1553, 1709, 1826, 1980, 2146, 2172, 2383, 2588, 2822, 3401, 3330, 4157, 3994, 4995, 5392, 5910, 6468, 7128, 7325, 7984, 9634, 10473, 11761, 12777]\n"
133 ]
134 },
135 {
136 "cell_type": "markdown",
137 "metadata": {},
138 "source": [
139 "**Grading**\n",
140 "\n",
141 "This homework assignment is worth $28$ ($24+4$) points, distributed as described above.\n",
142 "\n",
143 "Your final grade for the course will be the total of points you obtained (notice that the maximum is $20+20+16+28=84$) divided by $4$, rounded to the nearest integer. More precisely\n",
144 "\n",
145 "\\begin{align*}\n",
146 "\\operatorname{grade} = \\operatorname{min}\\left(20, \\left\\lfloor \\frac{\\operatorname{total}}{4} + 0.5\\right\\rfloor\\right)\n",
147 "\\end{align*}"
148 ]
149 }
150 ],
151 "metadata": {
152 "kernelspec": {
153 "display_name": "SageMath 9.2",
154 "language": "sage",
155 "name": "sagemath"
156 },
157 "language_info": {
158 "codemirror_mode": {
159 "name": "ipython",
160 "version": 3
161 },
162 "file_extension": ".py",
163 "mimetype": "text/x-python",
164 "name": "python",
165 "nbconvert_exporter": "python",
166 "pygments_lexer": "ipython3",
167 "version": "3.8.5"
168 }
169 },
170 "nbformat": 4,
171 "nbformat_minor": 4
172}
diff --git a/src/Homework4/.ipynb_checkpoints/Homework4-solutions-checkpoint.ipynb b/src/Homework4/.ipynb_checkpoints/Homework4-solutions-checkpoint.ipynb
new file mode 100644
index 0000000..f8617fd
--- /dev/null
+++ b/src/Homework4/.ipynb_checkpoints/Homework4-solutions-checkpoint.ipynb
@@ -0,0 +1,61 @@
1{
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 40,
6 "metadata": {},
7 "outputs": [
8 {
9 "name": "stdout",
10 "output_type": "stream",
11 "text": [
12 "f(x) \t Derivative \t Integral \t Series expansion\n",
13 "e^x \t e^x \t e^x \t 1 + 1*x + 1/2*x^2 + 1/6*x^3 + 1/24*x^4 + Order(x^5)\n",
14 "sin(x) \t cos(x) \t -cos(x) \t 1*x + (-1/6)*x^3 + Order(x^5)\n",
15 "cos(x) \t -sin(x) \t sin(x) \t 1 + (-1/2)*x^2 + 1/24*x^4 + Order(x^5)\n",
16 "tan(x) \t tan(x)^2 + 1 \t log(sec(x)) \t 1*x + 1/3*x^3 + Order(x^5)\n",
17 "log(x + 1) \t 1/(x + 1) \t (x + 1)*log(x + 1) - x - 1 \t 1*x + (-1/2)*x^2 + 1/3*x^3 + (-1/4)*x^4 + Order(x^5)\n",
18 "(x + 1)^a \t a*(x + 1)^(a - 1) \t (x + 1)^(a + 1)/(a + 1) \t 1 + (a)*x + (1/2*a^2 - 1/2*a)*x^2 + (1/6*a^3 - 1/2*a^2 + 1/3*a)*x^3 + (1/24*a^4 - 1/4*a^3 + 11/24*a^2 - 1/4*a)*x^4 + Order(x^5)\n"
19 ]
20 }
21 ],
22 "source": [
23 "print(\"f(x)\", \"\\t\", \"Derivative\", \"\\t\", \"Integral\", \"\\t\", \"Series expansion\")\n",
24 "var('a')\n",
25 "f(x) = (1+x)^a\n",
26 "assume(a>0)\n",
27 "functions = [e^x, sin, cos, tan, log(1+x), f]\n",
28 "for g in functions:\n",
29 " print(g(x), \"\\t\", derivative(g(x), x), \"\\t\", integral(g(x),x), \"\\t\", g(x).series(x==0,5))"
30 ]
31 },
32 {
33 "cell_type": "code",
34 "execution_count": null,
35 "metadata": {},
36 "outputs": [],
37 "source": []
38 }
39 ],
40 "metadata": {
41 "kernelspec": {
42 "display_name": "SageMath 9.2",
43 "language": "sage",
44 "name": "sagemath"
45 },
46 "language_info": {
47 "codemirror_mode": {
48 "name": "ipython",
49 "version": 3
50 },
51 "file_extension": ".py",
52 "mimetype": "text/x-python",
53 "name": "python",
54 "nbconvert_exporter": "python",
55 "pygments_lexer": "ipython3",
56 "version": "3.8.5"
57 }
58 },
59 "nbformat": 4,
60 "nbformat_minor": 4
61}
diff --git a/src/Homework4/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/src/Homework4/.ipynb_checkpoints/Untitled-checkpoint.ipynb
new file mode 100644
index 0000000..7fec515
--- /dev/null
+++ b/src/Homework4/.ipynb_checkpoints/Untitled-checkpoint.ipynb
@@ -0,0 +1,6 @@
1{
2 "cells": [],
3 "metadata": {},
4 "nbformat": 4,
5 "nbformat_minor": 4
6}
diff --git a/src/Homework4/Homework4.aux b/src/Homework4/Homework4.aux
new file mode 100644
index 0000000..a74227c
--- /dev/null
+++ b/src/Homework4/Homework4.aux
@@ -0,0 +1,20 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\providecommand \oddpage@label [2]{}
20\gdef \@abspage@last{2}
diff --git a/src/Homework4/Homework4.ipynb b/src/Homework4/Homework4.ipynb
new file mode 100644
index 0000000..99481b9
--- /dev/null
+++ b/src/Homework4/Homework4.ipynb
@@ -0,0 +1,172 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "*For this exercise you should have received this text in .ipynb format. Complete the exercises by modifying this file, and submit the modified version*\n",
8 "\n",
9 "**Deadline:** Sunday, June 6."
10 ]
11 },
12 {
13 "cell_type": "markdown",
14 "metadata": {},
15 "source": [
16 "**Exercise 1 (6 points)**\n",
17 "\n",
18 "Use Sage to find the intersection points *in the real plane* (that is, only those points such that *both* coordinates are real numbers) of the following pairs of geometric objects:\n",
19 "\n",
20 "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2\\right)^2 + (2y)^2 = 4$.\n",
21 "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2-2\\right)^2 + (2y)^2 = 4$.\n",
22 "* The curve of equation $y^2 = x^3 -x +1$ and the horizontal line $y=10$.\n",
23 "* The $x$-axis and the graph of the function $f(x)=\\log(x) - e^{-x}$. *Hint: $f(x)$ has only one real zero.*"
24 ]
25 },
26 {
27 "cell_type": "code",
28 "execution_count": null,
29 "metadata": {},
30 "outputs": [],
31 "source": []
32 },
33 {
34 "cell_type": "markdown",
35 "metadata": {},
36 "source": [
37 "**Exercise 2 (6 points)**\n",
38 "\n",
39 "(a) Use Sage to compute\n",
40 "* the derivative\n",
41 "* a primite (i.e. integral)\n",
42 "* the power series expansion around $0$ up to order $4$\n",
43 "\n",
44 "of the following functions:\n",
45 "* $f(x) = e^x$\n",
46 "* $f(x) = \\sin(x)$\n",
47 "* $f(x) = \\cos(x)$\n",
48 "* $f(x) = \\tan(x)$\n",
49 "* $f(x) = \\log(1+x)$\n",
50 "* $f(x) = \\sqrt[3]{1+x}$\n",
51 "\n",
52 "(b) Use Sage to get the Latex code that represents the objects you computed above.\n",
53 "\n",
54 "(c) Arrange the results of the previous points in a table in Latex. The table should have 4 columns (function, derivative, integral, series) and one row for each of the functions above. *Note: when including Latex in a Markdown cell in Jupyter you will not receive any warning if you make mistakes; instead the Latex will simply not be rendered and it will appear as plain text. If you have troubles making this work you can send me a separate .tex (and .pdf) file.*"
55 ]
56 },
57 {
58 "cell_type": "code",
59 "execution_count": null,
60 "metadata": {},
61 "outputs": [],
62 "source": [
63 "# Compute derivatives etc..."
64 ]
65 },
66 {
67 "cell_type": "code",
68 "execution_count": null,
69 "metadata": {},
70 "outputs": [],
71 "source": [
72 "# Compute Latex code"
73 ]
74 },
75 {
76 "cell_type": "markdown",
77 "metadata": {},
78 "source": [
79 "(Write your table here)"
80 ]
81 },
82 {
83 "cell_type": "markdown",
84 "metadata": {},
85 "source": [
86 "**Exercise 3 (4 points)**\n",
87 "\n",
88 "The equation\n",
89 "\\begin{align*}\n",
90 "y^2+x^{16}=1\n",
91 "\\end{align*}\n",
92 "determines a closed curve in $\\mathbb R^2$ that looks like a rounded square. Determine the area of that shape, giving both an exact value (which might depend on some functions that Sage knows, but you don't) and an approximate value."
93 ]
94 },
95 {
96 "cell_type": "code",
97 "execution_count": null,
98 "metadata": {},
99 "outputs": [],
100 "source": []
101 },
102 {
103 "cell_type": "markdown",
104 "metadata": {},
105 "source": [
106 "**Exercise 4 (12 points)**\n",
107 "\n",
108 "A team of biologists is monitoring the population of river shrimps in the Alzette. At first they thought that the size $P(t)$ of their population on day $t$ would satisfy the differential equation $P'(t)=P(t)/10$. However this does not work well with the data they have collected, so they now believe that the population of shrimps follows the formula $P'(t)=P(t)/10-b$ for some value of $b$ between 1 and 100. They need your help here.\n",
109 "\n",
110 "(a) Using Sage, find a solution for the differential equation with initial conditions\n",
111 "\\begin{align*}\n",
112 "\\begin{cases}\n",
113 "P'(t)&=\\frac{P(t)}{10}-b\\\\\n",
114 "P(1)&=1000\n",
115 "\\end{cases}\n",
116 "\\end{align*}\n",
117 "where $b$ is a generic constant.\n",
118 "\n",
119 "(b) The list `data` in the cell below contains the actual number of shrimps that was measured every day from day $1$ (the $0$ at the beginning is meaningless, but it will help to keep it there). Plot in one single picture, possibly using different colors for each:\n",
120 "* The data as a bar chart.\n",
121 "* A curve that interpolates the data, using one of the methods shown in class.\n",
122 "* The solution of the differential equation for $b=0$.\n",
123 "* The solution of the differential equation for a value of $b$ of your choice ($1\\leq b\\leq 100$) that fits the data better than $b=0$. *(For this last point there is no right or wrong choice, just pick one that looks good)*"
124 ]
125 },
126 {
127 "cell_type": "code",
128 "execution_count": null,
129 "metadata": {},
130 "outputs": [],
131 "source": [
132 "data = [0, 1000, 1123, 1223, 1190, 1432, 1553, 1709, 1826, 1980, 2146, 2172, 2383, 2588, 2822, 3401, 3330, 4157, 3994, 4995, 5392, 5910, 6468, 7128, 7325, 7984, 9634, 10473, 11761, 12777]\n"
133 ]
134 },
135 {
136 "cell_type": "markdown",
137 "metadata": {},
138 "source": [
139 "**Grading**\n",
140 "\n",
141 "This homework assignment is worth $28$ ($24+4$) points, distributed as described above.\n",
142 "\n",
143 "Your final grade for the course will be the total of points you obtained (notice that the maximum is $20+20+16+28=84$) divided by $4$, rounded to the nearest integer. More precisely\n",
144 "\n",
145 "\\begin{align*}\n",
146 "\\operatorname{grade} = \\operatorname{min}\\left(20, \\left\\lfloor \\frac{\\operatorname{total}}{4} + 0.5\\right\\rfloor\\right)\n",
147 "\\end{align*}"
148 ]
149 }
150 ],
151 "metadata": {
152 "kernelspec": {
153 "display_name": "SageMath 9.0",
154 "language": "sage",
155 "name": "sagemath"
156 },
157 "language_info": {
158 "codemirror_mode": {
159 "name": "ipython",
160 "version": 3
161 },
162 "file_extension": ".py",
163 "mimetype": "text/x-python",
164 "name": "python",
165 "nbconvert_exporter": "python",
166 "pygments_lexer": "ipython3",
167 "version": "3.8.5"
168 }
169 },
170 "nbformat": 4,
171 "nbformat_minor": 4
172}
diff --git a/src/Homework4/Homework4.log b/src/Homework4/Homework4.log
new file mode 100644
index 0000000..576cde7
--- /dev/null
+++ b/src/Homework4/Homework4.log
@@ -0,0 +1,953 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.4.20) 12 MAY 2021 14:24
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**Homework4.tex
6(./Homework4.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size11.clo
12File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty
27Package: tcolorbox 2020/10/09 version 4.42 text color boxes
28
29(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
30(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
31(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
32\pgfutil@everybye=\toks15
33\pgfutil@tempdima=\dimen139
34\pgfutil@tempdimb=\dimen140
35
36(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
37(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
38\pgfutil@abb=\box47
39)
40(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
41(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
42Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
43))
44Package: pgf 2020/12/01 v3.1.7a (3.1.7a)
45
46(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
47(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
48Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
49
50(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
51Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
52\KV@toks@=\toks16
53)
54(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
55Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
56
57(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
58Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
59)
60(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
61File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
62)
63Package graphics Info: Driver file: pdftex.def on input line 105.
64
65(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
66File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
67))
68\Gin@req@height=\dimen141
69\Gin@req@width=\dimen142
70)
71(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
72(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
73Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
74
75(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
76\pgfkeys@pathtoks=\toks17
77\pgfkeys@temptoks=\toks18
78
79(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
80\pgfkeys@tmptoks=\toks19
81))
82\pgf@x=\dimen143
83\pgf@y=\dimen144
84\pgf@xa=\dimen145
85\pgf@ya=\dimen146
86\pgf@xb=\dimen147
87\pgf@yb=\dimen148
88\pgf@xc=\dimen149
89\pgf@yc=\dimen150
90\pgf@xd=\dimen151
91\pgf@yd=\dimen152
92\w@pgf@writea=\write3
93\r@pgf@reada=\read2
94\c@pgf@counta=\count185
95\c@pgf@countb=\count186
96\c@pgf@countc=\count187
97\c@pgf@countd=\count188
98\t@pgf@toka=\toks20
99\t@pgf@tokb=\toks21
100\t@pgf@tokc=\toks22
101\pgf@sys@id@count=\count189
102
103(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
104File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
105)
106Driver file for pgf: pgfsys-pdftex.def
107
108(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
109File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
110
111(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
112File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
113)))
114(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
115File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
116\pgfsyssoftpath@smallbuffer@items=\count190
117\pgfsyssoftpath@bigbuffer@items=\count191
118)
119(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
120File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
121))
122(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
123Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
124
125(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
126File: color.cfg 2016/01/02 v1.6 sample color configuration
127)
128Package xcolor Info: Driver file: pdftex.def on input line 225.
129Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
130Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
131Package xcolor Info: Model `RGB' extended on input line 1364.
132Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
133Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
134Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
135Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
136Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
137Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
138)
139(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
140Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
141
142(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
143(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
144(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
145(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
146\pgfmath@dimen=\dimen153
147\pgfmath@count=\count192
148\pgfmath@box=\box48
149\pgfmath@toks=\toks23
150\pgfmath@stack@operand=\toks24
151\pgfmath@stack@operation=\toks25
152)
153(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
154(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
155(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
156.tex)
157(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
158(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
159x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
160(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
161(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
162(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
163.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
164\c@pgfmathroundto@lastzeros=\count193
165)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
166(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
167File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
168\pgf@picminx=\dimen154
169\pgf@picmaxx=\dimen155
170\pgf@picminy=\dimen156
171\pgf@picmaxy=\dimen157
172\pgf@pathminx=\dimen158
173\pgf@pathmaxx=\dimen159
174\pgf@pathminy=\dimen160
175\pgf@pathmaxy=\dimen161
176\pgf@xx=\dimen162
177\pgf@xy=\dimen163
178\pgf@yx=\dimen164
179\pgf@yy=\dimen165
180\pgf@zx=\dimen166
181\pgf@zy=\dimen167
182)
183(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
184File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
185\pgf@path@lastx=\dimen168
186\pgf@path@lasty=\dimen169
187) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
188File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
189\pgf@shorten@end@additional=\dimen170
190\pgf@shorten@start@additional=\dimen171
191)
192(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
193File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
194\pgfpic=\box49
195\pgf@hbox=\box50
196\pgf@layerbox@main=\box51
197\pgf@picture@serial@count=\count194
198)
199(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
200File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
201\pgflinewidth=\dimen172
202)
203(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
204ex
205File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
206\pgf@pt@x=\dimen173
207\pgf@pt@y=\dimen174
208\pgf@pt@temp=\dimen175
209) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
210File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
211)
212(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
213File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
214)
215(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
216x
217File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
218) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
219File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
220\pgfarrowsep=\dimen176
221)
222(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
223File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
224\pgf@max=\dimen177
225\pgf@sys@shading@range@num=\count195
226\pgf@shadingcount=\count196
227)
228(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
229File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
230
231(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
232File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
233\pgfexternal@startupbox=\box52
234))
235(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
236File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
237)
238(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
239File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
240) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
241File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
242)
243(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
244File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
245)))
246(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
247File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
248\pgfnodeparttextbox=\box53
249)
250(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
251File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a)
252)
253(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
254Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a)
255\pgf@nodesepstart=\dimen178
256\pgf@nodesepend=\dimen179
257)
258(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
259Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a)
260))
261(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty
262Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements
263\every@verbatim=\toks26
264\verbatim@line=\toks27
265\verbatim@in@stream=\read3
266)
267(/usr/share/texmf-dist/tex/latex/environ/environ.sty
268Package: environ 2014/05/04 v0.3 A new way to define environments
269
270(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty
271Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
272)
273\@envbody=\toks28
274)
275(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
276Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
277\etb@tempcnta=\count197
278)
279\tcb@titlebox=\box54
280\tcb@upperbox=\box55
281\tcb@lowerbox=\box56
282\tcb@phantombox=\box57
283\c@tcbbreakpart=\count198
284\c@tcblayer=\count199
285\c@tcolorbox@number=\count266
286\tcb@temp=\box58
287\tcb@temp=\box59
288\tcb@temp=\box60
289\tcb@temp=\box61
290\tcb@out=\write4
291\tcb@record@out=\write5
292
293(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex
294Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42'
295(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty
296Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO)
297
298(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
299Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO)
300)
301(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
302Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
303)
304(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
305Package: iftex 2020/03/06 v1.0d TeX engine tests
306))
307Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23.
308\tcb@testbox=\box62
309\tcb@totalupperbox=\box63
310\tcb@totallowerbox=\box64
311))
312(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty
313Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments
314
315(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
316Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)
317
318(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
319Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
320)))
321(/usr/share/texmf-dist/tex/latex/base/fontenc.sty
322Package: fontenc 2020/08/10 v2.0s Standard LaTeX package
323)
324(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
325Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS)
326\symupright=\mathgroup4
327)
328(/usr/share/texmf-dist/tex/latex/caption/caption.sty
329Package: caption 2020/10/26 v3.5g Customizing captions (AR)
330
331(/usr/share/texmf-dist/tex/latex/caption/caption3.sty
332Package: caption3 2020/10/21 v2.2e caption3 kernel (AR)
333\captionmargin=\dimen180
334\captionmargin@=\dimen181
335\captionwidth=\dimen182
336\caption@tempdima=\dimen183
337\caption@indent=\dimen184
338\caption@parindent=\dimen185
339\caption@hangindent=\dimen186
340Package caption Info: Standard document class detected.
341)
342\c@caption@flags=\count267
343\c@continuedfloat=\count268
344)
345(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty
346Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...)
347
348(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty
349Package: xkeyval 2020/11/20 v2.8 package option processing (HA)
350
351(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex
352(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex
353\XKV@toks=\toks29
354\XKV@tempa@toks=\toks30
355)
356\XKV@depth=\count269
357File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
358))
359(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty
360Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back
361-ends (calc, etex, pgfmath)
362)
363(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty
364Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material
365
366(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty
367Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes
368\collectedbox=\box65
369)
370\tc@llx=\dimen187
371\tc@lly=\dimen188
372\tc@urx=\dimen189
373\tc@ury=\dimen190
374Package trimclip Info: Using driver 'tc-pdftex.def'.
375
376(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def
377File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex
378))
379\adjbox@Width=\dimen191
380\adjbox@Height=\dimen192
381\adjbox@Depth=\dimen193
382\adjbox@Totalheight=\dimen194
383\adjbox@pwidth=\dimen195
384\adjbox@pheight=\dimen196
385\adjbox@pdepth=\dimen197
386\adjbox@ptotalheight=\dimen198
387
388(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty
389Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection
390\c@checkoddpage=\count270
391)
392(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty
393Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages
394\@vwid@box=\box66
395\sift@deathcycles=\count271
396\@vwid@loff=\dimen199
397\@vwid@roff=\dimen256
398))
399(/usr/share/texmf-dist/tex/latex/float/float.sty
400Package: float 2001/11/08 v1.3d Float enhancements (AL)
401\c@float@type=\count272
402\float@exts=\toks31
403\float@box=\box67
404\@float@everytoks=\toks32
405\@floatcapt=\box68
406)
407(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty
408Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
409\@enLab=\toks33
410)
411(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
412Package: geometry 2020/01/02 v5.9 Page Geometry
413
414(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
415Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
416)
417\Gm@cnth=\count273
418\Gm@cntv=\count274
419\c@Gm@tempcnt=\count275
420\Gm@bindingoffset=\dimen257
421\Gm@wd@mp=\dimen258
422\Gm@odd@mp=\dimen259
423\Gm@even@mp=\dimen260
424\Gm@layoutwidth=\dimen261
425\Gm@layoutheight=\dimen262
426\Gm@layouthoffset=\dimen263
427\Gm@layoutvoffset=\dimen264
428\Gm@dimlist=\toks34
429)
430(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
431Package: amsmath 2020/09/23 v2.17i AMS math features
432\@mathmargin=\skip49
433
434For additional information on amsmath, use the `?' option.
435(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
436Package: amstext 2000/06/29 v2.01 AMS text
437
438(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
439File: amsgen.sty 1999/11/30 v2.0 generic functions
440\@emptytoks=\toks35
441\ex@=\dimen265
442))
443(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
444Package: amsbsy 1999/11/29 v1.2d Bold Symbols
445\pmbraise@=\dimen266
446)
447(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
448Package: amsopn 2016/03/08 v2.02 operator names
449)
450\inf@bad=\count276
451LaTeX Info: Redefining \frac on input line 234.
452\uproot@=\count277
453\leftroot@=\count278
454LaTeX Info: Redefining \overline on input line 399.
455\classnum@=\count279
456\DOTSCASE@=\count280
457LaTeX Info: Redefining \ldots on input line 496.
458LaTeX Info: Redefining \dots on input line 499.
459LaTeX Info: Redefining \cdots on input line 620.
460\Mathstrutbox@=\box69
461\strutbox@=\box70
462\big@size=\dimen267
463LaTeX Font Info: Redeclaring font encoding OML on input line 743.
464LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
465\macc@depth=\count281
466\c@MaxMatrixCols=\count282
467\dotsspace@=\muskip16
468\c@parentequation=\count283
469\dspbrk@lvl=\count284
470\tag@help=\toks36
471\row@=\count285
472\column@=\count286
473\maxfields@=\count287
474\andhelp@=\toks37
475\eqnshift@=\dimen268
476\alignsep@=\dimen269
477\tagshift@=\dimen270
478\tagwidth@=\dimen271
479\totwidth@=\dimen272
480\lineht@=\dimen273
481\@envbody=\toks38
482\multlinegap=\skip50
483\multlinetaggap=\skip51
484\mathdisplay@stack=\toks39
485LaTeX Info: Redefining \[ on input line 2923.
486LaTeX Info: Redefining \] on input line 2924.
487)
488(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
489Package: amssymb 2013/01/14 v3.01 AMS font symbols
490
491(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
492Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
493\symAMSa=\mathgroup5
494\symAMSb=\mathgroup6
495LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
496LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
497(Font) U/euf/m/n --> U/euf/b/n on input line 106.
498))
499(/usr/share/texmf-dist/tex/latex/base/textcomp.sty
500Package: textcomp 2020/02/02 v2.0n Standard LaTeX package
501)
502(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty
503Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba
504tim
505)
506(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty
507Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro''
508\@eurobox=\box71
509)
510(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty
511Package: ucs 2013/05/11 v2.2 UCS: Unicode input support
512
513(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def
514File: uni-global.def 2013/05/13 UCS: Unicode global data
515)
516\uc@secondtry=\count288
517\uc@combtoks=\toks40
518\uc@combtoksb=\toks41
519\uc@temptokena=\toks42
520)
521(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
522Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv)
523\FV@CodeLineNo=\count289
524\FV@InFile=\read4
525\FV@TabBox=\box72
526\c@FancyVerbLine=\count290
527\FV@StepNumber=\count291
528\FV@OutFile=\write6
529)
530(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty
531Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac
532y)
533Package grffile Info: This package is an empty stub for compatibility on input
534line 40.
535)
536(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
537Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX
538
539(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
540Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO
541)
542Package pdftexcmds Info: \pdf@primitive is available.
543Package pdftexcmds Info: \pdf@ifprimitive is available.
544Package pdftexcmds Info: \pdfdraftmode found.
545)
546(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
547Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
548)
549(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
550Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
551)
552(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
553Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
554)
555(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
556Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
557)
558(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
559Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
560)
561\@linkdim=\dimen274
562\Hy@linkcounter=\count292
563\Hy@pagecounter=\count293
564
565(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
566File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO)
567Now handling font encoding PD1 ...
568... no UTF-8 mapping file for font encoding PD1
569)
570(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
571Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
572)
573(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty
574Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
575)
576\Hy@SavedSpaceFactor=\count294
577Package hyperref Info: Hyper figures OFF on input line 4464.
578Package hyperref Info: Link nesting OFF on input line 4469.
579Package hyperref Info: Hyper index ON on input line 4472.
580Package hyperref Info: Plain pages OFF on input line 4479.
581Package hyperref Info: Backreferencing OFF on input line 4484.
582Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
583Package hyperref Info: Bookmarks ON on input line 4717.
584\c@Hy@tempcnt=\count295
585
586(/usr/share/texmf-dist/tex/latex/url/url.sty
587\Urlmuskip=\muskip17
588Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
589)
590LaTeX Info: Redefining \url on input line 5076.
591\XeTeXLinkMargin=\dimen275
592
593(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty
594Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
595
596(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
597Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
598)
599))
600\Fld@menulength=\count296
601\Field@Width=\dimen276
602\Fld@charsize=\dimen277
603Package hyperref Info: Hyper figures OFF on input line 6347.
604Package hyperref Info: Link nesting OFF on input line 6352.
605Package hyperref Info: Hyper index ON on input line 6355.
606Package hyperref Info: backreferencing OFF on input line 6362.
607Package hyperref Info: Link coloring OFF on input line 6367.
608Package hyperref Info: Link coloring with OCG OFF on input line 6372.
609Package hyperref Info: PDF/A mode OFF on input line 6377.
610LaTeX Info: Redefining \ref on input line 6417.
611LaTeX Info: Redefining \pageref on input line 6421.
612
613(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty
614Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa
615ge
616with kernel methods
617)
618\Hy@abspage=\count297
619\c@Item=\count298
620\c@Hfootnote=\count299
621)
622Package hyperref Info: Driver (autodetected): hpdftex.
623
624(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
625File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX
626
627(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty
628Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag
629e
630with kernel methods
631)
632\Fld@listcount=\count300
633\c@bookmark@seq@number=\count301
634
635(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
636Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
637
638(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
639Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
640)
641Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
64286.
643)
644\Hy@SectionHShift=\skip52
645)
646(/usr/share/texmf-dist/tex/latex/titling/titling.sty
647Package: titling 2009/09/04 v2.1d maketitle typesetting
648\thanksmarkwidth=\skip53
649\thanksmargin=\skip54
650\droptitle=\skip55
651)
652(/usr/share/texmf-dist/tex/latex/tools/longtable.sty
653Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC)
654\LTleft=\skip56
655\LTright=\skip57
656\LTpre=\skip58
657\LTpost=\skip59
658\LTchunksize=\count302
659\LTcapwidth=\dimen278
660\LT@head=\box73
661\LT@firsthead=\box74
662\LT@foot=\box75
663\LT@lastfoot=\box76
664\LT@cols=\count303
665\LT@rows=\count304
666\c@LT@tables=\count305
667\c@LT@chunks=\count306
668\LT@p@ftn=\toks43
669)
670(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty
671Package: booktabs 2020/01/12 v1.61803398 Publication quality tables
672\heavyrulewidth=\dimen279
673\lightrulewidth=\dimen280
674\cmidrulewidth=\dimen281
675\belowrulesep=\dimen282
676\belowbottomsep=\dimen283
677\aboverulesep=\dimen284
678\abovetopsep=\dimen285
679\cmidrulesep=\dimen286
680\cmidrulekern=\dimen287
681\defaultaddspace=\dimen288
682\@cmidla=\count307
683\@cmidlb=\count308
684\@aboverulesep=\dimen289
685\@belowrulesep=\dimen290
686\@thisruleclass=\count309
687\@lastruleclass=\count310
688\@thisrulewidth=\dimen291
689)
690(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty
691Package: enumitem 2019/06/20 v3.9 Customized lists
692\labelindent=\skip60
693\enit@outerparindent=\dimen292
694\enit@toks=\toks44
695\enit@inbox=\box77
696\enit@count@id=\count311
697\enitdp@description=\count312
698)
699(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty
700\UL@box=\box78
701\UL@hyphenbox=\box79
702\UL@skip=\skip61
703\UL@hook=\toks45
704\UL@height=\dimen293
705\UL@pe=\count313
706\UL@pixel=\dimen294
707\ULC@box=\box80
708Package: ulem 2019/11/18
709\ULdepth=\dimen295
710)
711(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty
712Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk)
713\symrsfs=\mathgroup7
714)
715\Wrappedcontinuationbox=\box81
716\Wrappedvisiblespacebox=\box82
717Package hyperref Info: Option `breaklinks' set `true' on input line 360.
718Package hyperref Info: Option `colorlinks' set `true' on input line 360.
719LaTeX Font Info: Trying to load font information for T1+ppl on input line 36
7207.
721
722(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
723File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
724)
725(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
726File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
727\l__kernel_color_stack_int=\count314
728\l__pdf_internal_box=\box83
729)
730(./Homework4.aux)
731\openout1 = `Homework4.aux'.
732
733LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 367.
734LaTeX Font Info: ... okay on input line 367.
735LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 367.
736LaTeX Font Info: ... okay on input line 367.
737LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 367.
738LaTeX Font Info: ... okay on input line 367.
739LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 367.
740LaTeX Font Info: ... okay on input line 367.
741LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 367.
742LaTeX Font Info: ... okay on input line 367.
743LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 367.
744LaTeX Font Info: ... okay on input line 367.
745LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 367.
746LaTeX Font Info: ... okay on input line 367.
747LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 367.
748LaTeX Font Info: ... okay on input line 367.
749 (/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
750[Loading MPS to PDF converter (version 2006.09.02).]
751\scratchcounter=\count315
752\scratchdimen=\dimen296
753\scratchbox=\box84
754\nofMPsegments=\count316
755\nofMParguments=\count317
756\everyMPshowfont=\toks46
757\MPscratchCnt=\count318
758\MPscratchDim=\dimen297
759\MPnumerator=\count319
760\makeMPintoPDFobject=\count320
761\everyMPtoPDFconversion=\toks47
762) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
763Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
764Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
76585.
766
767(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
768File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
769e
770))
771Package caption Info: Begin \AtBeginDocument code.
772Package caption Info: float package is loaded.
773Package caption Info: hyperref package is loaded.
774Package caption Info: longtable package is loaded.
775
776(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty
777Package: ltcaption 2020/05/30 v1.4b longtable captions (AR)
778)
779Package caption Info: End \AtBeginDocument code.
780
781*geometry* driver: auto-detecting
782*geometry* detected driver: pdftex
783*geometry* verbose mode - [ preamble ] result:
784* driver: pdftex
785* paper: <default>
786* layout: <same size as paper>
787* layoutoffset:(h,v)=(0.0pt,0.0pt)
788* modes:
789* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)
790* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)
791* \paperwidth=614.295pt
792* \paperheight=794.96999pt
793* \textwidth=469.75502pt
794* \textheight=650.43001pt
795* \oddsidemargin=0.0pt
796* \evensidemargin=0.0pt
797* \topmargin=-37.0pt
798* \headheight=12.0pt
799* \headsep=25.0pt
800* \topskip=11.0pt
801* \footskip=30.0pt
802* \marginparwidth=59.0pt
803* \marginparsep=10.0pt
804* \columnsep=10.0pt
805* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
806* \hoffset=0.0pt
807* \voffset=0.0pt
808* \mag=1000
809* \@twocolumnfalse
810* \@twosidefalse
811* \@mparswitchfalse
812* \@reversemarginfalse
813* (1in=72.27pt=25.4mm, 1cm=28.453pt)
814
815(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def
816File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3
817)
818Package hyperref Info: Link coloring ON on input line 367.
819
820(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
821Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
822
823(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty
824Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
825)
826(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
827Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
828)
829\c@section@level=\count321
830)
831LaTeX Info: Redefining \ref on input line 367.
832LaTeX Info: Redefining \pageref on input line 367.
833LaTeX Info: Redefining \nameref on input line 367.
834
835(./Homework4.out) (./Homework4.out)
836\@outlinefile=\write7
837\openout7 = `Homework4.out'.
838
839LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3
84069.
841
842(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
843File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
844)
845LaTeX Font Info: Trying to load font information for OML+zplm on input line
846369.
847
848(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
849File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
850)
851LaTeX Font Info: Trying to load font information for OMS+zplm on input line
852369.
853
854(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd
855File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
856)
857LaTeX Font Info: Trying to load font information for OMX+zplm on input line
858369.
859
860(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
861File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
862)
863LaTeX Font Info: Trying to load font information for OT1+zplm on input line
864369.
865
866(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
867File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
868)
869LaTeX Font Info: Font shape `U/msa/m/n' will be
870(Font) scaled to size 12.50409pt on input line 369.
871LaTeX Font Info: Font shape `U/msa/m/n' will be
872(Font) scaled to size 9.37807pt on input line 369.
873LaTeX Font Info: Font shape `U/msa/m/n' will be
874(Font) scaled to size 7.29405pt on input line 369.
875LaTeX Font Info: Font shape `U/msb/m/n' will be
876(Font) scaled to size 12.50409pt on input line 369.
877LaTeX Font Info: Font shape `U/msb/m/n' will be
878(Font) scaled to size 9.37807pt on input line 369.
879LaTeX Font Info: Font shape `U/msb/m/n' will be
880(Font) scaled to size 7.29405pt on input line 369.
881LaTeX Font Info: Trying to load font information for U+rsfs on input line 36
8829.
883
884(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd
885File: ursfs.fd 1998/03/24 rsfs font definition file (jk)
886)
887
888LaTeX Warning: No \author given.
889
890LaTeX Font Info: Trying to load font information for TS1+ppl on input line 3
89187.
892(/usr/share/texmf-dist/tex/latex/psnfss/ts1ppl.fd
893File: ts1ppl.fd 2001/06/04 font definitions for TS1/ppl.
894)
895LaTeX Font Info: Font shape `U/msa/m/n' will be
896(Font) scaled to size 11.40997pt on input line 387.
897LaTeX Font Info: Font shape `U/msa/m/n' will be
898(Font) scaled to size 8.33606pt on input line 387.
899LaTeX Font Info: Font shape `U/msa/m/n' will be
900(Font) scaled to size 6.25204pt on input line 387.
901LaTeX Font Info: Font shape `U/msb/m/n' will be
902(Font) scaled to size 11.40997pt on input line 387.
903LaTeX Font Info: Font shape `U/msb/m/n' will be
904(Font) scaled to size 8.33606pt on input line 387.
905LaTeX Font Info: Font shape `U/msb/m/n' will be
906(Font) scaled to size 6.25204pt on input line 387.
907 [1
908
909{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
910LaTeX Font Info: Trying to load font information for U+fplmbb on input line
911454.
912
913(/usr/share/texmf-dist/tex/latex/psnfss/ufplmbb.fd
914File: ufplmbb.fd 2003/10/30 Fontinst v1.914 font definitions for U/fplmbb.
915)
916LaTeX Font Info: Trying to load font information for T1+cmtt on input line 4
91782.
918
919(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd
920File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
921)
922LaTeX Font Info: Font shape `U/msa/m/n' will be
923(Font) scaled to size 5.21004pt on input line 506.
924LaTeX Font Info: Font shape `U/msb/m/n' will be
925(Font) scaled to size 5.21004pt on input line 506.
926 [2] (./Homework4.aux)
927Package rerunfilecheck Info: File `Homework4.out' has not changed.
928(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0.
929 )
930Here is how much of TeX's memory you used:
931 21207 strings out of 479383
932 386260 string characters out of 5875798
933 695232 words of memory out of 5000000
934 37838 multiletter control sequences out of 15000+600000
935 440078 words of font info for 127 fonts, out of 8000000 for 9000
936 1141 hyphenation exceptions out of 8191
937 107i,14n,111p,874b,517s stack positions out of 5000i,500n,10000p,200000b,80000s
938{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/usr/share/t
939exmf-dist/fonts/enc/dvips/base/8r.enc}</usr/share/texmf-dist/fonts/type1/public
940/amsfonts/cm/cmex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c
941mmi10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr
942/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-d
943ist/fonts/type1/public/mathpazo/fplmbb.pfb></usr/share/texmf-dist/fonts/type1/p
944ublic/cm-super/sftt1095.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/upl
945b8a.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplr8a.pfb></usr/share/
946texmf-dist/fonts/type1/urw/palatino/uplri8a.pfb>
947Output written on Homework4.pdf (2 pages, 116266 bytes).
948PDF statistics:
949 65 PDF objects out of 1000 (max. 8388607)
950 51 compressed objects within 1 object stream
951 8 named destinations out of 1000 (max. 500000)
952 13 words of extra memory for PDF output out of 10000 (max. 10000000)
953
diff --git a/src/Homework4/Homework4.out b/src/Homework4/Homework4.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Homework4/Homework4.out
diff --git a/src/Homework4/Homework4.pdf b/src/Homework4/Homework4.pdf
new file mode 100644
index 0000000..ff8ecd2
--- /dev/null
+++ b/src/Homework4/Homework4.pdf
Binary files differ
diff --git a/src/Homework4/Homework4.tex b/src/Homework4/Homework4.tex
new file mode 100644
index 0000000..ada5be7
--- /dev/null
+++ b/src/Homework4/Homework4.tex
@@ -0,0 +1,530 @@
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{Mathematical Software - Homework 4}
150 \date{\textbf{Deadline:} Sunday, June 6}
151
152
153
154
155
156% Pygments definitions
157\makeatletter
158\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax%
159 \let\PY@ul=\relax \let\PY@tc=\relax%
160 \let\PY@bc=\relax \let\PY@ff=\relax}
161\def\PY@tok#1{\csname PY@tok@#1\endcsname}
162\def\PY@toks#1+{\ifx\relax#1\empty\else%
163 \PY@tok{#1}\expandafter\PY@toks\fi}
164\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{%
165 \PY@it{\PY@bf{\PY@ff{#1}}}}}}}
166\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}}
167
168\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}}
169\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
170\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}}
171\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
172\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
173\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}}
174\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
175\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
176\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
177\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
178\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
179\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
180\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}}
181\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
182\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}}
183\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}}
184\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}}
185\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}}
186\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
187\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
188\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
189\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
190\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}}
191\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}}
192\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}}
193\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
194\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
195\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
196\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
197\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}}
198\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
199\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}}
200\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}}
201\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit}
202\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf}
203\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
204\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}}
205\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
206\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}}}
207\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
208\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
209\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
210\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
211\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
212\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
213\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
214\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
215\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
216\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
217\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
218\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
219\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
220\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
221\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
222\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
223\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
224\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
225\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
226\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
227\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
228\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
229\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
230\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
231\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
232\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
233\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
234\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}}
235
236\def\PYZbs{\char`\\}
237\def\PYZus{\char`\_}
238\def\PYZob{\char`\{}
239\def\PYZcb{\char`\}}
240\def\PYZca{\char`\^}
241\def\PYZam{\char`\&}
242\def\PYZlt{\char`\<}
243\def\PYZgt{\char`\>}
244\def\PYZsh{\char`\#}
245\def\PYZpc{\char`\%}
246\def\PYZdl{\char`\$}
247\def\PYZhy{\char`\-}
248\def\PYZsq{\char`\'}
249\def\PYZdq{\char`\"}
250\def\PYZti{\char`\~}
251% for compatibility with earlier versions
252\def\PYZat{@}
253\def\PYZlb{[}
254\def\PYZrb{]}
255\makeatother
256
257
258 % For linebreaks inside Verbatim environment from package fancyvrb.
259 \makeatletter
260 \newbox\Wrappedcontinuationbox
261 \newbox\Wrappedvisiblespacebox
262 \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}}
263 \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}}
264 \newcommand*\Wrappedcontinuationindent {3ex }
265 \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox}
266 % Take advantage of the already applied Pygments mark-up to insert
267 % potential linebreaks for TeX processing.
268 % {, <, #, %, $, ' and ": go to next line.
269 % _, }, ^, &, >, - and ~: stay at end of broken line.
270 % Use of \textquotesingle for straight quote.
271 \newcommand*\Wrappedbreaksatspecials {%
272 \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}%
273 \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}%
274 \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}%
275 \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}%
276 \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}%
277 \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}%
278 \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}%
279 \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}%
280 \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}%
281 \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}%
282 \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}%
283 \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}%
284 \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}%
285 \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}%
286 }
287 % Some characters . , ; ? ! / are not pygmentized.
288 % This macro makes them "active" and they will insert potential linebreaks
289 \newcommand*\Wrappedbreaksatpunct {%
290 \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}%
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 \catcode`\.\active
298 \catcode`\,\active
299 \catcode`\;\active
300 \catcode`\:\active
301 \catcode`\?\active
302 \catcode`\!\active
303 \catcode`\/\active
304 \lccode`\~`\~
305 }
306 \makeatother
307
308 \let\OriginalVerbatim=\Verbatim
309 \makeatletter
310 \renewcommand{\Verbatim}[1][1]{%
311 %\parskip\z@skip
312 \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}%
313 \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}%
314 \def\FancyVerbFormatLine ##1{\hsize\linewidth
315 \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@
316 \doublehyphendemerits\z@\finalhyphendemerits\z@
317 \strut ##1\strut}%
318 }%
319 % If the linebreak is at a space, the latter will be displayed as visible
320 % space at end of first line, and a continuation symbol starts next line.
321 % Stretch/shrink are however usually zero for typewriter font.
322 \def\FV@Space {%
323 \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font
324 \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak}
325 {\kern\fontdimen2\font}%
326 }%
327
328 % Allow breaks at special characters using \PYG... macros.
329 \Wrappedbreaksatspecials
330 % Breaks at punctuation characters . , ; ? ! and / need catcode=\active
331 \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]%
332 }
333 \makeatother
334
335 % Exact colors from NB
336 \definecolor{incolor}{HTML}{303F9F}
337 \definecolor{outcolor}{HTML}{D84315}
338 \definecolor{cellborder}{HTML}{CFCFCF}
339 \definecolor{cellbackground}{HTML}{F7F7F7}
340
341 % prompt
342 \makeatletter
343 \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep}
344 \makeatother
345 \newcommand{\prompt}[4]{
346 \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip}
347 }
348
349
350
351 % Prevent overflowing lines due to hard-to-break entities
352 \sloppy
353 % Setup hyperref package
354 \hypersetup{
355 breaklinks=true, % so long urls are correctly broken across lines
356 colorlinks=true,
357 urlcolor=urlcolor,
358 linkcolor=linkcolor,
359 citecolor=citecolor,
360 }
361 % Slightly bigger margins than the latex defaults
362
363 \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in}
364
365
366
367\begin{document}
368
369 \maketitle
370
371
372
373
374 \emph{For this exercise you should have received this text in .ipynb
375format. Complete the exercises by modifying this file, and submit the
376modified version}
377
378 \textbf{Exercise 1 (6 points)}
379
380Use Sage to find the intersection points \emph{in the real plane} (that
381is, only those points such that \emph{both} coordinates are real
382numbers) of the following pairs of geometric objects:
383
384\begin{itemize}
385\tightlist
386\item
387 The circle of equation \(x^2 + y^2 = 4\) and the ellipse of equation
388 \(\left(\frac x2\right)^2 + (2y)^2 = 4\).
389\item
390 The circle of equation \(x^2 + y^2 = 4\) and the ellipse of equation
391 \(\left(\frac x2-2\right)^2 + (2y)^2 = 4\).
392\item
393 The curve of equation \(y^2 = x^3 -x +1\) and the horizontal line
394 \(y=10\).
395\item
396 The \(x\)-axis and the graph of the function
397 \(f(x)=\log(x) - e^{-x}\). \emph{Hint: \(f(x)\) has only one real
398 zero.}
399\end{itemize}
400
401
402\vspace{0.5cm}
403 \textbf{Exercise 2 (6 points)}
404
405\begin{enumerate}
406\def\labelenumi{(\alph{enumi})}
407\tightlist
408\item
409 Use Sage to compute
410\end{enumerate}
411
412\begin{itemize}
413\tightlist
414\item
415 the derivative
416\item
417 a primite (i.e.~integral)
418\item
419 the power series expansion around \(0\) up to order \(4\)
420\end{itemize}
421
422of the following functions:
423\begin{itemize}
424\item \(f(x) = e^x\)
425\item \(f(x) = \sin(x)\)
426\item \(f(x) = \cos(x)\)
427\item \(f(x) = \tan(x)\)
428\item \(f(x) = \log(1+x)\)
429\item \(f(x) = \sqrt[3]{1+x}\)
430\end{itemize}
431
432\begin{enumerate}
433\def\labelenumi{(\alph{enumi})}
434\setcounter{enumi}{1}
435\item
436 Use Sage to get the Latex code that represents the objects you
437 computed above.
438\item
439 Arrange the results of the previous points in a table in Latex. The
440 table should have 4 columns (function, derivative, integral, series)
441 and one row for each of the functions above. \emph{Note: when
442 including Latex in a Markdown cell in Jupyter you will not receive any
443 warning if you make mistakes; instead the Latex will simply not be
444 rendered and it will appear as plain text. If you have troubles making
445 this work you can send me a separate .tex (and .pdf) file.}
446\end{enumerate}
447
448
449\vspace{0.5cm}
450 \textbf{Exercise 3 (4 points)}
451
452The equation \begin{align*}
453y^2+x^{16}=1
454\end{align*} determines a closed curve in \(\mathbb R^2\) that looks
455like a rounded square. Determine the area of that shape, giving both an
456exact value (which might depend on some functions that Sage knows, but
457you don't) and an approximate value.
458
459
460\vspace{0.5cm}
461 \textbf{Exercise 4 (12 points)}
462
463A team of biologists is monitoring the population of river shrimps in
464the Alzette. At first they thought that the size \(P(t)\) of their
465population on day \(t\) would satisfy the differential equation
466\(P'(t)=P(t)/10\). However this does not work well with the data they
467have collected, so they now believe that the population of shrimps
468follows the formula \(P'(t)=P(t)/10-b\) for some value of \(b\) between
4691 and 100. They need your help here.
470
471\begin{enumerate}
472\def\labelenumi{(\alph{enumi})}
473\item
474 Using Sage, find a solution for the differential equation with initial
475 conditions \begin{align*}
476 \begin{cases}
477 P'(t)&=\frac{P(t)}{10}-b\\
478 P(1)&=1000
479 \end{cases}
480 \end{align*} where \(b\) is a generic constant.
481\item
482 The list \texttt{data} in the cell below contains the actual number of
483 shrimps that was measured every day from day \(1\) (the \(0\) at the
484 beginning is meaningless, but it will help to keep it there). Plot in
485 one single picture, possibly using different colors for each:
486\end{enumerate}
487
488\begin{itemize}
489\tightlist
490\item
491 The data as a bar chart.
492\item
493 A curve that interpolates the data, using one of the methods shown in
494 class.
495\item
496 The solution of the differential equation for \(b=0\).
497\item
498 The solution of the differential equation for a value of \(b\) of your
499 choice (\(1\leq b\leq 100\)) that fits the data better than \(b=0\).
500 \emph{(For this last point there is no right or wrong choice, just
501 pick one that looks good)}
502\end{itemize}
503
504 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
505\prompt{In}{incolor}{ }{\boxspacing}
506\begin{Verbatim}[commandchars=\\\{\}]
507\PY{n}{data} \PY{o}{=} \PY{p}{[}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{1000}\PY{p}{,} \PY{l+m+mi}{1123}\PY{p}{,} \PY{l+m+mi}{1223}\PY{p}{,} \PY{l+m+mi}{1190}\PY{p}{,} \PY{l+m+mi}{1432}\PY{p}{,} \PY{l+m+mi}{1553}\PY{p}{,} \PY{l+m+mi}{1709}\PY{p}{,} \PY{l+m+mi}{1826}\PY{p}{,} \PY{l+m+mi}{1980}\PY{p}{,} \PY{l+m+mi}{2146}\PY{p}{,} \PY{l+m+mi}{2172}\PY{p}{,} \PY{l+m+mi}{2383}\PY{p}{,} \PY{l+m+mi}{2588}\PY{p}{,} \PY{l+m+mi}{2822}\PY{p}{,} \PY{l+m+mi}{3401}\PY{p}{,} \PY{l+m+mi}{3330}\PY{p}{,} \PY{l+m+mi}{4157}\PY{p}{,} \PY{l+m+mi}{3994}\PY{p}{,} \PY{l+m+mi}{4995}\PY{p}{,} \PY{l+m+mi}{5392}\PY{p}{,} \PY{l+m+mi}{5910}\PY{p}{,} \PY{l+m+mi}{6468}\PY{p}{,} \PY{l+m+mi}{7128}\PY{p}{,} \PY{l+m+mi}{7325}\PY{p}{,} \PY{l+m+mi}{7984}\PY{p}{,} \PY{l+m+mi}{9634}\PY{p}{,} \PY{l+m+mi}{10473}\PY{p}{,} \PY{l+m+mi}{11761}\PY{p}{,} \PY{l+m+mi}{12777}\PY{p}{]}
508\end{Verbatim}
509\end{tcolorbox}
510
511\vspace{0.5cm}
512 \textbf{Grading}
513
514This homework assignment is worth \(28\) (\(24+4\)) points, distributed
515as described above.
516
517Your final grade for the course will be the total of points you obtained
518(notice that the maximum is \(20+20+16+28=84\)) divided by \(4\),
519rounded to the nearest integer. More precisely
520
521\begin{align*}
522\operatorname{grade} = \operatorname{min}\left(20, \left\lfloor \frac{\operatorname{total}}{4} + 0.5\right\rfloor\right)
523\end{align*}
524
525
526 % Add a bibliography block to the postdoc
527
528
529
530\end{document}
diff --git a/src/Lecture1/live/live.aux b/src/Lecture1/live/live.aux
new file mode 100644
index 0000000..dc9657e
--- /dev/null
+++ b/src/Lecture1/live/live.aux
@@ -0,0 +1,9 @@
1\relax
2\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}\protected@file@percent }
3\@writefile{toc}{\contentsline {section}{\numberline {2}Text}{1}\protected@file@percent }
4\@writefile{toc}{\contentsline {section}{\numberline {3}Math mode}{1}\protected@file@percent }
5\newlabel{eq}{{1}{1}}
6\@writefile{toc}{\contentsline {section}{\numberline {4}Environments}{1}\protected@file@percent }
7\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Lists}{1}\protected@file@percent }
8\newlabel{subsectionLists}{{4.1}{1}}
9\@writefile{toc}{\contentsline {section}{\numberline {5}Last section}{2}\protected@file@percent }
diff --git a/src/Lecture1/live/live.log b/src/Lecture1/live/live.log
new file mode 100644
index 0000000..8a3bb6e
--- /dev/null
+++ b/src/Lecture1/live/live.log
@@ -0,0 +1,249 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2021.5.20) 25 MAY 2021 16:11
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**live.tex
6(./live.tex
7LaTeX2e <2020-02-02> patch level 2
8L3 programming layer <2020-02-14>
9(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2019/12/20 v1.4l Standard LaTeX document class
11(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo
12File: size10.clo 2019/12/20 v1.4l Standard LaTeX file (size option)
13)
14\c@part=\count167
15\c@section=\count168
16\c@subsection=\count169
17\c@subsubsection=\count170
18\c@paragraph=\count171
19\c@subparagraph=\count172
20\c@figure=\count173
21\c@table=\count174
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen134
25)
26(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2018/08/11 v1.3c Input encoding file
28\inpenc@prehook=\toks14
29\inpenc@posthook=\toks15
30)
31(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/01/20 v2.17e AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks16
42\ex@=\dimen135
43))
44(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen136
47)
48(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count175
52LaTeX Info: Redefining \frac on input line 227.
53\uproot@=\count176
54\leftroot@=\count177
55LaTeX Info: Redefining \overline on input line 389.
56\classnum@=\count178
57\DOTSCASE@=\count179
58LaTeX Info: Redefining \ldots on input line 486.
59LaTeX Info: Redefining \dots on input line 489.
60LaTeX Info: Redefining \cdots on input line 610.
61\Mathstrutbox@=\box45
62\strutbox@=\box46
63\big@size=\dimen137
64LaTeX Font Info: Redeclaring font encoding OML on input line 733.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 734.
66\macc@depth=\count180
67\c@MaxMatrixCols=\count181
68\dotsspace@=\muskip16
69\c@parentequation=\count182
70\dspbrk@lvl=\count183
71\tag@help=\toks17
72\row@=\count184
73\column@=\count185
74\maxfields@=\count186
75\andhelp@=\toks18
76\eqnshift@=\dimen138
77\alignsep@=\dimen139
78\tagshift@=\dimen140
79\tagwidth@=\dimen141
80\totwidth@=\dimen142
81\lineht@=\dimen143
82\@envbody=\toks19
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks20
86LaTeX Info: Redefining \[ on input line 2859.
87LaTeX Info: Redefining \] on input line 2860.
88)
89(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
101Package: amsthm 2017/10/31 v2.20.4
102\thm@style=\toks21
103\thm@bodyfont=\toks22
104\thm@headfont=\toks23
105\thm@notefont=\toks24
106\thm@headpunct=\toks25
107\thm@preskip=\skip52
108\thm@postskip=\skip53
109\thm@headsep=\skip54
110\dth@everypar=\toks26
111)
112(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
113Package: geometry 2020/01/02 v5.9 Page Geometry
114
115(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
116Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
117\KV@toks@=\toks27
118)
119(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
120Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
121
122(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
123Package: iftex 2019/11/07 v1.0c TeX engine tests
124))
125\Gm@cnth=\count187
126\Gm@cntv=\count188
127\c@Gm@tempcnt=\count189
128\Gm@bindingoffset=\dimen144
129\Gm@wd@mp=\dimen145
130\Gm@odd@mp=\dimen146
131\Gm@even@mp=\dimen147
132\Gm@layoutwidth=\dimen148
133\Gm@layoutheight=\dimen149
134\Gm@layouthoffset=\dimen150
135\Gm@layoutvoffset=\dimen151
136\Gm@dimlist=\toks28
137)
138(/usr/share/texlive/texmf-dist/tex/latex/enumitem/enumitem.sty
139Package: enumitem 2019/06/20 v3.9 Customized lists
140\labelindent=\skip55
141\enit@outerparindent=\dimen152
142\enit@toks=\toks29
143\enit@inbox=\box47
144\enit@count@id=\count190
145\enitdp@description=\count191
146)
147\c@mythm=\count192
148
149(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def
150File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode
151\l__kernel_color_stack_int=\count193
152\l__pdf_internal_box=\box48
153)
154(./live.aux)
155\openout1 = `live.aux'.
156
157LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 29.
158LaTeX Font Info: ... okay on input line 29.
159LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 29.
160LaTeX Font Info: ... okay on input line 29.
161LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 29.
162LaTeX Font Info: ... okay on input line 29.
163LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 29.
164LaTeX Font Info: ... okay on input line 29.
165LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 29.
166LaTeX Font Info: ... okay on input line 29.
167LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 29.
168LaTeX Font Info: ... okay on input line 29.
169LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 29.
170LaTeX Font Info: ... okay on input line 29.
171
172*geometry* driver: auto-detecting
173*geometry* detected driver: pdftex
174*geometry* verbose mode - [ preamble ] result:
175* driver: pdftex
176* paper: a4paper
177* layout: <same size as paper>
178* layoutoffset:(h,v)=(0.0pt,0.0pt)
179* modes:
180* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt)
181* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt)
182* \paperwidth=597.50787pt
183* \paperheight=845.04684pt
184* \textwidth=483.69687pt
185* \textheight=731.23584pt
186* \oddsidemargin=-15.36449pt
187* \evensidemargin=-15.36449pt
188* \topmargin=-52.36449pt
189* \headheight=12.0pt
190* \headsep=25.0pt
191* \topskip=10.0pt
192* \footskip=30.0pt
193* \marginparwidth=57.0pt
194* \marginparsep=11.0pt
195* \columnsep=10.0pt
196* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
197* \hoffset=0.0pt
198* \voffset=0.0pt
199* \mag=1000
200* \@twocolumnfalse
201* \@twosidefalse
202* \@mparswitchfalse
203* \@reversemarginfalse
204* (1in=72.27pt=25.4mm, 1cm=28.453pt)
205
206LaTeX Font Info: Trying to load font information for U+msa on input line 31.
207
208(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
209File: umsa.fd 2013/01/14 v3.01 AMS symbols A
210)
211LaTeX Font Info: Trying to load font information for U+msb on input line 31.
212
213
214(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
215File: umsb.fd 2013/01/14 v3.01 AMS symbols B
216) [1
217
218{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] [2] (./live.aux) )
219Here is how much of TeX's memory you used:
220 2503 strings out of 481239
221 33566 string characters out of 5920377
222 277759 words of memory out of 5000000
223 17776 multiletter control sequences out of 15000+600000
224 541181 words of font info for 58 fonts, out of 8000000 for 9000
225 1141 hyphenation exceptions out of 8191
226 30i,9n,27p,221b,289s stack positions out of 5000i,500n,10000p,200000b,80000s
227 </home/
228sebastiano/.texlive2019/texmf-var/fonts/pk/ljfour/jknappen/ec/tcrm1000.600pk></
229usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/sh
230are/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/share/te
231xlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/texlive/
232texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texlive/texmf-
233dist/fonts/type1/public/amsfonts/cm/cmmi5.pfb></usr/share/texlive/texmf-dist/fo
234nts/type1/public/amsfonts/cm/cmmi7.pfb></usr/share/texlive/texmf-dist/fonts/typ
235e1/public/amsfonts/cm/cmr10.pfb></usr/share/texlive/texmf-dist/fonts/type1/publ
236ic/amsfonts/cm/cmr12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsf
237onts/cm/cmr17.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm
238/cmr5.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pf
239b></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></us
240r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr/share
241/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/share/texli
242ve/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb>
243Output written on live.pdf (2 pages, 148821 bytes).
244PDF statistics:
245 76 PDF objects out of 1000 (max. 8388607)
246 55 compressed objects within 1 object stream
247 0 named destinations out of 1000 (max. 500000)
248 1 words of extra memory for PDF output out of 10000 (max. 10000000)
249
diff --git a/src/Lecture1/live/live.pdf b/src/Lecture1/live/live.pdf
new file mode 100644
index 0000000..dc63cf8
--- /dev/null
+++ b/src/Lecture1/live/live.pdf
Binary files differ
diff --git a/src/Lecture1/live/live.tex b/src/Lecture1/live/live.tex
new file mode 100644
index 0000000..8ce8823
--- /dev/null
+++ b/src/Lecture1/live/live.tex
@@ -0,0 +1,168 @@
1\documentclass[10pt,a4paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage{amsthm}
7\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
8
9\usepackage{enumitem}
10\title{Latex Example Live}
11\author{Sebastiano Tronto}
12\date{20-02-2021}
13
14\newcommand{\reals}{\mathbb{R}}
15\DeclareMathOperator{\sinus}{sinus}
16
17
18\newtheorem{mythm}{My Theorem}[section]
19
20\theoremstyle{definition}
21\newtheorem{prop}[mythm]{Proposition}
22
23\theoremstyle{remark}
24\newtheorem*{warning}{Achtung}
25
26
27
28
29\begin{document}
30
31\maketitle
32
33\section{Introduction}
34
35Hello, world!
36
37This is a comment
38
39\section{Text}
40
41\textbf{This sentence is in boldface}
42
43\underline{\textit{italicized} maybe in a sentence \textbf{something}}
44
45\underline{\textit{one inside the other}}
46
47\emph{also italicized???}
48
49This is an important sentence, maybe a quote or something, and this \emph{word} is very important. Let's make this sentence longer than one line.
50
51{\Huge Large words}
52
53%\appendix
54
55\section{Math mode}
56
57This is an inline formula \( \sum_i \frac{i}{22} \), it appears within the text
58
59This is a displaystyle formula \[ \sum_{\alpha=0}^{2^{10}} \frac2 \alpha{22} \] it appears on its own line
60
61How sqrt works: \( \sqrt[\phi]{25} \)
62
63
64
65\begin{align}
66\label{eq}
67e^x &= \left(\sum_{i=0}^\infty \frac{x^i}{i!} \right) = \\
68&= \left( 1 + x + \frac{x^2}2 \right)+ \frac{x^3}{6} + \cdots \nonumber
69\end{align}
70
71\[
72 \left\{ x \in \reals \quad \text{such that} \quad \frac{ \sinus(x)}{x^2}>0 \right\}\reals
73\]
74
75\[ \sum_i \]
76
77The first equation we wrote is \eqref{eq}
78
79\section{Environments}
80
81\subsection{Lists}
82\label{subsectionLists}
83
84\begin{itemize}
85 \item One \textbf{item}
86 \item Another \(2+2=4\)
87 \item a third one \[\sum_{i=0}^n\]
88 \item A sublist:
89 \begin{itemize}
90 \item[+] First subitem
91 \item[+] and so on
92 \end{itemize}
93 \item Again in the main list
94\end{itemize}
95
96\begin{enumerate}[label=\Roman*]
97 \item One
98 \item Two
99 \item Actually three
100 \item Three (or not)
101\end{enumerate}
102
103\subsection*{Tables}
104
105Let's write a table:
106
107\vspace{1cm}
108\begin{tabular}{r||l|c}
109\hline
110This is a table & second column & third column \\
111\hline
112Things & a & \( 2+2 = 4 \)\\
113\hline
114more things & b & c
115\end{tabular}
116
117\vspace{1cm}
118\[
119 \left(\begin{array}{cc}
120 \int_0^1 e^x & \frac{2}{25} \\
121 0 & 0 \\
122 1111 & 234\alpha
123 \end{array}\right)
124\]
125
126\[
127 \begin{pmatrix}
128 \int_0^1 e^x & \frac{2}{25} \\
129 0 & 0 \\
130 1111 & 234\alpha
131 \end{pmatrix}
132\]
133
134\[
135\begin{pmatrix}
1361 & 2\\
1373 & 4
138\end{pmatrix}
139\overset{L2\rightarrow L2+L3}\longrightarrow
140\begin{pmatrix}
1411 & 2\\
1424 & 6
143\end{pmatrix}
144\]
145
146\section{Last section}
147
148In section \ref{subsectionLists} we saw how to write lists
149
150\begin{mythm}[Gauss]
151The equation \(2+x=4\) is true for \(x=2\).
152\end{mythm}
153
154\begin{prop}
155A less important fact
156\end{prop}
157
158\setcounter{mythm}{\arabic{mythm}+100}
159\begin{mythm}
160Another important fact.
161\end{mythm}
162
163\begin{warning}
164It is a common mistake to think that \(2+2=5\)
165\end{warning}
166\[\binom45\]
167
168\end{document} \ No newline at end of file
diff --git a/src/Lecture1/slides/1-Introduction.aux b/src/Lecture1/slides/1-Introduction.aux
new file mode 100644
index 0000000..58cf970
--- /dev/null
+++ b/src/Lecture1/slides/1-Introduction.aux
@@ -0,0 +1,58 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand{\transparent@use}[1]{}
4\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
5\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
6\global\let\oldcontentsline\contentsline
7\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
8\global\let\oldnewlabel\newlabel
9\gdef\newlabel#1#2{\newlabelxx{#1}#2}
10\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
11\AtEndDocument{\ifx\hyper@anchor\@undefined
12\let\contentsline\oldcontentsline
13\let\newlabel\oldnewlabel
14\fi}
15\fi}
16\global\let\hyper@last\relax
17\gdef\HyperFirstAtBeginDocument#1{#1}
18\providecommand\HyField@AuxAddToFields[1]{}
19\providecommand\HyField@AuxAddToCoFields[2]{}
20\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
21\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
22\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}}
23\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}}
24\@writefile{toc}{\beamer@sectionintoc {1}{What?}{3}{0}{1}}
25\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{2}}}
26\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{2}}}
27\@writefile{nav}{\headcommand {\sectionentry {1}{What?}{3}{What?}{0}}}
28\@writefile{nav}{\headcommand {\slideentry {1}{0}{1}{3/3}{}{0}}}
29\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}}
30\@writefile{toc}{\beamer@subsectionintoc {1}{1}{Latex}{4}{0}{1}}
31\@writefile{nav}{\headcommand {\beamer@subsectionpages {3}{3}}}
32\@writefile{nav}{\headcommand {\beamer@subsectionentry {0}{1}{1}{4}{Latex}}}
33\@writefile{nav}{\headcommand {\slideentry {1}{1}{1}{4/4}{Latex}{0}}}
34\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}}
35\@writefile{nav}{\headcommand {\slideentry {1}{1}{2}{5/5}{Latex}{0}}}
36\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}}
37\@writefile{toc}{\beamer@subsectionintoc {1}{2}{Sage}{6}{0}{1}}
38\@writefile{nav}{\headcommand {\beamer@subsectionpages {4}{5}}}
39\@writefile{nav}{\headcommand {\beamer@subsectionentry {0}{1}{2}{6}{Sage}}}
40\@writefile{nav}{\headcommand {\slideentry {1}{2}{1}{6/6}{Sage}{0}}}
41\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}}
42\@writefile{toc}{\beamer@sectionintoc {2}{When?}{7}{0}{2}}
43\@writefile{nav}{\headcommand {\beamer@sectionpages {3}{6}}}
44\@writefile{nav}{\headcommand {\beamer@subsectionpages {6}{6}}}
45\@writefile{nav}{\headcommand {\sectionentry {2}{When?}{7}{When?}{0}}}
46\@writefile{nav}{\headcommand {\slideentry {2}{0}{1}{7/7}{}{0}}}
47\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}}
48\@writefile{toc}{\beamer@sectionintoc {3}{How?}{8}{0}{3}}
49\@writefile{nav}{\headcommand {\beamer@sectionpages {7}{7}}}
50\@writefile{nav}{\headcommand {\beamer@subsectionpages {7}{7}}}
51\@writefile{nav}{\headcommand {\sectionentry {3}{How?}{8}{How?}{0}}}
52\@writefile{nav}{\headcommand {\slideentry {3}{0}{1}{8/8}{}{0}}}
53\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}}
54\@writefile{nav}{\headcommand {\beamer@partpages {1}{8}}}
55\@writefile{nav}{\headcommand {\beamer@subsectionpages {8}{8}}}
56\@writefile{nav}{\headcommand {\beamer@sectionpages {8}{8}}}
57\@writefile{nav}{\headcommand {\beamer@documentpages {8}}}
58\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {8}}}
diff --git a/src/Lecture1/slides/1-Introduction.log b/src/Lecture1/slides/1-Introduction.log
new file mode 100644
index 0000000..269c73d
--- /dev/null
+++ b/src/Lecture1/slides/1-Introduction.log
@@ -0,0 +1,1126 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2021.5.20) 25 MAY 2021 16:09
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**1-Introduction.tex
6(./1-Introduction.tex
7LaTeX2e <2020-02-02> patch level 2
8L3 programming layer <2020-02-14>
9(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
10Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations
11(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
12(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
13Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW)
14\etb@tempcnta=\count167
15)
16\beamer@tempbox=\box45
17\beamer@tempcount=\count168
18\c@beamerpauses=\count169
19
20(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
21\beamer@slideinframe=\count170
22\beamer@minimum=\count171
23\beamer@decode@box=\box46
24)
25\beamer@commentbox=\box47
26\beamer@modecount=\count172
27)
28(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
29Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead.
30
31(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
32Package: iftex 2019/11/07 v1.0c TeX engine tests
33))
34\headdp=\dimen134
35\footheight=\dimen135
36\sidebarheight=\dimen136
37\beamer@tempdim=\dimen137
38\beamer@finalheight=\dimen138
39\beamer@animht=\dimen139
40\beamer@animdp=\dimen140
41\beamer@animwd=\dimen141
42\beamer@leftmargin=\dimen142
43\beamer@rightmargin=\dimen143
44\beamer@leftsidebar=\dimen144
45\beamer@rightsidebar=\dimen145
46\beamer@boxsize=\dimen146
47\beamer@vboxoffset=\dimen147
48\beamer@descdefault=\dimen148
49\beamer@descriptionwidth=\dimen149
50\beamer@lastskip=\skip47
51\beamer@areabox=\box48
52\beamer@animcurrent=\box49
53\beamer@animshowbox=\box50
54\beamer@sectionbox=\box51
55\beamer@logobox=\box52
56\beamer@linebox=\box53
57\beamer@sectioncount=\count173
58\beamer@subsubsectionmax=\count174
59\beamer@subsectionmax=\count175
60\beamer@sectionmax=\count176
61\beamer@totalheads=\count177
62\beamer@headcounter=\count178
63\beamer@partstartpage=\count179
64\beamer@sectionstartpage=\count180
65\beamer@subsectionstartpage=\count181
66\beamer@animationtempa=\count182
67\beamer@animationtempb=\count183
68\beamer@xpos=\count184
69\beamer@ypos=\count185
70\beamer@ypos@offset=\count186
71\beamer@showpartnumber=\count187
72\beamer@currentsubsection=\count188
73\beamer@coveringdepth=\count189
74\beamer@sectionadjust=\count190
75\beamer@tocsectionnumber=\count191
76
77(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
78(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
79Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
80\KV@toks@=\toks14
81))
82\beamer@paperwidth=\skip48
83\beamer@paperheight=\skip49
84
85(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
86Package: geometry 2020/01/02 v5.9 Page Geometry
87
88(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
89Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
90)
91\Gm@cnth=\count192
92\Gm@cntv=\count193
93\c@Gm@tempcnt=\count194
94\Gm@bindingoffset=\dimen150
95\Gm@wd@mp=\dimen151
96\Gm@odd@mp=\dimen152
97\Gm@even@mp=\dimen153
98\Gm@layoutwidth=\dimen154
99\Gm@layoutheight=\dimen155
100\Gm@layouthoffset=\dimen156
101\Gm@layoutvoffset=\dimen157
102\Gm@dimlist=\toks15
103)
104(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
105File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option)
106)
107(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
108(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
109Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR)
110
111(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
112Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR)
113
114(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
115Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
116)
117(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
118File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
119)
120Package graphics Info: Driver file: pdftex.def on input line 105.
121
122(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
123File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
124))
125\Gin@req@height=\dimen158
126\Gin@req@width=\dimen159
127)
128(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
129(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
130(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
131\pgfutil@everybye=\toks16
132\pgfutil@tempdima=\dimen160
133\pgfutil@tempdimb=\dimen161
134
135(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t
136ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
137\pgfutil@abb=\box54
138(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty
139Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS)
140))
141(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
142(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex)
143Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b)
144))
145(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
146Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b)
147
148(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
149\pgfkeys@pathtoks=\toks17
150\pgfkeys@temptoks=\toks18
151
152(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t
153ex
154\pgfkeys@tmptoks=\toks19
155))
156\pgf@x=\dimen162
157\pgf@y=\dimen163
158\pgf@xa=\dimen164
159\pgf@ya=\dimen165
160\pgf@xb=\dimen166
161\pgf@yb=\dimen167
162\pgf@xc=\dimen168
163\pgf@yc=\dimen169
164\pgf@xd=\dimen170
165\pgf@yd=\dimen171
166\w@pgf@writea=\write3
167\r@pgf@reada=\read2
168\c@pgf@counta=\count195
169\c@pgf@countb=\count196
170\c@pgf@countc=\count197
171\c@pgf@countd=\count198
172\t@pgf@toka=\toks20
173\t@pgf@tokb=\toks21
174\t@pgf@tokc=\toks22
175\pgf@sys@id@count=\count199
176 (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
177File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b)
178)
179Driver file for pgf: pgfsys-pdftex.def
180
181(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
182File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b)
183
184(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de
185f
186File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b)
187)))
188(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.
189tex
190File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b)
191\pgfsyssoftpath@smallbuffer@items=\count266
192\pgfsyssoftpath@bigbuffer@items=\count267
193)
194(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.
195tex
196File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b)
197)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
198Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
199
200(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
201File: color.cfg 2016/01/02 v1.6 sample color configuration
202)
203Package xcolor Info: Driver file: pdftex.def on input line 225.
204Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
205Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
206Package xcolor Info: Model `RGB' extended on input line 1364.
207Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
208Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
209Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
210Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
211Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
212Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
213)
214(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
215Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b)
216
217(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
218(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
219(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
220(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
221\pgfmath@dimen=\dimen172
222\pgfmath@count=\count268
223\pgfmath@box=\box55
224\pgfmath@toks=\toks23
225\pgfmath@stack@operand=\toks24
226\pgfmath@stack@operation=\toks25
227)
228(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
229(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code
230.tex)
231(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet
232ric.code.tex)
233(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod
234e.tex)
235(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison
236.code.tex)
237(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.
238tex)
239(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code
240.tex)
241(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.
242tex)
243(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari
244thmetics.code.tex)))
245(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
246\c@pgfmathroundto@lastzeros=\count269
247))
248(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
249(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te
250x
251File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b)
252\pgf@picminx=\dimen173
253\pgf@picmaxx=\dimen174
254\pgf@picminy=\dimen175
255\pgf@picmaxy=\dimen176
256\pgf@pathminx=\dimen177
257\pgf@pathmaxx=\dimen178
258\pgf@pathminy=\dimen179
259\pgf@pathmaxy=\dimen180
260\pgf@xx=\dimen181
261\pgf@xy=\dimen182
262\pgf@yx=\dimen183
263\pgf@yy=\dimen184
264\pgf@zx=\dimen185
265\pgf@zy=\dimen186
266)
267(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.
268code.tex
269File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b)
270\pgf@path@lastx=\dimen187
271\pgf@path@lasty=\dimen188
272)
273(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code
274.tex
275File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
276\pgf@shorten@end@additional=\dimen189
277\pgf@shorten@start@additional=\dimen190
278)
279(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te
280x
281File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
282\pgfpic=\box56
283\pgf@hbox=\box57
284\pgf@layerbox@main=\box58
285\pgf@picture@serial@count=\count270
286)
287(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c
288ode.tex
289File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b)
290\pgflinewidth=\dimen191
291)
292(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation
293s.code.tex
294File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b)
295\pgf@pt@x=\dimen192
296\pgf@pt@y=\dimen193
297\pgf@pt@temp=\dimen194
298)
299(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
300File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b)
301)
302(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t
303ex
304File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b)
305)
306(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing
307.code.tex
308File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b)
309)
310(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te
311x
312File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b)
313\pgfarrowsep=\dimen195
314)
315(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
316File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b)
317\pgf@max=\dimen196
318\pgf@sys@shading@range@num=\count271
319\pgf@shadingcount=\count272
320)
321(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
322File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
323
324(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.
325tex
326File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b)
327\pgfexternal@startupbox=\box59
328))
329(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te
330x
331File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
332)
333(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c
334ode.tex
335File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b)
336)
337(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.
338tex
339File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b)
340)
341(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
342File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b)
343))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
344Package: xxcolor 2003/10/24 ver 0.1
345\XC@nummixins=\count273
346\XC@countmixins=\count274
347)
348(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
349Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO)
350
351(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
352Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
353)
354(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
355Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO)
356))
357(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
358Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX
359
360(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty
361Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO
362)
363Package pdftexcmds Info: \pdf@primitive is available.
364Package pdftexcmds Info: \pdf@ifprimitive is available.
365Package pdftexcmds Info: \pdfdraftmode found.
366)
367(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
368Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
369)
370(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
371Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
372)
373(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
374Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
375)
376(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
377Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
378)
379(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
380Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
381)
382(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
383Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
384)
385(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
386Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO)
387)
388\@linkdim=\dimen197
389\Hy@linkcounter=\count275
390\Hy@pagecounter=\count276
391
392(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
393File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO)
394Now handling font encoding PD1 ...
395... no UTF-8 mapping file for font encoding PD1
396)
397(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
398Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
399)
400(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
401Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
402)
403\Hy@SavedSpaceFactor=\count277
404\pdfmajorversion=\count278
405Package hyperref Info: Option `bookmarks' set `true' on input line 4421.
406Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421.
407Package hyperref Info: Option `implicit' set `false' on input line 4421.
408Package hyperref Info: Hyper figures OFF on input line 4547.
409Package hyperref Info: Link nesting OFF on input line 4552.
410Package hyperref Info: Hyper index ON on input line 4555.
411Package hyperref Info: Plain pages OFF on input line 4562.
412Package hyperref Info: Backreferencing OFF on input line 4567.
413Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals.
414Package hyperref Info: Bookmarks ON on input line 4800.
415\c@Hy@tempcnt=\count279
416
417(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty
418\Urlmuskip=\muskip16
419Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
420)
421LaTeX Info: Redefining \url on input line 5159.
422\XeTeXLinkMargin=\dimen198
423
424(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
425Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
426
427(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
428Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
429)
430))
431\Fld@menulength=\count280
432\Field@Width=\dimen199
433\Fld@charsize=\dimen256
434Package hyperref Info: Hyper figures OFF on input line 6430.
435Package hyperref Info: Link nesting OFF on input line 6435.
436Package hyperref Info: Hyper index ON on input line 6438.
437Package hyperref Info: backreferencing OFF on input line 6445.
438Package hyperref Info: Link coloring OFF on input line 6450.
439Package hyperref Info: Link coloring with OCG OFF on input line 6455.
440Package hyperref Info: PDF/A mode OFF on input line 6460.
441LaTeX Info: Redefining \ref on input line 6500.
442LaTeX Info: Redefining \pageref on input line 6504.
443\Hy@abspage=\count281
444
445
446Package hyperref Message: Stopped early.
447
448)
449Package hyperref Info: Driver (autodetected): hpdftex.
450 (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
451File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX
452
453(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
454Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO)
455)
456\Fld@listcount=\count282
457\c@bookmark@seq@number=\count283
458
459(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
460Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
461
462(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
463Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
464)
465Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
46686.
467))
468(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
469(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty)
470(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
471(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
472Package: amssymb 2013/01/14 v3.01 AMS font symbols
473
474(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
475Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
476\@emptytoks=\toks26
477\symAMSa=\mathgroup4
478\symAMSb=\mathgroup5
479LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
480LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
481(Font) U/euf/m/n --> U/euf/b/n on input line 106.
482))
483(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
484Package: sansmathaccent 2020/01/31
485
486(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
487Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files)
488)))
489(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
490(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
491Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX
492))
493(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty)
494(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty)
495(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
496\beamer@argscount=\count284
497\beamer@lastskipcover=\skip50
498\beamer@trivlistdepth=\count285
499)
500(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty)
501(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
502\c@lecture=\count286
503\c@part=\count287
504\c@section=\count288
505\c@subsection=\count289
506\c@subsubsection=\count290
507)
508(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
509\beamer@framebox=\box60
510\beamer@frametitlebox=\box61
511\beamer@zoombox=\box62
512\beamer@zoomcount=\count291
513\beamer@zoomframecount=\count292
514\beamer@frametextheight=\dimen257
515\c@subsectionslide=\count293
516\beamer@frametopskip=\skip51
517\beamer@framebottomskip=\skip52
518\beamer@frametopskipautobreak=\skip53
519\beamer@framebottomskipautobreak=\skip54
520\beamer@envbody=\toks27
521\framewidth=\dimen258
522\c@framenumber=\count294
523)
524(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
525\beamer@verbatimfileout=\write4
526)
527(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
528\beamer@splitbox=\box63
529\beamer@autobreakcount=\count295
530\beamer@autobreaklastheight=\dimen259
531\beamer@frametitletoks=\toks28
532\beamer@framesubtitletoks=\toks29
533)
534(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
535\beamer@footins=\box64
536)
537(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty)
538(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
539\beamer@frameboxcopy=\box65
540)
541(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty)
542(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
543\beamer@sbttoks=\toks30
544
545(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
546(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
547\bmb@box=\box66
548\bmb@colorbox=\box67
549\bmb@boxshadow=\box68
550\bmb@boxshadowball=\box69
551\bmb@boxshadowballlarge=\box70
552\bmb@temp=\dimen260
553\bmb@dima=\dimen261
554\bmb@dimb=\dimen262
555\bmb@prevheight=\dimen263
556)
557\beamer@blockheadheight=\dimen264
558))
559(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
560(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
561Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
562\@enLab=\toks31
563)
564\c@figure=\count296
565\c@table=\count297
566\abovecaptionskip=\skip55
567\belowcaptionskip=\skip56
568)
569(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
570\beamer@section@min@dim=\dimen265
571)
572(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
573(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
574Package: amsmath 2020/01/20 v2.17e AMS math features
575\@mathmargin=\skip57
576
577For additional information on amsmath, use the `?' option.
578(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
579Package: amstext 2000/06/29 v2.01 AMS text
580
581(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
582File: amsgen.sty 1999/11/30 v2.0 generic functions
583\@emptytoks=\toks32
584\ex@=\dimen266
585))
586(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
587Package: amsbsy 1999/11/29 v1.2d Bold Symbols
588\pmbraise@=\dimen267
589)
590(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
591Package: amsopn 2016/03/08 v2.02 operator names
592)
593\inf@bad=\count298
594LaTeX Info: Redefining \frac on input line 227.
595\uproot@=\count299
596\leftroot@=\count300
597LaTeX Info: Redefining \overline on input line 389.
598\classnum@=\count301
599\DOTSCASE@=\count302
600LaTeX Info: Redefining \ldots on input line 486.
601LaTeX Info: Redefining \dots on input line 489.
602LaTeX Info: Redefining \cdots on input line 610.
603\Mathstrutbox@=\box71
604\strutbox@=\box72
605\big@size=\dimen268
606LaTeX Font Info: Redeclaring font encoding OML on input line 733.
607LaTeX Font Info: Redeclaring font encoding OMS on input line 734.
608\macc@depth=\count303
609\c@MaxMatrixCols=\count304
610\dotsspace@=\muskip17
611\c@parentequation=\count305
612\dspbrk@lvl=\count306
613\tag@help=\toks33
614\row@=\count307
615\column@=\count308
616\maxfields@=\count309
617\andhelp@=\toks34
618\eqnshift@=\dimen269
619\alignsep@=\dimen270
620\tagshift@=\dimen271
621\tagwidth@=\dimen272
622\totwidth@=\dimen273
623\lineht@=\dimen274
624\@envbody=\toks35
625\multlinegap=\skip58
626\multlinetaggap=\skip59
627\mathdisplay@stack=\toks36
628LaTeX Info: Redefining \[ on input line 2859.
629LaTeX Info: Redefining \] on input line 2860.
630)
631(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
632Package: amsthm 2017/10/31 v2.20.4
633\thm@style=\toks37
634\thm@bodyfont=\toks38
635\thm@headfont=\toks39
636\thm@notefont=\toks40
637\thm@headpunct=\toks41
638\thm@preskip=\skip60
639\thm@postskip=\skip61
640\thm@headsep=\skip62
641\dth@everypar=\toks42
642)
643\c@theorem=\count310
644)
645(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty))
646(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
647(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty)
648(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty)
649(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
650\beamer@dima=\dimen275
651\beamer@dimb=\dimen276
652)
653(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty)))
654(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty
655(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty)
656(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty)
657(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty)
658(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty))
659(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
660Package: inputenc 2018/08/11 v1.3c Input encoding file
661\inpenc@prehook=\toks43
662\inpenc@posthook=\toks44
663)
664(/usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
665Package: svg 2020/01/13 v2.02e (include SVG pictures)
666
667(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
668Package: scrbase 2020/01/24 v3.29 KOMA-Script package (KOMA-Script-independent
669basics and keyval usage)
670)
671(/usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
672Package: shellesc 2019/11/08 v1.0c unified shell escape interface for LaTeX
673Package shellesc Info: Unrestricted shell escape enabled on input line 75.
674)
675(/usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
676Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
677)
678\svg@box=\box73
679\c@svg@param@lastpage=\count311
680\c@svg@param@currpage=\count312
681
682(/usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
683Package: ifplatform 2017/10/13 v0.4a Testing for the operating system
684
685(/usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
686Package: catchfile 2019/12/09 v1.8 Catch the contents of a file (HO)
687)
688(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
689Package: ifluatex 2019/10/25 v1.5 ifluatex legacy package. Use iftex instead.
690)
691runsystem(uname -s > "1-Introduction.w18")...executed.
692
693
694(./1-Introduction.w18)
695runsystem(rm -- "1-Introduction.w18")...executed.
696
697))
698(/usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
699Package: transparent 2019/11/29 v1.4 Transparency via pdfTeX's color stack (HO)
700
701)
702(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty
703Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ
704
705(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
706(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
707Package: pgf 2020/01/08 v3.1.5b (3.1.5b)
708
709(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
710File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
711\pgfnodeparttextbox=\box74
712) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
713File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b)
714)
715(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65
716.sty
717Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b)
718\pgf@nodesepstart=\dimen277
719\pgf@nodesepend=\dimen278
720)
721(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18
722.sty
723Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b)
724)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
725(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
726(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex))
727(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
728(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
729(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
730Package: pgffor 2020/01/08 v3.1.5b (3.1.5b)
731
732(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
733\pgffor@iter=\dimen279
734\pgffor@skip=\dimen280
735\pgffor@stack=\toks45
736\pgffor@toks=\toks46
737))
738(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
739Package: tikz 2020/01/08 v3.1.5b (3.1.5b)
740
741(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers
742.code.tex
743File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
744\pgf@plot@mark@count=\count313
745\pgfplotmarksize=\dimen281
746)
747\tikz@lastx=\dimen282
748\tikz@lasty=\dimen283
749\tikz@lastxsaved=\dimen284
750\tikz@lastysaved=\dimen285
751\tikz@lastmovetox=\dimen286
752\tikz@lastmovetoy=\dimen287
753\tikzleveldistance=\dimen288
754\tikzsiblingdistance=\dimen289
755\tikz@figbox=\box75
756\tikz@figbox@bg=\box76
757\tikz@tempbox=\box77
758\tikz@tempbox@bg=\box78
759\tikztreelevel=\count314
760\tikznumberofchildren=\count315
761\tikznumberofcurrentchild=\count316
762\tikz@fig@count=\count317
763
764(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
765File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
766\pgfmatrixcurrentrow=\count318
767\pgfmatrixcurrentcolumn=\count319
768\pgf@matrix@numberofcolumns=\count320
769)
770\tikz@expandcount=\count321
771
772(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
773zlibrarytopaths.code.tex
774File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b)
775)))
776(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex
777(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
778zlibrarymatrix.code.tex
779File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
780)
781(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
782zlibraryquotes.code.tex
783File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
784)
785(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.
786code.tex
787File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b)
788\pgfarrowinset=\dimen290
789\pgfarrowlength=\dimen291
790\pgfarrowwidth=\dimen292
791\pgfarrowlinewidth=\dimen293
792)))
793(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def
794File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode
795\l__kernel_color_stack_int=\count322
796\l__pdf_internal_box=\box79
797)
798(./1-Introduction.aux)
799\openout1 = `1-Introduction.aux'.
800
801LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 16.
802LaTeX Font Info: ... okay on input line 16.
803LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 16.
804LaTeX Font Info: ... okay on input line 16.
805LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 16.
806LaTeX Font Info: ... okay on input line 16.
807LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 16.
808LaTeX Font Info: ... okay on input line 16.
809LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 16.
810LaTeX Font Info: ... okay on input line 16.
811LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 16.
812LaTeX Font Info: ... okay on input line 16.
813LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 16.
814LaTeX Font Info: ... okay on input line 16.
815LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 16.
816LaTeX Font Info: ... okay on input line 16.
817
818*geometry* driver: auto-detecting
819*geometry* detected driver: pdftex
820*geometry* verbose mode - [ preamble ] result:
821* driver: pdftex
822* paper: custom
823* layout: <same size as paper>
824* layoutoffset:(h,v)=(0.0pt,0.0pt)
825* modes: includehead includefoot
826* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt)
827* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt)
828* \paperwidth=364.19536pt
829* \paperheight=273.14662pt
830* \textwidth=342.2953pt
831* \textheight=244.6939pt
832* \oddsidemargin=-61.31996pt
833* \evensidemargin=-61.31996pt
834* \topmargin=-72.26999pt
835* \headheight=14.22636pt
836* \headsep=0.0pt
837* \topskip=11.0pt
838* \footskip=14.22636pt
839* \marginparwidth=4.0pt
840* \marginparsep=10.0pt
841* \columnsep=10.0pt
842* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
843* \hoffset=0.0pt
844* \voffset=0.0pt
845* \mag=1000
846* \@twocolumnfalse
847* \@twosidefalse
848* \@mparswitchfalse
849* \@reversemarginfalse
850* (1in=72.27pt=25.4mm, 1cm=28.453pt)
851
852(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
853[Loading MPS to PDF converter (version 2006.09.02).]
854\scratchcounter=\count323
855\scratchdimen=\dimen294
856\scratchbox=\box80
857\nofMPsegments=\count324
858\nofMParguments=\count325
859\everyMPshowfont=\toks47
860\MPscratchCnt=\count326
861\MPscratchDim=\dimen295
862\MPnumerator=\count327
863\makeMPintoPDFobject=\count328
864\everyMPtoPDFconversion=\toks48
865) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
866Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
867Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
86885.
869
870(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
871File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
872e
873))
874ABD: EveryShipout initializing macros
875\AtBeginShipoutBox=\box81
876Package hyperref Info: Link coloring OFF on input line 16.
877
878(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
879Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
880
881(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
882Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
883)
884(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
885Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
886)
887\c@section@level=\count329
888)
889LaTeX Info: Redefining \ref on input line 16.
890LaTeX Info: Redefining \pageref on input line 16.
891LaTeX Info: Redefining \nameref on input line 16.
892
893(./1-Introduction.out) (./1-Introduction.out)
894\@outlinefile=\write5
895\openout5 = `1-Introduction.out'.
896
897LaTeX Font Info: Overwriting symbol font `operators' in version `normal'
898(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 16.
899LaTeX Font Info: Overwriting symbol font `operators' in version `bold'
900(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 16.
901\symnumbers=\mathgroup6
902\sympureletters=\mathgroup7
903LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal'
904(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 16.
905LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 16.
906LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal'
907(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 16.
908LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
909(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 16.
910LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 16.
911LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal'
912(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 16.
913LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
914(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 16.
915LaTeX Font Info: Redeclaring math alphabet \mathit on input line 16.
916LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal'
917(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 16.
918LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
919(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 16.
920LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 16.
921LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal'
922(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 16.
923LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
924(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 16.
925LaTeX Font Info: Overwriting symbol font `numbers' in version `bold'
926(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 16.
927LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
928(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 16.
929LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold'
930(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 16.
931LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
932(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 16.
933LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
934(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 16.
935LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
936(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 16.
937LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
938(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 16.
939LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 16.
940LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal'
941(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 1
9426.
943LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
944(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 1
9456.
946LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
947(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp
948ut line 16.
949
950(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary
951-English.dict
952Dictionary: translator-basic-dictionary, Language: English
953)
954(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic
955tionary-English.dict
956Dictionary: translator-bibliography-dictionary, Language: English
957)
958(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict
959ionary-English.dict
960Dictionary: translator-environment-dictionary, Language: English
961)
962(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar
963y-English.dict
964Dictionary: translator-months-dictionary, Language: English
965)
966(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona
967ry-English.dict
968Dictionary: translator-numbers-dictionary, Language: English
969)
970(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona
971ry-English.dict
972Dictionary: translator-theorem-dictionary, Language: English
973) (./1-Introduction.nav)
974<img/unilu.jpg, id=40, 645.16031pt x 578.16pt>
975File: img/unilu.jpg Graphic file (type jpg)
976<use img/unilu.jpg>
977Package pdftex.def Info: img/unilu.jpg used on input line 20.
978(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
979 [1
980
981{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>] (./1-Int
982roduction.toc)
983File: img/unilu.jpg Graphic file (type jpg)
984<use img/unilu.jpg>
985Package pdftex.def Info: img/unilu.jpg used on input line 24.
986(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
987 [2
988
989]
990LaTeX Font Info: Trying to load font information for U+msa on input line 41.
991
992
993(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
994File: umsa.fd 2013/01/14 v3.01 AMS symbols A
995)
996LaTeX Font Info: Trying to load font information for U+msb on input line 41.
997
998
999(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
1000File: umsb.fd 2013/01/14 v3.01 AMS symbols B
1001)
1002LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp
1003ut line 41.
1004
1005(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd
1006File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma
1007thkerncmss.
1008)
1009<img/latex.png, id=112, 803.0pt x 334.24875pt>
1010File: img/latex.png Graphic file (type png)
1011<use img/latex.png>
1012Package pdftex.def Info: img/latex.png used on input line 41.
1013(pdftex.def) Requested size: 80.3047pt x 33.42682pt.
1014Package svg Info: Last page of `./svg-inkscape/sage_svg-tex.pdf' is 1 on input
1015line 41.
1016
1017(./svg-inkscape/sage_svg-tex.pdf_tex
1018<./svg-inkscape/sage_svg-tex.pdf, id=115, page=1, 376.40625pt x 98.51555pt>
1019File: ./svg-inkscape/sage_svg-tex.pdf Graphic file (type pdf)
1020<use ./svg-inkscape/sage_svg-tex.pdf, page 1>
1021Package pdftex.def Info: ./svg-inkscape/sage_svg-tex.pdf , page1 used on input
1022line 56.
1023(pdftex.def) Requested size: 80.92596pt x 21.18042pt.
1024)
1025File: img/unilu.jpg Graphic file (type jpg)
1026<use img/unilu.jpg>
1027Package pdftex.def Info: img/unilu.jpg used on input line 41.
1028(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1029 [3
1030
1031 <./img/latex.png> <./svg-inkscape/sage_svg-tex.pdf>]
1032File: img/latex.png Graphic file (type png)
1033<use img/latex.png>
1034Package pdftex.def Info: img/latex.png used on input line 54.
1035(pdftex.def) Requested size: 80.3047pt x 33.42682pt.
1036File: img/unilu.jpg Graphic file (type jpg)
1037<use img/unilu.jpg>
1038Package pdftex.def Info: img/unilu.jpg used on input line 54.
1039(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1040 [4
1041
1042]
1043\openout4 = `1-Introduction.vrb'.
1044
1045 (./1-Introduction.vrb)
1046File: img/unilu.jpg Graphic file (type jpg)
1047<use img/unilu.jpg>
1048Package pdftex.def Info: img/unilu.jpg used on input line 70.
1049(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1050 [5
1051
1052]
1053Package svg Info: Last page of `./svg-inkscape/sage_svg-tex.pdf' is 1 on input
1054line 81.
1055
1056(./svg-inkscape/sage_svg-tex.pdf_tex
1057File: ./svg-inkscape/sage_svg-tex.pdf Graphic file (type pdf)
1058<use ./svg-inkscape/sage_svg-tex.pdf, page 1>
1059Package pdftex.def Info: ./svg-inkscape/sage_svg-tex.pdf , page1 used on input
1060line 56.
1061(pdftex.def) Requested size: 80.92596pt x 21.18042pt.
1062)
1063File: img/unilu.jpg Graphic file (type jpg)
1064<use img/unilu.jpg>
1065Package pdftex.def Info: img/unilu.jpg used on input line 81.
1066(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1067 [6
1068
1069]
1070File: img/unilu.jpg Graphic file (type jpg)
1071<use img/unilu.jpg>
1072Package pdftex.def Info: img/unilu.jpg used on input line 102.
1073(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1074 [7
1075
1076]
1077File: img/unilu.jpg Graphic file (type jpg)
1078<use img/unilu.jpg>
1079Package pdftex.def Info: img/unilu.jpg used on input line 112.
1080(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1081 [8
1082
1083]
1084\tf@nav=\write6
1085\openout6 = `1-Introduction.nav'.
1086
1087\tf@toc=\write7
1088\openout7 = `1-Introduction.toc'.
1089
1090\tf@snm=\write8
1091\openout8 = `1-Introduction.snm'.
1092
1093Package atveryend Info: Empty hook `BeforeClearDocument' on input line 114.
1094Package atveryend Info: Empty hook `AfterLastShipout' on input line 114.
1095 (./1-Introduction.aux)
1096Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 114.
1097Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 114.
1098Package rerunfilecheck Info: File `1-Introduction.out' has not changed.
1099(rerunfilecheck) Checksum: 602A5CE8E5D11B5A515CD518C32DC054;226.
1100 )
1101Here is how much of TeX's memory you used:
1102 22715 strings out of 481239
1103 461789 string characters out of 5920377
1104 724211 words of memory out of 5000000
1105 37390 multiletter control sequences out of 15000+600000
1106 540074 words of font info for 52 fonts, out of 8000000 for 9000
1107 1141 hyphenation exceptions out of 8191
1108 58i,15n,89p,798b,701s stack positions out of 5000i,500n,10000p,200000b,80000s
1109</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></us
1110r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/shar
1111e/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texl
1112ive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/tex
1113mf-dist/fonts/type1/public/amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-d
1114ist/fonts/type1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/f
1115onts/type1/public/amsfonts/cm/cmssi8.pfb></usr/share/texlive/texmf-dist/fonts/t
1116ype1/public/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/p
1117ublic/amsfonts/cm/cmsy8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/a
1118msfonts/cm/cmtt10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfont
1119s/cm/cmtt8.pfb>
1120Output written on 1-Introduction.pdf (8 pages, 183246 bytes).
1121PDF statistics:
1122 381 PDF objects out of 1000 (max. 8388607)
1123 320 compressed objects within 4 object streams
1124 22 named destinations out of 1000 (max. 500000)
1125 138 words of extra memory for PDF output out of 10000 (max. 10000000)
1126
diff --git a/src/Lecture1/slides/1-Introduction.nav b/src/Lecture1/slides/1-Introduction.nav
new file mode 100644
index 0000000..0ae14c4
--- /dev/null
+++ b/src/Lecture1/slides/1-Introduction.nav
@@ -0,0 +1,34 @@
1\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
2\headcommand {\beamer@framepages {1}{1}}
3\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}
4\headcommand {\beamer@framepages {2}{2}}
5\headcommand {\beamer@sectionpages {1}{2}}
6\headcommand {\beamer@subsectionpages {1}{2}}
7\headcommand {\sectionentry {1}{What?}{3}{What?}{0}}
8\headcommand {\slideentry {1}{0}{1}{3/3}{}{0}}
9\headcommand {\beamer@framepages {3}{3}}
10\headcommand {\beamer@subsectionpages {3}{3}}
11\headcommand {\beamer@subsectionentry {0}{1}{1}{4}{Latex}}
12\headcommand {\slideentry {1}{1}{1}{4/4}{Latex}{0}}
13\headcommand {\beamer@framepages {4}{4}}
14\headcommand {\slideentry {1}{1}{2}{5/5}{Latex}{0}}
15\headcommand {\beamer@framepages {5}{5}}
16\headcommand {\beamer@subsectionpages {4}{5}}
17\headcommand {\beamer@subsectionentry {0}{1}{2}{6}{Sage}}
18\headcommand {\slideentry {1}{2}{1}{6/6}{Sage}{0}}
19\headcommand {\beamer@framepages {6}{6}}
20\headcommand {\beamer@sectionpages {3}{6}}
21\headcommand {\beamer@subsectionpages {6}{6}}
22\headcommand {\sectionentry {2}{When?}{7}{When?}{0}}
23\headcommand {\slideentry {2}{0}{1}{7/7}{}{0}}
24\headcommand {\beamer@framepages {7}{7}}
25\headcommand {\beamer@sectionpages {7}{7}}
26\headcommand {\beamer@subsectionpages {7}{7}}
27\headcommand {\sectionentry {3}{How?}{8}{How?}{0}}
28\headcommand {\slideentry {3}{0}{1}{8/8}{}{0}}
29\headcommand {\beamer@framepages {8}{8}}
30\headcommand {\beamer@partpages {1}{8}}
31\headcommand {\beamer@subsectionpages {8}{8}}
32\headcommand {\beamer@sectionpages {8}{8}}
33\headcommand {\beamer@documentpages {8}}
34\headcommand {\gdef \inserttotalframenumber {8}}
diff --git a/src/Lecture1/slides/1-Introduction.out b/src/Lecture1/slides/1-Introduction.out
new file mode 100644
index 0000000..8886b09
--- /dev/null
+++ b/src/Lecture1/slides/1-Introduction.out
@@ -0,0 +1,5 @@
1\BOOKMARK [2][]{Outline0.1}{What?}{}% 1
2\BOOKMARK [3][]{Outline0.1.1.4}{Latex}{Outline0.1}% 2
3\BOOKMARK [3][]{Outline0.1.2.6}{Sage}{Outline0.1}% 3
4\BOOKMARK [2][]{Outline0.2}{When?}{}% 4
5\BOOKMARK [2][]{Outline0.3}{How?}{}% 5
diff --git a/src/Lecture1/slides/1-Introduction.pdf b/src/Lecture1/slides/1-Introduction.pdf
new file mode 100644
index 0000000..17eaaa8
--- /dev/null
+++ b/src/Lecture1/slides/1-Introduction.pdf
Binary files differ
diff --git a/src/Lecture1/slides/1-Introduction.snm b/src/Lecture1/slides/1-Introduction.snm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture1/slides/1-Introduction.snm
diff --git a/src/Lecture1/slides/1-Introduction.tex b/src/Lecture1/slides/1-Introduction.tex
new file mode 100644
index 0000000..2c8c355
--- /dev/null
+++ b/src/Lecture1/slides/1-Introduction.tex
@@ -0,0 +1,115 @@
1\documentclass[11pt]{beamer}
2\usetheme{Madrid}
3\usepackage[utf8]{inputenc}
4\usepackage{amsmath}
5\usepackage{svg}
6
7\usepackage{tikz-cd}
8
9\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto}
10\title{Mathematical Software - Introduction}
11\logo{\includegraphics[scale=0.1]{img/unilu.jpg}}
12%\institute{University of Luxembourg}
13
14\date{2021-02-19}
15
16\begin{document}
17
18\begin{frame}
19 \titlepage
20\end{frame}
21
22\begin{frame}
23 \tableofcontents
24\end{frame}
25
26\section{What?}
27\begin{frame}{What}
28 \begin{columns}
29 \column{0.6\textwidth}
30 \begin{itemize}
31 \item {\bf Latex} for writing scientific text
32 \item {\bf Sage} for computations
33 \end{itemize}
34
35 \column{0.4\textwidth}
36 \includegraphics[scale=0.1]{img/latex.png}
37 \vspace{0.5cm}
38
39 \includesvg[scale=0.215]{img/sage}
40 \end{columns}
41\end{frame}
42
43\subsection{Latex}
44\begin{frame}{Latex}
45 \includegraphics[scale=0.1]{img/latex.png}
46 \begin{itemize}
47 \item A typesetting system, has been around since the 1980s
48 \item Currently the best way to write scientific texts (Math, Physics...)
49 \item Can be used for lecture notes, homework, articles, books, graphics
50 (with TikZ), this presentation...%, shopping list...
51 \item ``What you get is what you \emph{mean}'', rather than what you
52 \emph{see}
53 \end{itemize}
54\end{frame}
55
56\begin{frame}[fragile]{Latex - Example}
57 An equation like this:
58 \begin{align*}
59 e^x =& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\
60 =& 1 + x + \frac{x^2}{2} + \frac{x^3}{6} + \cdots
61 \end{align*}
62 is written in LaTeX as:
63 \begin{verbatim}
64 \begin{align*}
65 e^x =& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\
66 =& 1 + x + \frac{x^2}{2} +
67 \frac{x^3}{6} + \cdots
68 \end{align*}
69 \end{verbatim}
70\end{frame}
71
72\subsection{Sage}
73\begin{frame}{Sage}
74 \includesvg[scale=0.215]{img/sage}
75 \begin{itemize}
76 \item Free and open source Mathematical software
77 \item Basically python with a lot of Math libraries
78 \item Builds up on existing software such a Pari/GP, NumPy, R...
79 \item Popular for Computational Algebra (Number Theory, Cryptography...)
80 \end{itemize}
81\end{frame}
82
83\section{When?}
84\begin{frame}{When}
85 \begin{tabular}{r|c|c}
86 %Date & Time & Topics \\
87 %\hline
88 February 19 & \texttt{14:00 - 17:30} & Introduction, LaTeX fundamentals \\
89 \hline
90 March 12 & \texttt{14:00 - 17:30} & More advanced LaTeX topics \\
91 \hline
92 March 26 & \texttt{14:00 - 17:30} & LaTeX: presentations, graphics \\
93 \hline
94 April 2 & \texttt{14:00 - 17:30} & ??? (LaTeX or Sage) \\
95 \hline
96 April 23 & \texttt{14:00 - 17:30} & Sage (???) \\
97 \hline
98 May 7 & \texttt{14:00 - {\bf 18:15}} & Sage (???) \\
99 \hline
100 May 21 & \texttt{14:00 - {\bf 18:15}} & Sage (???)
101 \end{tabular}
102\end{frame}
103
104\section{How?}
105\begin{frame}{How}
106 \begin{itemize}
107 \item \textbf{Remote teaching} at least until April 2 included (probably
108 always).
109 \item \textbf{Learn by doing} graded homework (4-5 assignments), non-graded
110 exercises, free practice. No final exam.
111 \end{itemize}
112\end{frame}
113
114\end{document}
115
diff --git a/src/Lecture1/slides/1-Introduction.toc b/src/Lecture1/slides/1-Introduction.toc
new file mode 100644
index 0000000..07181a7
--- /dev/null
+++ b/src/Lecture1/slides/1-Introduction.toc
@@ -0,0 +1,5 @@
1\beamer@sectionintoc {1}{What?}{3}{0}{1}
2\beamer@subsectionintoc {1}{1}{Latex}{4}{0}{1}
3\beamer@subsectionintoc {1}{2}{Sage}{6}{0}{1}
4\beamer@sectionintoc {2}{When?}{7}{0}{2}
5\beamer@sectionintoc {3}{How?}{8}{0}{3}
diff --git a/src/Lecture1/slides/1-Introduction.vrb b/src/Lecture1/slides/1-Introduction.vrb
new file mode 100644
index 0000000..5a53bf5
--- /dev/null
+++ b/src/Lecture1/slides/1-Introduction.vrb
@@ -0,0 +1,14 @@
1\frametitle{Latex - Example}
2An equation like this:
3 \begin{align*}
4 e^x =& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\
5 =& 1 + x + \frac{x^2}{2} + \frac{x^3}{6} + \cdots
6 \end{align*}
7 is written in LaTeX as:
8 \begin{verbatim}
9 \begin{align*}
10 e^x =& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\
11 =& 1 + x + \frac{x^2}{2} +
12 \frac{x^3}{6} + \cdots
13 \end{align*}
14 \end{verbatim}
diff --git a/src/Lecture1/slides/2-LatexFundamentals.aux b/src/Lecture1/slides/2-LatexFundamentals.aux
new file mode 100644
index 0000000..ccac4f0
--- /dev/null
+++ b/src/Lecture1/slides/2-LatexFundamentals.aux
@@ -0,0 +1,70 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
20\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
21\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}}
22\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}}
23\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}}
24\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}}
25\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}}
26\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}}
27\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}}
28\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}}
29\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}}
30\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}}
31\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}}
32\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}}
33\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}}
34\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}}
35\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}}
36\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}}
37\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}}
38\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}}
39\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}}
40\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}}
41\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}}
42\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}}
43\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}}
44\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}}
45\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}}
46\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}}
47\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}}
48\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}}
49\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}}
50\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}}
51\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}}
52\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}}
53\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}}
54\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}}
55\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}}
56\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}}
57\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}}
58\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}}
59\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}}
60\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}}
61\@writefile{nav}{\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}}
62\@writefile{nav}{\headcommand {\beamer@framepages {22}{22}}}
63\@writefile{nav}{\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}}}
64\@writefile{nav}{\headcommand {\beamer@framepages {23}{23}}}
65\@writefile{nav}{\headcommand {\beamer@partpages {1}{23}}}
66\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{23}}}
67\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{23}}}
68\@writefile{nav}{\headcommand {\beamer@documentpages {23}}}
69\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {23}}}
70\gdef \@abspage@last{23}
diff --git a/src/Lecture1/slides/2-LatexFundamentals.log b/src/Lecture1/slides/2-LatexFundamentals.log
new file mode 100644
index 0000000..6b7f22c
--- /dev/null
+++ b/src/Lecture1/slides/2-LatexFundamentals.log
@@ -0,0 +1,1174 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 29 MAR 2021 11:35
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**2-LatexFundamentals.tex
6(./2-LatexFundamentals.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/beamer/beamer.cls
10Document Class: beamer 2020/07/22 v3.59 A class for typesetting presentations
11(/usr/share/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
12(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
13Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
14\etb@tempcnta=\count177
15)
16\beamer@tempbox=\box47
17\beamer@tempcount=\count178
18\c@beamerpauses=\count179
19
20(/usr/share/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
21\beamer@slideinframe=\count180
22\beamer@minimum=\count181
23\beamer@decode@box=\box48
24)
25\beamer@commentbox=\box49
26\beamer@modecount=\count182
27)
28(/usr/share/texmf-dist/tex/generic/iftex/ifpdf.sty
29Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead.
30
31(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
32Package: iftex 2020/03/06 v1.0d TeX engine tests
33))
34\headdp=\dimen138
35\footheight=\dimen139
36\sidebarheight=\dimen140
37\beamer@tempdim=\dimen141
38\beamer@finalheight=\dimen142
39\beamer@animht=\dimen143
40\beamer@animdp=\dimen144
41\beamer@animwd=\dimen145
42\beamer@leftmargin=\dimen146
43\beamer@rightmargin=\dimen147
44\beamer@leftsidebar=\dimen148
45\beamer@rightsidebar=\dimen149
46\beamer@boxsize=\dimen150
47\beamer@vboxoffset=\dimen151
48\beamer@descdefault=\dimen152
49\beamer@descriptionwidth=\dimen153
50\beamer@lastskip=\skip47
51\beamer@areabox=\box50
52\beamer@animcurrent=\box51
53\beamer@animshowbox=\box52
54\beamer@sectionbox=\box53
55\beamer@logobox=\box54
56\beamer@linebox=\box55
57\beamer@sectioncount=\count183
58\beamer@subsubsectionmax=\count184
59\beamer@subsectionmax=\count185
60\beamer@sectionmax=\count186
61\beamer@totalheads=\count187
62\beamer@headcounter=\count188
63\beamer@partstartpage=\count189
64\beamer@sectionstartpage=\count190
65\beamer@subsectionstartpage=\count191
66\beamer@animationtempa=\count192
67\beamer@animationtempb=\count193
68\beamer@xpos=\count194
69\beamer@ypos=\count195
70\beamer@ypos@offset=\count196
71\beamer@showpartnumber=\count197
72\beamer@currentsubsection=\count198
73\beamer@coveringdepth=\count199
74\beamer@sectionadjust=\count266
75\beamer@tocsectionnumber=\count267
76
77(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
78(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
79Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
80\KV@toks@=\toks15
81))
82\beamer@paperwidth=\skip48
83\beamer@paperheight=\skip49
84
85(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
86Package: geometry 2020/01/02 v5.9 Page Geometry
87
88(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
89Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
90)
91\Gm@cnth=\count268
92\Gm@cntv=\count269
93\c@Gm@tempcnt=\count270
94\Gm@bindingoffset=\dimen154
95\Gm@wd@mp=\dimen155
96\Gm@odd@mp=\dimen156
97\Gm@even@mp=\dimen157
98\Gm@layoutwidth=\dimen158
99\Gm@layoutheight=\dimen159
100\Gm@layouthoffset=\dimen160
101\Gm@layoutvoffset=\dimen161
102\Gm@dimlist=\toks16
103)
104(/usr/share/texmf-dist/tex/latex/base/size11.clo
105File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
106)
107(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
108(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
109Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
110
111(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
112Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
113
114(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
115Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
116)
117(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
118File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
119)
120Package graphics Info: Driver file: pdftex.def on input line 105.
121
122(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
123File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
124))
125\Gin@req@height=\dimen162
126\Gin@req@width=\dimen163
127)
128(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
129(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
130(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
131\pgfutil@everybye=\toks17
132\pgfutil@tempdima=\dimen164
133\pgfutil@tempdimb=\dimen165
134
135(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
136(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
137\pgfutil@abb=\box56
138)
139(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
140(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
141Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
142))
143(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
144Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
145
146(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
147\pgfkeys@pathtoks=\toks18
148\pgfkeys@temptoks=\toks19
149
150(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
151\pgfkeys@tmptoks=\toks20
152))
153\pgf@x=\dimen166
154\pgf@y=\dimen167
155\pgf@xa=\dimen168
156\pgf@ya=\dimen169
157\pgf@xb=\dimen170
158\pgf@yb=\dimen171
159\pgf@xc=\dimen172
160\pgf@yc=\dimen173
161\pgf@xd=\dimen174
162\pgf@yd=\dimen175
163\w@pgf@writea=\write3
164\r@pgf@reada=\read2
165\c@pgf@counta=\count271
166\c@pgf@countb=\count272
167\c@pgf@countc=\count273
168\c@pgf@countd=\count274
169\t@pgf@toka=\toks21
170\t@pgf@tokb=\toks22
171\t@pgf@tokc=\toks23
172\pgf@sys@id@count=\count275
173
174(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
175File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
176)
177Driver file for pgf: pgfsys-pdftex.def
178
179(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
180File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
181
182(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
183File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
184)))
185(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
186File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
187\pgfsyssoftpath@smallbuffer@items=\count276
188\pgfsyssoftpath@bigbuffer@items=\count277
189)
190(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
191File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
192))
193(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
194Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
195
196(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
197File: color.cfg 2016/01/02 v1.6 sample color configuration
198)
199Package xcolor Info: Driver file: pdftex.def on input line 225.
200Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
201Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
202Package xcolor Info: Model `RGB' extended on input line 1364.
203Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
204Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
205Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
206Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
207Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
208Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
209)
210(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
211Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
212
213(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
214(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
215(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
216(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
217\pgfmath@dimen=\dimen176
218\pgfmath@count=\count278
219\pgfmath@box=\box57
220\pgfmath@toks=\toks24
221\pgfmath@stack@operand=\toks25
222\pgfmath@stack@operation=\toks26
223)
224(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
225(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
226(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
227.tex)
228(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
229(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
230x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
231(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
232(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
233(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
234.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
235\c@pgfmathroundto@lastzeros=\count279
236)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
237(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
238File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
239\pgf@picminx=\dimen177
240\pgf@picmaxx=\dimen178
241\pgf@picminy=\dimen179
242\pgf@picmaxy=\dimen180
243\pgf@pathminx=\dimen181
244\pgf@pathmaxx=\dimen182
245\pgf@pathminy=\dimen183
246\pgf@pathmaxy=\dimen184
247\pgf@xx=\dimen185
248\pgf@xy=\dimen186
249\pgf@yx=\dimen187
250\pgf@yy=\dimen188
251\pgf@zx=\dimen189
252\pgf@zy=\dimen190
253)
254(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
255File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
256\pgf@path@lastx=\dimen191
257\pgf@path@lasty=\dimen192
258) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
259File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
260\pgf@shorten@end@additional=\dimen193
261\pgf@shorten@start@additional=\dimen194
262)
263(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
264File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
265\pgfpic=\box58
266\pgf@hbox=\box59
267\pgf@layerbox@main=\box60
268\pgf@picture@serial@count=\count280
269)
270(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
271File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
272\pgflinewidth=\dimen195
273)
274(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
275ex
276File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
277\pgf@pt@x=\dimen196
278\pgf@pt@y=\dimen197
279\pgf@pt@temp=\dimen198
280) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
281File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
282)
283(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
284File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
285)
286(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
287x
288File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
289) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
290File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
291\pgfarrowsep=\dimen199
292)
293(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
294File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
295\pgf@max=\dimen256
296\pgf@sys@shading@range@num=\count281
297\pgf@shadingcount=\count282
298)
299(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
300File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
301
302(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
303File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
304\pgfexternal@startupbox=\box61
305))
306(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
307File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
308)
309(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
310File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
311) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
312File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
313)
314(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
315File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
316)))
317(/usr/share/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
318Package: xxcolor 2003/10/24 ver 0.1
319\XC@nummixins=\count283
320\XC@countmixins=\count284
321)
322(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty
323Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa
324ge
325with kernel methods
326)
327(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
328Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX
329
330(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
331Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO)
332)
333(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
334Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO
335)
336
337(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
338Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
339)
340Package pdftexcmds Info: \pdf@primitive is available.
341Package pdftexcmds Info: \pdf@ifprimitive is available.
342Package pdftexcmds Info: \pdfdraftmode found.
343)
344(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
345Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
346)
347(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
348Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
349)
350(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
351Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
352)
353(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
354Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
355)
356(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
357Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
358)
359(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
360Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
361)
362(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
363Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)
364)
365\@linkdim=\dimen257
366\Hy@linkcounter=\count285
367\Hy@pagecounter=\count286
368
369(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
370File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO)
371Now handling font encoding PD1 ...
372... no UTF-8 mapping file for font encoding PD1
373)
374(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
375Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
376)
377(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty
378Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
379)
380\Hy@SavedSpaceFactor=\count287
381Package hyperref Info: Option `bookmarks' set `true' on input line 4338.
382Package hyperref Info: Option `bookmarksopen' set `true' on input line 4338.
383Package hyperref Info: Option `implicit' set `false' on input line 4338.
384Package hyperref Info: Hyper figures OFF on input line 4464.
385Package hyperref Info: Link nesting OFF on input line 4469.
386Package hyperref Info: Hyper index ON on input line 4472.
387Package hyperref Info: Plain pages OFF on input line 4479.
388Package hyperref Info: Backreferencing OFF on input line 4484.
389Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals.
390Package hyperref Info: Bookmarks ON on input line 4717.
391\c@Hy@tempcnt=\count288
392
393(/usr/share/texmf-dist/tex/latex/url/url.sty
394\Urlmuskip=\muskip16
395Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
396)
397LaTeX Info: Redefining \url on input line 5076.
398\XeTeXLinkMargin=\dimen258
399
400(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty
401Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
402
403(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
404Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
405)
406))
407\Fld@menulength=\count289
408\Field@Width=\dimen259
409\Fld@charsize=\dimen260
410Package hyperref Info: Hyper figures OFF on input line 6347.
411Package hyperref Info: Link nesting OFF on input line 6352.
412Package hyperref Info: Hyper index ON on input line 6355.
413Package hyperref Info: backreferencing OFF on input line 6362.
414Package hyperref Info: Link coloring OFF on input line 6367.
415Package hyperref Info: Link coloring with OCG OFF on input line 6372.
416Package hyperref Info: PDF/A mode OFF on input line 6377.
417LaTeX Info: Redefining \ref on input line 6417.
418LaTeX Info: Redefining \pageref on input line 6421.
419\Hy@abspage=\count290
420
421
422Package hyperref Message: Stopped early.
423
424)
425Package hyperref Info: Driver (autodetected): hpdftex.
426 (/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
427File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX
428
429(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty
430Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag
431e
432with kernel methods
433)
434\Fld@listcount=\count291
435\c@bookmark@seq@number=\count292
436
437(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
438Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
439
440(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
441Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
442)
443Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
44486.
445))
446(/usr/share/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
447(/usr/share/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty)
448(/usr/share/texmf-dist/tex/latex/beamer/beamerbasefont.sty
449(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
450Package: amssymb 2013/01/14 v3.01 AMS font symbols
451
452(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
453Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
454\@emptytoks=\toks27
455\symAMSa=\mathgroup4
456\symAMSb=\mathgroup5
457LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
458LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
459(Font) U/euf/m/n --> U/euf/b/n on input line 106.
460)))
461(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
462(/usr/share/texmf-dist/tex/latex/translator/translator.sty
463Package: translator 2020-08-03 v1.12c Easy translation of strings in LaTeX
464))
465(/usr/share/texmf-dist/tex/latex/beamer/beamerbasemisc.sty)
466(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty)
467(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
468\beamer@argscount=\count293
469\beamer@lastskipcover=\skip50
470\beamer@trivlistdepth=\count294
471)
472(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetitle.sty)
473(/usr/share/texmf-dist/tex/latex/beamer/beamerbasesection.sty
474\c@lecture=\count295
475\c@part=\count296
476\c@section=\count297
477\c@subsection=\count298
478\c@subsubsection=\count299
479)
480(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
481\beamer@framebox=\box62
482\beamer@frametitlebox=\box63
483\beamer@zoombox=\box64
484\beamer@zoomcount=\count300
485\beamer@zoomframecount=\count301
486\beamer@frametextheight=\dimen261
487\c@subsectionslide=\count302
488\beamer@frametopskip=\skip51
489\beamer@framebottomskip=\skip52
490\beamer@frametopskipautobreak=\skip53
491\beamer@framebottomskipautobreak=\skip54
492\beamer@envbody=\toks28
493\framewidth=\dimen262
494\c@framenumber=\count303
495)
496(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
497\beamer@verbatimfileout=\write4
498)
499(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
500\beamer@splitbox=\box65
501\beamer@autobreakcount=\count304
502\beamer@autobreaklastheight=\dimen263
503\beamer@frametitletoks=\toks29
504\beamer@framesubtitletoks=\toks30
505)
506(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
507\beamer@footins=\box66
508)
509(/usr/share/texmf-dist/tex/latex/beamer/beamerbasecolor.sty)
510(/usr/share/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
511\beamer@frameboxcopy=\box67
512)
513(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetoc.sty)
514(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
515\beamer@sbttoks=\toks31
516
517(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
518(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
519\bmb@box=\box68
520\bmb@colorbox=\box69
521\bmb@boxshadow=\box70
522\bmb@boxshadowball=\box71
523\bmb@boxshadowballlarge=\box72
524\bmb@temp=\dimen264
525\bmb@dima=\dimen265
526\bmb@dimb=\dimen266
527\bmb@prevheight=\dimen267
528)
529\beamer@blockheadheight=\dimen268
530))
531(/usr/share/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
532(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty
533Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
534\@enLab=\toks32
535)
536\c@figure=\count305
537\c@table=\count306
538\abovecaptionskip=\skip55
539\belowcaptionskip=\skip56
540)
541(/usr/share/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
542\beamer@section@min@dim=\dimen269
543)
544(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
545(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
546Package: amsmath 2020/09/23 v2.17i AMS math features
547\@mathmargin=\skip57
548
549For additional information on amsmath, use the `?' option.
550(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
551Package: amstext 2000/06/29 v2.01 AMS text
552
553(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
554File: amsgen.sty 1999/11/30 v2.0 generic functions
555\@emptytoks=\toks33
556\ex@=\dimen270
557))
558(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
559Package: amsbsy 1999/11/29 v1.2d Bold Symbols
560\pmbraise@=\dimen271
561)
562(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
563Package: amsopn 2016/03/08 v2.02 operator names
564)
565\inf@bad=\count307
566LaTeX Info: Redefining \frac on input line 234.
567\uproot@=\count308
568\leftroot@=\count309
569LaTeX Info: Redefining \overline on input line 399.
570\classnum@=\count310
571\DOTSCASE@=\count311
572LaTeX Info: Redefining \ldots on input line 496.
573LaTeX Info: Redefining \dots on input line 499.
574LaTeX Info: Redefining \cdots on input line 620.
575\Mathstrutbox@=\box73
576\strutbox@=\box74
577\big@size=\dimen272
578LaTeX Font Info: Redeclaring font encoding OML on input line 743.
579LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
580\macc@depth=\count312
581\c@MaxMatrixCols=\count313
582\dotsspace@=\muskip17
583\c@parentequation=\count314
584\dspbrk@lvl=\count315
585\tag@help=\toks34
586\row@=\count316
587\column@=\count317
588\maxfields@=\count318
589\andhelp@=\toks35
590\eqnshift@=\dimen273
591\alignsep@=\dimen274
592\tagshift@=\dimen275
593\tagwidth@=\dimen276
594\totwidth@=\dimen277
595\lineht@=\dimen278
596\@envbody=\toks36
597\multlinegap=\skip58
598\multlinetaggap=\skip59
599\mathdisplay@stack=\toks37
600LaTeX Info: Redefining \[ on input line 2923.
601LaTeX Info: Redefining \] on input line 2924.
602)
603(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty
604Package: amsthm 2020/05/29 v2.20.6
605\thm@style=\toks38
606\thm@bodyfont=\toks39
607\thm@headfont=\toks40
608\thm@notefont=\toks41
609\thm@headpunct=\toks42
610\thm@preskip=\skip60
611\thm@postskip=\skip61
612\thm@headsep=\skip62
613\dth@everypar=\toks43
614)
615\c@theorem=\count319
616)
617(/usr/share/texmf-dist/tex/latex/beamer/beamerbasethemes.sty))
618(/usr/share/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
619(/usr/share/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty)
620(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty)
621(/usr/share/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
622\beamer@dima=\dimen279
623\beamer@dimb=\dimen280
624)
625(/usr/share/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty)))
626(/usr/share/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty
627(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty)
628(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty)
629(/usr/share/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty)
630(/usr/share/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty))
631(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
632Package: inputenc 2020/08/01 v1.3d Input encoding file
633\inpenc@prehook=\toks44
634\inpenc@posthook=\toks45
635)
636(/usr/share/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty
637Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ
638
639(/usr/share/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
640(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
641Package: pgf 2020/12/01 v3.1.7a (3.1.7a)
642
643(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
644File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
645\pgfnodeparttextbox=\box75
646)
647(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
648File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a)
649)
650(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
651Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a)
652\pgf@nodesepstart=\dimen281
653\pgf@nodesepend=\dimen282
654)
655(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
656Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a)
657))
658(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
659(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
660(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex))
661(/usr/share/texmf-dist/tex/latex/pgf/math/pgfmath.sty
662(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
663(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
664Package: pgffor 2020/12/01 v3.1.7a (3.1.7a)
665
666(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
667\pgffor@iter=\dimen283
668\pgffor@skip=\dimen284
669\pgffor@stack=\toks46
670\pgffor@toks=\toks47
671))
672(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
673Package: tikz 2020/12/01 v3.1.7a (3.1.7a)
674
675(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.te
676x
677File: pgflibraryplothandlers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
678\pgf@plot@mark@count=\count320
679\pgfplotmarksize=\dimen285
680)
681\tikz@lastx=\dimen286
682\tikz@lasty=\dimen287
683\tikz@lastxsaved=\dimen288
684\tikz@lastysaved=\dimen289
685\tikz@lastmovetox=\dimen290
686\tikz@lastmovetoy=\dimen291
687\tikzleveldistance=\dimen292
688\tikzsiblingdistance=\dimen293
689\tikz@figbox=\box76
690\tikz@figbox@bg=\box77
691\tikz@tempbox=\box78
692\tikz@tempbox@bg=\box79
693\tikztreelevel=\count321
694\tikznumberofchildren=\count322
695\tikznumberofcurrentchild=\count323
696\tikz@fig@count=\count324
697 (/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
698File: pgfmodulematrix.code.tex 2020/12/01 v3.1.7a (3.1.7a)
699\pgfmatrixcurrentrow=\count325
700\pgfmatrixcurrentcolumn=\count326
701\pgf@matrix@numberofcolumns=\count327
702)
703\tikz@expandcount=\count328
704
705(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary
706topaths.code.tex
707File: tikzlibrarytopaths.code.tex 2020/12/01 v3.1.7a (3.1.7a)
708)))
709(/usr/share/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex
710(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary
711matrix.code.tex
712File: tikzlibrarymatrix.code.tex 2020/12/01 v3.1.7a (3.1.7a)
713)
714(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary
715quotes.code.tex
716File: tikzlibraryquotes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
717)
718(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex
719File: pgflibraryarrows.meta.code.tex 2020/12/01 v3.1.7a (3.1.7a)
720\pgfarrowinset=\dimen294
721\pgfarrowlength=\dimen295
722\pgfarrowwidth=\dimen296
723\pgfarrowlinewidth=\dimen297
724))) (/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
725File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
726\l__kernel_color_stack_int=\count329
727\l__pdf_internal_box=\box80
728)
729(./2-LatexFundamentals.aux)
730\openout1 = `2-LatexFundamentals.aux'.
731
732LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 18.
733LaTeX Font Info: ... okay on input line 18.
734LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 18.
735LaTeX Font Info: ... okay on input line 18.
736LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 18.
737LaTeX Font Info: ... okay on input line 18.
738LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 18.
739LaTeX Font Info: ... okay on input line 18.
740LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 18.
741LaTeX Font Info: ... okay on input line 18.
742LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 18.
743LaTeX Font Info: ... okay on input line 18.
744LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 18.
745LaTeX Font Info: ... okay on input line 18.
746LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 18.
747LaTeX Font Info: ... okay on input line 18.
748
749*geometry* driver: auto-detecting
750*geometry* detected driver: pdftex
751*geometry* verbose mode - [ preamble ] result:
752* driver: pdftex
753* paper: custom
754* layout: <same size as paper>
755* layoutoffset:(h,v)=(0.0pt,0.0pt)
756* modes: includehead includefoot
757* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt)
758* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt)
759* \paperwidth=364.19536pt
760* \paperheight=273.14662pt
761* \textwidth=342.2953pt
762* \textheight=244.6939pt
763* \oddsidemargin=-61.31996pt
764* \evensidemargin=-61.31996pt
765* \topmargin=-72.26999pt
766* \headheight=14.22636pt
767* \headsep=0.0pt
768* \topskip=11.0pt
769* \footskip=14.22636pt
770* \marginparwidth=4.0pt
771* \marginparsep=10.0pt
772* \columnsep=10.0pt
773* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
774* \hoffset=0.0pt
775* \voffset=0.0pt
776* \mag=1000
777* \@twocolumnfalse
778* \@twosidefalse
779* \@mparswitchfalse
780* \@reversemarginfalse
781* (1in=72.27pt=25.4mm, 1cm=28.453pt)
782
783(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
784[Loading MPS to PDF converter (version 2006.09.02).]
785\scratchcounter=\count330
786\scratchdimen=\dimen298
787\scratchbox=\box81
788\nofMPsegments=\count331
789\nofMParguments=\count332
790\everyMPshowfont=\toks48
791\MPscratchCnt=\count333
792\MPscratchDim=\dimen299
793\MPnumerator=\count334
794\makeMPintoPDFobject=\count335
795\everyMPtoPDFconversion=\toks49
796) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
797Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
798Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
79985.
800
801(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
802File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
803e
804))
805Package hyperref Info: Link coloring OFF on input line 18.
806
807(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
808Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
809
810(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty
811Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
812)
813(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
814Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
815)
816\c@section@level=\count336
817)
818LaTeX Info: Redefining \ref on input line 18.
819LaTeX Info: Redefining \pageref on input line 18.
820LaTeX Info: Redefining \nameref on input line 18.
821
822(./2-LatexFundamentals.out) (./2-LatexFundamentals.out)
823\@outlinefile=\write5
824\openout5 = `2-LatexFundamentals.out'.
825
826LaTeX Font Info: Overwriting symbol font `operators' in version `normal'
827(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 18.
828LaTeX Font Info: Overwriting symbol font `operators' in version `bold'
829(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18.
830\symnumbers=\mathgroup6
831\sympureletters=\mathgroup7
832LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal'
833(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 18.
834LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 18.
835LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal'
836(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18.
837LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
838(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18.
839LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 18.
840LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal'
841(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 18.
842LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
843(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 18.
844LaTeX Font Info: Redeclaring math alphabet \mathit on input line 18.
845LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal'
846(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 18.
847LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
848(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 18.
849LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 18.
850LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal'
851(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18.
852LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
853(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18.
854LaTeX Font Info: Overwriting symbol font `numbers' in version `bold'
855(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18.
856LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
857(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18.
858LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold'
859(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 18.
860LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
861(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 18.
862LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
863(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18.
864LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
865(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18.
866LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
867(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 18.
868
869(/usr/share/texmf-dist/tex/latex/translator/translator-basic-dictionary-English
870.dict
871Dictionary: translator-basic-dictionary, Language: English
872)
873(/usr/share/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-
874English.dict
875Dictionary: translator-bibliography-dictionary, Language: English
876)
877(/usr/share/texmf-dist/tex/latex/translator/translator-environment-dictionary-E
878nglish.dict
879Dictionary: translator-environment-dictionary, Language: English
880)
881(/usr/share/texmf-dist/tex/latex/translator/translator-months-dictionary-Englis
882h.dict
883Dictionary: translator-months-dictionary, Language: English
884)
885(/usr/share/texmf-dist/tex/latex/translator/translator-numbers-dictionary-Engli
886sh.dict
887Dictionary: translator-numbers-dictionary, Language: English
888)
889(/usr/share/texmf-dist/tex/latex/translator/translator-theorem-dictionary-Engli
890sh.dict
891Dictionary: translator-theorem-dictionary, Language: English
892) (./2-LatexFundamentals.nav)
893<unilu.jpg, id=20, 645.16031pt x 578.16pt>
894File: unilu.jpg Graphic file (type jpg)
895<use unilu.jpg>
896Package pdftex.def Info: unilu.jpg used on input line 22.
897(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
898 [1
899
900{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map} <./unilu.jpg>]
901File: unilu.jpg Graphic file (type jpg)
902<use unilu.jpg>
903Package pdftex.def Info: unilu.jpg used on input line 31.
904(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
905 [2
906
907]
908<img/example2-preamble-edited.png, id=82, 575.14874pt x 307.1475pt>
909File: img/example2-preamble-edited.png Graphic file (type png)
910<use img/example2-preamble-edited.png>
911Package pdftex.def Info: img/example2-preamble-edited.png used on input line 3
9126.
913(pdftex.def) Requested size: 287.57367pt x 153.57336pt.
914File: unilu.jpg Graphic file (type jpg)
915<use unilu.jpg>
916Package pdftex.def Info: unilu.jpg used on input line 36.
917(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
918 [3
919
920 <./img/example2-preamble-edited.png>]
921LaTeX Font Info: Trying to load font information for OMS+cmtt on input line
92245.
923LaTeX Font Info: No file OMScmtt.fd. on input line 45.
924
925
926LaTeX Font Warning: Font shape `OMS/cmtt/m/n' undefined
927(Font) using `OMS/cmsy/m/n' instead
928(Font) for symbol `textbackslash' on input line 45.
929
930File: unilu.jpg Graphic file (type jpg)
931<use unilu.jpg>
932Package pdftex.def Info: unilu.jpg used on input line 45.
933(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
934[4
935
936]
937LaTeX Font Info: Trying to load font information for U+msa on input line 66.
938
939 (/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
940File: umsa.fd 2013/01/14 v3.01 AMS symbols A
941)
942LaTeX Font Info: Trying to load font information for U+msb on input line 66.
943
944
945(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
946File: umsb.fd 2013/01/14 v3.01 AMS symbols B
947)
948Overfull \hbox (6.31702pt too wide) in paragraph at lines 66--66
949 []
950 []
951
952File: unilu.jpg Graphic file (type jpg)
953<use unilu.jpg>
954Package pdftex.def Info: unilu.jpg used on input line 66.
955(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
956[5
957
958]
959LaTeX Font Info: Trying to load font information for OMS+cmss on input line
96077.
961LaTeX Font Info: No file OMScmss.fd. on input line 77.
962
963
964LaTeX Font Warning: Font shape `OMS/cmss/m/n' undefined
965(Font) using `OMS/cmsy/m/n' instead
966(Font) for symbol `textbraceleft' on input line 77.
967
968File: unilu.jpg Graphic file (type jpg)
969<use unilu.jpg>
970Package pdftex.def Info: unilu.jpg used on input line 77.
971(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
972[6
973
974]
975File: unilu.jpg Graphic file (type jpg)
976<use unilu.jpg>
977Package pdftex.def Info: unilu.jpg used on input line 93.
978(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
979 [7
980
981]
982File: unilu.jpg Graphic file (type jpg)
983<use unilu.jpg>
984Package pdftex.def Info: unilu.jpg used on input line 105.
985(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
986 [8
987
988]
989File: unilu.jpg Graphic file (type jpg)
990<use unilu.jpg>
991Package pdftex.def Info: unilu.jpg used on input line 120.
992(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
993 [9
994
995]
996LaTeX Font Info: Trying to load font information for TS1+cmtt on input line
997132.
998 (/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd
999File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
1000)
1001File: unilu.jpg Graphic file (type jpg)
1002<use unilu.jpg>
1003Package pdftex.def Info: unilu.jpg used on input line 132.
1004(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1005 [10
1006
1007]
1008File: unilu.jpg Graphic file (type jpg)
1009<use unilu.jpg>
1010Package pdftex.def Info: unilu.jpg used on input line 153.
1011(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1012 [11
1013
1014]
1015File: unilu.jpg Graphic file (type jpg)
1016<use unilu.jpg>
1017Package pdftex.def Info: unilu.jpg used on input line 169.
1018(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1019
1020[12
1021
1022]
1023File: unilu.jpg Graphic file (type jpg)
1024<use unilu.jpg>
1025Package pdftex.def Info: unilu.jpg used on input line 184.
1026(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1027 [13
1028
1029]
1030File: unilu.jpg Graphic file (type jpg)
1031<use unilu.jpg>
1032Package pdftex.def Info: unilu.jpg used on input line 196.
1033(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1034 [14
1035
1036]
1037LaTeX Font Info: Trying to load font information for U+euf on input line 213
1038.
1039 (/usr/share/texmf-dist/tex/latex/amsfonts/ueuf.fd
1040File: ueuf.fd 2013/01/14 v3.01 Euler Fraktur
1041)
1042File: unilu.jpg Graphic file (type jpg)
1043<use unilu.jpg>
1044Package pdftex.def Info: unilu.jpg used on input line 213.
1045(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1046 [15
1047
1048]
1049File: unilu.jpg Graphic file (type jpg)
1050<use unilu.jpg>
1051Package pdftex.def Info: unilu.jpg used on input line 224.
1052(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1053 [16
1054
1055]
1056File: unilu.jpg Graphic file (type jpg)
1057<use unilu.jpg>
1058Package pdftex.def Info: unilu.jpg used on input line 238.
1059(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1060
1061[17
1062
1063]
1064File: unilu.jpg Graphic file (type jpg)
1065<use unilu.jpg>
1066Package pdftex.def Info: unilu.jpg used on input line 261.
1067(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1068 [18
1069
1070]
1071File: unilu.jpg Graphic file (type jpg)
1072<use unilu.jpg>
1073Package pdftex.def Info: unilu.jpg used on input line 289.
1074(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1075 [19
1076
1077]
1078File: unilu.jpg Graphic file (type jpg)
1079<use unilu.jpg>
1080Package pdftex.def Info: unilu.jpg used on input line 299.
1081(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1082 [20
1083
1084]
1085File: unilu.jpg Graphic file (type jpg)
1086<use unilu.jpg>
1087Package pdftex.def Info: unilu.jpg used on input line 308.
1088(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1089 [21
1090
1091]
1092<img/thm_pre.png, id=604, 493.845pt x 208.78pt>
1093File: img/thm_pre.png Graphic file (type png)
1094<use img/thm_pre.png>
1095Package pdftex.def Info: img/thm_pre.png used on input line 326.
1096(pdftex.def) Requested size: 148.15463pt x 62.63448pt.
1097<img/thm_tex.png, id=605, 621.32124pt x 162.6075pt>
1098File: img/thm_tex.png Graphic file (type png)
1099<use img/thm_tex.png>
1100Package pdftex.def Info: img/thm_tex.png used on input line 326.
1101(pdftex.def) Requested size: 186.39781pt x 48.78262pt.
1102
1103Overfull \hbox (15.25017pt too wide) in paragraph at lines 326--326
1104[][]
1105 []
1106
1107<img/thm_pdf.png, id=606, 848.16875pt x 474.77374pt>
1108File: img/thm_pdf.png Graphic file (type png)
1109<use img/thm_pdf.png>
1110Package pdftex.def Info: img/thm_pdf.png used on input line 326.
1111(pdftex.def) Requested size: 169.63074pt x 94.95306pt.
1112File: unilu.jpg Graphic file (type jpg)
1113<use unilu.jpg>
1114Package pdftex.def Info: unilu.jpg used on input line 326.
1115(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1116[22
1117
1118 <./img/thm_pre.png> <./img/thm_tex.png> <./img/thm_pdf.png>]
1119File: unilu.jpg Graphic file (type jpg)
1120<use unilu.jpg>
1121Package pdftex.def Info: unilu.jpg used on input line 337.
1122(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1123 [23
1124
1125]
1126\tf@nav=\write6
1127\openout6 = `2-LatexFundamentals.nav'.
1128
1129\tf@toc=\write7
1130\openout7 = `2-LatexFundamentals.toc'.
1131
1132\tf@snm=\write8
1133\openout8 = `2-LatexFundamentals.snm'.
1134
1135
1136(./2-LatexFundamentals.aux)
1137Package rerunfilecheck Info: File `2-LatexFundamentals.out' has not changed.
1138(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0.
1139
1140
1141LaTeX Font Warning: Some font shapes were not available, defaults substituted.
1142
1143 )
1144Here is how much of TeX's memory you used:
1145 21817 strings out of 479383
1146 440738 string characters out of 5875799
1147 736403 words of memory out of 5000000
1148 38353 multiletter control sequences out of 15000+600000
1149 417921 words of font info for 82 fonts, out of 8000000 for 9000
1150 1141 hyphenation exceptions out of 8191
1151 107i,15n,111p,440b,626s stack positions out of 5000i,500n,10000p,200000b,80000s
1152{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/share/
1153texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/texmf-dist/fon
1154ts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texmf-dist/fonts/type1/publi
1155c/amsfonts/cm/cmmi8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c
1156mss10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></us
1157r/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmss17.pfb></usr/share/texmf-
1158dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texmf-dist/fonts/type
11591/public/amsfonts/cm/cmss9.pfb></usr/share/texmf-dist/fonts/type1/public/amsfon
1160ts/cm/cmssbx10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmssi1
11610.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmssi8.pfb></usr/sh
1162are/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist
1163/fonts/type1/public/amsfonts/cm/cmsy8.pfb></usr/share/texmf-dist/fonts/type1/pu
1164blic/amsfonts/cm/cmtt10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/
1165cm/cmtt8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/euler/eufm10.pf
1166b></usr/share/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb></usr/s
1167hare/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb>
1168Output written on 2-LatexFundamentals.pdf (23 pages, 397400 bytes).
1169PDF statistics:
1170 728 PDF objects out of 1000 (max. 8388607)
1171 661 compressed objects within 7 object streams
1172 47 named destinations out of 1000 (max. 500000)
1173 92 words of extra memory for PDF output out of 10000 (max. 10000000)
1174
diff --git a/src/Lecture1/slides/2-LatexFundamentals.nav b/src/Lecture1/slides/2-LatexFundamentals.nav
new file mode 100644
index 0000000..fe076e4
--- /dev/null
+++ b/src/Lecture1/slides/2-LatexFundamentals.nav
@@ -0,0 +1,51 @@
1\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
2\headcommand {\beamer@framepages {1}{1}}
3\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}
4\headcommand {\beamer@framepages {2}{2}}
5\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}
6\headcommand {\beamer@framepages {3}{3}}
7\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}
8\headcommand {\beamer@framepages {4}{4}}
9\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}
10\headcommand {\beamer@framepages {5}{5}}
11\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}
12\headcommand {\beamer@framepages {6}{6}}
13\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}
14\headcommand {\beamer@framepages {7}{7}}
15\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}
16\headcommand {\beamer@framepages {8}{8}}
17\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}
18\headcommand {\beamer@framepages {9}{9}}
19\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}
20\headcommand {\beamer@framepages {10}{10}}
21\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}
22\headcommand {\beamer@framepages {11}{11}}
23\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}
24\headcommand {\beamer@framepages {12}{12}}
25\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}
26\headcommand {\beamer@framepages {13}{13}}
27\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}
28\headcommand {\beamer@framepages {14}{14}}
29\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}
30\headcommand {\beamer@framepages {15}{15}}
31\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}
32\headcommand {\beamer@framepages {16}{16}}
33\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}
34\headcommand {\beamer@framepages {17}{17}}
35\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}
36\headcommand {\beamer@framepages {18}{18}}
37\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}
38\headcommand {\beamer@framepages {19}{19}}
39\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}
40\headcommand {\beamer@framepages {20}{20}}
41\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}
42\headcommand {\beamer@framepages {21}{21}}
43\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}
44\headcommand {\beamer@framepages {22}{22}}
45\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}}
46\headcommand {\beamer@framepages {23}{23}}
47\headcommand {\beamer@partpages {1}{23}}
48\headcommand {\beamer@subsectionpages {1}{23}}
49\headcommand {\beamer@sectionpages {1}{23}}
50\headcommand {\beamer@documentpages {23}}
51\headcommand {\gdef \inserttotalframenumber {23}}
diff --git a/src/Lecture1/slides/2-LatexFundamentals.out b/src/Lecture1/slides/2-LatexFundamentals.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture1/slides/2-LatexFundamentals.out
diff --git a/src/Lecture1/slides/2-LatexFundamentals.pdf b/src/Lecture1/slides/2-LatexFundamentals.pdf
new file mode 100644
index 0000000..a96f172
--- /dev/null
+++ b/src/Lecture1/slides/2-LatexFundamentals.pdf
Binary files differ
diff --git a/src/Lecture1/slides/2-LatexFundamentals.snm b/src/Lecture1/slides/2-LatexFundamentals.snm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture1/slides/2-LatexFundamentals.snm
diff --git a/src/Lecture1/slides/2-LatexFundamentals.tex b/src/Lecture1/slides/2-LatexFundamentals.tex
new file mode 100644
index 0000000..fe2c031
--- /dev/null
+++ b/src/Lecture1/slides/2-LatexFundamentals.tex
@@ -0,0 +1,340 @@
1\documentclass[11pt]{beamer}
2\usetheme{Madrid}
3\usepackage[utf8]{inputenc}
4\usepackage{amsmath, amssymb, amsfonts, amsthm}
5\usepackage{xcolor}
6
7\usepackage{tikz-cd}
8
9\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto}
10\title{Latex Fundamentals}
11\logo{\includegraphics[scale=0.1]{img/unilu.jpg}}
12%\institute{University of Luxembourg}
13
14\newcommand{\bs}{\textbackslash}
15
16\date{2021-02-19}
17
18\begin{document}
19
20\begin{frame}
21 \titlepage
22\end{frame}
23
24\begin{frame}{Latex}
25 \begin{enumerate}
26 \item Write code (like HTML, not like Python)
27 \item Compile to get a pdf file
28 \item ???
29 \item Profit
30 \end{enumerate}
31\end{frame}
32
33
34\begin{frame}{Document structure}
35 \includegraphics[scale=0.5]{img/example2-preamble-edited.png}
36\end{frame}
37
38\begin{frame}{Preamble}
39 \begin{itemize}
40 \item Include packages with \texttt{\bs usepackage}
41 \item Define properties of the document (\texttt{\bs documentclass},
42 \texttt{\bs author}, ...)
43 \item Define new commands and environments
44 \end{itemize}
45\end{frame}
46
47\begin{frame}{Text formatting}
48 \begin{center}
49
50 \begin{tabular}{ccc}
51 \texttt{\small \bs textbf\{Hello\}} &
52 \texttt{\small \bs textit\{Hello\}} or \texttt{\small\bs emph\{Hello\}} &
53 \texttt{\small \bs underline\{Hello\}} \\
54 \textbf{Hello} & \textit{Hello} & \underline{Hello}
55 \end{tabular}
56
57 \vspace{0.7cm}
58 \begin{tabular}{ccc}
59 \texttt{\small \{\bs small Hello\}} & \hspace{1cm}
60 \texttt{\small \{\bs Large Hello\}} \hspace{1cm} &
61 \texttt{\small \{\bs huge Hello\}} \\
62 {\small Hello} & {\Large Hello} & {\huge Hello}
63 \end{tabular}
64
65 \end{center}
66\end{frame}
67
68\begin{frame}{Text formatting}
69 Some technicalities:
70 \begin{itemize}
71 \item Blocks are delimited by \{ and \}
72 \item \texttt{\bs textbf\{...\}} etc. are commands with one argument
73 \item \texttt{\bs emph\{...\}} is context-aware (when in doubt use this)
74 \item \texttt{\bs Large} etc. change the text until the end of the block
75 \item Some people use \texttt{\{\bs bf Hello\}}, but it is deprecated
76 \end{itemize}
77\end{frame}
78
79\begin{frame}{Text formatting}
80 \begin{center}
81 \begin{tabular}{lc}
82 \texttt{\{\bs tiny Hello\}} & {\tiny Hello} \\
83 \texttt{\{\bs scriptsize Hello\}} & {\scriptsize Hello} \\
84 \texttt{\{\bs footnotesize Hello\}} & {\footnotesize Hello} \\
85 \texttt{\{\bs normalsize Hello\}} & {\normalsize Hello} \\
86 \texttt{\{\bs large Hello\}} & {\large Hello} \\
87 \texttt{\{\bs Large Hello\}} & {\Large Hello} \\
88 \texttt{\{\bs LARGE Hello\}} & {\LARGE Hello} \\
89 \texttt{\{\bs huge Hello\}} & {\huge Hello} \\
90 \texttt{\{\bs Huge Hello\}} & {\Huge Hello} \\
91 \end{tabular}
92 \end{center}
93\end{frame}
94
95\begin{frame}{Math mode}
96 \texttt{One can write math inline, like
97 {\color{red}\bs(} \bs sum\_i\bs frac\{i\}\{2\} {\color{red}\bs)},
98 or in displaystyle:
99 {\color{red}\bs[} \bs sum\_i\bs frac\{i\}\{2\} {\color{red}\bs]}
100 }
101
102 \vspace{1.5cm}
103 One can write math inline, like \(\sum_i\frac{i}{2}\) or in displaystyle:
104 \[\sum_i\frac{i}{2}\]
105\end{frame}
106
107\begin{frame}{Math mode}
108 \begin{center}
109 For formulas spanning multiple lines you can use:
110
111 \vspace{0.5cm}
112 \texttt{\color{red}\bs begin\{align\} (...) \bs end \{align\}}
113 \begin{align}
114 e^x =& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\
115 =& 1 + x + \frac{x^2}{2} + \frac{x^3}{6} + \cdots
116 \end{align}
117 or \texttt{\color{red}\bs begin\{align*\} (...) \bs end\{align*\}} for no
118 numbers.
119 \end{center}
120\end{frame}
121
122\begin{frame}{Math mode}
123 \begin{itemize}
124 \item Some people use \texttt{\$2+2=4\$} instead of \texttt{\bs(2+2=4\bs)}
125 \item Some \textbf{evil} people use \texttt{\$\$2+2=4\$\$} instead of
126 \texttt{\bs[2+2=4\bs]} (don't try this at home!)
127 \item For \texttt{align} use \texttt{\bs nonumber} to remove one number
128 and \texttt{\&} to align.
129 \item For example I always use \texttt{\$2+2=4\$} and the \texttt{align*}
130 environment.
131 \end{itemize}
132\end{frame}
133
134\begin{frame}{Math mode}
135 \begin{itemize}
136 \item Simple symbols: letters, numbers, $+,-,=,<,>$...
137 \item Symbols that need a \textbf{command}:
138
139 \vspace{0.6cm}
140 \begin{tabular}{c|c|c|c|c}
141 \texttt{\bs alpha, \bs Phi} & \texttt{\bs times, \bs cdot} &
142 \texttt{\bs sum} & \texttt{\bs leq, \bs geq} & \texttt{\bs infty}\\
143 $\alpha,\Phi$ & $\times,\cdot$ & $\sum$ & $\leq,\geq$ & $\infty$
144 \end{tabular}
145 \vspace{0.6cm}
146 \item Negate symbols with \texttt{\bs not}:
147 \begin{align*}
148 \texttt{x \bs not \bs in A} \qquad\to&\qquad x\not\in A\\
149 \texttt{x \bs not = y}\quad\text{ or }\quad\texttt{x \bs neq y}
150 \qquad\to&\qquad x\neq y\\
151 \end{align*}
152 \end{itemize}
153\end{frame}
154
155\begin{frame}{Math mode}
156 \begin{itemize}
157 \item Some commands take one or more \textbf{arguments} (like
158 \texttt{\bs frac}).
159
160 Anything can be an argument:
161 \begin{align*}
162 \texttt{\bs frac\{1\}\{\bs sum\_\{n\}\}}\qquad\to\qquad
163 \frac{1}{\sum_{n} \sqrt n}
164 \end{align*}
165 \item A few commands take \textbf{options}:
166 \texttt{\bs sqrt[3]\{x\}} $\to\,\sqrt[3]{x}$
167 %\item Most of these commands work only in Math mode
168 \end{itemize}
169\end{frame}
170
171
172\begin{frame}{Math mode}
173 \begin{itemize}
174 \item Every symbol can have a \textbf{subscript} and a \textbf{superscript}
175 \begin{align*}
176 \texttt{x\_0\^{}\{23\}} \qquad \to \qquad x_0^{23}
177 \end{align*}
178 \item Anything can be a sub/superscript:
179 \begin{align*}
180 \texttt{\bs int\_\{\bs phi (y)\}\^{}\{2\^{}\{n\_1\}\}}
181 \qquad \to \qquad \int_{\phi(y)}^{2^{n_1}}
182 \end{align*}
183 \end{itemize}
184\end{frame}
185
186
187\begin{frame}{Math mode}
188 \begin{itemize}
189 \item Adjust parentheses size with \texttt{\bs left(} and
190 \texttt{\bs right)}: \[\left(\frac{x+6}{y-2}\right)\]
191 \item Insert text with \texttt{\bs text} and
192 spaces with \texttt{\bs ,} and \texttt{\bs quad}:
193 \[\text{this symbol}\quad \sum_{n=0}^\infty \frac{x^n}{n!} \quad
194 \text{is in math mode}, this is not text\]
195 \end{itemize}
196\end{frame}
197
198\begin{frame}{Math mode}
199
200 \begin{itemize}
201 \item Fancy letters with \texttt{\bs mathcal},
202 \texttt{\bs mathbb} and \texttt{\bs mathfrak}:
203 \begin{align*}
204 \mathcal{A} \qquad \mathbb R \qquad \mathfrak p
205 \end{align*}
206 \item For custom operators use \texttt{\bs operatorname\{oper\}}:
207 \begin{align*}
208 \operatorname{oper}(x)
209 \end{align*}
210 \item Pro-tip: write \texttt{\bs newcommand\{\bs R\}\{\bs mathbb R\}} and
211 \texttt{\bs DeclareMathOperator\{\bs lcm\}\{lcm\}} in your preamble!
212 \end{itemize}
213\end{frame}
214
215\begin{frame}{Math mode}
216 \begin{itemize}
217 \item Wikibooks page on Math mode:
218 {\small\url{https://en.wikibooks.org/wiki/LaTeX/Mathematics}}
219 \item Advanced stuff:
220 {\small\url{https://en.wikibooks.org/wiki/LaTeX/Advanced_Mathematics}}
221 \item List of Mathematical symbols:
222 {\small\url{https://www.caam.rice.edu/~heinken/latex/symbols.pdf}}
223 \end{itemize}
224\end{frame}
225
226\begin{frame}{Environments}
227 \texttt{\color{red}\bs begin\{something\}}
228 Inside an environment
229 \texttt{\color{red}\bs end\{something\}}
230
231 \vspace{0.8cm}
232 \begin{itemize}
233 \item We have seen \texttt{document} and \texttt{align}
234 \item Text and symbols appear differently depending on the environment
235 \item Certain commands are specific to an environment
236 \item You can define new environments
237 \end{itemize}
238\end{frame}
239
240
241\begin{frame}{Environments}
242 Lists: \texttt{\color{red}itemize} and \texttt{\color{red}enumerate}
243
244 \vspace{0.8cm}
245 \begin{columns}
246 \column{0.5\textwidth}
247 \begin{itemize}
248 \item First: \[2+2=4\]
249 \item Second
250 \end{itemize}
251
252 \column{0.5\textwidth}
253 \texttt{\bs begin\{itemize\}}
254
255 \texttt{\qquad \bs item First: \bs[2+2=4\bs]}
256
257 \texttt{\qquad \bs item Second}
258
259 \texttt{\bs end\{itemize\}}
260 \end{columns}
261\end{frame}
262
263\begin{frame}{Environments}
264 Tables: \texttt{tabular} (text) and \texttt{array} (Math mode)
265
266 \vspace{0.8cm}
267 \begin{columns}
268 \column{0.5\textwidth}
269 \begin{tabular}{r|cc}
270 This & is & just \\
271 \hline
272 a & boring & table
273 \end{tabular}
274
275 \column{0.5\textwidth}
276 \texttt{\bs begin\{tabular\}\{r|cc\}}
277
278 \texttt{\qquad This \& is \& just \bs\bs}
279
280 \texttt{\qquad \bs hline}
281
282 \texttt{\qquad a \& boring \& table}
283
284 \texttt{\bs end\{tabular\}}
285 \end{columns}
286
287 \vspace{0.8cm}
288 Matrices: \texttt{array} with parentheses or \texttt{pmatrix}
289\end{frame}
290
291\begin{frame}{Sections}
292 \begin{itemize}
293 \item Use \texttt{\bs section\{Section Name\}} to start a new section
294 \item Also: \texttt{\bs chapter} (book only), \texttt{\bs subsection},
295 \texttt{subsubsection}...
296 \item \texttt{\bs section*\{Name\}} for no number
297 \item Sections after \texttt{\bs appendix} are numbered differently
298 \end{itemize}
299\end{frame}
300
301\begin{frame}{Theorems}
302
303 \begin{itemize}
304 \item In preamble: \texttt{\bs usepackage\{amsthm\}}
305 \item Also in preamble \texttt{\bs newtheorem \{envname\}\{Theorem\}}
306 \item Use \texttt{\bs newtheorem*} for no number
307 \end{itemize}
308\end{frame}
309
310\begin{frame}{Theorems}
311 \begin{columns}
312 \column{0.5\textwidth}
313 \includegraphics[scale=0.3]{img/thm_pre.png}
314
315 \vspace{0.2cm}
316 \vdots
317 \vspace{0.3cm}
318
319 \includegraphics[scale=0.3]{img/thm_tex.png}
320
321 \column{0.5\textwidth}
322 \includegraphics[scale=0.2]{img/thm_pdf.png}
323
324 \vspace{1cm}
325 \end{columns}
326\end{frame}
327
328\begin{frame}{End of the lecture}
329 For next time:
330
331 \vspace{0.8cm}
332 \begin{itemize}
333 \item Install Latex on your PC
334 \item Start writing something in Latex (e.g. homework)
335 \item Email me if you have any question
336 \end{itemize}
337\end{frame}
338
339\end{document}
340
diff --git a/src/Lecture1/slides/2-LatexFundamentals.toc b/src/Lecture1/slides/2-LatexFundamentals.toc
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture1/slides/2-LatexFundamentals.toc
diff --git a/src/Lecture1/slides/2-LatexFundamentals.vrb b/src/Lecture1/slides/2-LatexFundamentals.vrb
new file mode 100644
index 0000000..a5775a8
--- /dev/null
+++ b/src/Lecture1/slides/2-LatexFundamentals.vrb
@@ -0,0 +1,18 @@
1\frametitle{Math mode - align and equation}
2\begin{center}
3 For formulas spanning multiple lines you can use:
4 \begin{columns}
5 \column{0.5\textwidth}
6 \texttt{\bs begin\{align\}(...)\bs end \{align\}}
7 \begin{align}
8 \sum_{n=1}^\infty n =& 1+2+3+4+5+\cdots=\\
9 =& -\frac12
10 \end{align}
11 \column{0.5\textwidth}
12 \texttt{\bs begin\{equation\}(...)\bs end \{equation\}}
13 \begin{equation}
14 \sum_{n=1}^\infty n = 1+2+3+4+5+\cdots=\\
15 = -\frac12
16 \end{equation}
17 \end{columns}
18 \end{center}
diff --git a/src/Lecture1/slides/img/example2-preamble-edited.png b/src/Lecture1/slides/img/example2-preamble-edited.png
new file mode 100644
index 0000000..1bce28a
--- /dev/null
+++ b/src/Lecture1/slides/img/example2-preamble-edited.png
Binary files differ
diff --git a/src/Lecture1/slides/img/example2-preamble.png b/src/Lecture1/slides/img/example2-preamble.png
new file mode 100644
index 0000000..e2d7379
--- /dev/null
+++ b/src/Lecture1/slides/img/example2-preamble.png
Binary files differ
diff --git a/src/Lecture1/slides/img/latex.png b/src/Lecture1/slides/img/latex.png
new file mode 100644
index 0000000..200ec19
--- /dev/null
+++ b/src/Lecture1/slides/img/latex.png
Binary files differ
diff --git a/src/Lecture1/slides/img/sage.svg b/src/Lecture1/slides/img/sage.svg
new file mode 100644
index 0000000..642e67b
--- /dev/null
+++ b/src/Lecture1/slides/img/sage.svg
@@ -0,0 +1,72 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="500" height="130" id="svg2" sodipodi:version="0.32" inkscape:version="0.91 r13725" sodipodi:docname="sage-logo-2018.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.1">
4 <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:zoom="3.5216707" inkscape:cx="253.52082" inkscape:cy="12.127563" inkscape:document-units="px" inkscape:current-layer="g3993" showgrid="false" inkscape:window-width="2560" inkscape:window-height="1410" inkscape:window-x="0" inkscape:window-y="30" showguides="true" inkscape:guide-bbox="true" inkscape:window-maximized="1" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0"/>
5 <defs id="defs4"/>
6 <metadata id="metadata7">
7 <rdf:RDF>
8 <cc:Work rdf:about="">
9 <dc:format>image/svg+xml</dc:format>
10 <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
11 <dc:title/>
12 </cc:Work>
13 </rdf:RDF>
14 </metadata>
15 <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(-100.8642,-253.78876)">
16 <g id="g3993">
17 <rect ry="11.531985" rx="11.531984" y="253.78876" x="100.8642" height="130" width="500" id="rect3430" style="opacity:0.98999999;fill:#3131ff;fill-opacity:1;stroke:none" inkscape:export-xdpi="90" inkscape:export-ydpi="90"/>
18 <g id="g3432" transform="matrix(0.7759764,0,0,0.7759764,-1035.2282,-1486.6449)">
19 <path transform="matrix(0.9672595,0,0,0.9672595,235.69886,548.04605)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3434" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
20 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3436" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.9672595,0,0,0.9672595,308.74604,539.35166)"/>
21 <path transform="matrix(1.2053547,0,0,1.2053547,-25.196551,182.19849)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3438" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
22 <path transform="matrix(0.7953719,0,0,0.7953719,449.34462,925.45441)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3440" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
23 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3442" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.7953719,0,0,0.7953719,499.30379,973.24771)"/>
24 <path transform="matrix(0.7953719,0,0,0.7953719,556.29908,956.69427)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3444" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
25 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3446" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.7953719,0,0,0.7953719,581.00221,902.90894)"/>
26 <path transform="matrix(0.6234843,0,0,0.6234843,800.65848,1180.6657)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3448" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
27 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3450" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.6234843,0,0,0.6234843,766.33259,1139.9519)"/>
28 <path transform="matrix(0.6234843,0,0,0.6234843,664.75027,1230.1938)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3454" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
29 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3456" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.6234843,0,0,0.6234843,701.58781,1267.5497)"/>
30 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3458" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.7953719,0,0,0.7953719,440.41431,869.81028)"/>
31 <path transform="matrix(0.7953719,0,0,0.7953719,484.50773,829.39633)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3460" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
32 <path transform="matrix(0.6234843,0,0,0.6234843,699.00639,1196.6154)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3462" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
33 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3464" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.6234843,0,0,0.6234843,749.0301,1256.3969)"/>
34 <path id="path3468" d="m 1590.0065,2271.6035 -18.6281,72.6731" style="fill:none;stroke:#ffffff;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
35 <path id="path3470" d="m 1589.0995,2273.5223 -72.5588,8.4545" style="fill:none;stroke:#ffffff;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
36 <path id="path3472" d="m 1571.3087,2343.4372 -54.6982,-61.8801" style="fill:none;stroke:#ffffff;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
37 <path id="path3474" d="m 1571.3087,2343.8569 -18.07,55.944" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
38 <path id="path3476" d="m 1516.4012,2281.3172 21.0002,-24.3443" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
39 <path id="path3478" d="m 1493.9359,2295.4681 21.7676,-14.3307" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
40 <path id="path3480" d="m 1503.0057,2350.6326 13.3955,-69.9749" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
41 <path id="path3482" d="m 1552.1922,2398.5417 -49.5353,-46.59" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
42 <path id="path3484" d="m 1610.0997,2381.3328 -58.1168,16.969" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
43 <path id="path3486" d="m 1634.2395,2328.3869 -24.1398,53.1257" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
44 <path id="path3488" d="m 1570.5412,2343.4372 62.8611,-14.6306" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
45 <path id="path3491" d="m 1590.1461,2273.0426 43.1166,55.1644" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
46 <path id="path3493" d="m 1501.7987,2350.6326 66.9774,-7.1954" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
47 <path id="path3495" d="m 1551.4038,2398.062 -24.4188,-13.1316" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
48 <path id="path3497" d="m 1489.38,2347.2747 36.3492,37.296" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
49 <path id="path3499" d="m 1493.2173,2295.9478 -2.721,51.3269" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
50 <path id="path3501" d="m 1537.3805,2254.8743 54.0702,1.8588" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
51 <path id="path3503" d="m 1627.172,2298.5261 -34.2562,-41.9729" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
52 <path id="path3505" d="m 1635.4744,2328.207 -9.0001,-30.1006" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
53 <path id="path3507" d="m 1589.4972,2272.2631 3.2093,-15.2902" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
54 <path id="path3509" d="m 1503.6825,2351.2305 -14.1629,-2.6983" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
55 <path id="path3511" d="m 1526.985,2385.4084 46.7446,-11.4526" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
56 <path id="path3513" d="m 1574.9157,2373.8958 33.6282,7.2554" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
57 <path id="path3515" d="m 1492.5121,2295.941 61.203,-6.8478" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
58 <path id="path3517" d="m 1553.7151,2287.7387 36.4241,-13.5452" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
59 <path transform="matrix(0.6234843,0,0,0.6234843,726.86911,1170.9368)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3519" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
60 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3521" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.5833906,0,0,0.5833906,837.2333,1298.2147)"/>
61 <path id="path3523" d="m 1609.6576,2343.739 16.404,-46.0639" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
62 <path id="path3525" d="m 1609.4298,2381.481 0.5696,-38.77" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
63 <path style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" d="m 1502.1919,2350.0723 23.4339,-35.9573" id="path3527" inkscape:connector-curvature="0"/>
64 <path style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" d="M 1537.8572,2255.3651 1524.94,2314.115" id="path3529" inkscape:connector-curvature="0"/>
65 </g>
66 <path style="fill:none;stroke:#ffffff;stroke-width:2.70117497;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" d="m 254.60496,253.34928 c 0,132.01 0,130.863 0,130.863" id="path3583" inkscape:connector-curvature="0"/>
67 <path inkscape:connector-curvature="0" style="fill:#ffffff;fill-opacity:1;stroke:none" d="m 346.54394,281.67999 c -0.37043,0.007 -0.76375,0.0151 -1.1923,0.0298 -4.7419,0.0171 -7.05535,-0.0322 -12.07595,0 -9.38453,-0.002 -18.5077,-0.009 -27.94282,0 -2.76724,0.002 -3.2464,0.74262 -4.15781,2.08965 -0.84157,1.257 -0.52,2.74748 -0.58086,4.35844 0.0491,9.26026 -0.11828,18.39755 0.0916,27.76254 2.3e-4,1.71546 0.22265,2.89833 2.96549,2.92551 11.90252,0.071 23.8385,-0.0528 35.73868,0.11936 1.86901,-0.0373 2.49921,0.36001 2.41519,2.71654 0.0938,5.34549 0.0594,8.55673 0.0916,13.01556 0.0616,1.51319 -0.93002,2.06621 -2.44578,2.05981 -11.81841,-0.14189 -23.64222,-0.0193 -35.46352,-0.0597 0,0 -19.44381,-0.0373 -19.74953,0 -1.40045,0.56851 -1.24661,1.72798 -1.28402,3.64197 0.0367,1.89735 -0.10303,3.39377 1.1923,3.6121 2.2304,0.43082 4.53877,0.12215 6.81757,0.23882 18.43643,-0.0193 38.42963,0.0406 56.86393,-0.0298 1.55646,0.0749 2.20791,-0.4696 2.14005,-2.35832 -0.0403,-9.55785 0.0816,-18.57222 -0.0612,-28.12078 -0.0638,-1.48128 -0.33764,-2.06013 -1.58975,-2.26876 l -34.88265,0 c -2.78601,0.032 -3.05366,-0.007 -3.7298,-0.71645 -0.6514,-0.68444 -0.7527,-1.59021 -0.70315,-6.06001 -0.0713,-4.92872 -0.0627,-3.07599 0,-8.00038 -0.0565,-3.81095 -0.27244,-4.9496 0.61143,-6.03015 0.9055,-1.10697 4.69087,-0.67763 8.34616,-0.65674 10.24285,-0.0305 23.70767,0.19061 30.20516,0 2.18319,-0.0642 2.0923,-1.30284 2.14004,-4.0599 0.0193,-3.86686 -1.16746,-4.25181 -3.76036,-4.20916 z m 23.4793,0 c -2.38324,0.004 -4.80548,0.0359 -7.3067,0.0895 -2.42348,-0.18934 -4.30516,1.00537 -4.18838,4.44799 0.0543,18.30196 -0.19041,35.13798 0,53.43544 0.19127,4.57432 2.39608,4.27143 5.8087,4.23901 13.51499,-0.0625 24.92875,-0.0434 38.64301,-0.47763 1.87754,-0.0594 3.45678,-1.4103 4.76925,-4.1196 1.74989,-3.13894 3.37176,-5.84613 5.25838,-9.40345 1.73378,-3.26914 2.76947,-6.45889 4.24951,-6.44807 1.48004,0.0109 2.52111,3.21701 4.86095,7.22423 2.33984,4.00723 5.11487,8.50015 7.52072,11.55281 1.90175,1.72645 5.04589,1.14142 8.04044,1.25378 8.37287,-0.0638 16.78431,0.22246 25.13019,0 2.26544,-0.0504 1.60002,-2.09729 1.71203,-3.64197 0.32736,-4.51419 -2.74798,-3.62595 -4.67752,-3.67182 -8.8857,-0.10758 -22.44645,0.74045 -25.68049,0.11936 -1.64482,-0.31584 -3.21958,-2.94907 -7.70414,-10.56769 -1.99177,-2.96156 -2.55627,-4.11539 -4.52466,-7.61233 -0.5719,-0.98583 -0.56688,-1.88964 -0.30572,-3.01504 2.62458,-5.434 1.5447,-3.00409 2.90434,-5.64208 4.10098,-6.79184 10.5605,-17.97616 11.12822,-18.8666 1.22636,-1.9235 2.83254,-1.53373 5.5641,-1.61201 7.76311,-0.0151 15.47704,-0.10563 23.2653,0.0298 3.76224,-0.009 3.78975,0.94091 3.72979,5.40325 -0.047,21.77964 0.10281,43.54142 -0.0612,65.31662 -0.65557,2.64801 -4.17524,2.40442 -6.45069,2.44788 -15.03857,0.0627 -30.0913,-0.1303 -45.1243,0.0895 -0.8338,1.30593 -0.90729,2.40815 -1.03945,4.1196 -0.0894,1.63569 -0.28797,3.95505 2.04832,3.88078 18.84775,0.0635 37.7046,0.0108 56.55823,0.0298 1.94799,-0.002 3.20688,-1.95119 3.14892,-4.1196 -0.0361,-26.28869 0.0651,-52.58481 -0.0612,-78.86953 0.0706,-2.49769 -1.23214,-5.52925 -4.24951,-5.52266 -12.40867,-0.0914 -24.82933,-0.0855 -37.23671,0 -3.77303,0.41319 -4.85765,4.65736 -6.72585,7.28393 -3.70935,6.17615 -7.25859,12.46514 -11.06705,18.56808 -1.53274,1.93131 -2.6533,-0.74347 -3.33236,-1.94039 -4.38793,-7.25285 -8.84035,-14.62797 -13.42111,-21.76227 -2.13904,-2.88031 -5.96126,-2.14883 -9.72191,-2.14935 -7.51296,0.046 -14.31183,-0.10541 -21.46155,-0.0895 z m 117.794,0 c -1.74522,0.40297 -2.82837,2.21505 -2.87379,3.91064 -0.002,17.91255 -0.0171,35.82253 0.0612,53.73396 0.0554,1.90805 1.00565,3.07483 2.75149,3.82109 1.82118,0.88335 3.66025,0.97694 5.93097,1.01496 l 67.96159,0 c 1.33481,0.0881 1.93085,-0.007 1.95662,-1.70156 0.0243,-1.66238 0.0528,-3.21199 0,-4.6868 0.0537,-1.796 -1.51141,-1.69348 -2.29289,-1.64188 l -65.88273,0 c -1.66979,-0.0346 -2.40612,-1.66458 -2.17059,-3.10462 0.0193,-13.82954 -0.0386,-27.69841 0.0305,-41.52442 -0.10862,-2.27759 0.93405,-2.96926 2.81262,-2.80612 12.70762,0.037 27.10367,-0.0691 39.80477,0.0596 1.47047,-0.0583 2.46521,0.86667 2.35404,2.41802 -0.0575,5.30572 0.11055,12.40667 -0.0916,17.70236 0.1698,2.06578 -1.3662,1.96895 -2.99605,1.94039 -11.6794,0.0193 -16.80653,0.0713 -36.53356,0.0596 -1.93222,-7.6e-4 -1.49203,1.87931 -1.55919,3.52254 0.0771,2.73125 -0.42735,4.24372 1.19234,4.23902 15.57389,-0.0453 30.24904,0.11398 45.49113,0 1.56318,0.12 2.4766,-1.17465 2.44576,-2.92552 -0.0487,-10.28849 0.117,-20.55088 -0.0612,-30.83733 -0.29732,-1.83355 -2.25243,-3.09594 -4.79982,-3.13447 -17.85306,-0.0357 -35.6799,0.0662 -53.5316,-0.0596 z m -114.85909,7.37348 c 2.82764,-0.0294 5.67113,0.20523 8.49904,0.14919 4.53418,-0.0522 7.52775,0.0539 12.07594,0 3.82394,-0.0764 4.71204,2.78726 5.35009,3.82109 3.747,6.07122 6.39261,10.52033 9.99705,16.56797 1.20991,2.01432 2.41944,3.65173 3.57693,5.49282 0.46804,0.98488 0.26631,2.0831 -0.24457,3.01507 -1.9047,2.84027 -3.54524,5.84743 -5.31952,8.77655 -1.898,3.02164 -3.43612,6.271 -5.71697,9.04521 -0.95342,1.39773 -3.14377,0.68796 -4.03552,0.92542 -8.07776,0.0916 -14.69346,0.0335 -22.77613,0.0596 -1.73097,-0.10862 -5.08644,0.40143 -6.54244,-0.53732 -1.7547,-1.13139 -1.53826,-2.95631 -1.5286,-4.59726 -0.0414,-7.1301 0.0129,-12.7755 0,-19.91142 -0.0987,-5.62971 0.0988,-9.77399 0,-15.40373 -0.087,-3.25177 0.16444,-3.72516 0.64203,-4.8062 0.57861,-1.30962 1.90723,-2.07022 3.17948,-2.44789 0.93799,-0.0835 1.90066,-0.13931 2.84319,-0.14919 z" id="path5088-7-1-3" sodipodi:nodetypes="cccccccccccccccccccccccccsccccccccccccscscccscsccccscccccccccccccccccccccccccccccccccccccccsccccccccscccccccscccsccc"/>
68 </g>
69 </g>
70 <svg version="1.1" baseProfile="full" id="body" width="8in" height="8in" viewBox="0 0 1 1" preserveAspectRatio="none" inkscape:version="0.48.4 r9939" transform="matrix(720,0,0,720,-100.8642,668.57342)"/>
71 <svg version="1.1" baseProfile="full" id="svg118829" width="8in" height="8in" viewBox="0 0 1 1" preserveAspectRatio="none" inkscape:version="0.48.4 r9939" transform="matrix(720,0,0,720,-100.8642,668.57342)"/>
72</svg> \ No newline at end of file
diff --git a/src/Lecture1/slides/img/thm_pdf.png b/src/Lecture1/slides/img/thm_pdf.png
new file mode 100644
index 0000000..dfeed6f
--- /dev/null
+++ b/src/Lecture1/slides/img/thm_pdf.png
Binary files differ
diff --git a/src/Lecture1/slides/img/thm_pre.png b/src/Lecture1/slides/img/thm_pre.png
new file mode 100644
index 0000000..5c2147b
--- /dev/null
+++ b/src/Lecture1/slides/img/thm_pre.png
Binary files differ
diff --git a/src/Lecture1/slides/img/thm_tex.png b/src/Lecture1/slides/img/thm_tex.png
new file mode 100644
index 0000000..f98ba0b
--- /dev/null
+++ b/src/Lecture1/slides/img/thm_tex.png
Binary files differ
diff --git a/src/Lecture1/slides/img/unilu.jpg b/src/Lecture1/slides/img/unilu.jpg
new file mode 100644
index 0000000..5265563
--- /dev/null
+++ b/src/Lecture1/slides/img/unilu.jpg
Binary files differ
diff --git a/src/Lecture1/slides/svg-inkscape/sage_svg-tex.pdf b/src/Lecture1/slides/svg-inkscape/sage_svg-tex.pdf
new file mode 100644
index 0000000..ded4361
--- /dev/null
+++ b/src/Lecture1/slides/svg-inkscape/sage_svg-tex.pdf
Binary files differ
diff --git a/src/Lecture1/slides/svg-inkscape/sage_svg-tex.pdf_tex b/src/Lecture1/slides/svg-inkscape/sage_svg-tex.pdf_tex
new file mode 100644
index 0000000..14f08dd
--- /dev/null
+++ b/src/Lecture1/slides/svg-inkscape/sage_svg-tex.pdf_tex
@@ -0,0 +1,58 @@
1%% Creator: Inkscape 1.0.1 (unknown), www.inkscape.org
2%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
3%% Accompanies image file 'sage_svg-tex.pdf' (pdf, eps, ps)
4%%
5%% To include the image in your LaTeX document, write
6%% \input{<filename>.pdf_tex}
7%% instead of
8%% \includegraphics{<filename>.pdf}
9%% To scale the image, write
10%% \def\svgwidth{<desired width>}
11%% \input{<filename>.pdf_tex}
12%% instead of
13%% \includegraphics[width=<desired width>]{<filename>.pdf}
14%%
15%% Images with a different path to the parent latex file can
16%% be accessed with the `import' package (which may need to be
17%% installed) using
18%% \usepackage{import}
19%% in the preamble, and then including the image with
20%% \import{<path to file>}{<filename>.pdf_tex}
21%% Alternatively, one can specify
22%% \graphicspath{{<path to file>/}}
23%%
24%% For more information, please see info/svg-inkscape on CTAN:
25%% http://tug.ctan.org/tex-archive/info/svg-inkscape
26%%
27\begingroup%
28 \makeatletter%
29 \providecommand\color[2][]{%
30 \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
31 \renewcommand\color[2][]{}%
32 }%
33 \providecommand\transparent[1]{%
34 \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
35 \renewcommand\transparent[1]{}%
36 }%
37 \providecommand\rotatebox[2]{#2}%
38 \newcommand*\fsize{\dimexpr\f@size pt\relax}%
39 \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
40 \ifx\svgwidth\undefined%
41 \setlength{\unitlength}{375bp}%
42 \ifx\svgscale\undefined%
43 \relax%
44 \else%
45 \setlength{\unitlength}{\unitlength * \real{\svgscale}}%
46 \fi%
47 \else%
48 \setlength{\unitlength}{\svgwidth}%
49 \fi%
50 \global\let\svgwidth\undefined%
51 \global\let\svgscale\undefined%
52 \makeatother%
53 \begin{picture}(1,0.26172667)%
54 \lineheight{1}%
55 \setlength\tabcolsep{0pt}%
56 \put(0,0){\includegraphics[width=\unitlength,page=1]{sage_svg-tex.pdf}}%
57 \end{picture}%
58\endgroup%
diff --git a/src/Lecture2/live/biblio1.aux b/src/Lecture2/live/biblio1.aux
new file mode 100644
index 0000000..fcf6e6c
--- /dev/null
+++ b/src/Lecture2/live/biblio1.aux
@@ -0,0 +1,10 @@
1\relax
2\citation{szamuely}
3\citation{szamuely}
4\citation{knuth68}
5\citation{knuth68}
6\citation{szamuely}
7\bibcite{knuth68}{1}
8\bibcite{lang-algebra}{2}
9\bibcite{szamuely}{3}
10\gdef \@abspage@last{1}
diff --git a/src/Lecture2/live/biblio1.log b/src/Lecture2/live/biblio1.log
new file mode 100644
index 0000000..a38a2c2
--- /dev/null
+++ b/src/Lecture2/live/biblio1.log
@@ -0,0 +1,203 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 12 MAR 2021 16:41
2entering extended mode
3 restricted \write18 enabled.
4 %&-line parsing enabled.
5**biblio1.tex
6(./biblio1.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size10.clo
12File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2020/08/01 v1.3d Input encoding file
28\inpenc@prehook=\toks15
29\inpenc@posthook=\toks16
30)
31(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/09/23 v2.17i AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks17
42\ex@=\dimen139
43))
44(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen140
47)
48(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count185
52LaTeX Info: Redefining \frac on input line 234.
53\uproot@=\count186
54\leftroot@=\count187
55LaTeX Info: Redefining \overline on input line 399.
56\classnum@=\count188
57\DOTSCASE@=\count189
58LaTeX Info: Redefining \ldots on input line 496.
59LaTeX Info: Redefining \dots on input line 499.
60LaTeX Info: Redefining \cdots on input line 620.
61\Mathstrutbox@=\box47
62\strutbox@=\box48
63\big@size=\dimen141
64LaTeX Font Info: Redeclaring font encoding OML on input line 743.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
66\macc@depth=\count190
67\c@MaxMatrixCols=\count191
68\dotsspace@=\muskip16
69\c@parentequation=\count192
70\dspbrk@lvl=\count193
71\tag@help=\toks18
72\row@=\count194
73\column@=\count195
74\maxfields@=\count196
75\andhelp@=\toks19
76\eqnshift@=\dimen142
77\alignsep@=\dimen143
78\tagshift@=\dimen144
79\tagwidth@=\dimen145
80\totwidth@=\dimen146
81\lineht@=\dimen147
82\@envbody=\toks20
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks21
86LaTeX Info: Redefining \[ on input line 2923.
87LaTeX Info: Redefining \] on input line 2924.
88)
89(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
101Package: geometry 2020/01/02 v5.9 Page Geometry
102
103(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
104Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
105\KV@toks@=\toks22
106)
107(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
108Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
109
110(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
111Package: iftex 2020/03/06 v1.0d TeX engine tests
112))
113\Gm@cnth=\count197
114\Gm@cntv=\count198
115\c@Gm@tempcnt=\count199
116\Gm@bindingoffset=\dimen148
117\Gm@wd@mp=\dimen149
118\Gm@odd@mp=\dimen150
119\Gm@even@mp=\dimen151
120\Gm@layoutwidth=\dimen152
121\Gm@layoutheight=\dimen153
122\Gm@layouthoffset=\dimen154
123\Gm@layoutvoffset=\dimen155
124\Gm@dimlist=\toks23
125)
126(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
127File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
128\l__kernel_color_stack_int=\count266
129\l__pdf_internal_box=\box49
130) (./biblio1.aux)
131\openout1 = `biblio1.aux'.
132
133LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 7.
134LaTeX Font Info: ... okay on input line 7.
135LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 7.
136LaTeX Font Info: ... okay on input line 7.
137LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 7.
138LaTeX Font Info: ... okay on input line 7.
139LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 7.
140LaTeX Font Info: ... okay on input line 7.
141LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 7.
142LaTeX Font Info: ... okay on input line 7.
143LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 7.
144LaTeX Font Info: ... okay on input line 7.
145LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 7.
146LaTeX Font Info: ... okay on input line 7.
147
148*geometry* driver: auto-detecting
149*geometry* detected driver: pdftex
150*geometry* verbose mode - [ preamble ] result:
151* driver: pdftex
152* paper: a5paper
153* layout: <same size as paper>
154* layoutoffset:(h,v)=(0.0pt,0.0pt)
155* modes:
156* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt)
157* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt)
158* \paperwidth=421.10078pt
159* \paperheight=597.50787pt
160* \textwidth=307.28978pt
161* \textheight=483.69687pt
162* \oddsidemargin=-15.36449pt
163* \evensidemargin=-15.36449pt
164* \topmargin=-52.36449pt
165* \headheight=12.0pt
166* \headsep=25.0pt
167* \topskip=10.0pt
168* \footskip=30.0pt
169* \marginparwidth=3.0pt
170* \marginparsep=11.0pt
171* \columnsep=10.0pt
172* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
173* \hoffset=0.0pt
174* \voffset=0.0pt
175* \mag=1000
176* \@twocolumnfalse
177* \@twosidefalse
178* \@mparswitchfalse
179* \@reversemarginfalse
180* (1in=72.27pt=25.4mm, 1cm=28.453pt)
181
182[1
183
184{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./biblio1.aux) )
185Here is how much of TeX's memory you used:
186 2068 strings out of 479383
187 27244 string characters out of 5875799
188 304076 words of memory out of 5000000
189 19218 multiletter control sequences out of 15000+600000
190 404381 words of font info for 30 fonts, out of 8000000 for 9000
191 1141 hyphenation exceptions out of 8191
192 66i,4n,72p,224b,147s stack positions out of 5000i,500n,10000p,200000b,80000s
193</u
194sr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf
195-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/fonts/typ
196e1/public/amsfonts/cm/cmti10.pfb>
197Output written on biblio1.pdf (1 page, 42218 bytes).
198PDF statistics:
199 20 PDF objects out of 1000 (max. 8388607)
200 13 compressed objects within 1 object stream
201 0 named destinations out of 1000 (max. 500000)
202 1 words of extra memory for PDF output out of 10000 (max. 10000000)
203
diff --git a/src/Lecture2/live/biblio1.pdf b/src/Lecture2/live/biblio1.pdf
new file mode 100644
index 0000000..da22e81
--- /dev/null
+++ b/src/Lecture2/live/biblio1.pdf
Binary files differ
diff --git a/src/Lecture2/live/biblio1.synctex.gz b/src/Lecture2/live/biblio1.synctex.gz
new file mode 100644
index 0000000..1230d2a
--- /dev/null
+++ b/src/Lecture2/live/biblio1.synctex.gz
Binary files differ
diff --git a/src/Lecture2/live/biblio1.tex b/src/Lecture2/live/biblio1.tex
new file mode 100644
index 0000000..39e5b38
--- /dev/null
+++ b/src/Lecture2/live/biblio1.tex
@@ -0,0 +1,34 @@
1\documentclass[10pt,a5paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
7\begin{document}
8
9The theory of the étale fundamental group of affdssf \cite[Proposition~5]{szamuely} schemes is introduced in \cite[Proposition~5]{szamuely}.
10
11The book \cite{knuth68} is still unfinished.
12
13\cite{knuth68, szamuely}
14
15\begin{thebibliography}{999}
16 \bibitem{knuth68}
17 Donald Knuth,
18 \emph{The Art of Computer Programming},
19 Volume I, Addison-Wesley, 1968.
20
21 \bibitem{lang-algebra}
22 Serge Lang,
23 \emph{Algebra},
24 Springer,
25 2002.
26
27 \bibitem{szamuely}
28 Tamás Szamuely,
29 \emph{Galois Groups and Fundamental Groups},
30 Cambridge University Press,
31 2009.
32\end{thebibliography}
33
34\end{document} \ No newline at end of file
diff --git a/src/Lecture2/live/biblio2.aux b/src/Lecture2/live/biblio2.aux
new file mode 100644
index 0000000..16c1b60
--- /dev/null
+++ b/src/Lecture2/live/biblio2.aux
@@ -0,0 +1,10 @@
1\relax
2\citation{knuth68}
3\citation{th}
4\citation{rudin}
5\bibstyle{alpha}
6\bibdata{my_biblio}
7\bibcite{knuth68}{Knu68}
8\bibcite{rudin}{Rud62}
9\bibcite{th}{Tro22}
10\gdef \@abspage@last{1}
diff --git a/src/Lecture2/live/biblio2.bbl b/src/Lecture2/live/biblio2.bbl
new file mode 100644
index 0000000..807d268
--- /dev/null
+++ b/src/Lecture2/live/biblio2.bbl
@@ -0,0 +1,18 @@
1\begin{thebibliography}{Knu68}
2
3\bibitem[Knu68]{knuth68}
4Donald Knuth.
5\newblock {\em The Art of Computer Programming}, volume~I.
6\newblock Addison-Wesley, 1968.
7
8\bibitem[Rud62]{rudin}
9Walter Rudin.
10\newblock {\em Fourier analysis on groups}, volume 121967.
11\newblock Wiley Online Library, 1962.
12
13\bibitem[Tro22]{th}
14Tronto.
15\newblock {\em Kummer Theory}.
16\newblock PhD thesis, Uni.lu, 2022.
17
18\end{thebibliography}
diff --git a/src/Lecture2/live/biblio2.blg b/src/Lecture2/live/biblio2.blg
new file mode 100644
index 0000000..64ea089
--- /dev/null
+++ b/src/Lecture2/live/biblio2.blg
@@ -0,0 +1,46 @@
1This is BibTeX, Version 0.99d (TeX Live 2020/VoidLinux)
2Capacity: max_strings=200000, hash_size=200000, hash_prime=170003
3The top-level auxiliary file: biblio2.aux
4The style file: alpha.bst
5Database file #1: my_biblio.bib
6You've used 3 entries,
7 2543 wiz_defined-function locations,
8 575 strings with 4616 characters,
9and the built_in function-call counts, 846 in all, are:
10= -- 75
11> -- 24
12< -- 5
13+ -- 7
14- -- 6
15* -- 48
16:= -- 155
17add.period$ -- 9
18call.type$ -- 3
19change.case$ -- 12
20chr.to.int$ -- 3
21cite$ -- 3
22duplicate$ -- 45
23empty$ -- 68
24format.name$ -- 12
25if$ -- 165
26int.to.chr$ -- 1
27int.to.str$ -- 0
28missing$ -- 4
29newline$ -- 18
30num.names$ -- 9
31pop$ -- 20
32preamble$ -- 1
33purify$ -- 18
34quote$ -- 0
35skip$ -- 31
36stack$ -- 0
37substring$ -- 22
38swap$ -- 5
39text.length$ -- 5
40text.prefix$ -- 3
41top$ -- 0
42type$ -- 16
43warning$ -- 0
44while$ -- 6
45width$ -- 6
46write$ -- 41
diff --git a/src/Lecture2/live/biblio2.log b/src/Lecture2/live/biblio2.log
new file mode 100644
index 0000000..851ded9
--- /dev/null
+++ b/src/Lecture2/live/biblio2.log
@@ -0,0 +1,203 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 12 MAR 2021 16:53
2entering extended mode
3 restricted \write18 enabled.
4 %&-line parsing enabled.
5**biblio2.tex
6(./biblio2.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size10.clo
12File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2020/08/01 v1.3d Input encoding file
28\inpenc@prehook=\toks15
29\inpenc@posthook=\toks16
30)
31(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/09/23 v2.17i AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks17
42\ex@=\dimen139
43))
44(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen140
47)
48(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count185
52LaTeX Info: Redefining \frac on input line 234.
53\uproot@=\count186
54\leftroot@=\count187
55LaTeX Info: Redefining \overline on input line 399.
56\classnum@=\count188
57\DOTSCASE@=\count189
58LaTeX Info: Redefining \ldots on input line 496.
59LaTeX Info: Redefining \dots on input line 499.
60LaTeX Info: Redefining \cdots on input line 620.
61\Mathstrutbox@=\box47
62\strutbox@=\box48
63\big@size=\dimen141
64LaTeX Font Info: Redeclaring font encoding OML on input line 743.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
66\macc@depth=\count190
67\c@MaxMatrixCols=\count191
68\dotsspace@=\muskip16
69\c@parentequation=\count192
70\dspbrk@lvl=\count193
71\tag@help=\toks18
72\row@=\count194
73\column@=\count195
74\maxfields@=\count196
75\andhelp@=\toks19
76\eqnshift@=\dimen142
77\alignsep@=\dimen143
78\tagshift@=\dimen144
79\tagwidth@=\dimen145
80\totwidth@=\dimen146
81\lineht@=\dimen147
82\@envbody=\toks20
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks21
86LaTeX Info: Redefining \[ on input line 2923.
87LaTeX Info: Redefining \] on input line 2924.
88)
89(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
101Package: geometry 2020/01/02 v5.9 Page Geometry
102
103(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
104Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
105\KV@toks@=\toks22
106)
107(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
108Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
109
110(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
111Package: iftex 2020/03/06 v1.0d TeX engine tests
112))
113\Gm@cnth=\count197
114\Gm@cntv=\count198
115\c@Gm@tempcnt=\count199
116\Gm@bindingoffset=\dimen148
117\Gm@wd@mp=\dimen149
118\Gm@odd@mp=\dimen150
119\Gm@even@mp=\dimen151
120\Gm@layoutwidth=\dimen152
121\Gm@layoutheight=\dimen153
122\Gm@layouthoffset=\dimen154
123\Gm@layoutvoffset=\dimen155
124\Gm@dimlist=\toks23
125)
126(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
127File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
128\l__kernel_color_stack_int=\count266
129\l__pdf_internal_box=\box49
130) (./biblio2.aux)
131\openout1 = `biblio2.aux'.
132
133LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 7.
134LaTeX Font Info: ... okay on input line 7.
135LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 7.
136LaTeX Font Info: ... okay on input line 7.
137LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 7.
138LaTeX Font Info: ... okay on input line 7.
139LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 7.
140LaTeX Font Info: ... okay on input line 7.
141LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 7.
142LaTeX Font Info: ... okay on input line 7.
143LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 7.
144LaTeX Font Info: ... okay on input line 7.
145LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 7.
146LaTeX Font Info: ... okay on input line 7.
147
148*geometry* driver: auto-detecting
149*geometry* detected driver: pdftex
150*geometry* verbose mode - [ preamble ] result:
151* driver: pdftex
152* paper: a5paper
153* layout: <same size as paper>
154* layoutoffset:(h,v)=(0.0pt,0.0pt)
155* modes:
156* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt)
157* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt)
158* \paperwidth=421.10078pt
159* \paperheight=597.50787pt
160* \textwidth=307.28978pt
161* \textheight=483.69687pt
162* \oddsidemargin=-15.36449pt
163* \evensidemargin=-15.36449pt
164* \topmargin=-52.36449pt
165* \headheight=12.0pt
166* \headsep=25.0pt
167* \topskip=10.0pt
168* \footskip=30.0pt
169* \marginparwidth=3.0pt
170* \marginparsep=11.0pt
171* \columnsep=10.0pt
172* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
173* \hoffset=0.0pt
174* \voffset=0.0pt
175* \mag=1000
176* \@twocolumnfalse
177* \@twosidefalse
178* \@mparswitchfalse
179* \@reversemarginfalse
180* (1in=72.27pt=25.4mm, 1cm=28.453pt)
181
182(./biblio2.bbl) [1
183
184{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
185(./biblio2.aux) )
186Here is how much of TeX's memory you used:
187 2070 strings out of 479383
188 27254 string characters out of 5875799
189 304088 words of memory out of 5000000
190 19217 multiletter control sequences out of 15000+600000
191 404381 words of font info for 30 fonts, out of 8000000 for 9000
192 1141 hyphenation exceptions out of 8191
193 66i,4n,72p,224b,133s stack positions out of 5000i,500n,10000p,200000b,80000s
194</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.p
195fb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/
196texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb>
197Output written on biblio2.pdf (1 page, 40599 bytes).
198PDF statistics:
199 20 PDF objects out of 1000 (max. 8388607)
200 13 compressed objects within 1 object stream
201 0 named destinations out of 1000 (max. 500000)
202 1 words of extra memory for PDF output out of 10000 (max. 10000000)
203
diff --git a/src/Lecture2/live/biblio2.pdf b/src/Lecture2/live/biblio2.pdf
new file mode 100644
index 0000000..fac5bce
--- /dev/null
+++ b/src/Lecture2/live/biblio2.pdf
Binary files differ
diff --git a/src/Lecture2/live/biblio2.synctex.gz b/src/Lecture2/live/biblio2.synctex.gz
new file mode 100644
index 0000000..2510660
--- /dev/null
+++ b/src/Lecture2/live/biblio2.synctex.gz
Binary files differ
diff --git a/src/Lecture2/live/biblio2.tex b/src/Lecture2/live/biblio2.tex
new file mode 100644
index 0000000..4997a0a
--- /dev/null
+++ b/src/Lecture2/live/biblio2.tex
@@ -0,0 +1,18 @@
1\documentclass[10pt,a5paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
7\begin{document}
8
9\cite{knuth68}
10
11You can find my results in \cite{th}
12
13We can also refer to this book \cite{rudin}
14
15\bibliographystyle{alpha}
16\bibliography{my_biblio}
17
18\end{document} \ No newline at end of file
diff --git a/src/Lecture2/live/commands.aux b/src/Lecture2/live/commands.aux
new file mode 100644
index 0000000..b640121
--- /dev/null
+++ b/src/Lecture2/live/commands.aux
@@ -0,0 +1,2 @@
1\relax
2\gdef \@abspage@last{1}
diff --git a/src/Lecture2/live/commands.log b/src/Lecture2/live/commands.log
new file mode 100644
index 0000000..e65a5e6
--- /dev/null
+++ b/src/Lecture2/live/commands.log
@@ -0,0 +1,215 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 12 MAR 2021 15:47
2entering extended mode
3 restricted \write18 enabled.
4 %&-line parsing enabled.
5**commands.tex
6(./commands.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size10.clo
12File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2020/08/01 v1.3d Input encoding file
28\inpenc@prehook=\toks15
29\inpenc@posthook=\toks16
30)
31(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/09/23 v2.17i AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks17
42\ex@=\dimen139
43))
44(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen140
47)
48(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count185
52LaTeX Info: Redefining \frac on input line 234.
53\uproot@=\count186
54\leftroot@=\count187
55LaTeX Info: Redefining \overline on input line 399.
56\classnum@=\count188
57\DOTSCASE@=\count189
58LaTeX Info: Redefining \ldots on input line 496.
59LaTeX Info: Redefining \dots on input line 499.
60LaTeX Info: Redefining \cdots on input line 620.
61\Mathstrutbox@=\box47
62\strutbox@=\box48
63\big@size=\dimen141
64LaTeX Font Info: Redeclaring font encoding OML on input line 743.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
66\macc@depth=\count190
67\c@MaxMatrixCols=\count191
68\dotsspace@=\muskip16
69\c@parentequation=\count192
70\dspbrk@lvl=\count193
71\tag@help=\toks18
72\row@=\count194
73\column@=\count195
74\maxfields@=\count196
75\andhelp@=\toks19
76\eqnshift@=\dimen142
77\alignsep@=\dimen143
78\tagshift@=\dimen144
79\tagwidth@=\dimen145
80\totwidth@=\dimen146
81\lineht@=\dimen147
82\@envbody=\toks20
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks21
86LaTeX Info: Redefining \[ on input line 2923.
87LaTeX Info: Redefining \] on input line 2924.
88)
89(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
101Package: geometry 2020/01/02 v5.9 Page Geometry
102
103(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
104Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
105\KV@toks@=\toks22
106)
107(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
108Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
109
110(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
111Package: iftex 2020/03/06 v1.0d TeX engine tests
112))
113\Gm@cnth=\count197
114\Gm@cntv=\count198
115\c@Gm@tempcnt=\count199
116\Gm@bindingoffset=\dimen148
117\Gm@wd@mp=\dimen149
118\Gm@odd@mp=\dimen150
119\Gm@even@mp=\dimen151
120\Gm@layoutwidth=\dimen152
121\Gm@layoutheight=\dimen153
122\Gm@layouthoffset=\dimen154
123\Gm@layoutvoffset=\dimen155
124\Gm@dimlist=\toks23
125)
126(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
127File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
128\l__kernel_color_stack_int=\count266
129\l__pdf_internal_box=\box49
130)
131(./commands.aux)
132\openout1 = `commands.aux'.
133
134LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 15.
135LaTeX Font Info: ... okay on input line 15.
136LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 15.
137LaTeX Font Info: ... okay on input line 15.
138LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 15.
139LaTeX Font Info: ... okay on input line 15.
140LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 15.
141LaTeX Font Info: ... okay on input line 15.
142LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 15.
143LaTeX Font Info: ... okay on input line 15.
144LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 15.
145LaTeX Font Info: ... okay on input line 15.
146LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 15.
147LaTeX Font Info: ... okay on input line 15.
148
149*geometry* driver: auto-detecting
150*geometry* detected driver: pdftex
151*geometry* verbose mode - [ preamble ] result:
152* driver: pdftex
153* paper: a5paper
154* layout: <same size as paper>
155* layoutoffset:(h,v)=(0.0pt,0.0pt)
156* modes:
157* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt)
158* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt)
159* \paperwidth=421.10078pt
160* \paperheight=597.50787pt
161* \textwidth=307.28978pt
162* \textheight=483.69687pt
163* \oddsidemargin=-15.36449pt
164* \evensidemargin=-15.36449pt
165* \topmargin=-52.36449pt
166* \headheight=12.0pt
167* \headsep=25.0pt
168* \topskip=10.0pt
169* \footskip=30.0pt
170* \marginparwidth=3.0pt
171* \marginparsep=11.0pt
172* \columnsep=10.0pt
173* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
174* \hoffset=0.0pt
175* \voffset=0.0pt
176* \mag=1000
177* \@twocolumnfalse
178* \@twosidefalse
179* \@mparswitchfalse
180* \@reversemarginfalse
181* (1in=72.27pt=25.4mm, 1cm=28.453pt)
182
183LaTeX Font Info: Trying to load font information for U+msa on input line 17.
184
185(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
186File: umsa.fd 2013/01/14 v3.01 AMS symbols A
187)
188LaTeX Font Info: Trying to load font information for U+msb on input line 17.
189
190
191(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
192File: umsb.fd 2013/01/14 v3.01 AMS symbols B
193) [1
194
195{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./commands.aux) )
196Here is how much of TeX's memory you used:
197 2090 strings out of 479383
198 27605 string characters out of 5875799
199 303148 words of memory out of 5000000
200 19230 multiletter control sequences out of 15000+600000
201 405129 words of font info for 35 fonts, out of 8000000 for 9000
202 1141 hyphenation exceptions out of 8191
203 66i,4n,72p,225b,104s stack positions out of 5000i,500n,10000p,200000b,80000s
204</
205usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texm
206f-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/share/texmf-dist/fonts/ty
207pe1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/fonts/type1/public/amsf
208onts/cm/cmr7.pfb>
209Output written on commands.pdf (1 page, 34332 bytes).
210PDF statistics:
211 24 PDF objects out of 1000 (max. 8388607)
212 16 compressed objects within 1 object stream
213 0 named destinations out of 1000 (max. 500000)
214 1 words of extra memory for PDF output out of 10000 (max. 10000000)
215
diff --git a/src/Lecture2/live/commands.pdf b/src/Lecture2/live/commands.pdf
new file mode 100644
index 0000000..fac2654
--- /dev/null
+++ b/src/Lecture2/live/commands.pdf
Binary files differ
diff --git a/src/Lecture2/live/commands.synctex.gz b/src/Lecture2/live/commands.synctex.gz
new file mode 100644
index 0000000..d3f24b3
--- /dev/null
+++ b/src/Lecture2/live/commands.synctex.gz
Binary files differ
diff --git a/src/Lecture2/live/commands.tex b/src/Lecture2/live/commands.tex
new file mode 100644
index 0000000..25a0a78
--- /dev/null
+++ b/src/Lecture2/live/commands.tex
@@ -0,0 +1,27 @@
1\documentclass[10pt,a5paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
7
8
9\newcommand{\myvec}[2]{({#1}_1,{#1}_2,\dots,{#1}_{#2})}
10\newcommand{\myvecn}[1]{\myvec{#1}{n}}
11
12\newcommand{\myvecopt}[2][n]{({#2}_1,{#2}_2,\dots,{#2}_{#1})}
13\providecommand{\vec}[1]{\overleftarrow{#1}}
14
15\begin{document}
16
17\[
18 \vec{v}=\myvecopt{v}
19\]
20
21later...
22
23\[
24 \vec{w}=\myvecopt[10]{w}
25\]
26
27\end{document} \ No newline at end of file
diff --git a/src/Lecture2/live/me.jpg b/src/Lecture2/live/me.jpg
new file mode 100644
index 0000000..505306d
--- /dev/null
+++ b/src/Lecture2/live/me.jpg
Binary files differ
diff --git a/src/Lecture2/live/my_biblio.bib b/src/Lecture2/live/my_biblio.bib
new file mode 100644
index 0000000..df88b07
--- /dev/null
+++ b/src/Lecture2/live/my_biblio.bib
@@ -0,0 +1,36 @@
1@book{knuth68,
2 author = "Donald Knuth",
3 title = "The Art of Computer Programming",
4 publisher = "Addison-Wesley",
5 volume = "I",
6 year = "1968",
7}
8
9@misc{lang-algebra,
10 title = {Algebra},
11 author = {Serge Lang},
12 year = {2002},
13 publisher = {Springer}
14}
15
16@book{szamuely,
17 title = {Galois groups and fundamental groups},
18 author = {Szamuely, Tam{\'a}s},
19 year = {2009},
20 publisher = {Cambridge University Press}
21}
22
23@PhdThesis{th,
24author = {Tronto},
25title = {Kummer Theory},
26school = {Uni.lu},
27year = {2022},
28}
29
30@book{rudin1962fourier,
31 title={Fourier analysis on groups},
32 author={Rudin, Walter},
33 volume={121967},
34 year={1962},
35 publisher={Wiley Online Library}
36}
diff --git a/src/Lecture2/live/new.aux b/src/Lecture2/live/new.aux
new file mode 100644
index 0000000..5787655
--- /dev/null
+++ b/src/Lecture2/live/new.aux
@@ -0,0 +1,8 @@
1\relax
2\@writefile{toc}{\contentsline {section}{\numberline {\S 1}Text}{1}{}\protected@file@percent }
3\@writefile{toc}{\contentsline {section}{\numberline {\S 2}inbetween}{1}{}\protected@file@percent }
4\@writefile{toc}{\contentsline {section}{\numberline {\S 3}Last section}{1}{}\protected@file@percent }
5\newlabel{ts}{{\S 3}{1}}
6\newlabel{gaussthm}{{3,B}{1}}
7\newlabel{eq}{{3.1}{1}}
8\gdef \@abspage@last{2}
diff --git a/src/Lecture2/live/new.log b/src/Lecture2/live/new.log
new file mode 100644
index 0000000..f979539
--- /dev/null
+++ b/src/Lecture2/live/new.log
@@ -0,0 +1,245 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 12 MAR 2021 15:08
2entering extended mode
3 restricted \write18 enabled.
4 %&-line parsing enabled.
5**new.tex
6(./new.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size10.clo
12File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2020/08/01 v1.3d Input encoding file
28\inpenc@prehook=\toks15
29\inpenc@posthook=\toks16
30)
31(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/09/23 v2.17i AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks17
42\ex@=\dimen139
43))
44(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen140
47)
48(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count185
52LaTeX Info: Redefining \frac on input line 234.
53\uproot@=\count186
54\leftroot@=\count187
55LaTeX Info: Redefining \overline on input line 399.
56\classnum@=\count188
57\DOTSCASE@=\count189
58LaTeX Info: Redefining \ldots on input line 496.
59LaTeX Info: Redefining \dots on input line 499.
60LaTeX Info: Redefining \cdots on input line 620.
61\Mathstrutbox@=\box47
62\strutbox@=\box48
63\big@size=\dimen141
64LaTeX Font Info: Redeclaring font encoding OML on input line 743.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
66\macc@depth=\count190
67\c@MaxMatrixCols=\count191
68\dotsspace@=\muskip16
69\c@parentequation=\count192
70\dspbrk@lvl=\count193
71\tag@help=\toks18
72\row@=\count194
73\column@=\count195
74\maxfields@=\count196
75\andhelp@=\toks19
76\eqnshift@=\dimen142
77\alignsep@=\dimen143
78\tagshift@=\dimen144
79\tagwidth@=\dimen145
80\totwidth@=\dimen146
81\lineht@=\dimen147
82\@envbody=\toks20
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks21
86LaTeX Info: Redefining \[ on input line 2923.
87LaTeX Info: Redefining \] on input line 2924.
88)
89(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty
101Package: amsthm 2020/05/29 v2.20.6
102\thm@style=\toks22
103\thm@bodyfont=\toks23
104\thm@headfont=\toks24
105\thm@notefont=\toks25
106\thm@headpunct=\toks26
107\thm@preskip=\skip52
108\thm@postskip=\skip53
109\thm@headsep=\skip54
110\dth@everypar=\toks27
111)
112(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
113Package: geometry 2020/01/02 v5.9 Page Geometry
114
115(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
116Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
117\KV@toks@=\toks28
118)
119(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
120Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
121
122(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
123Package: iftex 2020/03/06 v1.0d TeX engine tests
124))
125\Gm@cnth=\count197
126\Gm@cntv=\count198
127\c@Gm@tempcnt=\count199
128\Gm@bindingoffset=\dimen148
129\Gm@wd@mp=\dimen149
130\Gm@odd@mp=\dimen150
131\Gm@even@mp=\dimen151
132\Gm@layoutwidth=\dimen152
133\Gm@layoutheight=\dimen153
134\Gm@layouthoffset=\dimen154
135\Gm@layoutvoffset=\dimen155
136\Gm@dimlist=\toks29
137)
138(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty
139Package: enumitem 2019/06/20 v3.9 Customized lists
140\labelindent=\skip55
141\enit@outerparindent=\dimen156
142\enit@toks=\toks30
143\enit@inbox=\box49
144\enit@count@id=\count266
145\enitdp@description=\count267
146)
147\c@mythm=\count268
148\c@defi=\count269
149
150(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
151File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
152\l__kernel_color_stack_int=\count270
153\l__pdf_internal_box=\box50
154) (./new.aux)
155\openout1 = `new.aux'.
156
157LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 34.
158LaTeX Font Info: ... okay on input line 34.
159LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 34.
160LaTeX Font Info: ... okay on input line 34.
161LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 34.
162LaTeX Font Info: ... okay on input line 34.
163LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 34.
164LaTeX Font Info: ... okay on input line 34.
165LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 34.
166LaTeX Font Info: ... okay on input line 34.
167LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 34.
168LaTeX Font Info: ... okay on input line 34.
169LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 34.
170LaTeX Font Info: ... okay on input line 34.
171
172*geometry* driver: auto-detecting
173*geometry* detected driver: pdftex
174*geometry* verbose mode - [ preamble ] result:
175* driver: pdftex
176* paper: a5paper
177* layout: <same size as paper>
178* layoutoffset:(h,v)=(0.0pt,0.0pt)
179* modes:
180* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt)
181* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt)
182* \paperwidth=421.10078pt
183* \paperheight=597.50787pt
184* \textwidth=307.28978pt
185* \textheight=483.69687pt
186* \oddsidemargin=-15.36449pt
187* \evensidemargin=-15.36449pt
188* \topmargin=-52.36449pt
189* \headheight=12.0pt
190* \headsep=25.0pt
191* \topskip=10.0pt
192* \footskip=30.0pt
193* \marginparwidth=3.0pt
194* \marginparsep=11.0pt
195* \columnsep=10.0pt
196* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
197* \hoffset=0.0pt
198* \voffset=0.0pt
199* \mag=1000
200* \@twocolumnfalse
201* \@twosidefalse
202* \@mparswitchfalse
203* \@reversemarginfalse
204* (1in=72.27pt=25.4mm, 1cm=28.453pt)
205
206LaTeX Font Info: Trying to load font information for U+msa on input line 36.
207
208(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
209File: umsa.fd 2013/01/14 v3.01 AMS symbols A
210)
211LaTeX Font Info: Trying to load font information for U+msb on input line 36.
212
213
214(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
215File: umsb.fd 2013/01/14 v3.01 AMS symbols B
216) [1
217
218{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [2] (./new.aux) )
219Here is how much of TeX's memory you used:
220 2540 strings out of 479383
221 34346 string characters out of 5875799
222 316279 words of memory out of 5000000
223 19657 multiletter control sequences out of 15000+600000
224 412008 words of font info for 60 fonts, out of 8000000 for 9000
225 1141 hyphenation exceptions out of 8191
226 66i,8n,72p,220b,216s stack positions out of 5000i,500n,10000p,200000b,80000s
227{/u
228sr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/share/texmf
229-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/share/texmf-dist/fonts/ty
230pe1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf-dist/fonts/type1/public/ams
231fonts/cm/cmex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi1
2320.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/sha
233re/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/f
234onts/type1/public/amsfonts/cm/cmr12.pfb></usr/share/texmf-dist/fonts/type1/publ
235ic/amsfonts/cm/cmr17.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/
236cmr7.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr
237/share/texmf-dist/fonts/type1/public/cm-super/sfbx1440.pfb></usr/share/texmf-di
238st/fonts/type1/public/cm-super/sfrm1000.pfb>
239Output written on new.pdf (2 pages, 114184 bytes).
240PDF statistics:
241 60 PDF objects out of 1000 (max. 8388607)
242 43 compressed objects within 1 object stream
243 0 named destinations out of 1000 (max. 500000)
244 1 words of extra memory for PDF output out of 10000 (max. 10000000)
245
diff --git a/src/Lecture2/live/new.pdf b/src/Lecture2/live/new.pdf
new file mode 100644
index 0000000..e1afcd0
--- /dev/null
+++ b/src/Lecture2/live/new.pdf
Binary files differ
diff --git a/src/Lecture2/live/new.synctex.gz b/src/Lecture2/live/new.synctex.gz
new file mode 100644
index 0000000..dc08275
--- /dev/null
+++ b/src/Lecture2/live/new.synctex.gz
Binary files differ
diff --git a/src/Lecture2/live/new.tex b/src/Lecture2/live/new.tex
new file mode 100644
index 0000000..e38c7cf
--- /dev/null
+++ b/src/Lecture2/live/new.tex
@@ -0,0 +1,99 @@
1\documentclass[10pt,a5paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage{amsthm}
7\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
8
9\usepackage{enumitem}
10
11\title{Latex Example Live}
12\author{Sebastiano Tronto}
13\date{12-03-2021}
14
15
16
17\newtheorem{mythm}{My Theorem}[section]
18
19\theoremstyle{definition}
20\newtheorem{prop}[mythm]{Proposition}
21\newtheorem{defi}{Definition}
22
23\theoremstyle{remark}
24\newtheorem*{warning}{Achtung}
25
26\renewcommand{\thesection}{\S\arabic{section}}
27\renewcommand{\themythm}{\arabic{section},\Alph{mythm}}
28
29
30\numberwithin{equation}{section}
31
32\renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
33
34\begin{document}
35
36\maketitle
37
38
39\section{Text}
40
41abc
42
43\begin{align}
441+1=2
45\end{align}
46
47The section \ref{ts} contains theorems
48
49\section{inbetween}
50
51\section{Last section}
52\label{ts}
53
54
55\begin{prop}
56A less important fact
57\end{prop}
58
59\begin{mythm}[Gauss]
60\label{gaussthm}
61The equation \(2+x=4\) is true for \(x=2\).
62\begin{align}
63\label{eq}
64\sum_{i=1}^ni
65\end{align}
66\end{mythm}
67
68The above equation \eqref{eq} is not an equation
69
70\arabic{equation}
71
72
73\setcounter{defi}{23}
74\begin{defi}
75a definition
76\end{defi}
77
78\setcounter{mythm}{10}
79\begin{mythm}
80Another important fact.
81\end{mythm}
82
83\begin{warning}
84It is a common mistake to think that \(2+2=5\)
85\end{warning}
86
87
88\vspace{1cm}
89
90\begin{enumerate}[label=(\Roman*)]
91 \item an item
92 \item another one
93\end{enumerate}
94
95\arabic{enumi}
96
97\ref{gaussthm} is a theorem by gauss
98
99\end{document} \ No newline at end of file
diff --git a/src/Lecture2/live/old.aux b/src/Lecture2/live/old.aux
new file mode 100644
index 0000000..aeb0fd3
--- /dev/null
+++ b/src/Lecture2/live/old.aux
@@ -0,0 +1,10 @@
1\relax
2\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}{}\protected@file@percent }
3\@writefile{toc}{\contentsline {section}{\numberline {2}Text}{1}{}\protected@file@percent }
4\@writefile{toc}{\contentsline {section}{\numberline {3}Math mode}{1}{}\protected@file@percent }
5\newlabel{eq}{{1}{1}}
6\@writefile{toc}{\contentsline {section}{\numberline {4}Environments}{1}{}\protected@file@percent }
7\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Lists}{1}{}\protected@file@percent }
8\newlabel{subsectionLists}{{4.1}{1}}
9\@writefile{toc}{\contentsline {section}{\numberline {5}Last section}{2}{}\protected@file@percent }
10\gdef \@abspage@last{2}
diff --git a/src/Lecture2/live/old.log b/src/Lecture2/live/old.log
new file mode 100644
index 0000000..814b8b8
--- /dev/null
+++ b/src/Lecture2/live/old.log
@@ -0,0 +1,284 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 12 MAR 2021 14:31
2entering extended mode
3 restricted \write18 enabled.
4 %&-line parsing enabled.
5**old.tex
6(./old.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size10.clo
12File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2020/08/01 v1.3d Input encoding file
28\inpenc@prehook=\toks15
29\inpenc@posthook=\toks16
30)
31(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/09/23 v2.17i AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks17
42\ex@=\dimen139
43))
44(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen140
47)
48(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count185
52LaTeX Info: Redefining \frac on input line 234.
53\uproot@=\count186
54\leftroot@=\count187
55LaTeX Info: Redefining \overline on input line 399.
56\classnum@=\count188
57\DOTSCASE@=\count189
58LaTeX Info: Redefining \ldots on input line 496.
59LaTeX Info: Redefining \dots on input line 499.
60LaTeX Info: Redefining \cdots on input line 620.
61\Mathstrutbox@=\box47
62\strutbox@=\box48
63\big@size=\dimen141
64LaTeX Font Info: Redeclaring font encoding OML on input line 743.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
66\macc@depth=\count190
67\c@MaxMatrixCols=\count191
68\dotsspace@=\muskip16
69\c@parentequation=\count192
70\dspbrk@lvl=\count193
71\tag@help=\toks18
72\row@=\count194
73\column@=\count195
74\maxfields@=\count196
75\andhelp@=\toks19
76\eqnshift@=\dimen142
77\alignsep@=\dimen143
78\tagshift@=\dimen144
79\tagwidth@=\dimen145
80\totwidth@=\dimen146
81\lineht@=\dimen147
82\@envbody=\toks20
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks21
86LaTeX Info: Redefining \[ on input line 2923.
87LaTeX Info: Redefining \] on input line 2924.
88)
89(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty
101Package: amsthm 2020/05/29 v2.20.6
102\thm@style=\toks22
103\thm@bodyfont=\toks23
104\thm@headfont=\toks24
105\thm@notefont=\toks25
106\thm@headpunct=\toks26
107\thm@preskip=\skip52
108\thm@postskip=\skip53
109\thm@headsep=\skip54
110\dth@everypar=\toks27
111)
112(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
113Package: geometry 2020/01/02 v5.9 Page Geometry
114
115(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
116Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
117\KV@toks@=\toks28
118)
119(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
120Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
121
122(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
123Package: iftex 2020/03/06 v1.0d TeX engine tests
124))
125\Gm@cnth=\count197
126\Gm@cntv=\count198
127\c@Gm@tempcnt=\count199
128\Gm@bindingoffset=\dimen148
129\Gm@wd@mp=\dimen149
130\Gm@odd@mp=\dimen150
131\Gm@even@mp=\dimen151
132\Gm@layoutwidth=\dimen152
133\Gm@layoutheight=\dimen153
134\Gm@layouthoffset=\dimen154
135\Gm@layoutvoffset=\dimen155
136\Gm@dimlist=\toks29
137)
138(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty
139Package: enumitem 2019/06/20 v3.9 Customized lists
140\labelindent=\skip55
141\enit@outerparindent=\dimen156
142\enit@toks=\toks30
143\enit@inbox=\box49
144\enit@count@id=\count266
145\enitdp@description=\count267
146)
147\c@mythm=\count268
148\c@defi=\count269
149
150(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
151Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
152
153(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
154File: color.cfg 2016/01/02 v1.6 sample color configuration
155)
156Package xcolor Info: Driver file: pdftex.def on input line 225.
157
158(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
159File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
160)
161Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
162Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
163Package xcolor Info: Model `RGB' extended on input line 1364.
164Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
165Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
166Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
167Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
168Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
169Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
170)
171(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
172File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
173\l__kernel_color_stack_int=\count270
174\l__pdf_internal_box=\box50
175) (./old.aux)
176\openout1 = `old.aux'.
177
178LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 30.
179LaTeX Font Info: ... okay on input line 30.
180LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 30.
181LaTeX Font Info: ... okay on input line 30.
182LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 30.
183LaTeX Font Info: ... okay on input line 30.
184LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 30.
185LaTeX Font Info: ... okay on input line 30.
186LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 30.
187LaTeX Font Info: ... okay on input line 30.
188LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 30.
189LaTeX Font Info: ... okay on input line 30.
190LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 30.
191LaTeX Font Info: ... okay on input line 30.
192
193*geometry* driver: auto-detecting
194*geometry* detected driver: pdftex
195*geometry* verbose mode - [ preamble ] result:
196* driver: pdftex
197* paper: a4paper
198* layout: <same size as paper>
199* layoutoffset:(h,v)=(0.0pt,0.0pt)
200* modes:
201* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt)
202* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt)
203* \paperwidth=597.50787pt
204* \paperheight=845.04684pt
205* \textwidth=483.69687pt
206* \textheight=731.23584pt
207* \oddsidemargin=-15.36449pt
208* \evensidemargin=-15.36449pt
209* \topmargin=-52.36449pt
210* \headheight=12.0pt
211* \headsep=25.0pt
212* \topskip=10.0pt
213* \footskip=30.0pt
214* \marginparwidth=57.0pt
215* \marginparsep=11.0pt
216* \columnsep=10.0pt
217* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
218* \hoffset=0.0pt
219* \voffset=0.0pt
220* \mag=1000
221* \@twocolumnfalse
222* \@twosidefalse
223* \@mparswitchfalse
224* \@reversemarginfalse
225* (1in=72.27pt=25.4mm, 1cm=28.453pt)
226
227(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
228[Loading MPS to PDF converter (version 2006.09.02).]
229\scratchcounter=\count271
230\scratchdimen=\dimen157
231\scratchbox=\box51
232\nofMPsegments=\count272
233\nofMParguments=\count273
234\everyMPshowfont=\toks31
235\MPscratchCnt=\count274
236\MPscratchDim=\dimen158
237\MPnumerator=\count275
238\makeMPintoPDFobject=\count276
239\everyMPtoPDFconversion=\toks32
240)
241LaTeX Font Info: Trying to load font information for U+msa on input line 32.
242
243 (/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
244File: umsa.fd 2013/01/14 v3.01 AMS symbols A
245)
246LaTeX Font Info: Trying to load font information for U+msb on input line 32.
247
248
249(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
250File: umsb.fd 2013/01/14 v3.01 AMS symbols B
251) [1
252
253{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [2] (./old.aux) )
254Here is how much of TeX's memory you used:
255 3486 strings out of 479383
256 45825 string characters out of 5875799
257 338303 words of memory out of 5000000
258 20587 multiletter control sequences out of 15000+600000
259 412441 words of font info for 62 fonts, out of 8000000 for 9000
260 1141 hyphenation exceptions out of 8191
261 66i,9n,72p,220b,300s stack positions out of 5000i,500n,10000p,200000b,80000s
262{/u
263sr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/share/texmf
264-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/share/texmf-dist/fonts/ty
265pe1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf-dist/fonts/type1/public/ams
266fonts/cm/cmex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi1
2670.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi5.pfb></usr/sha
268re/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/share/texmf-dist/f
269onts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/fonts/type1/publ
270ic/amsfonts/cm/cmr12.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/
271cmr17.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr5.pfb></usr/
272share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb></usr/share/texmf-dist
273/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type1/p
274ublic/amsfonts/cm/cmsy7.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/
275cm/cmti10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb>
276</usr/share/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb></usr/sha
277re/texmf-dist/fonts/type1/public/cm-super/sfrm1000.pfb>
278Output written on old.pdf (2 pages, 165455 bytes).
279PDF statistics:
280 80 PDF objects out of 1000 (max. 8388607)
281 58 compressed objects within 1 object stream
282 0 named destinations out of 1000 (max. 500000)
283 1 words of extra memory for PDF output out of 10000 (max. 10000000)
284
diff --git a/src/Lecture2/live/old.pdf b/src/Lecture2/live/old.pdf
new file mode 100644
index 0000000..b05e7e8
--- /dev/null
+++ b/src/Lecture2/live/old.pdf
Binary files differ
diff --git a/src/Lecture2/live/old.synctex.gz b/src/Lecture2/live/old.synctex.gz
new file mode 100644
index 0000000..36a48f5
--- /dev/null
+++ b/src/Lecture2/live/old.synctex.gz
Binary files differ
diff --git a/src/Lecture2/live/old.tex b/src/Lecture2/live/old.tex
new file mode 100644
index 0000000..938002a
--- /dev/null
+++ b/src/Lecture2/live/old.tex
@@ -0,0 +1,176 @@
1\documentclass[10pt,a4paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage{amsthm}
7\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
8
9\usepackage{enumitem}
10\title{Latex Example Live}
11\author{Sebastiano Tronto}
12\date{20-02-2021}
13
14\newcommand{\reals}{\mathbb{R}}
15\DeclareMathOperator{\sinus}{sinus}
16
17
18\newtheorem{mythm}{My Theorem}[section]
19
20\theoremstyle{definition}
21\newtheorem{prop}[mythm]{Proposition}
22\newtheorem{defi}{Definition}
23
24\theoremstyle{remark}
25\newtheorem*{warning}{Achtung}
26
27\usepackage{xcolor}
28
29
30\begin{document}
31
32\maketitle
33
34\section{Introduction}
35
36{\color{pink} Hello, world!
37
38This is a comment}
39
40\texttt{This looks like computer code}
41
42\section{Text}
43
44\textbf{This sentence is in boldface}
45
46\underline{\textit{italicized} maybe in a sentence \textbf{something}}
47
48\underline{\textit{one inside the other}}
49
50\emph{also italicized???}
51
52This is an important sentence, maybe a quote or something, and this \emph{word} is very important. Let's make this sentence longer than one line.
53
54{\Huge Large words}
55
56%\appendix
57
58\section{Math mode}
59
60This is an inline formula \( \displaystyle \sum_i \frac{i}{22} \), it appears within the text
61
62This is a displaystyle formula \[ \textstyle \sum_{\alpha=0}^{2^{10}} \frac2 \alpha{22} \] it appears on its own line
63
64How sqrt works: \( \sqrt[\phi]{25} \)
65
66
67
68\begin{flalign}
69\label{eq}
70e^x &= \left(\sum_{i=0}^\infty \frac{x^i}{i!} \right) = & \\
71&= \left( 1 + x + \frac{x^2}2 \right)+ \frac{x^3}{6} + \cdots \nonumber
72\end{flalign}
73
74\[
75 \left\{ x \in \reals \quad \text{such that} \quad \frac{ \sinus(x)}{x^2}>0 \right\}\reals
76\]
77
78\[ \sum_i \]
79
80The first equation we wrote is \eqref{eq}
81
82\section{Environments}
83
84\subsection{Lists}
85\label{subsectionLists}
86
87\begin{itemize}
88 \item One \textbf{item}
89 \item Another \(2+2=4\)
90 \item a third one \[\sum_{i=0}^n\]
91 \item A sublist:
92 \begin{itemize}
93 \item[+] First subitem
94 \item[+] and so on
95 \end{itemize}
96 \item Again in the main list
97\end{itemize}
98
99\begin{enumerate}[label=\Roman*]
100 \item One
101 \item Two
102 \item Actually three
103 \item Three (or not)
104\end{enumerate}
105
106\subsection*{Tables}
107
108Let's write a table:
109
110\vspace{1cm}
111\begin{tabular}{r||l|c}
112\hline
113This is a table & second column & third column \\
114\hline
115Things & a & \( 2+2 = 4 \)\\
116\hline
117more things & b & c
118\end{tabular}
119
120\vspace{1cm}
121\[
122 \left(\begin{array}{cc}
123 \int_0^1 e^x & \frac{2}{25} \\
124 0 & 0 \\
125 1111 & 234\alpha
126 \end{array}\right)
127\]
128
129\[
130 \begin{pmatrix}
131 \int_0^1 e^x & \frac{2}{25} \\
132 0 & 0 \\
133 1111 & 234\alpha
134 \end{pmatrix}
135\]
136
137\[
138\begin{pmatrix}
1391 & 2\\
1403 & 4
141\end{pmatrix}
142\overset{L2\rightarrow L2+L3}\longrightarrow
143\begin{pmatrix}
1441 & 2\\
1454 & 6
146\end{pmatrix}
147\]
148
149\section{Last section}
150
151In section \ref{subsectionLists} we saw how to write lists
152
153\begin{mythm}[Gauss]
154The equation \(2+x=4\) is true for \(x=2\).
155\end{mythm}
156
157\begin{prop}
158A less important fact
159\end{prop}
160
161\begin{defi}
162a definition
163\end{defi}
164
165\begin{mythm}
166Another important fact.
167\end{mythm}
168
169\begin{warning}
170It is a common mistake to think that \(2+2=5\)
171\end{warning}
172\[\binom45\]
173
174\[ 2 \nmid 10 \]
175
176\end{document} \ No newline at end of file
diff --git a/src/Lecture2/live/pic.aux b/src/Lecture2/live/pic.aux
new file mode 100644
index 0000000..f4fc4a4
--- /dev/null
+++ b/src/Lecture2/live/pic.aux
@@ -0,0 +1,3 @@
1\relax
2\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Me, upside-down}}{1}{}\protected@file@percent }
3\gdef \@abspage@last{5}
diff --git a/src/Lecture2/live/pic.log b/src/Lecture2/live/pic.log
new file mode 100644
index 0000000..a4ab70d
--- /dev/null
+++ b/src/Lecture2/live/pic.log
@@ -0,0 +1,300 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 12 MAR 2021 16:34
2entering extended mode
3 restricted \write18 enabled.
4 %&-line parsing enabled.
5**pic.tex
6(./pic.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size10.clo
12File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2020/08/01 v1.3d Input encoding file
28\inpenc@prehook=\toks15
29\inpenc@posthook=\toks16
30)
31(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/09/23 v2.17i AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks17
42\ex@=\dimen139
43))
44(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen140
47)
48(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count185
52LaTeX Info: Redefining \frac on input line 234.
53\uproot@=\count186
54\leftroot@=\count187
55LaTeX Info: Redefining \overline on input line 399.
56\classnum@=\count188
57\DOTSCASE@=\count189
58LaTeX Info: Redefining \ldots on input line 496.
59LaTeX Info: Redefining \dots on input line 499.
60LaTeX Info: Redefining \cdots on input line 620.
61\Mathstrutbox@=\box47
62\strutbox@=\box48
63\big@size=\dimen141
64LaTeX Font Info: Redeclaring font encoding OML on input line 743.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
66\macc@depth=\count190
67\c@MaxMatrixCols=\count191
68\dotsspace@=\muskip16
69\c@parentequation=\count192
70\dspbrk@lvl=\count193
71\tag@help=\toks18
72\row@=\count194
73\column@=\count195
74\maxfields@=\count196
75\andhelp@=\toks19
76\eqnshift@=\dimen142
77\alignsep@=\dimen143
78\tagshift@=\dimen144
79\tagwidth@=\dimen145
80\totwidth@=\dimen146
81\lineht@=\dimen147
82\@envbody=\toks20
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks21
86LaTeX Info: Redefining \[ on input line 2923.
87LaTeX Info: Redefining \] on input line 2924.
88)
89(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
101Package: geometry 2020/01/02 v5.9 Page Geometry
102
103(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
104Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
105\KV@toks@=\toks22
106)
107(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
108Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
109
110(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
111Package: iftex 2020/03/06 v1.0d TeX engine tests
112))
113\Gm@cnth=\count197
114\Gm@cntv=\count198
115\c@Gm@tempcnt=\count199
116\Gm@bindingoffset=\dimen148
117\Gm@wd@mp=\dimen149
118\Gm@odd@mp=\dimen150
119\Gm@even@mp=\dimen151
120\Gm@layoutwidth=\dimen152
121\Gm@layoutheight=\dimen153
122\Gm@layouthoffset=\dimen154
123\Gm@layoutvoffset=\dimen155
124\Gm@dimlist=\toks23
125)
126(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
127Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
128
129(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
130Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
131
132(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
133Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
134)
135(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
136File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
137)
138Package graphics Info: Driver file: pdftex.def on input line 105.
139
140(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
141File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
142))
143\Gin@req@height=\dimen156
144\Gin@req@width=\dimen157
145)
146(/usr/share/texmf-dist/tex/latex/lipsum/lipsum.sty
147(/usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty
148Package: expl3 2020-12-03 L3 programming layer (loader)
149
150(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
151File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
152\l__kernel_color_stack_int=\count266
153\l__pdf_internal_box=\box49
154))
155(/usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
156Package: xparse 2020-10-27 L3 Experimental document command parser
157
158(/usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse-generic.tex))
159Package: lipsum 2019/01/02 v2.2 150 paragraphs of Lorem Ipsum dummy text
160
161(/usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex
162File: lipsum.ltd.tex 2019/01/02 v2.2 The Lorem ipsum dummy text
163))
164(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
165Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
166
167(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
168File: color.cfg 2016/01/02 v1.6 sample color configuration
169)
170Package xcolor Info: Driver file: pdftex.def on input line 225.
171Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
172Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
173Package xcolor Info: Model `RGB' extended on input line 1364.
174Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
175Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
176Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
177Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
178Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
179Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
180)
181(/usr/share/texmf-dist/tex/latex/float/float.sty
182Package: float 2001/11/08 v1.3d Float enhancements (AL)
183\c@float@type=\count267
184\float@exts=\toks24
185\float@box=\box50
186\@float@everytoks=\toks25
187\@floatcapt=\box51
188)
189(/usr/share/texmf-dist/tex/latex/wrapfig/wrapfig.sty
190\wrapoverhang=\dimen158
191\WF@size=\dimen159
192\c@WF@wrappedlines=\count268
193\WF@box=\box52
194\WF@everypar=\toks26
195Package: wrapfig 2003/01/31 v 3.6
196) (./pic.aux)
197\openout1 = `pic.aux'.
198
199LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 17.
200LaTeX Font Info: ... okay on input line 17.
201LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 17.
202LaTeX Font Info: ... okay on input line 17.
203LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 17.
204LaTeX Font Info: ... okay on input line 17.
205LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 17.
206LaTeX Font Info: ... okay on input line 17.
207LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 17.
208LaTeX Font Info: ... okay on input line 17.
209LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 17.
210LaTeX Font Info: ... okay on input line 17.
211LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 17.
212LaTeX Font Info: ... okay on input line 17.
213
214*geometry* driver: auto-detecting
215*geometry* detected driver: pdftex
216*geometry* verbose mode - [ preamble ] result:
217* driver: pdftex
218* paper: a5paper
219* layout: <same size as paper>
220* layoutoffset:(h,v)=(0.0pt,0.0pt)
221* modes:
222* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt)
223* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt)
224* \paperwidth=421.10078pt
225* \paperheight=597.50787pt
226* \textwidth=307.28978pt
227* \textheight=483.69687pt
228* \oddsidemargin=-15.36449pt
229* \evensidemargin=-15.36449pt
230* \topmargin=-52.36449pt
231* \headheight=12.0pt
232* \headsep=25.0pt
233* \topskip=10.0pt
234* \footskip=30.0pt
235* \marginparwidth=3.0pt
236* \marginparsep=11.0pt
237* \columnsep=10.0pt
238* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
239* \hoffset=0.0pt
240* \voffset=0.0pt
241* \mag=1000
242* \@twocolumnfalse
243* \@twosidefalse
244* \@mparswitchfalse
245* \@reversemarginfalse
246* (1in=72.27pt=25.4mm, 1cm=28.453pt)
247
248(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
249[Loading MPS to PDF converter (version 2006.09.02).]
250\scratchcounter=\count269
251\scratchdimen=\dimen160
252\scratchbox=\box53
253\nofMPsegments=\count270
254\nofMParguments=\count271
255\everyMPshowfont=\toks27
256\MPscratchCnt=\count272
257\MPscratchDim=\dimen161
258\MPnumerator=\count273
259\makeMPintoPDFobject=\count274
260\everyMPtoPDFconversion=\toks28
261) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
262Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
263Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
26485.
265
266(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
267File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
268e
269))
270<me.jpg, id=1, 722.7pt x 963.6pt>
271File: me.jpg Graphic file (type jpg)
272<use me.jpg>
273Package pdftex.def Info: me.jpg used on input line 21.
274(pdftex.def) Requested size: 64.01463pt x 85.35826pt.
275
276Underfull \hbox (badness 1635) in paragraph at lines 26--26
277\OT1/cmr/m/n/10 rus elit, vestibu-lum ut, plac-
278 []
279
280[1
281
282{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map} <./me.jpg>]
283[2] [3] [4] [5] (./pic.aux) )
284Here is how much of TeX's memory you used:
285 3612 strings out of 479383
286 49723 string characters out of 5875799
287 598958 words of memory out of 5000000
288 20706 multiletter control sequences out of 15000+600000
289 403430 words of font info for 27 fonts, out of 8000000 for 9000
290 1141 hyphenation exceptions out of 8191
291 66i,7n,73p,220b,211s stack positions out of 5000i,500n,10000p,200000b,80000s
292</usr/share/texmf-dist/fonts/type1/public/amsfonts
293/cm/cmr10.pfb>
294Output written on pic.pdf (5 pages, 131626 bytes).
295PDF statistics:
296 25 PDF objects out of 1000 (max. 8388607)
297 15 compressed objects within 1 object stream
298 0 named destinations out of 1000 (max. 500000)
299 6 words of extra memory for PDF output out of 10000 (max. 10000000)
300
diff --git a/src/Lecture2/live/pic.pdf b/src/Lecture2/live/pic.pdf
new file mode 100644
index 0000000..23c2a88
--- /dev/null
+++ b/src/Lecture2/live/pic.pdf
Binary files differ
diff --git a/src/Lecture2/live/pic.synctex.gz b/src/Lecture2/live/pic.synctex.gz
new file mode 100644
index 0000000..b9f4f3e
--- /dev/null
+++ b/src/Lecture2/live/pic.synctex.gz
Binary files differ
diff --git a/src/Lecture2/live/pic.tex b/src/Lecture2/live/pic.tex
new file mode 100644
index 0000000..d4d3a45
--- /dev/null
+++ b/src/Lecture2/live/pic.tex
@@ -0,0 +1,34 @@
1\documentclass[10pt,a5paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
7
8\usepackage{graphicx}
9\usepackage{lipsum}
10\usepackage{xcolor}
11\usepackage{float}
12\usepackage{wrapfig}
13
14\setlength{\parindent}{0cm}
15\setlength{\parskip}{1cm}
16
17\begin{document}
18
19\begin{wrapfigure}{l}{0.5\textwidth}
20\centering
21\includegraphics[height=3cm,angle=260]{me.jpg}
22\caption{Me, upside-down}
23\end{wrapfigure}
24
25\lipsum
26
27x \hfill y
28
29Name: \hrulefill \quad Address: \dotfill
30
31{\color{red} \lipsum }
32
33
34\end{document} \ No newline at end of file
diff --git a/src/Lecture2/live/sentencecounter.aux b/src/Lecture2/live/sentencecounter.aux
new file mode 100644
index 0000000..dc10b18
--- /dev/null
+++ b/src/Lecture2/live/sentencecounter.aux
@@ -0,0 +1,6 @@
1\relax
2\@writefile{toc}{\contentsline {section}{\numberline {1}First section}{1}{}\protected@file@percent }
3\newlabel{s1}{{[1,2]}{1}}
4\@writefile{toc}{\contentsline {section}{\numberline {2}Second section}{1}{}\protected@file@percent }
5\newlabel{sanother}{{[2,1]}{1}}
6\gdef \@abspage@last{1}
diff --git a/src/Lecture2/live/sentencecounter.bbl b/src/Lecture2/live/sentencecounter.bbl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture2/live/sentencecounter.bbl
diff --git a/src/Lecture2/live/sentencecounter.blg b/src/Lecture2/live/sentencecounter.blg
new file mode 100644
index 0000000..5a7d479
--- /dev/null
+++ b/src/Lecture2/live/sentencecounter.blg
@@ -0,0 +1,48 @@
1This is BibTeX, Version 0.99d (TeX Live 2020/VoidLinux)
2Capacity: max_strings=200000, hash_size=200000, hash_prime=170003
3The top-level auxiliary file: sentencecounter.aux
4I found no \citation commands---while reading file sentencecounter.aux
5I found no \bibdata command---while reading file sentencecounter.aux
6I found no \bibstyle command---while reading file sentencecounter.aux
7You've used 0 entries,
8 0 wiz_defined-function locations,
9 83 strings with 504 characters,
10and the built_in function-call counts, 0 in all, are:
11= -- 0
12> -- 0
13< -- 0
14+ -- 0
15- -- 0
16* -- 0
17:= -- 0
18add.period$ -- 0
19call.type$ -- 0
20change.case$ -- 0
21chr.to.int$ -- 0
22cite$ -- 0
23duplicate$ -- 0
24empty$ -- 0
25format.name$ -- 0
26if$ -- 0
27int.to.chr$ -- 0
28int.to.str$ -- 0
29missing$ -- 0
30newline$ -- 0
31num.names$ -- 0
32pop$ -- 0
33preamble$ -- 0
34purify$ -- 0
35quote$ -- 0
36skip$ -- 0
37stack$ -- 0
38substring$ -- 0
39swap$ -- 0
40text.length$ -- 0
41text.prefix$ -- 0
42top$ -- 0
43type$ -- 0
44warning$ -- 0
45while$ -- 0
46width$ -- 0
47write$ -- 0
48(There were 3 error messages)
diff --git a/src/Lecture2/live/sentencecounter.log b/src/Lecture2/live/sentencecounter.log
new file mode 100644
index 0000000..20c9291
--- /dev/null
+++ b/src/Lecture2/live/sentencecounter.log
@@ -0,0 +1,256 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 12 MAR 2021 16:12
2entering extended mode
3 restricted \write18 enabled.
4 %&-line parsing enabled.
5**sentencecounter.tex
6(./sentencecounter.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size10.clo
12File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2020/08/01 v1.3d Input encoding file
28\inpenc@prehook=\toks15
29\inpenc@posthook=\toks16
30)
31(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/09/23 v2.17i AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks17
42\ex@=\dimen139
43))
44(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen140
47)
48(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count185
52LaTeX Info: Redefining \frac on input line 234.
53\uproot@=\count186
54\leftroot@=\count187
55LaTeX Info: Redefining \overline on input line 399.
56\classnum@=\count188
57\DOTSCASE@=\count189
58LaTeX Info: Redefining \ldots on input line 496.
59LaTeX Info: Redefining \dots on input line 499.
60LaTeX Info: Redefining \cdots on input line 620.
61\Mathstrutbox@=\box47
62\strutbox@=\box48
63\big@size=\dimen141
64LaTeX Font Info: Redeclaring font encoding OML on input line 743.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
66\macc@depth=\count190
67\c@MaxMatrixCols=\count191
68\dotsspace@=\muskip16
69\c@parentequation=\count192
70\dspbrk@lvl=\count193
71\tag@help=\toks18
72\row@=\count194
73\column@=\count195
74\maxfields@=\count196
75\andhelp@=\toks19
76\eqnshift@=\dimen142
77\alignsep@=\dimen143
78\tagshift@=\dimen144
79\tagwidth@=\dimen145
80\totwidth@=\dimen146
81\lineht@=\dimen147
82\@envbody=\toks20
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks21
86LaTeX Info: Redefining \[ on input line 2923.
87LaTeX Info: Redefining \] on input line 2924.
88)
89(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
101Package: geometry 2020/01/02 v5.9 Page Geometry
102
103(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
104Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
105\KV@toks@=\toks22
106)
107(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
108Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
109
110(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
111Package: iftex 2020/03/06 v1.0d TeX engine tests
112))
113\Gm@cnth=\count197
114\Gm@cntv=\count198
115\c@Gm@tempcnt=\count199
116\Gm@bindingoffset=\dimen148
117\Gm@wd@mp=\dimen149
118\Gm@odd@mp=\dimen150
119\Gm@even@mp=\dimen151
120\Gm@layoutwidth=\dimen152
121\Gm@layoutheight=\dimen153
122\Gm@layouthoffset=\dimen154
123\Gm@layoutvoffset=\dimen155
124\Gm@dimlist=\toks23
125)
126(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
127Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
128
129(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
130File: color.cfg 2016/01/02 v1.6 sample color configuration
131)
132Package xcolor Info: Driver file: pdftex.def on input line 225.
133
134(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
135File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
136)
137Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
138Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
139Package xcolor Info: Model `RGB' extended on input line 1364.
140Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
141Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
142Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
143Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
144Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
145Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
146)
147\c@sentence=\count266
148
149(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
150File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
151\l__kernel_color_stack_int=\count267
152\l__pdf_internal_box=\box49
153)
154(./sentencecounter.aux)
155\openout1 = `sentencecounter.aux'.
156
157LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 31.
158LaTeX Font Info: ... okay on input line 31.
159LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 31.
160LaTeX Font Info: ... okay on input line 31.
161LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 31.
162LaTeX Font Info: ... okay on input line 31.
163LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 31.
164LaTeX Font Info: ... okay on input line 31.
165LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 31.
166LaTeX Font Info: ... okay on input line 31.
167LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 31.
168LaTeX Font Info: ... okay on input line 31.
169LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 31.
170LaTeX Font Info: ... okay on input line 31.
171
172*geometry* driver: auto-detecting
173*geometry* detected driver: pdftex
174*geometry* verbose mode - [ preamble ] result:
175* driver: pdftex
176* paper: a5paper
177* layout: <same size as paper>
178* layoutoffset:(h,v)=(0.0pt,0.0pt)
179* modes:
180* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt)
181* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt)
182* \paperwidth=421.10078pt
183* \paperheight=597.50787pt
184* \textwidth=307.28978pt
185* \textheight=483.69687pt
186* \oddsidemargin=-15.36449pt
187* \evensidemargin=-15.36449pt
188* \topmargin=-52.36449pt
189* \headheight=12.0pt
190* \headsep=25.0pt
191* \topskip=10.0pt
192* \footskip=30.0pt
193* \marginparwidth=3.0pt
194* \marginparsep=11.0pt
195* \columnsep=10.0pt
196* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
197* \hoffset=0.0pt
198* \voffset=0.0pt
199* \mag=1000
200* \@twocolumnfalse
201* \@twosidefalse
202* \@mparswitchfalse
203* \@reversemarginfalse
204* (1in=72.27pt=25.4mm, 1cm=28.453pt)
205
206(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
207[Loading MPS to PDF converter (version 2006.09.02).]
208\scratchcounter=\count268
209\scratchdimen=\dimen156
210\scratchbox=\box50
211\nofMPsegments=\count269
212\nofMParguments=\count270
213\everyMPshowfont=\toks24
214\MPscratchCnt=\count271
215\MPscratchDim=\dimen157
216\MPnumerator=\count272
217\makeMPintoPDFobject=\count273
218\everyMPtoPDFconversion=\toks25
219)
220LaTeX Font Info: Trying to load font information for U+msa on input line 35.
221
222 (/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
223File: umsa.fd 2013/01/14 v3.01 AMS symbols A
224)
225LaTeX Font Info: Trying to load font information for U+msb on input line 35.
226
227
228(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
229File: umsb.fd 2013/01/14 v3.01 AMS symbols B
230) [1
231
232{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./sentencecounter.a
233ux) )
234Here is how much of TeX's memory you used:
235 3042 strings out of 479383
236 39191 string characters out of 5875799
237 322429 words of memory out of 5000000
238 20164 multiletter control sequences out of 15000+600000
239 406032 words of font info for 38 fonts, out of 8000000 for 9000
240 1141 hyphenation exceptions out of 8191
241 66i,9n,72p,232b,133s stack positions out of 5000i,500n,10000p,200000b,80000s
242</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/sha
243re/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/texmf-dist/
244fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texmf-dist/fonts/type1/pu
245blic/amsfonts/cm/cmmi7.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/c
246m/cmr10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb></u
247sr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb></usr/share/texmf-d
248ist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type
2491/public/amsfonts/symbols/msbm10.pfb>
250Output written on sentencecounter.pdf (1 page, 76925 bytes).
251PDF statistics:
252 44 PDF objects out of 1000 (max. 8388607)
253 31 compressed objects within 1 object stream
254 0 named destinations out of 1000 (max. 500000)
255 1 words of extra memory for PDF output out of 10000 (max. 10000000)
256
diff --git a/src/Lecture2/live/sentencecounter.pdf b/src/Lecture2/live/sentencecounter.pdf
new file mode 100644
index 0000000..7c0d117
--- /dev/null
+++ b/src/Lecture2/live/sentencecounter.pdf
Binary files differ
diff --git a/src/Lecture2/live/sentencecounter.synctex.gz b/src/Lecture2/live/sentencecounter.synctex.gz
new file mode 100644
index 0000000..7217772
--- /dev/null
+++ b/src/Lecture2/live/sentencecounter.synctex.gz
Binary files differ
diff --git a/src/Lecture2/live/sentencecounter.tex b/src/Lecture2/live/sentencecounter.tex
new file mode 100644
index 0000000..6428918
--- /dev/null
+++ b/src/Lecture2/live/sentencecounter.tex
@@ -0,0 +1,66 @@
1\documentclass[10pt,a5paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
7
8\usepackage{xcolor}
9
10\newcounter{sentence}[section]
11\renewcommand{\thesentence}{[\thesection,\arabic{sentence}]}
12
13\newcommand{\R}{\mathbb{R}}
14\newcommand{\words}{blah bla blha}
15
16\newcommand{\todo}[1]{{\color{red}\large TODO: #1}}
17
18\newcommand{\sent}[1]{\refstepcounter{sentence}#1\textsuperscript{\arabic{sentence}}}
19
20\newcommand{\mymatrix}[4]{\begin{pmatrix}
21#1 & #2 \\
22#3 & #4
23\end{pmatrix}}
24
25\newcommand{\twocases}[4]{\begin{cases}
26#1 & #2 \\
27#3 & #4
28\end{cases}}
29
30
31\begin{document}
32
33\section{First section}
34
35\sent{A sentence before the first one}
36
37\sent{This is a sentence.}
38\label{s1}
39\sent{This is another sentence.}
40
41\todo{finish the first section}
42
43This is a longer sentence that takes more than one line line maybe~no still it random words to show that how tilde works i dont know Theorem~10
44
45\section{Second section}
46
47\sent{A sentence in the second section.}
48\label{sanother}
49
50\vspace{2cm}
51
52In sentence~\ref{s1}... \todo{what did I want to say?}
53
54\[ \R \]
55
56\words
57
58\[
59\mymatrix{x}{a_{2,2}}{0}{f(10)}
60\]
61
62\[
63f(x)=\twocases{x^2}{\text{if }x>0}{-x^3}{\text{otherwise.}}
64\]
65
66\end{document} \ No newline at end of file
diff --git a/src/Lecture2/slides/3-MoreLatex.aux b/src/Lecture2/slides/3-MoreLatex.aux
new file mode 100644
index 0000000..c61be1c
--- /dev/null
+++ b/src/Lecture2/slides/3-MoreLatex.aux
@@ -0,0 +1,69 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
20\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
21\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}}
22\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}}
23\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}}
24\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}}
25\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}}
26\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}}
27\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}}
28\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}}
29\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}}
30\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}}
31\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}}
32\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}}
33\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}}
34\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}}
35\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}}
36\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}}
37\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}}
38\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}}
39\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}}
40\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}}
41\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}}
42\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}}
43\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}}
44\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}}
45\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}}
46\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}}
47\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}}
48\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}}
49\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}}
50\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}}
51\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}}
52\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}}
53\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}}
54\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}}
55\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}}
56\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}}
57\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}}
58\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}}
59\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}}
60\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}}
61\@writefile{nav}{\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}}
62\@writefile{nav}{\headcommand {\beamer@framepages {22}{22}}}
63\@writefile{nav}{\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}}}
64\@writefile{nav}{\headcommand {\beamer@framepages {23}{23}}}
65\@writefile{nav}{\headcommand {\beamer@partpages {1}{23}}}
66\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{23}}}
67\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{23}}}
68\@writefile{nav}{\headcommand {\beamer@documentpages {23}}}
69\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {23}}}
diff --git a/src/Lecture2/slides/3-MoreLatex.log b/src/Lecture2/slides/3-MoreLatex.log
new file mode 100644
index 0000000..f876db2
--- /dev/null
+++ b/src/Lecture2/slides/3-MoreLatex.log
@@ -0,0 +1,1193 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2021.5.20) 25 MAY 2021 16:13
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**3-MoreLatex.tex
6(./3-MoreLatex.tex
7LaTeX2e <2020-02-02> patch level 2
8L3 programming layer <2020-02-14>
9(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
10Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations
11(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
12(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
13Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW)
14\etb@tempcnta=\count167
15)
16\beamer@tempbox=\box45
17\beamer@tempcount=\count168
18\c@beamerpauses=\count169
19
20(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
21\beamer@slideinframe=\count170
22\beamer@minimum=\count171
23\beamer@decode@box=\box46
24)
25\beamer@commentbox=\box47
26\beamer@modecount=\count172
27)
28(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
29Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead.
30
31(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
32Package: iftex 2019/11/07 v1.0c TeX engine tests
33))
34\headdp=\dimen134
35\footheight=\dimen135
36\sidebarheight=\dimen136
37\beamer@tempdim=\dimen137
38\beamer@finalheight=\dimen138
39\beamer@animht=\dimen139
40\beamer@animdp=\dimen140
41\beamer@animwd=\dimen141
42\beamer@leftmargin=\dimen142
43\beamer@rightmargin=\dimen143
44\beamer@leftsidebar=\dimen144
45\beamer@rightsidebar=\dimen145
46\beamer@boxsize=\dimen146
47\beamer@vboxoffset=\dimen147
48\beamer@descdefault=\dimen148
49\beamer@descriptionwidth=\dimen149
50\beamer@lastskip=\skip47
51\beamer@areabox=\box48
52\beamer@animcurrent=\box49
53\beamer@animshowbox=\box50
54\beamer@sectionbox=\box51
55\beamer@logobox=\box52
56\beamer@linebox=\box53
57\beamer@sectioncount=\count173
58\beamer@subsubsectionmax=\count174
59\beamer@subsectionmax=\count175
60\beamer@sectionmax=\count176
61\beamer@totalheads=\count177
62\beamer@headcounter=\count178
63\beamer@partstartpage=\count179
64\beamer@sectionstartpage=\count180
65\beamer@subsectionstartpage=\count181
66\beamer@animationtempa=\count182
67\beamer@animationtempb=\count183
68\beamer@xpos=\count184
69\beamer@ypos=\count185
70\beamer@ypos@offset=\count186
71\beamer@showpartnumber=\count187
72\beamer@currentsubsection=\count188
73\beamer@coveringdepth=\count189
74\beamer@sectionadjust=\count190
75\beamer@tocsectionnumber=\count191
76
77(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
78(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
79Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
80\KV@toks@=\toks14
81))
82\beamer@paperwidth=\skip48
83\beamer@paperheight=\skip49
84
85(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
86Package: geometry 2020/01/02 v5.9 Page Geometry
87
88(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
89Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
90)
91\Gm@cnth=\count192
92\Gm@cntv=\count193
93\c@Gm@tempcnt=\count194
94\Gm@bindingoffset=\dimen150
95\Gm@wd@mp=\dimen151
96\Gm@odd@mp=\dimen152
97\Gm@even@mp=\dimen153
98\Gm@layoutwidth=\dimen154
99\Gm@layoutheight=\dimen155
100\Gm@layouthoffset=\dimen156
101\Gm@layoutvoffset=\dimen157
102\Gm@dimlist=\toks15
103)
104(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
105File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option)
106)
107(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
108(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
109Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR)
110
111(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
112Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR)
113
114(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
115Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
116)
117(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
118File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
119)
120Package graphics Info: Driver file: pdftex.def on input line 105.
121
122(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
123File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
124))
125\Gin@req@height=\dimen158
126\Gin@req@width=\dimen159
127)
128(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
129(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
130(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
131\pgfutil@everybye=\toks16
132\pgfutil@tempdima=\dimen160
133\pgfutil@tempdimb=\dimen161
134
135(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t
136ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
137\pgfutil@abb=\box54
138(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty
139Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS)
140))
141(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
142(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex)
143Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b)
144))
145(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
146Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b)
147
148(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
149\pgfkeys@pathtoks=\toks17
150\pgfkeys@temptoks=\toks18
151
152(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t
153ex
154\pgfkeys@tmptoks=\toks19
155))
156\pgf@x=\dimen162
157\pgf@y=\dimen163
158\pgf@xa=\dimen164
159\pgf@ya=\dimen165
160\pgf@xb=\dimen166
161\pgf@yb=\dimen167
162\pgf@xc=\dimen168
163\pgf@yc=\dimen169
164\pgf@xd=\dimen170
165\pgf@yd=\dimen171
166\w@pgf@writea=\write3
167\r@pgf@reada=\read2
168\c@pgf@counta=\count195
169\c@pgf@countb=\count196
170\c@pgf@countc=\count197
171\c@pgf@countd=\count198
172\t@pgf@toka=\toks20
173\t@pgf@tokb=\toks21
174\t@pgf@tokc=\toks22
175\pgf@sys@id@count=\count199
176 (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
177File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b)
178)
179Driver file for pgf: pgfsys-pdftex.def
180
181(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
182File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b)
183
184(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de
185f
186File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b)
187)))
188(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.
189tex
190File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b)
191\pgfsyssoftpath@smallbuffer@items=\count266
192\pgfsyssoftpath@bigbuffer@items=\count267
193)
194(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.
195tex
196File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b)
197)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
198Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
199
200(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
201File: color.cfg 2016/01/02 v1.6 sample color configuration
202)
203Package xcolor Info: Driver file: pdftex.def on input line 225.
204Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
205Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
206Package xcolor Info: Model `RGB' extended on input line 1364.
207Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
208Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
209Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
210Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
211Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
212Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
213)
214(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
215Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b)
216
217(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
218(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
219(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
220(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
221\pgfmath@dimen=\dimen172
222\pgfmath@count=\count268
223\pgfmath@box=\box55
224\pgfmath@toks=\toks23
225\pgfmath@stack@operand=\toks24
226\pgfmath@stack@operation=\toks25
227)
228(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
229(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code
230.tex)
231(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet
232ric.code.tex)
233(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod
234e.tex)
235(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison
236.code.tex)
237(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.
238tex)
239(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code
240.tex)
241(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.
242tex)
243(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari
244thmetics.code.tex)))
245(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
246\c@pgfmathroundto@lastzeros=\count269
247))
248(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
249(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te
250x
251File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b)
252\pgf@picminx=\dimen173
253\pgf@picmaxx=\dimen174
254\pgf@picminy=\dimen175
255\pgf@picmaxy=\dimen176
256\pgf@pathminx=\dimen177
257\pgf@pathmaxx=\dimen178
258\pgf@pathminy=\dimen179
259\pgf@pathmaxy=\dimen180
260\pgf@xx=\dimen181
261\pgf@xy=\dimen182
262\pgf@yx=\dimen183
263\pgf@yy=\dimen184
264\pgf@zx=\dimen185
265\pgf@zy=\dimen186
266)
267(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.
268code.tex
269File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b)
270\pgf@path@lastx=\dimen187
271\pgf@path@lasty=\dimen188
272)
273(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code
274.tex
275File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
276\pgf@shorten@end@additional=\dimen189
277\pgf@shorten@start@additional=\dimen190
278)
279(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te
280x
281File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
282\pgfpic=\box56
283\pgf@hbox=\box57
284\pgf@layerbox@main=\box58
285\pgf@picture@serial@count=\count270
286)
287(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c
288ode.tex
289File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b)
290\pgflinewidth=\dimen191
291)
292(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation
293s.code.tex
294File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b)
295\pgf@pt@x=\dimen192
296\pgf@pt@y=\dimen193
297\pgf@pt@temp=\dimen194
298)
299(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
300File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b)
301)
302(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t
303ex
304File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b)
305)
306(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing
307.code.tex
308File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b)
309)
310(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te
311x
312File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b)
313\pgfarrowsep=\dimen195
314)
315(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
316File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b)
317\pgf@max=\dimen196
318\pgf@sys@shading@range@num=\count271
319\pgf@shadingcount=\count272
320)
321(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
322File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
323
324(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.
325tex
326File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b)
327\pgfexternal@startupbox=\box59
328))
329(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te
330x
331File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
332)
333(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c
334ode.tex
335File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b)
336)
337(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.
338tex
339File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b)
340)
341(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
342File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b)
343))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
344Package: xxcolor 2003/10/24 ver 0.1
345\XC@nummixins=\count273
346\XC@countmixins=\count274
347)
348(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
349Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO)
350
351(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
352Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
353)
354(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
355Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO)
356))
357(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
358Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX
359
360(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty
361Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO
362)
363Package pdftexcmds Info: \pdf@primitive is available.
364Package pdftexcmds Info: \pdf@ifprimitive is available.
365Package pdftexcmds Info: \pdfdraftmode found.
366)
367(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
368Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
369)
370(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
371Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
372)
373(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
374Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
375)
376(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
377Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
378)
379(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
380Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
381)
382(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
383Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
384)
385(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
386Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO)
387)
388\@linkdim=\dimen197
389\Hy@linkcounter=\count275
390\Hy@pagecounter=\count276
391
392(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
393File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO)
394Now handling font encoding PD1 ...
395... no UTF-8 mapping file for font encoding PD1
396)
397(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
398Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
399)
400(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
401Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
402)
403\Hy@SavedSpaceFactor=\count277
404\pdfmajorversion=\count278
405Package hyperref Info: Option `bookmarks' set `true' on input line 4421.
406Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421.
407Package hyperref Info: Option `implicit' set `false' on input line 4421.
408Package hyperref Info: Hyper figures OFF on input line 4547.
409Package hyperref Info: Link nesting OFF on input line 4552.
410Package hyperref Info: Hyper index ON on input line 4555.
411Package hyperref Info: Plain pages OFF on input line 4562.
412Package hyperref Info: Backreferencing OFF on input line 4567.
413Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals.
414Package hyperref Info: Bookmarks ON on input line 4800.
415\c@Hy@tempcnt=\count279
416
417(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty
418\Urlmuskip=\muskip16
419Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
420)
421LaTeX Info: Redefining \url on input line 5159.
422\XeTeXLinkMargin=\dimen198
423
424(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
425Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
426
427(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
428Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
429)
430))
431\Fld@menulength=\count280
432\Field@Width=\dimen199
433\Fld@charsize=\dimen256
434Package hyperref Info: Hyper figures OFF on input line 6430.
435Package hyperref Info: Link nesting OFF on input line 6435.
436Package hyperref Info: Hyper index ON on input line 6438.
437Package hyperref Info: backreferencing OFF on input line 6445.
438Package hyperref Info: Link coloring OFF on input line 6450.
439Package hyperref Info: Link coloring with OCG OFF on input line 6455.
440Package hyperref Info: PDF/A mode OFF on input line 6460.
441LaTeX Info: Redefining \ref on input line 6500.
442LaTeX Info: Redefining \pageref on input line 6504.
443\Hy@abspage=\count281
444
445
446Package hyperref Message: Stopped early.
447
448)
449Package hyperref Info: Driver (autodetected): hpdftex.
450 (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
451File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX
452
453(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
454Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO)
455)
456\Fld@listcount=\count282
457\c@bookmark@seq@number=\count283
458
459(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
460Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
461
462(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
463Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
464)
465Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
46686.
467))
468(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
469(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty)
470(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
471(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
472Package: amssymb 2013/01/14 v3.01 AMS font symbols
473
474(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
475Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
476\@emptytoks=\toks26
477\symAMSa=\mathgroup4
478\symAMSb=\mathgroup5
479LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
480LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
481(Font) U/euf/m/n --> U/euf/b/n on input line 106.
482))
483(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
484Package: sansmathaccent 2020/01/31
485
486(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
487Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files)
488)))
489(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
490(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
491Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX
492))
493(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty)
494(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty)
495(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
496\beamer@argscount=\count284
497\beamer@lastskipcover=\skip50
498\beamer@trivlistdepth=\count285
499)
500(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty)
501(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
502\c@lecture=\count286
503\c@part=\count287
504\c@section=\count288
505\c@subsection=\count289
506\c@subsubsection=\count290
507)
508(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
509\beamer@framebox=\box60
510\beamer@frametitlebox=\box61
511\beamer@zoombox=\box62
512\beamer@zoomcount=\count291
513\beamer@zoomframecount=\count292
514\beamer@frametextheight=\dimen257
515\c@subsectionslide=\count293
516\beamer@frametopskip=\skip51
517\beamer@framebottomskip=\skip52
518\beamer@frametopskipautobreak=\skip53
519\beamer@framebottomskipautobreak=\skip54
520\beamer@envbody=\toks27
521\framewidth=\dimen258
522\c@framenumber=\count294
523)
524(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
525\beamer@verbatimfileout=\write4
526)
527(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
528\beamer@splitbox=\box63
529\beamer@autobreakcount=\count295
530\beamer@autobreaklastheight=\dimen259
531\beamer@frametitletoks=\toks28
532\beamer@framesubtitletoks=\toks29
533)
534(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
535\beamer@footins=\box64
536)
537(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty)
538(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
539\beamer@frameboxcopy=\box65
540)
541(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty)
542(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
543\beamer@sbttoks=\toks30
544
545(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
546(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
547\bmb@box=\box66
548\bmb@colorbox=\box67
549\bmb@boxshadow=\box68
550\bmb@boxshadowball=\box69
551\bmb@boxshadowballlarge=\box70
552\bmb@temp=\dimen260
553\bmb@dima=\dimen261
554\bmb@dimb=\dimen262
555\bmb@prevheight=\dimen263
556)
557\beamer@blockheadheight=\dimen264
558))
559(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
560(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
561Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
562\@enLab=\toks31
563)
564\c@figure=\count296
565\c@table=\count297
566\abovecaptionskip=\skip55
567\belowcaptionskip=\skip56
568)
569(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
570\beamer@section@min@dim=\dimen265
571)
572(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
573(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
574Package: amsmath 2020/01/20 v2.17e AMS math features
575\@mathmargin=\skip57
576
577For additional information on amsmath, use the `?' option.
578(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
579Package: amstext 2000/06/29 v2.01 AMS text
580
581(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
582File: amsgen.sty 1999/11/30 v2.0 generic functions
583\@emptytoks=\toks32
584\ex@=\dimen266
585))
586(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
587Package: amsbsy 1999/11/29 v1.2d Bold Symbols
588\pmbraise@=\dimen267
589)
590(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
591Package: amsopn 2016/03/08 v2.02 operator names
592)
593\inf@bad=\count298
594LaTeX Info: Redefining \frac on input line 227.
595\uproot@=\count299
596\leftroot@=\count300
597LaTeX Info: Redefining \overline on input line 389.
598\classnum@=\count301
599\DOTSCASE@=\count302
600LaTeX Info: Redefining \ldots on input line 486.
601LaTeX Info: Redefining \dots on input line 489.
602LaTeX Info: Redefining \cdots on input line 610.
603\Mathstrutbox@=\box71
604\strutbox@=\box72
605\big@size=\dimen268
606LaTeX Font Info: Redeclaring font encoding OML on input line 733.
607LaTeX Font Info: Redeclaring font encoding OMS on input line 734.
608\macc@depth=\count303
609\c@MaxMatrixCols=\count304
610\dotsspace@=\muskip17
611\c@parentequation=\count305
612\dspbrk@lvl=\count306
613\tag@help=\toks33
614\row@=\count307
615\column@=\count308
616\maxfields@=\count309
617\andhelp@=\toks34
618\eqnshift@=\dimen269
619\alignsep@=\dimen270
620\tagshift@=\dimen271
621\tagwidth@=\dimen272
622\totwidth@=\dimen273
623\lineht@=\dimen274
624\@envbody=\toks35
625\multlinegap=\skip58
626\multlinetaggap=\skip59
627\mathdisplay@stack=\toks36
628LaTeX Info: Redefining \[ on input line 2859.
629LaTeX Info: Redefining \] on input line 2860.
630)
631(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
632Package: amsthm 2017/10/31 v2.20.4
633\thm@style=\toks37
634\thm@bodyfont=\toks38
635\thm@headfont=\toks39
636\thm@notefont=\toks40
637\thm@headpunct=\toks41
638\thm@preskip=\skip60
639\thm@postskip=\skip61
640\thm@headsep=\skip62
641\dth@everypar=\toks42
642)
643\c@theorem=\count310
644)
645(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty))
646(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
647(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty)
648(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty)
649(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
650\beamer@dima=\dimen275
651\beamer@dimb=\dimen276
652)
653(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty)))
654(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty
655(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty)
656(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty)
657(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty)
658(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty))
659(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
660Package: inputenc 2018/08/11 v1.3c Input encoding file
661\inpenc@prehook=\toks43
662\inpenc@posthook=\toks44
663)
664(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty
665Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ
666
667(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
668(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
669Package: pgf 2020/01/08 v3.1.5b (3.1.5b)
670
671(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
672File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
673\pgfnodeparttextbox=\box73
674) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
675File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b)
676)
677(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65
678.sty
679Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b)
680\pgf@nodesepstart=\dimen277
681\pgf@nodesepend=\dimen278
682)
683(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18
684.sty
685Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b)
686)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
687(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
688(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex))
689(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
690(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
691(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
692Package: pgffor 2020/01/08 v3.1.5b (3.1.5b)
693
694(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
695\pgffor@iter=\dimen279
696\pgffor@skip=\dimen280
697\pgffor@stack=\toks45
698\pgffor@toks=\toks46
699))
700(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
701Package: tikz 2020/01/08 v3.1.5b (3.1.5b)
702
703(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers
704.code.tex
705File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
706\pgf@plot@mark@count=\count311
707\pgfplotmarksize=\dimen281
708)
709\tikz@lastx=\dimen282
710\tikz@lasty=\dimen283
711\tikz@lastxsaved=\dimen284
712\tikz@lastysaved=\dimen285
713\tikz@lastmovetox=\dimen286
714\tikz@lastmovetoy=\dimen287
715\tikzleveldistance=\dimen288
716\tikzsiblingdistance=\dimen289
717\tikz@figbox=\box74
718\tikz@figbox@bg=\box75
719\tikz@tempbox=\box76
720\tikz@tempbox@bg=\box77
721\tikztreelevel=\count312
722\tikznumberofchildren=\count313
723\tikznumberofcurrentchild=\count314
724\tikz@fig@count=\count315
725
726(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
727File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
728\pgfmatrixcurrentrow=\count316
729\pgfmatrixcurrentcolumn=\count317
730\pgf@matrix@numberofcolumns=\count318
731)
732\tikz@expandcount=\count319
733
734(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
735zlibrarytopaths.code.tex
736File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b)
737)))
738(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex
739(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
740zlibrarymatrix.code.tex
741File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
742)
743(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
744zlibraryquotes.code.tex
745File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
746)
747(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.
748code.tex
749File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b)
750\pgfarrowinset=\dimen290
751\pgfarrowlength=\dimen291
752\pgfarrowwidth=\dimen292
753\pgfarrowlinewidth=\dimen293
754)))
755(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def
756File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode
757\l__kernel_color_stack_int=\count320
758\l__pdf_internal_box=\box78
759)
760(./3-MoreLatex.aux)
761\openout1 = `3-MoreLatex.aux'.
762
763LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 19.
764LaTeX Font Info: ... okay on input line 19.
765LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 19.
766LaTeX Font Info: ... okay on input line 19.
767LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 19.
768LaTeX Font Info: ... okay on input line 19.
769LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 19.
770LaTeX Font Info: ... okay on input line 19.
771LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 19.
772LaTeX Font Info: ... okay on input line 19.
773LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 19.
774LaTeX Font Info: ... okay on input line 19.
775LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 19.
776LaTeX Font Info: ... okay on input line 19.
777LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 19.
778LaTeX Font Info: ... okay on input line 19.
779
780*geometry* driver: auto-detecting
781*geometry* detected driver: pdftex
782*geometry* verbose mode - [ preamble ] result:
783* driver: pdftex
784* paper: custom
785* layout: <same size as paper>
786* layoutoffset:(h,v)=(0.0pt,0.0pt)
787* modes: includehead includefoot
788* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt)
789* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt)
790* \paperwidth=364.19536pt
791* \paperheight=273.14662pt
792* \textwidth=342.2953pt
793* \textheight=244.6939pt
794* \oddsidemargin=-61.31996pt
795* \evensidemargin=-61.31996pt
796* \topmargin=-72.26999pt
797* \headheight=14.22636pt
798* \headsep=0.0pt
799* \topskip=11.0pt
800* \footskip=14.22636pt
801* \marginparwidth=4.0pt
802* \marginparsep=10.0pt
803* \columnsep=10.0pt
804* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
805* \hoffset=0.0pt
806* \voffset=0.0pt
807* \mag=1000
808* \@twocolumnfalse
809* \@twosidefalse
810* \@mparswitchfalse
811* \@reversemarginfalse
812* (1in=72.27pt=25.4mm, 1cm=28.453pt)
813
814(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
815[Loading MPS to PDF converter (version 2006.09.02).]
816\scratchcounter=\count321
817\scratchdimen=\dimen294
818\scratchbox=\box79
819\nofMPsegments=\count322
820\nofMParguments=\count323
821\everyMPshowfont=\toks47
822\MPscratchCnt=\count324
823\MPscratchDim=\dimen295
824\MPnumerator=\count325
825\makeMPintoPDFobject=\count326
826\everyMPtoPDFconversion=\toks48
827) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
828Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
829Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
83085.
831
832(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
833File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
834e
835))
836ABD: EveryShipout initializing macros
837\AtBeginShipoutBox=\box80
838Package hyperref Info: Link coloring OFF on input line 19.
839
840(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
841Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
842
843(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
844Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
845)
846(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
847Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
848)
849\c@section@level=\count327
850)
851LaTeX Info: Redefining \ref on input line 19.
852LaTeX Info: Redefining \pageref on input line 19.
853LaTeX Info: Redefining \nameref on input line 19.
854
855(./3-MoreLatex.out) (./3-MoreLatex.out)
856\@outlinefile=\write5
857\openout5 = `3-MoreLatex.out'.
858
859LaTeX Font Info: Overwriting symbol font `operators' in version `normal'
860(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 19.
861LaTeX Font Info: Overwriting symbol font `operators' in version `bold'
862(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 19.
863\symnumbers=\mathgroup6
864\sympureletters=\mathgroup7
865LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal'
866(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 19.
867LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 19.
868LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal'
869(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 19.
870LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
871(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 19.
872LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 19.
873LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal'
874(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 19.
875LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
876(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 19.
877LaTeX Font Info: Redeclaring math alphabet \mathit on input line 19.
878LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal'
879(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 19.
880LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
881(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 19.
882LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 19.
883LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal'
884(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 19.
885LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
886(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 19.
887LaTeX Font Info: Overwriting symbol font `numbers' in version `bold'
888(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 19.
889LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
890(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 19.
891LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold'
892(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 19.
893LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
894(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 19.
895LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
896(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 19.
897LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
898(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 19.
899LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
900(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 19.
901LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 19.
902LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal'
903(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 1
9049.
905LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
906(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 1
9079.
908LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
909(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp
910ut line 19.
911
912(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary
913-English.dict
914Dictionary: translator-basic-dictionary, Language: English
915)
916(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic
917tionary-English.dict
918Dictionary: translator-bibliography-dictionary, Language: English
919)
920(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict
921ionary-English.dict
922Dictionary: translator-environment-dictionary, Language: English
923)
924(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar
925y-English.dict
926Dictionary: translator-months-dictionary, Language: English
927)
928(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona
929ry-English.dict
930Dictionary: translator-numbers-dictionary, Language: English
931)
932(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona
933ry-English.dict
934Dictionary: translator-theorem-dictionary, Language: English
935) (./3-MoreLatex.nav)
936<img/unilu.jpg, id=20, 645.16031pt x 578.16pt>
937File: img/unilu.jpg Graphic file (type jpg)
938<use img/unilu.jpg>
939Package pdftex.def Info: img/unilu.jpg used on input line 23.
940(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
941 [1
942
943{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>]
944LaTeX Font Info: Trying to load font information for OMS+cmtt on input line
94542.
946
947(/usr/share/texmf/tex/latex/R/tex/latex/omscmtt.fd
948File: omscmtt.fd
949)
950LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <12> not available
951(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 42.
952LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <10.95> not available
953(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 42.
954File: img/unilu.jpg Graphic file (type jpg)
955<use img/unilu.jpg>
956Package pdftex.def Info: img/unilu.jpg used on input line 42.
957(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
958 [2
959
960]
961<img/thm_pre.png, id=85, 493.845pt x 208.78pt>
962File: img/thm_pre.png Graphic file (type png)
963<use img/thm_pre.png>
964Package pdftex.def Info: img/thm_pre.png used on input line 60.
965(pdftex.def) Requested size: 148.15463pt x 62.63448pt.
966<img/thm_tex.png, id=86, 621.32124pt x 162.6075pt>
967File: img/thm_tex.png Graphic file (type png)
968<use img/thm_tex.png>
969Package pdftex.def Info: img/thm_tex.png used on input line 60.
970(pdftex.def) Requested size: 186.39781pt x 48.78262pt.
971
972Overfull \hbox (15.25017pt too wide) in paragraph at lines 60--60
973[][]
974 []
975
976LaTeX Font Info: Trying to load font information for U+msa on input line 60.
977
978(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
979File: umsa.fd 2013/01/14 v3.01 AMS symbols A
980)
981LaTeX Font Info: Trying to load font information for U+msb on input line 60.
982
983
984(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
985File: umsb.fd 2013/01/14 v3.01 AMS symbols B
986)
987LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp
988ut line 60.
989
990(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd
991File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma
992thkerncmss.
993)
994<img/thm_pdf.png, id=87, 848.16875pt x 474.77374pt>
995File: img/thm_pdf.png Graphic file (type png)
996<use img/thm_pdf.png>
997Package pdftex.def Info: img/thm_pdf.png used on input line 60.
998(pdftex.def) Requested size: 169.63074pt x 94.95306pt.
999File: img/unilu.jpg Graphic file (type jpg)
1000<use img/unilu.jpg>
1001Package pdftex.def Info: img/unilu.jpg used on input line 60.
1002(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1003
1004[3
1005
1006 <./img/thm_pre.png> <./img/thm_tex.png> <./img/thm_pdf.png>]
1007File: img/unilu.jpg Graphic file (type jpg)
1008<use img/unilu.jpg>
1009Package pdftex.def Info: img/unilu.jpg used on input line 79.
1010(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1011 [4
1012
1013]
1014File: img/unilu.jpg Graphic file (type jpg)
1015<use img/unilu.jpg>
1016Package pdftex.def Info: img/unilu.jpg used on input line 104.
1017(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1018 [5
1019
1020]
1021File: img/unilu.jpg Graphic file (type jpg)
1022<use img/unilu.jpg>
1023Package pdftex.def Info: img/unilu.jpg used on input line 151.
1024(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1025
1026[6
1027
1028]
1029LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <14.4> not available
1030(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 173.
1031File: img/unilu.jpg Graphic file (type jpg)
1032<use img/unilu.jpg>
1033Package pdftex.def Info: img/unilu.jpg used on input line 173.
1034(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1035 [7
1036
1037]
1038File: img/unilu.jpg Graphic file (type jpg)
1039<use img/unilu.jpg>
1040Package pdftex.def Info: img/unilu.jpg used on input line 189.
1041(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1042 [8
1043
1044]
1045File: img/unilu.jpg Graphic file (type jpg)
1046<use img/unilu.jpg>
1047Package pdftex.def Info: img/unilu.jpg used on input line 206.
1048(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1049 [9
1050
1051]
1052File: img/unilu.jpg Graphic file (type jpg)
1053<use img/unilu.jpg>
1054Package pdftex.def Info: img/unilu.jpg used on input line 222.
1055(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1056 [10
1057
1058]
1059File: img/unilu.jpg Graphic file (type jpg)
1060<use img/unilu.jpg>
1061Package pdftex.def Info: img/unilu.jpg used on input line 236.
1062(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1063 [11
1064
1065]
1066File: img/unilu.jpg Graphic file (type jpg)
1067<use img/unilu.jpg>
1068Package pdftex.def Info: img/unilu.jpg used on input line 253.
1069(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1070 [12
1071
1072]
1073File: img/unilu.jpg Graphic file (type jpg)
1074<use img/unilu.jpg>
1075Package pdftex.def Info: img/unilu.jpg used on input line 283.
1076(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1077 [13
1078
1079]
1080File: img/unilu.jpg Graphic file (type jpg)
1081<use img/unilu.jpg>
1082Package pdftex.def Info: img/unilu.jpg used on input line 301.
1083(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1084 [14
1085
1086]
1087File: img/unilu.jpg Graphic file (type jpg)
1088<use img/unilu.jpg>
1089Package pdftex.def Info: img/unilu.jpg used on input line 323.
1090(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1091 [15
1092
1093]
1094File: img/unilu.jpg Graphic file (type jpg)
1095<use img/unilu.jpg>
1096Package pdftex.def Info: img/unilu.jpg used on input line 347.
1097(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1098 [16
1099
1100]
1101File: img/unilu.jpg Graphic file (type jpg)
1102<use img/unilu.jpg>
1103Package pdftex.def Info: img/unilu.jpg used on input line 367.
1104(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1105 [17
1106
1107]
1108File: img/unilu.jpg Graphic file (type jpg)
1109<use img/unilu.jpg>
1110Package pdftex.def Info: img/unilu.jpg used on input line 381.
1111(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1112 [18
1113
1114]
1115File: img/unilu.jpg Graphic file (type jpg)
1116<use img/unilu.jpg>
1117Package pdftex.def Info: img/unilu.jpg used on input line 402.
1118(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1119 [19
1120
1121]
1122File: img/unilu.jpg Graphic file (type jpg)
1123<use img/unilu.jpg>
1124Package pdftex.def Info: img/unilu.jpg used on input line 420.
1125(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1126 [20
1127
1128]
1129File: img/unilu.jpg Graphic file (type jpg)
1130<use img/unilu.jpg>
1131Package pdftex.def Info: img/unilu.jpg used on input line 433.
1132(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1133 [21
1134
1135]
1136File: img/unilu.jpg Graphic file (type jpg)
1137<use img/unilu.jpg>
1138Package pdftex.def Info: img/unilu.jpg used on input line 458.
1139(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1140
1141[22
1142
1143]
1144File: img/unilu.jpg Graphic file (type jpg)
1145<use img/unilu.jpg>
1146Package pdftex.def Info: img/unilu.jpg used on input line 475.
1147(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1148 [23
1149
1150]
1151\tf@nav=\write6
1152\openout6 = `3-MoreLatex.nav'.
1153
1154\tf@toc=\write7
1155\openout7 = `3-MoreLatex.toc'.
1156
1157\tf@snm=\write8
1158\openout8 = `3-MoreLatex.snm'.
1159
1160Package atveryend Info: Empty hook `BeforeClearDocument' on input line 477.
1161Package atveryend Info: Empty hook `AfterLastShipout' on input line 477.
1162 (./3-MoreLatex.aux)
1163Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 477.
1164Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 477.
1165Package rerunfilecheck Info: File `3-MoreLatex.out' has not changed.
1166(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0.
1167 )
1168Here is how much of TeX's memory you used:
1169 22004 strings out of 481239
1170 446635 string characters out of 5920377
1171 685823 words of memory out of 5000000
1172 36692 multiletter control sequences out of 15000+600000
1173 541233 words of font info for 57 fonts, out of 8000000 for 9000
1174 1141 hyphenation exceptions out of 8191
1175 58i,18n,89p,795b,653s stack positions out of 5000i,500n,10000p,200000b,80000s
1176</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></us
1177r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/shar
1178e/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/texl
1179ive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texlive/te
1180xmf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/texmf-dis
1181t/fonts/type1/public/amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-dist/fo
1182nts/type1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/fonts/t
1183ype1/public/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/p
1184ublic/amsfonts/cm/cmtt10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/
1185amsfonts/cm/cmtt12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfon
1186ts/cm/cmtt8.pfb>
1187Output written on 3-MoreLatex.pdf (23 pages, 331145 bytes).
1188PDF statistics:
1189 701 PDF objects out of 1000 (max. 8388607)
1190 643 compressed objects within 7 object streams
1191 47 named destinations out of 1000 (max. 500000)
1192 87 words of extra memory for PDF output out of 10000 (max. 10000000)
1193
diff --git a/src/Lecture2/slides/3-MoreLatex.nav b/src/Lecture2/slides/3-MoreLatex.nav
new file mode 100644
index 0000000..fe076e4
--- /dev/null
+++ b/src/Lecture2/slides/3-MoreLatex.nav
@@ -0,0 +1,51 @@
1\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
2\headcommand {\beamer@framepages {1}{1}}
3\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}
4\headcommand {\beamer@framepages {2}{2}}
5\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}
6\headcommand {\beamer@framepages {3}{3}}
7\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}
8\headcommand {\beamer@framepages {4}{4}}
9\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}
10\headcommand {\beamer@framepages {5}{5}}
11\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}
12\headcommand {\beamer@framepages {6}{6}}
13\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}
14\headcommand {\beamer@framepages {7}{7}}
15\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}
16\headcommand {\beamer@framepages {8}{8}}
17\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}
18\headcommand {\beamer@framepages {9}{9}}
19\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}
20\headcommand {\beamer@framepages {10}{10}}
21\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}
22\headcommand {\beamer@framepages {11}{11}}
23\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}
24\headcommand {\beamer@framepages {12}{12}}
25\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}
26\headcommand {\beamer@framepages {13}{13}}
27\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}
28\headcommand {\beamer@framepages {14}{14}}
29\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}
30\headcommand {\beamer@framepages {15}{15}}
31\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}
32\headcommand {\beamer@framepages {16}{16}}
33\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}
34\headcommand {\beamer@framepages {17}{17}}
35\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}
36\headcommand {\beamer@framepages {18}{18}}
37\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}
38\headcommand {\beamer@framepages {19}{19}}
39\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}
40\headcommand {\beamer@framepages {20}{20}}
41\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}
42\headcommand {\beamer@framepages {21}{21}}
43\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}
44\headcommand {\beamer@framepages {22}{22}}
45\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}}
46\headcommand {\beamer@framepages {23}{23}}
47\headcommand {\beamer@partpages {1}{23}}
48\headcommand {\beamer@subsectionpages {1}{23}}
49\headcommand {\beamer@sectionpages {1}{23}}
50\headcommand {\beamer@documentpages {23}}
51\headcommand {\gdef \inserttotalframenumber {23}}
diff --git a/src/Lecture2/slides/3-MoreLatex.out b/src/Lecture2/slides/3-MoreLatex.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture2/slides/3-MoreLatex.out
diff --git a/src/Lecture2/slides/3-MoreLatex.pdf b/src/Lecture2/slides/3-MoreLatex.pdf
new file mode 100644
index 0000000..2c95ed9
--- /dev/null
+++ b/src/Lecture2/slides/3-MoreLatex.pdf
Binary files differ
diff --git a/src/Lecture2/slides/3-MoreLatex.snm b/src/Lecture2/slides/3-MoreLatex.snm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture2/slides/3-MoreLatex.snm
diff --git a/src/Lecture2/slides/3-MoreLatex.tex b/src/Lecture2/slides/3-MoreLatex.tex
new file mode 100644
index 0000000..5f234b0
--- /dev/null
+++ b/src/Lecture2/slides/3-MoreLatex.tex
@@ -0,0 +1,478 @@
1\documentclass[11pt]{beamer}
2\usetheme{Madrid}
3\usepackage[utf8]{inputenc}
4\usepackage{amsmath, amssymb, amsfonts, amsthm}
5\usepackage{xcolor}
6
7\usepackage{tikz-cd}
8%\usepackage{enumitem}
9
10\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto}
11\title{More Latex}
12\logo{\includegraphics[scale=0.1]{img/unilu.jpg}}
13%\institute{University of Luxembourg}
14
15\newcommand{\bs}{\textbackslash}
16
17\date{2021-03-12}
18
19\begin{document}
20
21\begin{frame}
22 \titlepage
23\end{frame}
24
25\begin{frame}{Theorems (review)}
26 \begin{center}
27 \large
28 \texttt{\bs newtheorem\{env-name\}{\color{red}[number-with]}\{Text\}{\color{red}[number-parent]}}
29 \end{center}
30
31 \vspace{0.4cm}
32 \begin{itemize}
33 \item \texttt{env-name}: Environment name (use
34 \texttt{\bs begin\{env-name\}...})
35 \item \texttt{Text}: Theorem name to be displayed
36 \item \texttt{[number-with]} for ``shared counter''
37 \item \texttt{[number-parent]} adds x.1
38 \item {\color{red} At most one of \texttt{[number-with]}
39 and \texttt{[number-parent]}}
40 \end{itemize}
41
42\end{frame}
43
44\begin{frame}{Theorems (review)}
45 \begin{columns}
46 \column{0.5\textwidth}
47 \includegraphics[scale=0.3]{img/thm_pre.png}
48
49 \vspace{0.2cm}
50 \vdots
51 \vspace{0.3cm}
52
53 \includegraphics[scale=0.3]{img/thm_tex.png}
54
55 \column{0.5\textwidth}
56 \includegraphics[scale=0.2]{img/thm_pdf.png}
57
58 \vspace{1cm}
59 \end{columns}
60\end{frame}
61
62
63\begin{frame}{Counters}
64 Reference: \url{https://en.wikibooks.org/wiki/LaTeX/Counters}
65
66 \vspace{0.5cm}
67 \begin{itemize}
68 \item Sections, theorems etc have an associated \emph{counter}
69
70 \vspace{0.2cm}
71 \item Common usage:
72
73 \vspace{0.1cm}
74 \texttt{\bs setcounter\{counter-name\}\{n\} \quad \%Set counter to n}
75
76 \vspace{0.1cm}
77 \texttt{\bs addtocounter\{counter-name\}\{n\}\quad\%Add n to counter}
78 \end{itemize}
79\end{frame}
80
81
82\begin{frame}{Counters}
83
84 \begin{itemize}
85 \item Define a counter with \texttt{\bs newcounter\{name\}[number-parent]}
86
87 \vspace{0.2cm}
88 \item Change sub-numbering of defined counters:
89
90 \vspace{0.15cm}
91 \begin{center}
92 \begin{tabular}{l}
93 \texttt{\bs numberwithin\{equation\}\{section\}}
94 %\texttt{\bs numberwithout\{subsection\}\{section\}}
95 \end{tabular}
96 \end{center}
97
98 \vspace{0.2cm}
99 \item Print formatted counter with \texttt{\bs{\color{red}the}name}
100 or just number with \texttt{\bs arabic\{name\}}
101 (or \texttt{\bs alph}, \texttt{\bs Alph}, \texttt{\bs roman},
102 \texttt{\bs Roman}, \texttt{\bs fnsymbol})
103 \end{itemize}
104\end{frame}
105
106
107\begin{frame}{Counters}
108
109 \begin{columns}
110
111 \column{0.5\textwidth}
112 \begin{center}
113 {\large\textbf{Default counters}}
114
115 \vspace{0.3cm}
116 \begin{tabular}{l}
117 %part \\
118 chapter \\
119 section \\
120 subsection \\
121 subsubsection \\
122 paragraph \\
123 %subparagraph \\
124 page \\
125 figure \\
126 %table \\
127 footnote \\
128 %mpfootnote \\
129 equation \\
130 enumi \\
131 enumii \\
132 ...
133 %enumiii \\
134 %enumiv \\
135 \end{tabular}
136 \end{center}
137
138 \column{0.5\textwidth}
139 {\large\textbf{Counter styles}}
140
141 \vspace{0.3cm}
142 \begin{tabular}{ll}
143 \texttt{arabic} & 1, 2, 3, 4... \\
144 \texttt{alph} & a, b, c, d... \\
145 \texttt{Alph} & A, B, C, D... \\
146 \texttt{roman} & i, ii, iii, iv... \\
147 \texttt{Roman} & I, II, III, IV... \\
148 \texttt{fnsymbol} & $\ast$, $\dagger$, $\ddagger$, $\S$ ...
149 \end{tabular}
150 \end{columns}
151\end{frame}
152
153\begin{frame}{Counters: change \texttt{\bs thecounter}}
154 \begin{itemize}
155 \item Change how counter is displayed by default, for example:
156
157 \vspace{0.2cm}
158 \begin{center}
159 \texttt{\bs renewcommand\{\bs thesection\}\{\bs alph\{section\}\}}
160 \end{center}
161
162 \vspace{0.3cm}
163 \item For enumerate:
164
165 \vspace{0.2cm}
166 \begin{center}
167 \begin{tabular}{l}
168 \texttt{\bs usepackage\{enumitem\}} \\
169 \texttt{\bs begin\{enumerate\}[label=\bs alph*]}
170 \end{tabular}
171 \end{center}
172 \end{itemize}
173\end{frame}
174
175\begin{frame}{\texttt{label} and \texttt{ref}}
176 \begin{itemize}
177 \item Put \texttt{\bs label\{mark\}} immediately after the thing you want
178 to refer to (after \texttt{\bs refstepcounter\{countername\}} for
179 counters you define)
180
181 \vspace{0.3cm}
182 \item Use \texttt{\bs ref\{mark\}} or \texttt{\bs eqref\{mark\}} to refer
183 %(or \texttt{\bs eqref\{mark\}} = \texttt{(\bs ref\{mark\})})
184
185 (Pro tip: write \texttt{Proposition$\sim$\bs ref\{mark\}})
186 \vspace{0.3cm}
187 \item Compile twice!
188 \end{itemize}
189\end{frame}
190
191
192\begin{frame}{The \texttt{hyperref} package}
193 \texttt{\bs usepackage\{hyperref\}}
194
195 \vspace{1cm}
196 \begin{itemize}
197 \item Now all \texttt{\bs ref\{mark\}} become clickable!
198
199 \vspace{0.3cm}
200 \item \texttt{\bs hyperref[mark]\{text\}} for internal links
201
202 \vspace{0.3cm}
203 \item \texttt{\bs url\{www.google.com\}} or
204 \texttt{\bs href\{www.google.com\}\{Google\}} for web links
205 \end{itemize}
206\end{frame}
207
208\begin{frame}{New commands}
209 \begin{itemize}
210 \item We have seen \texttt{\bs newcommand\{\bs command\}\{output\}}
211
212 \vspace{0.3cm}
213 \item Arguments: use \texttt{\bs newcommand\{\bs command\}[n]\{output\}}
214 and use the arguments in \texttt{output} with
215 \texttt{\#1, \#2, ... \#n} \hspace{0.4cm}(\texttt n$\leq 9$)
216
217 \vspace{0.3cm}
218 \item If \texttt{\bs command} is already defined:
219 \texttt{\bs renewcommand} (overwrite) or
220 \texttt{\bs providecommand} (use old definition, if it exists)
221 \end{itemize}
222\end{frame}
223
224\begin{frame}{New commands - examples}
225
226 \begin{tabular}{l|c}
227 \texttt{\bs newcommand\{hi\}\{Hello, World!\}} \\
228 \texttt{\bs hi} & Hello, world! \\
229 \\
230 \texttt{\bs newcommand\{hello\}[1]\{Hello, \#1!\}} \\
231 \texttt{\bs hello\{my friend\}} & Hello, my friend! \\
232 \\
233 \texttt{\bs renewcommand\{binom\}[2]\{bin(\#1,\#2)\}} \\
234 \texttt{\bs( \bs binom\{10\}2 \bs)} & \(bin(10,2)\)
235 \end{tabular}
236\end{frame}
237
238
239\begin{frame}{New commands - optional argument}
240 \texttt{\bs newcommand\{\bs com\}[n][default1]\{output\}}
241
242 \texttt{\bs com[first]\{other,args\}} or \texttt{\bs com\{without,first\}}
243
244 \vspace{1cm}
245 \begin{itemize}
246 \item At most one optional argument, must be \texttt{\# 1}
247
248 \vspace{0.3cm}
249 \item More complex things: use TeX primitives such as
250 \texttt{\bs ifthenelse} or see
251 \url{https://www.ctan.org/tex-archive/support/newcommand/}
252 \end{itemize}
253\end{frame}
254
255\begin{frame}{Exercises}
256 \begin{enumerate}%[label=(\arabic*)]
257 \item Write a command \texttt{\bs mat} which takes $4$ arguments and
258 outputs a $2\times 2$ matrix with those arguments as entries
259 (use \texttt{pmatrix}).
260
261 \vspace{0.5cm}
262 \item Write a command to define a function case-by-case ($2$ cases,
263 $4$ arguments). Use the \texttt{cases} environment:
264
265 \vspace{0.2cm}
266 \begin{columns}
267 \column{0.45\textwidth}
268 \begin{center}\begin{tabular}{l}
269 \texttt{\bs begin\{cases\}} \\
270 \texttt{\quad 1 \& 2 \bs\bs \quad3 \& 4} \\
271 \texttt{\bs end\{cases\}}
272 \end{tabular}\end{center}
273
274 \column{0.09\textwidth}
275 \begin{center} $\implies$ \end{center}
276
277 \column{0.45\textwidth}
278 \begin{align*}
279 \begin{cases} 1 & 2 \\ 3 & 4 \end{cases}
280 \end{align*}
281 \end{columns}
282 \end{enumerate}
283\end{frame}
284
285
286\begin{frame}{Pictures}
287 \texttt{\bs usepackage\{graphicx\}}
288
289 \texttt{\bs includegraphics[options]\{picture.jpg\}}
290
291 \vspace{1cm}
292 Options (comma-separated) include:
293
294 \vspace{0.2cm}
295 \begin{itemize}
296 \item \texttt{scale=x} (scale by a factor of x)
297 \item \texttt{width=x} and \texttt{height=y} (if both specified picture
298 is distorted)
299 \item \texttt{angle=$\alpha$} (rotate)
300 \end{itemize}
301\end{frame}
302
303
304\begin{frame}{Figures}
305 \texttt{\bs begin\{figure\}[place]}
306
307 \vspace{1cm}
308 \begin{itemize}
309 \item Figure outside normal text flow.
310 \item \texttt{place}: \texttt{h} (here), \texttt{t} (top) or \texttt{b}
311 (bottom).
312 \item Can add \emph{caption}
313 \end{itemize}
314
315 \vspace{0.3cm}
316 \begin{center} \begin{tabular}{l}
317 \texttt{\bs begin\{figure\}[h]} \\
318 \texttt{\qquad\bs centering \qquad \% recommended} \\
319 \texttt{\qquad \bs includegraphics\{picture.jpg\}} \\
320 \texttt{\qquad \bs caption\{Description of the picture\}} \\
321 \texttt{\bs end\{figure\}}
322 \end{tabular} \end{center}
323\end{frame}
324
325
326\begin{frame}{Wrapping text around figures}
327
328 \texttt{\bs usepackage\{{\color{red}wrapfig}\}}
329
330 \texttt{\bs begin\{wrapfigure\}{\color{red}\{alignment\}\{width\}}}
331
332 \vspace{1cm}
333 \begin{itemize}
334 \item \texttt{alignment}: \texttt{l} (left) or \texttt{r} (right)
335 \item Must specify \texttt{width}
336 \item Works the same as \texttt{figure}
337 \end{itemize}
338
339 \vspace{0.3cm}
340 \begin{center} \begin{tabular}{l}
341 \texttt{\bs begin\{wrapfigure\}{\color{red}\{l\}\{0.5\bs textwidth\}}} \\
342 \texttt{\qquad\bs centering} \\
343 \texttt{\qquad \bs includegraphics\{picture.jpg\}} \\
344 \texttt{\qquad \bs caption\{Description of the picture\}} \\
345 \texttt{\bs end\{wrapfigure\}}
346 \end{tabular} \end{center}
347\end{frame}
348
349
350\begin{frame}{Lengths}
351 Reference: \url{https://en.wikibooks.org/wiki/LaTeX/Lengths}
352
353 \vspace{0.5cm}
354 \begin{itemize}
355 \item Similar to counters:
356
357 \vspace{0.3cm}
358 \begin{center}\begin{tabular}{l}
359 \texttt{\bs newlength\{\bs lengthname\}}\\
360 \texttt{\bs setlength\{\bs lengthname\}\{value\}}
361 \end{tabular}\end{center}
362
363 \vspace{0.3cm}
364 \item \texttt{value}: number followed by unit
365 (\texttt{12pt}, \texttt{1.2cm}, \texttt{65mm}, \dots)
366 \end{itemize}
367\end{frame}
368
369\begin{frame}{Lengths}
370 Default lengths:
371
372 \vspace{0.5cm}
373 \begin{itemize}
374 \item \texttt{\bs textwidth}: width of text in a page
375 \item \texttt{\bs textheight}: height of text in a page
376 \item \texttt{\bs baselineskip}: space between lines in same paragraph
377 \item \texttt{\bs parskip}: space between paragraphs
378 \item \texttt{\bs parindent}: indentation of first line of a paragraph
379 \item \dots
380 \end{itemize}
381\end{frame}
382
383\begin{frame}{Manual spacing}
384 \begin{itemize}
385 \item \texttt{\bs vspace\{length\}} and \texttt{\bs hspace\{length\}}
386
387 \vspace{0.2cm}
388 \item Fill space: \texttt{\bs vfill} and \texttt{\bs hfill}
389
390 \vspace{0.2cm}
391 \item Fill line with ``decoration'':
392 \texttt{\bs hrulefill} and \texttt{\bs dotfill}
393
394 \vspace{0.2cm}
395 \item Example:
396
397 \vspace{0.2cm}
398 \begin{center}
399 \texttt{First name: \bs hrulefill \bs quad Last name: \bs hrulefill}
400 \end{center}
401 \end{itemize}
402\end{frame}
403
404
405
406\begin{frame}{Bibliography}
407 Simple bibliography with \texttt{thebibliography} environment:
408
409 \vspace{0.5cm}
410 \begin{center}\begin{tabular}{l}
411 \texttt{\bs begin\{thebibliography\}\{99\}} \\
412 \texttt{\qquad\bs bibitem\{knuth68\}} \\
413 \texttt{\qquad\qquad Donald Knuth, The Art of Computer Programming,} \\
414 \texttt{\qquad\qquad Volume I, 1968, Addison-Wesley}\\
415 \texttt{\bs end\{thebibliography\}}
416 \end{tabular}\end{center}
417
418 %\vspace{0.5cm}
419 %And cite with \texttt{\bs cite\{knuth68\}}
420\end{frame}
421
422
423\begin{frame}{Bibligraphy}
424 \begin{itemize}
425 \item Simple citation: \texttt{\bs cite\{knuth68\}}
426
427 \vspace{0.3cm}
428 \item Cite multiple sources: \texttt{\bs cite\{source1, source2\}}
429
430 \vspace{0.3cm}
431 \item Cite specific part with \texttt{\bs cite[p.$\sim$42]\{source\}}
432 \end{itemize}
433\end{frame}
434
435
436\begin{frame}{Bibliography: BibTeX}
437 \begin{itemize}
438 \item Separate file \texttt{mybib.bib}, different syntax:
439
440 \begin{center}\begin{tabular}{l}
441 \texttt{@book\{knuth68,} \\
442 \texttt{\qquad author = "Donald Knuth",}\\
443 \texttt{\qquad title = "The Art of Computer Programming",}\\
444 \texttt{\qquad publisher = "Addison-Wesley",}\\
445 \texttt{\qquad volume = "I",}\\
446 \texttt{\qquad year = "1968",} \\
447 \texttt{\}}
448 \end{tabular}\end{center}
449
450 \vspace{0.3cm}
451 \item Include bibliography in your \texttt{.tex} file:
452
453 \begin{center}\begin{tabular}{l}
454 \texttt{\bs bibliographystyle\{plain\}}\\
455 \texttt{\bs bibliography\{mybib\}}
456 \end{tabular}\end{center}
457 \end{itemize}
458\end{frame}
459
460
461\begin{frame}{Bibliography: BibTeX}
462 \begin{itemize}
463 \item Compile, generate bibliography, compile, compile
464
465 \vspace{0.3cm}
466 \item Books in \texttt{.bib} file but not cited do not appear
467
468 \vspace{0.3cm}
469 \item Citing articles and other: see \url{https://en.wikibooks.org/wiki/%
470 LaTeX/Bibliography\_Management\#Standard\_templates}
471
472 \vspace{0.3cm}
473 \item Find BibTeX citations on \url{https://scholar.google.com}
474 \end{itemize}
475\end{frame}
476
477\end{document}
478
diff --git a/src/Lecture2/slides/3-MoreLatex.toc b/src/Lecture2/slides/3-MoreLatex.toc
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture2/slides/3-MoreLatex.toc
diff --git a/src/Lecture2/slides/img/thm_pdf.png b/src/Lecture2/slides/img/thm_pdf.png
new file mode 100644
index 0000000..dfeed6f
--- /dev/null
+++ b/src/Lecture2/slides/img/thm_pdf.png
Binary files differ
diff --git a/src/Lecture2/slides/img/thm_pre.png b/src/Lecture2/slides/img/thm_pre.png
new file mode 100644
index 0000000..5c2147b
--- /dev/null
+++ b/src/Lecture2/slides/img/thm_pre.png
Binary files differ
diff --git a/src/Lecture2/slides/img/thm_tex.png b/src/Lecture2/slides/img/thm_tex.png
new file mode 100644
index 0000000..f98ba0b
--- /dev/null
+++ b/src/Lecture2/slides/img/thm_tex.png
Binary files differ
diff --git a/src/Lecture2/slides/img/unilu.jpg b/src/Lecture2/slides/img/unilu.jpg
new file mode 100644
index 0000000..5265563
--- /dev/null
+++ b/src/Lecture2/slides/img/unilu.jpg
Binary files differ
diff --git a/src/Lecture3/live/beamer.aux b/src/Lecture3/live/beamer.aux
new file mode 100644
index 0000000..d7d4f05
--- /dev/null
+++ b/src/Lecture3/live/beamer.aux
@@ -0,0 +1,36 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
20\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
21\@writefile{toc}{\beamer@sectionintoc {1}{This is the first section}{2}{0}{1}}
22\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{1}}}
23\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{1}}}
24\@writefile{nav}{\headcommand {\sectionentry {1}{this}{2}{This is the first section}{0}}}
25\@writefile{nav}{\headcommand {\slideentry {1}{0}{1}{2/5}{}{0}}}
26\@writefile{nav}{\headcommand {\beamer@framepages {2}{5}}}
27\@writefile{nav}{\headcommand {\slideentry {1}{0}{2}{6/6}{}{0}}}
28\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}}
29\@writefile{nav}{\headcommand {\slideentry {1}{0}{3}{7/10}{}{0}}}
30\@writefile{nav}{\headcommand {\beamer@framepages {7}{10}}}
31\@writefile{nav}{\headcommand {\beamer@partpages {1}{10}}}
32\@writefile{nav}{\headcommand {\beamer@subsectionpages {2}{10}}}
33\@writefile{nav}{\headcommand {\beamer@sectionpages {2}{10}}}
34\@writefile{nav}{\headcommand {\beamer@documentpages {10}}}
35\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {4}}}
36\gdef \@abspage@last{10}
diff --git a/src/Lecture3/live/beamer.log b/src/Lecture3/live/beamer.log
new file mode 100644
index 0000000..873d535
--- /dev/null
+++ b/src/Lecture3/live/beamer.log
@@ -0,0 +1,944 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 26 MAR 2021 16:48
2entering extended mode
3 restricted \write18 enabled.
4 %&-line parsing enabled.
5**beamer.tex
6(./beamer.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/beamer/beamer.cls
10Document Class: beamer 2020/07/22 v3.59 A class for typesetting presentations
11(/usr/share/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
12(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
13Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
14\etb@tempcnta=\count177
15)
16\beamer@tempbox=\box47
17\beamer@tempcount=\count178
18\c@beamerpauses=\count179
19
20(/usr/share/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
21\beamer@slideinframe=\count180
22\beamer@minimum=\count181
23\beamer@decode@box=\box48
24)
25\beamer@commentbox=\box49
26\beamer@modecount=\count182
27)
28(/usr/share/texmf-dist/tex/generic/iftex/ifpdf.sty
29Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead.
30
31(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
32Package: iftex 2020/03/06 v1.0d TeX engine tests
33))
34\headdp=\dimen138
35\footheight=\dimen139
36\sidebarheight=\dimen140
37\beamer@tempdim=\dimen141
38\beamer@finalheight=\dimen142
39\beamer@animht=\dimen143
40\beamer@animdp=\dimen144
41\beamer@animwd=\dimen145
42\beamer@leftmargin=\dimen146
43\beamer@rightmargin=\dimen147
44\beamer@leftsidebar=\dimen148
45\beamer@rightsidebar=\dimen149
46\beamer@boxsize=\dimen150
47\beamer@vboxoffset=\dimen151
48\beamer@descdefault=\dimen152
49\beamer@descriptionwidth=\dimen153
50\beamer@lastskip=\skip47
51\beamer@areabox=\box50
52\beamer@animcurrent=\box51
53\beamer@animshowbox=\box52
54\beamer@sectionbox=\box53
55\beamer@logobox=\box54
56\beamer@linebox=\box55
57\beamer@sectioncount=\count183
58\beamer@subsubsectionmax=\count184
59\beamer@subsectionmax=\count185
60\beamer@sectionmax=\count186
61\beamer@totalheads=\count187
62\beamer@headcounter=\count188
63\beamer@partstartpage=\count189
64\beamer@sectionstartpage=\count190
65\beamer@subsectionstartpage=\count191
66\beamer@animationtempa=\count192
67\beamer@animationtempb=\count193
68\beamer@xpos=\count194
69\beamer@ypos=\count195
70\beamer@ypos@offset=\count196
71\beamer@showpartnumber=\count197
72\beamer@currentsubsection=\count198
73\beamer@coveringdepth=\count199
74\beamer@sectionadjust=\count266
75\beamer@tocsectionnumber=\count267
76
77(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
78(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
79Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
80\KV@toks@=\toks15
81))
82\beamer@paperwidth=\skip48
83\beamer@paperheight=\skip49
84
85(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
86Package: geometry 2020/01/02 v5.9 Page Geometry
87
88(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
89Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
90)
91\Gm@cnth=\count268
92\Gm@cntv=\count269
93\c@Gm@tempcnt=\count270
94\Gm@bindingoffset=\dimen154
95\Gm@wd@mp=\dimen155
96\Gm@odd@mp=\dimen156
97\Gm@even@mp=\dimen157
98\Gm@layoutwidth=\dimen158
99\Gm@layoutheight=\dimen159
100\Gm@layouthoffset=\dimen160
101\Gm@layoutvoffset=\dimen161
102\Gm@dimlist=\toks16
103)
104(/usr/share/texmf-dist/tex/latex/base/size11.clo
105File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
106)
107(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
108(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
109Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
110
111(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
112Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
113
114(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
115Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
116)
117(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
118File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
119)
120Package graphics Info: Driver file: pdftex.def on input line 105.
121
122(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
123File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
124))
125\Gin@req@height=\dimen162
126\Gin@req@width=\dimen163
127)
128(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
129(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
130(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
131\pgfutil@everybye=\toks17
132\pgfutil@tempdima=\dimen164
133\pgfutil@tempdimb=\dimen165
134
135(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
136(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
137\pgfutil@abb=\box56
138)
139(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
140(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
141Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
142))
143(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
144Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
145
146(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
147\pgfkeys@pathtoks=\toks18
148\pgfkeys@temptoks=\toks19
149
150(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
151\pgfkeys@tmptoks=\toks20
152))
153\pgf@x=\dimen166
154\pgf@y=\dimen167
155\pgf@xa=\dimen168
156\pgf@ya=\dimen169
157\pgf@xb=\dimen170
158\pgf@yb=\dimen171
159\pgf@xc=\dimen172
160\pgf@yc=\dimen173
161\pgf@xd=\dimen174
162\pgf@yd=\dimen175
163\w@pgf@writea=\write3
164\r@pgf@reada=\read2
165\c@pgf@counta=\count271
166\c@pgf@countb=\count272
167\c@pgf@countc=\count273
168\c@pgf@countd=\count274
169\t@pgf@toka=\toks21
170\t@pgf@tokb=\toks22
171\t@pgf@tokc=\toks23
172\pgf@sys@id@count=\count275
173
174(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
175File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
176)
177Driver file for pgf: pgfsys-pdftex.def
178
179(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
180File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
181
182(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
183File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
184)))
185(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
186File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
187\pgfsyssoftpath@smallbuffer@items=\count276
188\pgfsyssoftpath@bigbuffer@items=\count277
189)
190(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
191File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
192))
193(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
194Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
195
196(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
197File: color.cfg 2016/01/02 v1.6 sample color configuration
198)
199Package xcolor Info: Driver file: pdftex.def on input line 225.
200Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
201Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
202Package xcolor Info: Model `RGB' extended on input line 1364.
203Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
204Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
205Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
206Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
207Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
208Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
209)
210(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
211Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
212
213(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
214(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
215(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
216(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
217\pgfmath@dimen=\dimen176
218\pgfmath@count=\count278
219\pgfmath@box=\box57
220\pgfmath@toks=\toks24
221\pgfmath@stack@operand=\toks25
222\pgfmath@stack@operation=\toks26
223)
224(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
225(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
226(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
227.tex)
228(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
229(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
230x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
231(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
232(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
233(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
234.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
235\c@pgfmathroundto@lastzeros=\count279
236)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
237(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
238File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
239\pgf@picminx=\dimen177
240\pgf@picmaxx=\dimen178
241\pgf@picminy=\dimen179
242\pgf@picmaxy=\dimen180
243\pgf@pathminx=\dimen181
244\pgf@pathmaxx=\dimen182
245\pgf@pathminy=\dimen183
246\pgf@pathmaxy=\dimen184
247\pgf@xx=\dimen185
248\pgf@xy=\dimen186
249\pgf@yx=\dimen187
250\pgf@yy=\dimen188
251\pgf@zx=\dimen189
252\pgf@zy=\dimen190
253)
254(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
255File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
256\pgf@path@lastx=\dimen191
257\pgf@path@lasty=\dimen192
258) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
259File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
260\pgf@shorten@end@additional=\dimen193
261\pgf@shorten@start@additional=\dimen194
262)
263(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
264File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
265\pgfpic=\box58
266\pgf@hbox=\box59
267\pgf@layerbox@main=\box60
268\pgf@picture@serial@count=\count280
269)
270(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
271File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
272\pgflinewidth=\dimen195
273)
274(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
275ex
276File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
277\pgf@pt@x=\dimen196
278\pgf@pt@y=\dimen197
279\pgf@pt@temp=\dimen198
280) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
281File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
282)
283(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
284File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
285)
286(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
287x
288File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
289) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
290File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
291\pgfarrowsep=\dimen199
292)
293(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
294File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
295\pgf@max=\dimen256
296\pgf@sys@shading@range@num=\count281
297\pgf@shadingcount=\count282
298)
299(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
300File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
301
302(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
303File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
304\pgfexternal@startupbox=\box61
305))
306(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
307File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
308)
309(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
310File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
311) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
312File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
313)
314(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
315File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
316)))
317(/usr/share/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
318Package: xxcolor 2003/10/24 ver 0.1
319\XC@nummixins=\count283
320\XC@countmixins=\count284
321)
322(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty
323Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa
324ge
325with kernel methods
326)
327(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
328Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX
329
330(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
331Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO)
332)
333(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
334Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO
335)
336
337(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
338Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
339)
340Package pdftexcmds Info: \pdf@primitive is available.
341Package pdftexcmds Info: \pdf@ifprimitive is available.
342Package pdftexcmds Info: \pdfdraftmode found.
343)
344(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
345Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
346)
347(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
348Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
349)
350(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
351Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
352)
353(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
354Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
355)
356(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
357Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
358)
359(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
360Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
361)
362(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
363Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)
364)
365\@linkdim=\dimen257
366\Hy@linkcounter=\count285
367\Hy@pagecounter=\count286
368
369(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
370File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO)
371Now handling font encoding PD1 ...
372... no UTF-8 mapping file for font encoding PD1
373)
374(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
375Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
376)
377(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty
378Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
379)
380\Hy@SavedSpaceFactor=\count287
381Package hyperref Info: Option `bookmarks' set `true' on input line 4338.
382Package hyperref Info: Option `bookmarksopen' set `true' on input line 4338.
383Package hyperref Info: Option `implicit' set `false' on input line 4338.
384Package hyperref Info: Hyper figures OFF on input line 4464.
385Package hyperref Info: Link nesting OFF on input line 4469.
386Package hyperref Info: Hyper index ON on input line 4472.
387Package hyperref Info: Plain pages OFF on input line 4479.
388Package hyperref Info: Backreferencing OFF on input line 4484.
389Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals.
390Package hyperref Info: Bookmarks ON on input line 4717.
391\c@Hy@tempcnt=\count288
392
393(/usr/share/texmf-dist/tex/latex/url/url.sty
394\Urlmuskip=\muskip16
395Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
396)
397LaTeX Info: Redefining \url on input line 5076.
398\XeTeXLinkMargin=\dimen258
399
400(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty
401Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
402
403(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
404Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
405)
406))
407\Fld@menulength=\count289
408\Field@Width=\dimen259
409\Fld@charsize=\dimen260
410Package hyperref Info: Hyper figures OFF on input line 6347.
411Package hyperref Info: Link nesting OFF on input line 6352.
412Package hyperref Info: Hyper index ON on input line 6355.
413Package hyperref Info: backreferencing OFF on input line 6362.
414Package hyperref Info: Link coloring OFF on input line 6367.
415Package hyperref Info: Link coloring with OCG OFF on input line 6372.
416Package hyperref Info: PDF/A mode OFF on input line 6377.
417LaTeX Info: Redefining \ref on input line 6417.
418LaTeX Info: Redefining \pageref on input line 6421.
419\Hy@abspage=\count290
420
421
422Package hyperref Message: Stopped early.
423
424)
425Package hyperref Info: Driver (autodetected): hpdftex.
426 (/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
427File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX
428
429(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty
430Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag
431e
432with kernel methods
433)
434\Fld@listcount=\count291
435\c@bookmark@seq@number=\count292
436
437(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
438Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
439
440(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
441Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
442)
443Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
44486.
445))
446(/usr/share/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
447(/usr/share/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty)
448(/usr/share/texmf-dist/tex/latex/beamer/beamerbasefont.sty
449(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
450Package: amssymb 2013/01/14 v3.01 AMS font symbols
451
452(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
453Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
454\@emptytoks=\toks27
455\symAMSa=\mathgroup4
456\symAMSb=\mathgroup5
457LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
458LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
459(Font) U/euf/m/n --> U/euf/b/n on input line 106.
460)))
461(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
462(/usr/share/texmf-dist/tex/latex/translator/translator.sty
463Package: translator 2020-08-03 v1.12c Easy translation of strings in LaTeX
464))
465(/usr/share/texmf-dist/tex/latex/beamer/beamerbasemisc.sty)
466(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty)
467(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
468\beamer@argscount=\count293
469\beamer@lastskipcover=\skip50
470\beamer@trivlistdepth=\count294
471)
472(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetitle.sty)
473(/usr/share/texmf-dist/tex/latex/beamer/beamerbasesection.sty
474\c@lecture=\count295
475\c@part=\count296
476\c@section=\count297
477\c@subsection=\count298
478\c@subsubsection=\count299
479)
480(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
481\beamer@framebox=\box62
482\beamer@frametitlebox=\box63
483\beamer@zoombox=\box64
484\beamer@zoomcount=\count300
485\beamer@zoomframecount=\count301
486\beamer@frametextheight=\dimen261
487\c@subsectionslide=\count302
488\beamer@frametopskip=\skip51
489\beamer@framebottomskip=\skip52
490\beamer@frametopskipautobreak=\skip53
491\beamer@framebottomskipautobreak=\skip54
492\beamer@envbody=\toks28
493\framewidth=\dimen262
494\c@framenumber=\count303
495)
496(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
497\beamer@verbatimfileout=\write4
498)
499(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
500\beamer@splitbox=\box65
501\beamer@autobreakcount=\count304
502\beamer@autobreaklastheight=\dimen263
503\beamer@frametitletoks=\toks29
504\beamer@framesubtitletoks=\toks30
505)
506(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
507\beamer@footins=\box66
508)
509(/usr/share/texmf-dist/tex/latex/beamer/beamerbasecolor.sty)
510(/usr/share/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
511\beamer@frameboxcopy=\box67
512)
513(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetoc.sty)
514(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
515\beamer@sbttoks=\toks31
516
517(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
518(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
519\bmb@box=\box68
520\bmb@colorbox=\box69
521\bmb@boxshadow=\box70
522\bmb@boxshadowball=\box71
523\bmb@boxshadowballlarge=\box72
524\bmb@temp=\dimen264
525\bmb@dima=\dimen265
526\bmb@dimb=\dimen266
527\bmb@prevheight=\dimen267
528)
529\beamer@blockheadheight=\dimen268
530))
531(/usr/share/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
532(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty
533Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
534\@enLab=\toks32
535)
536\c@figure=\count305
537\c@table=\count306
538\abovecaptionskip=\skip55
539\belowcaptionskip=\skip56
540)
541(/usr/share/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
542\beamer@section@min@dim=\dimen269
543)
544(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
545(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
546Package: amsmath 2020/09/23 v2.17i AMS math features
547\@mathmargin=\skip57
548
549For additional information on amsmath, use the `?' option.
550(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
551Package: amstext 2000/06/29 v2.01 AMS text
552
553(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
554File: amsgen.sty 1999/11/30 v2.0 generic functions
555\@emptytoks=\toks33
556\ex@=\dimen270
557))
558(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
559Package: amsbsy 1999/11/29 v1.2d Bold Symbols
560\pmbraise@=\dimen271
561)
562(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
563Package: amsopn 2016/03/08 v2.02 operator names
564)
565\inf@bad=\count307
566LaTeX Info: Redefining \frac on input line 234.
567\uproot@=\count308
568\leftroot@=\count309
569LaTeX Info: Redefining \overline on input line 399.
570\classnum@=\count310
571\DOTSCASE@=\count311
572LaTeX Info: Redefining \ldots on input line 496.
573LaTeX Info: Redefining \dots on input line 499.
574LaTeX Info: Redefining \cdots on input line 620.
575\Mathstrutbox@=\box73
576\strutbox@=\box74
577\big@size=\dimen272
578LaTeX Font Info: Redeclaring font encoding OML on input line 743.
579LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
580\macc@depth=\count312
581\c@MaxMatrixCols=\count313
582\dotsspace@=\muskip17
583\c@parentequation=\count314
584\dspbrk@lvl=\count315
585\tag@help=\toks34
586\row@=\count316
587\column@=\count317
588\maxfields@=\count318
589\andhelp@=\toks35
590\eqnshift@=\dimen273
591\alignsep@=\dimen274
592\tagshift@=\dimen275
593\tagwidth@=\dimen276
594\totwidth@=\dimen277
595\lineht@=\dimen278
596\@envbody=\toks36
597\multlinegap=\skip58
598\multlinetaggap=\skip59
599\mathdisplay@stack=\toks37
600LaTeX Info: Redefining \[ on input line 2923.
601LaTeX Info: Redefining \] on input line 2924.
602)
603(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty
604Package: amsthm 2020/05/29 v2.20.6
605\thm@style=\toks38
606\thm@bodyfont=\toks39
607\thm@headfont=\toks40
608\thm@notefont=\toks41
609\thm@headpunct=\toks42
610\thm@preskip=\skip60
611\thm@postskip=\skip61
612\thm@headsep=\skip62
613\dth@everypar=\toks43
614)
615\c@theorem=\count319
616)
617(/usr/share/texmf-dist/tex/latex/beamer/beamerbasethemes.sty))
618(/usr/share/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
619(/usr/share/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty)
620(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty)
621(/usr/share/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
622\beamer@dima=\dimen279
623\beamer@dimb=\dimen280
624)
625(/usr/share/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty)))
626(/usr/share/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty
627(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty)
628(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty)
629(/usr/share/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty)
630(/usr/share/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty))
631(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
632Package: inputenc 2020/08/01 v1.3d Input encoding file
633\inpenc@prehook=\toks44
634\inpenc@posthook=\toks45
635)
636\c@prop=\count320
637
638(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
639File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
640\l__kernel_color_stack_int=\count321
641\l__pdf_internal_box=\box75
642) (./beamer.aux)
643\openout1 = `beamer.aux'.
644
645LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 20.
646LaTeX Font Info: ... okay on input line 20.
647LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 20.
648LaTeX Font Info: ... okay on input line 20.
649LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 20.
650LaTeX Font Info: ... okay on input line 20.
651LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 20.
652LaTeX Font Info: ... okay on input line 20.
653LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 20.
654LaTeX Font Info: ... okay on input line 20.
655LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 20.
656LaTeX Font Info: ... okay on input line 20.
657LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 20.
658LaTeX Font Info: ... okay on input line 20.
659LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 20.
660LaTeX Font Info: ... okay on input line 20.
661*geometry* driver: auto-detecting
662*geometry* detected driver: pdftex
663*geometry* verbose mode - [ preamble ] result:
664* driver: pdftex
665* paper: custom
666* layout: <same size as paper>
667* layoutoffset:(h,v)=(0.0pt,0.0pt)
668* modes: includehead includefoot
669* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt)
670* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt)
671* \paperwidth=364.19536pt
672* \paperheight=273.14662pt
673* \textwidth=342.2953pt
674* \textheight=244.6939pt
675* \oddsidemargin=-61.31996pt
676* \evensidemargin=-61.31996pt
677* \topmargin=-72.26999pt
678* \headheight=14.22636pt
679* \headsep=0.0pt
680* \topskip=11.0pt
681* \footskip=14.22636pt
682* \marginparwidth=4.0pt
683* \marginparsep=10.0pt
684* \columnsep=10.0pt
685* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
686* \hoffset=0.0pt
687* \voffset=0.0pt
688* \mag=1000
689* \@twocolumnfalse
690* \@twosidefalse
691* \@mparswitchfalse
692* \@reversemarginfalse
693* (1in=72.27pt=25.4mm, 1cm=28.453pt)
694
695(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
696[Loading MPS to PDF converter (version 2006.09.02).]
697\scratchcounter=\count322
698\scratchdimen=\dimen281
699\scratchbox=\box76
700\nofMPsegments=\count323
701\nofMParguments=\count324
702\everyMPshowfont=\toks46
703\MPscratchCnt=\count325
704\MPscratchDim=\dimen282
705\MPnumerator=\count326
706\makeMPintoPDFobject=\count327
707\everyMPtoPDFconversion=\toks47
708) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
709Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
710
711(/usr/share/texmf-dist/tex/latex/grfext/grfext.sty
712Package: grfext 2019/12/03 v1.3 Manage graphics extensions (HO)
713)
714Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
71585.
716Package grfext Info: Graphics extension search list:
717(grfext) [.pdf,.png,.jpg,.mps,.jpeg,.jbig2,.jb2,.PDF,.PNG,.JPG,.JPE
718G,.JBIG2,.JB2,.eps]
719(grfext) \AppendGraphicsExtensions on input line 504.
720
721(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
722File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
723e
724))
725Package hyperref Info: Link coloring OFF on input line 20.
726
727(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
728Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
729
730(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty
731Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
732)
733(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
734Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
735)
736\c@section@level=\count328
737)
738LaTeX Info: Redefining \ref on input line 20.
739LaTeX Info: Redefining \pageref on input line 20.
740LaTeX Info: Redefining \nameref on input line 20.
741
742(./beamer.out) (./beamer.out)
743\@outlinefile=\write5
744\openout5 = `beamer.out'.
745
746LaTeX Font Info: Overwriting symbol font `operators' in version `normal'
747(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 20.
748LaTeX Font Info: Overwriting symbol font `operators' in version `bold'
749(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 20.
750\symnumbers=\mathgroup6
751\sympureletters=\mathgroup7
752LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal'
753(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 20.
754LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 20.
755LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal'
756(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 20.
757LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
758(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 20.
759LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 20.
760LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal'
761(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 20.
762LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
763(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 20.
764LaTeX Font Info: Redeclaring math alphabet \mathit on input line 20.
765LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal'
766(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 20.
767LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
768(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 20.
769LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 20.
770LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal'
771(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 20.
772LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
773(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 20.
774LaTeX Font Info: Overwriting symbol font `numbers' in version `bold'
775(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 20.
776LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
777(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 20.
778LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold'
779(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 20.
780LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
781(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 20.
782LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
783(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 20.
784LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
785(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 20.
786LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
787(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 20.
788
789(/usr/share/texmf-dist/tex/latex/translator/translator-basic-dictionary-English
790.dict
791Dictionary: translator-basic-dictionary, Language: English
792)
793(/usr/share/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-
794English.dict
795Dictionary: translator-bibliography-dictionary, Language: English
796)
797(/usr/share/texmf-dist/tex/latex/translator/translator-environment-dictionary-E
798nglish.dict
799Dictionary: translator-environment-dictionary, Language: English
800)
801(/usr/share/texmf-dist/tex/latex/translator/translator-months-dictionary-Englis
802h.dict
803Dictionary: translator-months-dictionary, Language: English
804)
805(/usr/share/texmf-dist/tex/latex/translator/translator-numbers-dictionary-Engli
806sh.dict
807Dictionary: translator-numbers-dictionary, Language: English
808)
809(/usr/share/texmf-dist/tex/latex/translator/translator-theorem-dictionary-Engli
810sh.dict
811Dictionary: translator-theorem-dictionary, Language: English
812) (./beamer.nav)
813<unilu.jpg, id=24, 645.16031pt x 578.16pt>
814File: unilu.jpg Graphic file (type jpg)
815<use unilu.jpg>
816Package pdftex.def Info: unilu.jpg used on input line 24.
817(pdftex.def) Requested size: 32.2599pt x 28.90968pt.
818 [1
819
820{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map} <./unilu.jpg>]
821LaTeX Font Info: Trying to load font information for U+msa on input line 45.
822
823 (/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
824File: umsa.fd 2013/01/14 v3.01 AMS symbols A
825)
826LaTeX Font Info: Trying to load font information for U+msb on input line 45.
827
828
829(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
830File: umsb.fd 2013/01/14 v3.01 AMS symbols B
831)
832File: unilu.jpg Graphic file (type jpg)
833<use unilu.jpg>
834Package pdftex.def Info: unilu.jpg used on input line 45.
835(pdftex.def) Requested size: 32.2599pt x 28.90968pt.
836 [2
837
838]
839File: unilu.jpg Graphic file (type jpg)
840<use unilu.jpg>
841Package pdftex.def Info: unilu.jpg used on input line 45.
842(pdftex.def) Requested size: 32.2599pt x 28.90968pt.
843 [3
844
845]
846File: unilu.jpg Graphic file (type jpg)
847<use unilu.jpg>
848Package pdftex.def Info: unilu.jpg used on input line 45.
849(pdftex.def) Requested size: 32.2599pt x 28.90968pt.
850 [4
851
852]
853File: unilu.jpg Graphic file (type jpg)
854<use unilu.jpg>
855Package pdftex.def Info: unilu.jpg used on input line 45.
856(pdftex.def) Requested size: 32.2599pt x 28.90968pt.
857 [5
858
859]
860File: unilu.jpg Graphic file (type jpg)
861<use unilu.jpg>
862Package pdftex.def Info: unilu.jpg used on input line 64.
863(pdftex.def) Requested size: 32.2599pt x 28.90968pt.
864 [6
865
866]
867File: unilu.jpg Graphic file (type jpg)
868<use unilu.jpg>
869Package pdftex.def Info: unilu.jpg used on input line 82.
870(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
871File: unilu.jpg Graphic file (type jpg)
872<use unilu.jpg>
873Package pdftex.def Info: unilu.jpg used on input line 82.
874(pdftex.def) Requested size: 32.2599pt x 28.90968pt.
875 [7
876
877]
878File: unilu.jpg Graphic file (type jpg)
879<use unilu.jpg>
880Package pdftex.def Info: unilu.jpg used on input line 82.
881(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
882File: unilu.jpg Graphic file (type jpg)
883<use unilu.jpg>
884Package pdftex.def Info: unilu.jpg used on input line 82.
885(pdftex.def) Requested size: 32.2599pt x 28.90968pt.
886
887[8
888
889]
890File: unilu.jpg Graphic file (type jpg)
891<use unilu.jpg>
892Package pdftex.def Info: unilu.jpg used on input line 82.
893(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
894File: unilu.jpg Graphic file (type jpg)
895<use unilu.jpg>
896Package pdftex.def Info: unilu.jpg used on input line 82.
897(pdftex.def) Requested size: 32.2599pt x 28.90968pt.
898 [9
899
900]
901File: unilu.jpg Graphic file (type jpg)
902<use unilu.jpg>
903Package pdftex.def Info: unilu.jpg used on input line 82.
904(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
905File: unilu.jpg Graphic file (type jpg)
906<use unilu.jpg>
907Package pdftex.def Info: unilu.jpg used on input line 82.
908(pdftex.def) Requested size: 32.2599pt x 28.90968pt.
909 [10
910
911]
912\tf@nav=\write6
913\openout6 = `beamer.nav'.
914
915\tf@toc=\write7
916\openout7 = `beamer.toc'.
917
918\tf@snm=\write8
919\openout8 = `beamer.snm'.
920
921 (./beamer.aux)
922Package rerunfilecheck Info: File `beamer.out' has not changed.
923(rerunfilecheck) Checksum: 8EA766F5AA06B3504ADD0C5571DBBFEF;60.
924 )
925Here is how much of TeX's memory you used:
926 17825 strings out of 479383
927 340227 string characters out of 5875799
928 644974 words of memory out of 5000000
929 34481 multiletter control sequences out of 15000+600000
930 410355 words of font info for 52 fonts, out of 8000000 for 9000
931 1141 hyphenation exceptions out of 8191
932 107i,15n,111p,427b,707s stack positions out of 5000i,500n,10000p,200000b,80000s
933</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/
934texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/texmf-dist/fon
935ts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texmf-dist/fonts/type1/publi
936c/amsfonts/cm/cmss8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c
937mssi10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmssi8.pfb>
938Output written on beamer.pdf (10 pages, 110030 bytes).
939PDF statistics:
940 129 PDF objects out of 1000 (max. 8388607)
941 95 compressed objects within 1 object stream
942 22 named destinations out of 1000 (max. 500000)
943 98 words of extra memory for PDF output out of 10000 (max. 10000000)
944
diff --git a/src/Lecture3/live/beamer.nav b/src/Lecture3/live/beamer.nav
new file mode 100644
index 0000000..b6bc73c
--- /dev/null
+++ b/src/Lecture3/live/beamer.nav
@@ -0,0 +1,16 @@
1\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
2\headcommand {\beamer@framepages {1}{1}}
3\headcommand {\beamer@sectionpages {1}{1}}
4\headcommand {\beamer@subsectionpages {1}{1}}
5\headcommand {\sectionentry {1}{this}{2}{This is the first section}{0}}
6\headcommand {\slideentry {1}{0}{1}{2/5}{}{0}}
7\headcommand {\beamer@framepages {2}{5}}
8\headcommand {\slideentry {1}{0}{2}{6/6}{}{0}}
9\headcommand {\beamer@framepages {6}{6}}
10\headcommand {\slideentry {1}{0}{3}{7/10}{}{0}}
11\headcommand {\beamer@framepages {7}{10}}
12\headcommand {\beamer@partpages {1}{10}}
13\headcommand {\beamer@subsectionpages {2}{10}}
14\headcommand {\beamer@sectionpages {2}{10}}
15\headcommand {\beamer@documentpages {10}}
16\headcommand {\gdef \inserttotalframenumber {4}}
diff --git a/src/Lecture3/live/beamer.out b/src/Lecture3/live/beamer.out
new file mode 100644
index 0000000..ad62b2a
--- /dev/null
+++ b/src/Lecture3/live/beamer.out
@@ -0,0 +1 @@
\BOOKMARK [2][]{Outline0.1}{This is the first section}{}% 1
diff --git a/src/Lecture3/live/beamer.pdf b/src/Lecture3/live/beamer.pdf
new file mode 100644
index 0000000..62c10d5
--- /dev/null
+++ b/src/Lecture3/live/beamer.pdf
Binary files differ
diff --git a/src/Lecture3/live/beamer.snm b/src/Lecture3/live/beamer.snm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture3/live/beamer.snm
diff --git a/src/Lecture3/live/beamer.synctex.gz b/src/Lecture3/live/beamer.synctex.gz
new file mode 100644
index 0000000..a8c8ce3
--- /dev/null
+++ b/src/Lecture3/live/beamer.synctex.gz
Binary files differ
diff --git a/src/Lecture3/live/beamer.tex b/src/Lecture3/live/beamer.tex
new file mode 100644
index 0000000..fd9ddcf
--- /dev/null
+++ b/src/Lecture3/live/beamer.tex
@@ -0,0 +1,84 @@
1\documentclass[11pt]{beamer}
2\usetheme{Madrid}
3\usepackage[utf8]{inputenc}
4\usepackage{amsmath}
5\usepackage{amsfonts}
6\usepackage{amssymb}
7
8\author[Tronto]{Sebastiano Tronto}
9\title[Example]{Example presentation}
10
11\newtheorem{prop}{Proposition}
12
13\setbeamercovered{transparent}
14\setbeamertemplate{navigation symbols}{}
15\logo{\includegraphics[scale=0.05]{unilu.jpg}}
16
17%\date{}
18
19
20\begin{document}
21
22\begin{frame}
23\titlepage
24\end{frame}
25
26%\begin{frame}
27%\tableofcontents
28%\end{frame}
29
30\section[this]{This is the first section}
31
32\begin{frame}{Frame number one}
33\uncover<2->{
34\begin{align*}
35 \sum_{i=1}^n\frac{i}{2}
36\end{align*}
37}
38
39\begin{itemize}[<+->]
40\item One item
41\item another random things
42\item third line
43\item fourth element
44\end{itemize}
45\end{frame}
46
47\begin{frame}{A second frame}
48\begin{theorem}
49A theorem
50\end{theorem}
51
52{
53
54\setbeamercolor{block body}{fg=red,bg=gray}
55\begin{prop}
56My proposition
57\end{prop}
58}
59
60\begin{block}{Title of the block}
61this is my custom block
62\end{block}
63
64\end{frame}
65
66\begin{frame}{Columns}
67\begin{columns}
68 \column{0.5\textwidth}
69 \begin{itemize}[<+->]
70 \item One item
71 \item another random things
72 \item third line
73 \item fourth element
74 \end{itemize}
75
76 \column{0.2\textwidth}
77 hello
78
79 \column{0.3\textwidth}
80 \includegraphics[scale=0.1]{unilu.jpg}
81\end{columns}
82\end{frame}
83
84\end{document} \ No newline at end of file
diff --git a/src/Lecture3/live/beamer.toc b/src/Lecture3/live/beamer.toc
new file mode 100644
index 0000000..f8fa149
--- /dev/null
+++ b/src/Lecture3/live/beamer.toc
@@ -0,0 +1 @@
\beamer@sectionintoc {1}{This is the first section}{2}{0}{1}
diff --git a/src/Lecture3/live/tikz.aux b/src/Lecture3/live/tikz.aux
new file mode 100644
index 0000000..4089a83
--- /dev/null
+++ b/src/Lecture3/live/tikz.aux
@@ -0,0 +1,2 @@
1\relax
2\gdef \@abspage@last{4}
diff --git a/src/Lecture3/live/tikz.bbl b/src/Lecture3/live/tikz.bbl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture3/live/tikz.bbl
diff --git a/src/Lecture3/live/tikz.blg b/src/Lecture3/live/tikz.blg
new file mode 100644
index 0000000..d5ba374
--- /dev/null
+++ b/src/Lecture3/live/tikz.blg
@@ -0,0 +1,48 @@
1This is BibTeX, Version 0.99d (TeX Live 2020/VoidLinux)
2Capacity: max_strings=200000, hash_size=200000, hash_prime=170003
3The top-level auxiliary file: tikz.aux
4I found no \citation commands---while reading file tikz.aux
5I found no \bibdata command---while reading file tikz.aux
6I found no \bibstyle command---while reading file tikz.aux
7You've used 0 entries,
8 0 wiz_defined-function locations,
9 83 strings with 482 characters,
10and the built_in function-call counts, 0 in all, are:
11= -- 0
12> -- 0
13< -- 0
14+ -- 0
15- -- 0
16* -- 0
17:= -- 0
18add.period$ -- 0
19call.type$ -- 0
20change.case$ -- 0
21chr.to.int$ -- 0
22cite$ -- 0
23duplicate$ -- 0
24empty$ -- 0
25format.name$ -- 0
26if$ -- 0
27int.to.chr$ -- 0
28int.to.str$ -- 0
29missing$ -- 0
30newline$ -- 0
31num.names$ -- 0
32pop$ -- 0
33preamble$ -- 0
34purify$ -- 0
35quote$ -- 0
36skip$ -- 0
37stack$ -- 0
38substring$ -- 0
39swap$ -- 0
40text.length$ -- 0
41text.prefix$ -- 0
42top$ -- 0
43type$ -- 0
44warning$ -- 0
45while$ -- 0
46width$ -- 0
47write$ -- 0
48(There were 3 error messages)
diff --git a/src/Lecture3/live/tikz.log b/src/Lecture3/live/tikz.log
new file mode 100644
index 0000000..570c323
--- /dev/null
+++ b/src/Lecture3/live/tikz.log
@@ -0,0 +1,544 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.2.3) 26 MAR 2021 17:10
2entering extended mode
3 restricted \write18 enabled.
4 %&-line parsing enabled.
5**tikz.tex
6(./tikz.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size10.clo
12File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/base/inputenc.sty
27Package: inputenc 2020/08/01 v1.3d Input encoding file
28\inpenc@prehook=\toks15
29\inpenc@posthook=\toks16
30)
31(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
32Package: amsmath 2020/09/23 v2.17i AMS math features
33\@mathmargin=\skip49
34
35For additional information on amsmath, use the `?' option.
36(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
37Package: amstext 2000/06/29 v2.01 AMS text
38
39(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
40File: amsgen.sty 1999/11/30 v2.0 generic functions
41\@emptytoks=\toks17
42\ex@=\dimen139
43))
44(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
45Package: amsbsy 1999/11/29 v1.2d Bold Symbols
46\pmbraise@=\dimen140
47)
48(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
49Package: amsopn 2016/03/08 v2.02 operator names
50)
51\inf@bad=\count185
52LaTeX Info: Redefining \frac on input line 234.
53\uproot@=\count186
54\leftroot@=\count187
55LaTeX Info: Redefining \overline on input line 399.
56\classnum@=\count188
57\DOTSCASE@=\count189
58LaTeX Info: Redefining \ldots on input line 496.
59LaTeX Info: Redefining \dots on input line 499.
60LaTeX Info: Redefining \cdots on input line 620.
61\Mathstrutbox@=\box47
62\strutbox@=\box48
63\big@size=\dimen141
64LaTeX Font Info: Redeclaring font encoding OML on input line 743.
65LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
66\macc@depth=\count190
67\c@MaxMatrixCols=\count191
68\dotsspace@=\muskip16
69\c@parentequation=\count192
70\dspbrk@lvl=\count193
71\tag@help=\toks18
72\row@=\count194
73\column@=\count195
74\maxfields@=\count196
75\andhelp@=\toks19
76\eqnshift@=\dimen142
77\alignsep@=\dimen143
78\tagshift@=\dimen144
79\tagwidth@=\dimen145
80\totwidth@=\dimen146
81\lineht@=\dimen147
82\@envbody=\toks20
83\multlinegap=\skip50
84\multlinetaggap=\skip51
85\mathdisplay@stack=\toks21
86LaTeX Info: Redefining \[ on input line 2923.
87LaTeX Info: Redefining \] on input line 2924.
88)
89(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
90Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
91\symAMSa=\mathgroup4
92\symAMSb=\mathgroup5
93LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
94LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
95(Font) U/euf/m/n --> U/euf/b/n on input line 106.
96)
97(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
98Package: amssymb 2013/01/14 v3.01 AMS font symbols
99)
100(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
101Package: geometry 2020/01/02 v5.9 Page Geometry
102
103(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
104Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
105\KV@toks@=\toks22
106)
107(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
108Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
109
110(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
111Package: iftex 2020/03/06 v1.0d TeX engine tests
112))
113\Gm@cnth=\count197
114\Gm@cntv=\count198
115\c@Gm@tempcnt=\count199
116\Gm@bindingoffset=\dimen148
117\Gm@wd@mp=\dimen149
118\Gm@odd@mp=\dimen150
119\Gm@even@mp=\dimen151
120\Gm@layoutwidth=\dimen152
121\Gm@layoutheight=\dimen153
122\Gm@layouthoffset=\dimen154
123\Gm@layoutvoffset=\dimen155
124\Gm@dimlist=\toks23
125)
126(/usr/share/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
127(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
128(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
129(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
130\pgfutil@everybye=\toks24
131\pgfutil@tempdima=\dimen156
132\pgfutil@tempdimb=\dimen157
133
134(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
135(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
136\pgfutil@abb=\box49
137)
138(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
139(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
140Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
141))
142Package: pgf 2020/12/01 v3.1.7a (3.1.7a)
143
144(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
145(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
146Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
147
148(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
149Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
150
151(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
152Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
153)
154(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
155File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
156)
157Package graphics Info: Driver file: pdftex.def on input line 105.
158
159(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
160File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
161))
162\Gin@req@height=\dimen158
163\Gin@req@width=\dimen159
164)
165(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
166(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
167Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
168
169(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
170\pgfkeys@pathtoks=\toks25
171\pgfkeys@temptoks=\toks26
172
173(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
174\pgfkeys@tmptoks=\toks27
175))
176\pgf@x=\dimen160
177\pgf@y=\dimen161
178\pgf@xa=\dimen162
179\pgf@ya=\dimen163
180\pgf@xb=\dimen164
181\pgf@yb=\dimen165
182\pgf@xc=\dimen166
183\pgf@yc=\dimen167
184\pgf@xd=\dimen168
185\pgf@yd=\dimen169
186\w@pgf@writea=\write3
187\r@pgf@reada=\read2
188\c@pgf@counta=\count266
189\c@pgf@countb=\count267
190\c@pgf@countc=\count268
191\c@pgf@countd=\count269
192\t@pgf@toka=\toks28
193\t@pgf@tokb=\toks29
194\t@pgf@tokc=\toks30
195\pgf@sys@id@count=\count270
196
197(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
198File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
199)
200Driver file for pgf: pgfsys-pdftex.def
201
202(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
203File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
204
205(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
206File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
207)))
208(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
209File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
210\pgfsyssoftpath@smallbuffer@items=\count271
211\pgfsyssoftpath@bigbuffer@items=\count272
212)
213(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
214File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
215))
216(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
217Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
218
219(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
220File: color.cfg 2016/01/02 v1.6 sample color configuration
221)
222Package xcolor Info: Driver file: pdftex.def on input line 225.
223Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
224Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
225Package xcolor Info: Model `RGB' extended on input line 1364.
226Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
227Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
228Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
229Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
230Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
231Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
232)
233(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
234Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
235
236(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
237(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
238(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
239(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
240\pgfmath@dimen=\dimen170
241\pgfmath@count=\count273
242\pgfmath@box=\box50
243\pgfmath@toks=\toks31
244\pgfmath@stack@operand=\toks32
245\pgfmath@stack@operation=\toks33
246)
247(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
248(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
249(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
250.tex)
251(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
252(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
253x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
254(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
255(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
256(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
257.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
258\c@pgfmathroundto@lastzeros=\count274
259)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
260(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
261File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
262\pgf@picminx=\dimen171
263\pgf@picmaxx=\dimen172
264\pgf@picminy=\dimen173
265\pgf@picmaxy=\dimen174
266\pgf@pathminx=\dimen175
267\pgf@pathmaxx=\dimen176
268\pgf@pathminy=\dimen177
269\pgf@pathmaxy=\dimen178
270\pgf@xx=\dimen179
271\pgf@xy=\dimen180
272\pgf@yx=\dimen181
273\pgf@yy=\dimen182
274\pgf@zx=\dimen183
275\pgf@zy=\dimen184
276)
277(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
278File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
279\pgf@path@lastx=\dimen185
280\pgf@path@lasty=\dimen186
281) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
282File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
283\pgf@shorten@end@additional=\dimen187
284\pgf@shorten@start@additional=\dimen188
285)
286(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
287File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
288\pgfpic=\box51
289\pgf@hbox=\box52
290\pgf@layerbox@main=\box53
291\pgf@picture@serial@count=\count275
292)
293(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
294File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
295\pgflinewidth=\dimen189
296)
297(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
298ex
299File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
300\pgf@pt@x=\dimen190
301\pgf@pt@y=\dimen191
302\pgf@pt@temp=\dimen192
303) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
304File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
305)
306(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
307File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
308)
309(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
310x
311File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
312) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
313File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
314\pgfarrowsep=\dimen193
315)
316(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
317File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
318\pgf@max=\dimen194
319\pgf@sys@shading@range@num=\count276
320\pgf@shadingcount=\count277
321)
322(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
323File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
324
325(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
326File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
327\pgfexternal@startupbox=\box54
328))
329(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
330File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
331)
332(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
333File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
334) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
335File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
336)
337(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
338File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
339)))
340(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
341File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
342\pgfnodeparttextbox=\box55
343)
344(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
345File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a)
346)
347(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
348Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a)
349\pgf@nodesepstart=\dimen195
350\pgf@nodesepend=\dimen196
351)
352(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
353Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a)
354))
355(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
356(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
357(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex))
358(/usr/share/texmf-dist/tex/latex/pgf/math/pgfmath.sty
359(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
360(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
361Package: pgffor 2020/12/01 v3.1.7a (3.1.7a)
362
363(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
364\pgffor@iter=\dimen197
365\pgffor@skip=\dimen198
366\pgffor@stack=\toks34
367\pgffor@toks=\toks35
368))
369(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
370Package: tikz 2020/12/01 v3.1.7a (3.1.7a)
371
372(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.te
373x
374File: pgflibraryplothandlers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
375\pgf@plot@mark@count=\count278
376\pgfplotmarksize=\dimen199
377)
378\tikz@lastx=\dimen256
379\tikz@lasty=\dimen257
380\tikz@lastxsaved=\dimen258
381\tikz@lastysaved=\dimen259
382\tikz@lastmovetox=\dimen260
383\tikz@lastmovetoy=\dimen261
384\tikzleveldistance=\dimen262
385\tikzsiblingdistance=\dimen263
386\tikz@figbox=\box56
387\tikz@figbox@bg=\box57
388\tikz@tempbox=\box58
389\tikz@tempbox@bg=\box59
390\tikztreelevel=\count279
391\tikznumberofchildren=\count280
392\tikznumberofcurrentchild=\count281
393\tikz@fig@count=\count282
394 (/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
395File: pgfmodulematrix.code.tex 2020/12/01 v3.1.7a (3.1.7a)
396\pgfmatrixcurrentrow=\count283
397\pgfmatrixcurrentcolumn=\count284
398\pgf@matrix@numberofcolumns=\count285
399)
400\tikz@expandcount=\count286
401
402(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary
403topaths.code.tex
404File: tikzlibrarytopaths.code.tex 2020/12/01 v3.1.7a (3.1.7a)
405))) (/usr/share/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty
406Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ
407
408(/usr/share/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex
409(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary
410matrix.code.tex
411File: tikzlibrarymatrix.code.tex 2020/12/01 v3.1.7a (3.1.7a)
412)
413(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary
414quotes.code.tex
415File: tikzlibraryquotes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
416)
417(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex
418File: pgflibraryarrows.meta.code.tex 2020/12/01 v3.1.7a (3.1.7a)
419\pgfarrowinset=\dimen264
420\pgfarrowlength=\dimen265
421\pgfarrowwidth=\dimen266
422\pgfarrowlinewidth=\dimen267
423))) (/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
424File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
425\l__kernel_color_stack_int=\count287
426\l__pdf_internal_box=\box60
427)
428(./tikz.aux)
429\openout1 = `tikz.aux'.
430
431LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 11.
432LaTeX Font Info: ... okay on input line 11.
433LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 11.
434LaTeX Font Info: ... okay on input line 11.
435LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 11.
436LaTeX Font Info: ... okay on input line 11.
437LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 11.
438LaTeX Font Info: ... okay on input line 11.
439LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 11.
440LaTeX Font Info: ... okay on input line 11.
441LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 11.
442LaTeX Font Info: ... okay on input line 11.
443LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 11.
444LaTeX Font Info: ... okay on input line 11.
445
446*geometry* driver: auto-detecting
447*geometry* detected driver: pdftex
448*geometry* verbose mode - [ preamble ] result:
449* driver: pdftex
450* paper: a4paper
451* layout: <same size as paper>
452* layoutoffset:(h,v)=(0.0pt,0.0pt)
453* modes:
454* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt)
455* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt)
456* \paperwidth=597.50787pt
457* \paperheight=845.04684pt
458* \textwidth=483.69687pt
459* \textheight=731.23584pt
460* \oddsidemargin=-15.36449pt
461* \evensidemargin=-15.36449pt
462* \topmargin=-52.36449pt
463* \headheight=12.0pt
464* \headsep=25.0pt
465* \topskip=10.0pt
466* \footskip=30.0pt
467* \marginparwidth=57.0pt
468* \marginparsep=11.0pt
469* \columnsep=10.0pt
470* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
471* \hoffset=0.0pt
472* \voffset=0.0pt
473* \mag=1000
474* \@twocolumnfalse
475* \@twosidefalse
476* \@mparswitchfalse
477* \@reversemarginfalse
478* (1in=72.27pt=25.4mm, 1cm=28.453pt)
479
480(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
481[Loading MPS to PDF converter (version 2006.09.02).]
482\scratchcounter=\count288
483\scratchdimen=\dimen268
484\scratchbox=\box61
485\nofMPsegments=\count289
486\nofMParguments=\count290
487\everyMPshowfont=\toks36
488\MPscratchCnt=\count291
489\MPscratchDim=\dimen269
490\MPnumerator=\count292
491\makeMPintoPDFobject=\count293
492\everyMPtoPDFconversion=\toks37
493) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
494Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
495Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
49685.
497
498(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
499File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
500e
501))
502LaTeX Font Info: Trying to load font information for U+msa on input line 14.
503
504
505(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
506File: umsa.fd 2013/01/14 v3.01 AMS symbols A
507)
508LaTeX Font Info: Trying to load font information for U+msb on input line 14.
509
510
511(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
512File: umsb.fd 2013/01/14 v3.01 AMS symbols B
513) [1
514
515{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
516Missing character: There is no ; in font nullfont!
517Missing character: There is no ; in font nullfont!
518Missing character: There is no ; in font nullfont!
519Missing character: There is no ; in font nullfont!
520Missing character: There is no ; in font nullfont!
521Missing character: There is no ; in font nullfont!
522Missing character: There is no ; in font nullfont!
523 [2] [3] [4] (./tikz.aux) )
524Here is how much of TeX's memory you used:
525 14361 strings out of 479383
526 293642 string characters out of 5875799
527 548100 words of memory out of 5000000
528 31241 multiletter control sequences out of 15000+600000
529 405129 words of font info for 35 fonts, out of 8000000 for 9000
530 1141 hyphenation exceptions out of 8191
531 108i,14n,111p,405b,942s stack positions out of 5000i,500n,10000p,200000b,80000s
532</usr/share/texmf-dist/fonts/type1/public/amsfonts/c
533m/cmmi10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></
534usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf
535-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb></usr/share/texmf-dist/fonts/type
5361/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfo
537nts/cm/cmsy7.pfb>
538Output written on tikz.pdf (4 pages, 55498 bytes).
539PDF statistics:
540 44 PDF objects out of 1000 (max. 8388607)
541 31 compressed objects within 1 object stream
542 0 named destinations out of 1000 (max. 500000)
543 13 words of extra memory for PDF output out of 10000 (max. 10000000)
544
diff --git a/src/Lecture3/live/tikz.pdf b/src/Lecture3/live/tikz.pdf
new file mode 100644
index 0000000..d2482bf
--- /dev/null
+++ b/src/Lecture3/live/tikz.pdf
Binary files differ
diff --git a/src/Lecture3/live/tikz.synctex.gz b/src/Lecture3/live/tikz.synctex.gz
new file mode 100644
index 0000000..3c9707e
--- /dev/null
+++ b/src/Lecture3/live/tikz.synctex.gz
Binary files differ
diff --git a/src/Lecture3/live/tikz.tex b/src/Lecture3/live/tikz.tex
new file mode 100644
index 0000000..65dbd5d
--- /dev/null
+++ b/src/Lecture3/live/tikz.tex
@@ -0,0 +1,84 @@
1\documentclass[10pt,a4paper]{article}
2\usepackage[utf8]{inputenc}
3\usepackage{amsmath}
4\usepackage{amsfonts}
5\usepackage{amssymb}
6\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
7
8\usepackage{tikz}
9\usepackage{tikz-cd}
10
11\begin{document}
12
13\begin{tikzcd}
14T \arrow[dr,dotted,"{(x,y)}" description]
15 \arrow[drr,"x",out=60, in=120]
16 \arrow[ddr,"y"',bend right]\\
17& X\times_Z Y \arrow[r,"p"]\arrow[d,"q"'] & X \arrow[d,"f"]\\
18& Y \arrow[r,"g"',hook,two heads] & Z
19\end{tikzcd}
20
21
22\newpage
23
24
25\begin{tikzpicture}[scale=2]
26
27 \foreach \x in {0,1,...,5} {
28 \foreach \y in {0,...,3} {
29 \filldraw[fill=blue] (\x,\y) circle[radius=0.4];
30 };
31 };
32\end{tikzpicture}
33
34\begin{tikzpicture}[scale=3]
35 \draw[very thick] (0,0) \foreach \i in {0.3,0.6,...,1.5}
36 {-- (\i,\i^2) };
37\end{tikzpicture}
38
39
40\newpage
41
42\begin{tikzpicture}
43
44 \pgfmathsetmacro{\angle}{120}
45
46 \colorlet{coscolor}{blue!60}
47 \colorlet{sincolor}{red!60}
48 \tikzset{structureline/.style={black,thin}}
49
50 \draw[lightgray] (-5,-5) grid (5,5);
51
52
53 \filldraw[thick,fill=green!20,draw=green]
54(0,0) -- (1/3*4,0) arc[radius=1/3*4, start angle=0, end angle=\angle] node[below=0.5cm] {\(\angle^\circ\)} -- cycle;
55
56 \draw[->,structureline] (0,-5) -- (0,5);
57 \draw[->,structureline] (-5,0) -- (5,0);
58 \draw[structureline] (0,0) circle[radius=4];
59
60 \draw[structureline] (0,0) -- (\angle:4);
61 \draw[coscolor] (0,0) -- node[below] {\(\cos(\angle^\circ)\)} (4*cos{\angle},0);
62 \draw[thick,sincolor] (4*cos{\angle},0) -- node[right] {\(\sin(\angle^\circ)\)} (\angle:4);
63
64\end{tikzpicture}
65
66\newpage
67\begin{tikzpicture}[scale=3]
68 \coordinate (A) at (1,1);
69 \coordinate (B) at (3,1.5);
70
71 \draw[blue!20!red,line width=4pt] (0,0) -- (A) -- (2,0) -- cycle;
72
73
74 \draw[very thick,green!60,dotted] (B) circle[x radius = 0.7cm, y radius = 1.2cm];
75
76 \filldraw[fill=purple,draw=blue,line width=2pt] (B) arc[radius = 1cm, start angle=0, end angle=90] -- (A) --cycle;
77
78 \filldraw[fill=pink, line width=3pt] (0,0) rectangle (2,-1);
79
80 \draw[line width=2pt,>->] (1,0.5) -- (3,0);
81
82\end{tikzpicture}
83
84\end{document} \ No newline at end of file
diff --git a/src/Lecture3/live/unilu.jpg b/src/Lecture3/live/unilu.jpg
new file mode 100644
index 0000000..5265563
--- /dev/null
+++ b/src/Lecture3/live/unilu.jpg
Binary files differ
diff --git a/src/Lecture3/slides/4-TikZ.aux b/src/Lecture3/slides/4-TikZ.aux
new file mode 100644
index 0000000..6a882fb
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.aux
@@ -0,0 +1,65 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
20\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
21\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}}
22\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}}
23\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}}
24\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}}
25\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}}
26\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}}
27\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}}
28\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}}
29\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}}
30\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}}
31\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}}
32\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}}
33\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}}
34\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}}
35\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}}
36\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}}
37\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}}
38\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}}
39\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}}
40\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}}
41\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}}
42\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}}
43\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}}
44\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}}
45\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}}
46\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}}
47\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}}
48\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}}
49\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}}
50\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}}
51\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}}
52\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}}
53\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}}
54\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}}
55\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}}
56\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}}
57\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}}
58\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}}
59\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}}
60\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}}
61\@writefile{nav}{\headcommand {\beamer@partpages {1}{21}}}
62\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{21}}}
63\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{21}}}
64\@writefile{nav}{\headcommand {\beamer@documentpages {21}}}
65\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {21}}}
diff --git a/src/Lecture3/slides/4-TikZ.bbl b/src/Lecture3/slides/4-TikZ.bbl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.bbl
diff --git a/src/Lecture3/slides/4-TikZ.blg b/src/Lecture3/slides/4-TikZ.blg
new file mode 100644
index 0000000..5802708
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.blg
@@ -0,0 +1,48 @@
1This is BibTeX, Version 0.99d (TeX Live 2020/VoidLinux)
2Capacity: max_strings=200000, hash_size=200000, hash_prime=170003
3The top-level auxiliary file: 3-MoreLatex.aux
4I found no \citation commands---while reading file 3-MoreLatex.aux
5I found no \bibdata command---while reading file 3-MoreLatex.aux
6I found no \bibstyle command---while reading file 3-MoreLatex.aux
7You've used 0 entries,
8 0 wiz_defined-function locations,
9 83 strings with 496 characters,
10and the built_in function-call counts, 0 in all, are:
11= -- 0
12> -- 0
13< -- 0
14+ -- 0
15- -- 0
16* -- 0
17:= -- 0
18add.period$ -- 0
19call.type$ -- 0
20change.case$ -- 0
21chr.to.int$ -- 0
22cite$ -- 0
23duplicate$ -- 0
24empty$ -- 0
25format.name$ -- 0
26if$ -- 0
27int.to.chr$ -- 0
28int.to.str$ -- 0
29missing$ -- 0
30newline$ -- 0
31num.names$ -- 0
32pop$ -- 0
33preamble$ -- 0
34purify$ -- 0
35quote$ -- 0
36skip$ -- 0
37stack$ -- 0
38substring$ -- 0
39swap$ -- 0
40text.length$ -- 0
41text.prefix$ -- 0
42top$ -- 0
43type$ -- 0
44warning$ -- 0
45while$ -- 0
46width$ -- 0
47write$ -- 0
48(There were 3 error messages)
diff --git a/src/Lecture3/slides/4-TikZ.log b/src/Lecture3/slides/4-TikZ.log
new file mode 100644
index 0000000..d2850a1
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.log
@@ -0,0 +1,1201 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2021.5.20) 25 MAY 2021 16:15
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**4-TikZ.tex
6(./4-TikZ.tex
7LaTeX2e <2020-02-02> patch level 2
8L3 programming layer <2020-02-14>
9(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
10Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations
11(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
12(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
13Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW)
14\etb@tempcnta=\count167
15)
16\beamer@tempbox=\box45
17\beamer@tempcount=\count168
18\c@beamerpauses=\count169
19
20(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
21\beamer@slideinframe=\count170
22\beamer@minimum=\count171
23\beamer@decode@box=\box46
24)
25\beamer@commentbox=\box47
26\beamer@modecount=\count172
27)
28(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
29Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead.
30
31(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
32Package: iftex 2019/11/07 v1.0c TeX engine tests
33))
34\headdp=\dimen134
35\footheight=\dimen135
36\sidebarheight=\dimen136
37\beamer@tempdim=\dimen137
38\beamer@finalheight=\dimen138
39\beamer@animht=\dimen139
40\beamer@animdp=\dimen140
41\beamer@animwd=\dimen141
42\beamer@leftmargin=\dimen142
43\beamer@rightmargin=\dimen143
44\beamer@leftsidebar=\dimen144
45\beamer@rightsidebar=\dimen145
46\beamer@boxsize=\dimen146
47\beamer@vboxoffset=\dimen147
48\beamer@descdefault=\dimen148
49\beamer@descriptionwidth=\dimen149
50\beamer@lastskip=\skip47
51\beamer@areabox=\box48
52\beamer@animcurrent=\box49
53\beamer@animshowbox=\box50
54\beamer@sectionbox=\box51
55\beamer@logobox=\box52
56\beamer@linebox=\box53
57\beamer@sectioncount=\count173
58\beamer@subsubsectionmax=\count174
59\beamer@subsectionmax=\count175
60\beamer@sectionmax=\count176
61\beamer@totalheads=\count177
62\beamer@headcounter=\count178
63\beamer@partstartpage=\count179
64\beamer@sectionstartpage=\count180
65\beamer@subsectionstartpage=\count181
66\beamer@animationtempa=\count182
67\beamer@animationtempb=\count183
68\beamer@xpos=\count184
69\beamer@ypos=\count185
70\beamer@ypos@offset=\count186
71\beamer@showpartnumber=\count187
72\beamer@currentsubsection=\count188
73\beamer@coveringdepth=\count189
74\beamer@sectionadjust=\count190
75\beamer@tocsectionnumber=\count191
76
77(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
78(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
79Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
80\KV@toks@=\toks14
81))
82\beamer@paperwidth=\skip48
83\beamer@paperheight=\skip49
84
85(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
86Package: geometry 2020/01/02 v5.9 Page Geometry
87
88(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
89Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
90)
91\Gm@cnth=\count192
92\Gm@cntv=\count193
93\c@Gm@tempcnt=\count194
94\Gm@bindingoffset=\dimen150
95\Gm@wd@mp=\dimen151
96\Gm@odd@mp=\dimen152
97\Gm@even@mp=\dimen153
98\Gm@layoutwidth=\dimen154
99\Gm@layoutheight=\dimen155
100\Gm@layouthoffset=\dimen156
101\Gm@layoutvoffset=\dimen157
102\Gm@dimlist=\toks15
103)
104(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
105File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option)
106)
107(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
108(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
109Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR)
110
111(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
112Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR)
113
114(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
115Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
116)
117(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
118File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
119)
120Package graphics Info: Driver file: pdftex.def on input line 105.
121
122(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
123File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
124))
125\Gin@req@height=\dimen158
126\Gin@req@width=\dimen159
127)
128(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
129(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
130(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
131\pgfutil@everybye=\toks16
132\pgfutil@tempdima=\dimen160
133\pgfutil@tempdimb=\dimen161
134
135(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t
136ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
137\pgfutil@abb=\box54
138(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty
139Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS)
140))
141(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
142(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex)
143Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b)
144))
145(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
146Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b)
147
148(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
149\pgfkeys@pathtoks=\toks17
150\pgfkeys@temptoks=\toks18
151
152(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t
153ex
154\pgfkeys@tmptoks=\toks19
155))
156\pgf@x=\dimen162
157\pgf@y=\dimen163
158\pgf@xa=\dimen164
159\pgf@ya=\dimen165
160\pgf@xb=\dimen166
161\pgf@yb=\dimen167
162\pgf@xc=\dimen168
163\pgf@yc=\dimen169
164\pgf@xd=\dimen170
165\pgf@yd=\dimen171
166\w@pgf@writea=\write3
167\r@pgf@reada=\read2
168\c@pgf@counta=\count195
169\c@pgf@countb=\count196
170\c@pgf@countc=\count197
171\c@pgf@countd=\count198
172\t@pgf@toka=\toks20
173\t@pgf@tokb=\toks21
174\t@pgf@tokc=\toks22
175\pgf@sys@id@count=\count199
176 (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
177File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b)
178)
179Driver file for pgf: pgfsys-pdftex.def
180
181(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
182File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b)
183
184(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de
185f
186File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b)
187)))
188(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.
189tex
190File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b)
191\pgfsyssoftpath@smallbuffer@items=\count266
192\pgfsyssoftpath@bigbuffer@items=\count267
193)
194(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.
195tex
196File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b)
197)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
198Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
199
200(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
201File: color.cfg 2016/01/02 v1.6 sample color configuration
202)
203Package xcolor Info: Driver file: pdftex.def on input line 225.
204Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
205Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
206Package xcolor Info: Model `RGB' extended on input line 1364.
207Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
208Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
209Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
210Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
211Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
212Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
213)
214(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
215Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b)
216
217(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
218(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
219(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
220(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
221\pgfmath@dimen=\dimen172
222\pgfmath@count=\count268
223\pgfmath@box=\box55
224\pgfmath@toks=\toks23
225\pgfmath@stack@operand=\toks24
226\pgfmath@stack@operation=\toks25
227)
228(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
229(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code
230.tex)
231(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet
232ric.code.tex)
233(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod
234e.tex)
235(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison
236.code.tex)
237(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.
238tex)
239(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code
240.tex)
241(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.
242tex)
243(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari
244thmetics.code.tex)))
245(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
246\c@pgfmathroundto@lastzeros=\count269
247))
248(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
249(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te
250x
251File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b)
252\pgf@picminx=\dimen173
253\pgf@picmaxx=\dimen174
254\pgf@picminy=\dimen175
255\pgf@picmaxy=\dimen176
256\pgf@pathminx=\dimen177
257\pgf@pathmaxx=\dimen178
258\pgf@pathminy=\dimen179
259\pgf@pathmaxy=\dimen180
260\pgf@xx=\dimen181
261\pgf@xy=\dimen182
262\pgf@yx=\dimen183
263\pgf@yy=\dimen184
264\pgf@zx=\dimen185
265\pgf@zy=\dimen186
266)
267(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.
268code.tex
269File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b)
270\pgf@path@lastx=\dimen187
271\pgf@path@lasty=\dimen188
272)
273(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code
274.tex
275File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
276\pgf@shorten@end@additional=\dimen189
277\pgf@shorten@start@additional=\dimen190
278)
279(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te
280x
281File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
282\pgfpic=\box56
283\pgf@hbox=\box57
284\pgf@layerbox@main=\box58
285\pgf@picture@serial@count=\count270
286)
287(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c
288ode.tex
289File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b)
290\pgflinewidth=\dimen191
291)
292(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation
293s.code.tex
294File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b)
295\pgf@pt@x=\dimen192
296\pgf@pt@y=\dimen193
297\pgf@pt@temp=\dimen194
298)
299(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
300File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b)
301)
302(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t
303ex
304File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b)
305)
306(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing
307.code.tex
308File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b)
309)
310(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te
311x
312File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b)
313\pgfarrowsep=\dimen195
314)
315(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
316File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b)
317\pgf@max=\dimen196
318\pgf@sys@shading@range@num=\count271
319\pgf@shadingcount=\count272
320)
321(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
322File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
323
324(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.
325tex
326File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b)
327\pgfexternal@startupbox=\box59
328))
329(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te
330x
331File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
332)
333(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c
334ode.tex
335File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b)
336)
337(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.
338tex
339File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b)
340)
341(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
342File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b)
343))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
344Package: xxcolor 2003/10/24 ver 0.1
345\XC@nummixins=\count273
346\XC@countmixins=\count274
347)
348(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
349Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO)
350
351(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
352Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
353)
354(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
355Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO)
356))
357(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
358Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX
359
360(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty
361Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO
362)
363Package pdftexcmds Info: \pdf@primitive is available.
364Package pdftexcmds Info: \pdf@ifprimitive is available.
365Package pdftexcmds Info: \pdfdraftmode found.
366)
367(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
368Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
369)
370(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
371Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
372)
373(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
374Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
375)
376(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
377Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
378)
379(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
380Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
381)
382(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
383Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
384)
385(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
386Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO)
387)
388\@linkdim=\dimen197
389\Hy@linkcounter=\count275
390\Hy@pagecounter=\count276
391
392(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
393File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO)
394Now handling font encoding PD1 ...
395... no UTF-8 mapping file for font encoding PD1
396)
397(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
398Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
399)
400(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
401Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
402)
403\Hy@SavedSpaceFactor=\count277
404\pdfmajorversion=\count278
405Package hyperref Info: Option `bookmarks' set `true' on input line 4421.
406Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421.
407Package hyperref Info: Option `implicit' set `false' on input line 4421.
408Package hyperref Info: Hyper figures OFF on input line 4547.
409Package hyperref Info: Link nesting OFF on input line 4552.
410Package hyperref Info: Hyper index ON on input line 4555.
411Package hyperref Info: Plain pages OFF on input line 4562.
412Package hyperref Info: Backreferencing OFF on input line 4567.
413Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals.
414Package hyperref Info: Bookmarks ON on input line 4800.
415\c@Hy@tempcnt=\count279
416
417(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty
418\Urlmuskip=\muskip16
419Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
420)
421LaTeX Info: Redefining \url on input line 5159.
422\XeTeXLinkMargin=\dimen198
423
424(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
425Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
426
427(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
428Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
429)
430))
431\Fld@menulength=\count280
432\Field@Width=\dimen199
433\Fld@charsize=\dimen256
434Package hyperref Info: Hyper figures OFF on input line 6430.
435Package hyperref Info: Link nesting OFF on input line 6435.
436Package hyperref Info: Hyper index ON on input line 6438.
437Package hyperref Info: backreferencing OFF on input line 6445.
438Package hyperref Info: Link coloring OFF on input line 6450.
439Package hyperref Info: Link coloring with OCG OFF on input line 6455.
440Package hyperref Info: PDF/A mode OFF on input line 6460.
441LaTeX Info: Redefining \ref on input line 6500.
442LaTeX Info: Redefining \pageref on input line 6504.
443\Hy@abspage=\count281
444
445
446Package hyperref Message: Stopped early.
447
448)
449Package hyperref Info: Driver (autodetected): hpdftex.
450 (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
451File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX
452
453(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
454Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO)
455)
456\Fld@listcount=\count282
457\c@bookmark@seq@number=\count283
458
459(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
460Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
461
462(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
463Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
464)
465Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
46686.
467))
468(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
469(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty)
470(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
471(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
472Package: amssymb 2013/01/14 v3.01 AMS font symbols
473
474(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
475Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
476\@emptytoks=\toks26
477\symAMSa=\mathgroup4
478\symAMSb=\mathgroup5
479LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
480LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
481(Font) U/euf/m/n --> U/euf/b/n on input line 106.
482))
483(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
484Package: sansmathaccent 2020/01/31
485
486(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
487Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files)
488)))
489(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
490(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
491Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX
492))
493(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty)
494(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty)
495(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
496\beamer@argscount=\count284
497\beamer@lastskipcover=\skip50
498\beamer@trivlistdepth=\count285
499)
500(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty)
501(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
502\c@lecture=\count286
503\c@part=\count287
504\c@section=\count288
505\c@subsection=\count289
506\c@subsubsection=\count290
507)
508(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
509\beamer@framebox=\box60
510\beamer@frametitlebox=\box61
511\beamer@zoombox=\box62
512\beamer@zoomcount=\count291
513\beamer@zoomframecount=\count292
514\beamer@frametextheight=\dimen257
515\c@subsectionslide=\count293
516\beamer@frametopskip=\skip51
517\beamer@framebottomskip=\skip52
518\beamer@frametopskipautobreak=\skip53
519\beamer@framebottomskipautobreak=\skip54
520\beamer@envbody=\toks27
521\framewidth=\dimen258
522\c@framenumber=\count294
523)
524(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
525\beamer@verbatimfileout=\write4
526)
527(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
528\beamer@splitbox=\box63
529\beamer@autobreakcount=\count295
530\beamer@autobreaklastheight=\dimen259
531\beamer@frametitletoks=\toks28
532\beamer@framesubtitletoks=\toks29
533)
534(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
535\beamer@footins=\box64
536)
537(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty)
538(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
539\beamer@frameboxcopy=\box65
540)
541(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty)
542(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
543\beamer@sbttoks=\toks30
544
545(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
546(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
547\bmb@box=\box66
548\bmb@colorbox=\box67
549\bmb@boxshadow=\box68
550\bmb@boxshadowball=\box69
551\bmb@boxshadowballlarge=\box70
552\bmb@temp=\dimen260
553\bmb@dima=\dimen261
554\bmb@dimb=\dimen262
555\bmb@prevheight=\dimen263
556)
557\beamer@blockheadheight=\dimen264
558))
559(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
560(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
561Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
562\@enLab=\toks31
563)
564\c@figure=\count296
565\c@table=\count297
566\abovecaptionskip=\skip55
567\belowcaptionskip=\skip56
568)
569(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
570\beamer@section@min@dim=\dimen265
571)
572(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
573(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
574Package: amsmath 2020/01/20 v2.17e AMS math features
575\@mathmargin=\skip57
576
577For additional information on amsmath, use the `?' option.
578(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
579Package: amstext 2000/06/29 v2.01 AMS text
580
581(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
582File: amsgen.sty 1999/11/30 v2.0 generic functions
583\@emptytoks=\toks32
584\ex@=\dimen266
585))
586(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
587Package: amsbsy 1999/11/29 v1.2d Bold Symbols
588\pmbraise@=\dimen267
589)
590(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
591Package: amsopn 2016/03/08 v2.02 operator names
592)
593\inf@bad=\count298
594LaTeX Info: Redefining \frac on input line 227.
595\uproot@=\count299
596\leftroot@=\count300
597LaTeX Info: Redefining \overline on input line 389.
598\classnum@=\count301
599\DOTSCASE@=\count302
600LaTeX Info: Redefining \ldots on input line 486.
601LaTeX Info: Redefining \dots on input line 489.
602LaTeX Info: Redefining \cdots on input line 610.
603\Mathstrutbox@=\box71
604\strutbox@=\box72
605\big@size=\dimen268
606LaTeX Font Info: Redeclaring font encoding OML on input line 733.
607LaTeX Font Info: Redeclaring font encoding OMS on input line 734.
608\macc@depth=\count303
609\c@MaxMatrixCols=\count304
610\dotsspace@=\muskip17
611\c@parentequation=\count305
612\dspbrk@lvl=\count306
613\tag@help=\toks33
614\row@=\count307
615\column@=\count308
616\maxfields@=\count309
617\andhelp@=\toks34
618\eqnshift@=\dimen269
619\alignsep@=\dimen270
620\tagshift@=\dimen271
621\tagwidth@=\dimen272
622\totwidth@=\dimen273
623\lineht@=\dimen274
624\@envbody=\toks35
625\multlinegap=\skip58
626\multlinetaggap=\skip59
627\mathdisplay@stack=\toks36
628LaTeX Info: Redefining \[ on input line 2859.
629LaTeX Info: Redefining \] on input line 2860.
630)
631(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
632Package: amsthm 2017/10/31 v2.20.4
633\thm@style=\toks37
634\thm@bodyfont=\toks38
635\thm@headfont=\toks39
636\thm@notefont=\toks40
637\thm@headpunct=\toks41
638\thm@preskip=\skip60
639\thm@postskip=\skip61
640\thm@headsep=\skip62
641\dth@everypar=\toks42
642)
643\c@theorem=\count310
644)
645(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty))
646(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
647(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty)
648(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty)
649(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
650\beamer@dima=\dimen275
651\beamer@dimb=\dimen276
652)
653(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty)))
654(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty
655(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty)
656(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty)
657(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty)
658(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty))
659(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
660Package: inputenc 2018/08/11 v1.3c Input encoding file
661\inpenc@prehook=\toks43
662\inpenc@posthook=\toks44
663)
664(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty
665Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ
666
667(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
668(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
669Package: pgf 2020/01/08 v3.1.5b (3.1.5b)
670
671(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
672File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
673\pgfnodeparttextbox=\box73
674) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
675File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b)
676)
677(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65
678.sty
679Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b)
680\pgf@nodesepstart=\dimen277
681\pgf@nodesepend=\dimen278
682)
683(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18
684.sty
685Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b)
686)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
687(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
688(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex))
689(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
690(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
691(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
692Package: pgffor 2020/01/08 v3.1.5b (3.1.5b)
693
694(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
695\pgffor@iter=\dimen279
696\pgffor@skip=\dimen280
697\pgffor@stack=\toks45
698\pgffor@toks=\toks46
699))
700(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
701Package: tikz 2020/01/08 v3.1.5b (3.1.5b)
702
703(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers
704.code.tex
705File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
706\pgf@plot@mark@count=\count311
707\pgfplotmarksize=\dimen281
708)
709\tikz@lastx=\dimen282
710\tikz@lasty=\dimen283
711\tikz@lastxsaved=\dimen284
712\tikz@lastysaved=\dimen285
713\tikz@lastmovetox=\dimen286
714\tikz@lastmovetoy=\dimen287
715\tikzleveldistance=\dimen288
716\tikzsiblingdistance=\dimen289
717\tikz@figbox=\box74
718\tikz@figbox@bg=\box75
719\tikz@tempbox=\box76
720\tikz@tempbox@bg=\box77
721\tikztreelevel=\count312
722\tikznumberofchildren=\count313
723\tikznumberofcurrentchild=\count314
724\tikz@fig@count=\count315
725
726(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
727File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
728\pgfmatrixcurrentrow=\count316
729\pgfmatrixcurrentcolumn=\count317
730\pgf@matrix@numberofcolumns=\count318
731)
732\tikz@expandcount=\count319
733
734(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
735zlibrarytopaths.code.tex
736File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b)
737)))
738(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex
739(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
740zlibrarymatrix.code.tex
741File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
742)
743(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
744zlibraryquotes.code.tex
745File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
746)
747(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.
748code.tex
749File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b)
750\pgfarrowinset=\dimen290
751\pgfarrowlength=\dimen291
752\pgfarrowwidth=\dimen292
753\pgfarrowlinewidth=\dimen293
754)))
755(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def
756File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode
757\l__kernel_color_stack_int=\count320
758\l__pdf_internal_box=\box78
759)
760(./4-TikZ.aux)
761\openout1 = `4-TikZ.aux'.
762
763LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 21.
764LaTeX Font Info: ... okay on input line 21.
765LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 21.
766LaTeX Font Info: ... okay on input line 21.
767LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 21.
768LaTeX Font Info: ... okay on input line 21.
769LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 21.
770LaTeX Font Info: ... okay on input line 21.
771LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 21.
772LaTeX Font Info: ... okay on input line 21.
773LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 21.
774LaTeX Font Info: ... okay on input line 21.
775LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 21.
776LaTeX Font Info: ... okay on input line 21.
777LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 21.
778LaTeX Font Info: ... okay on input line 21.
779
780*geometry* driver: auto-detecting
781*geometry* detected driver: pdftex
782*geometry* verbose mode - [ preamble ] result:
783* driver: pdftex
784* paper: custom
785* layout: <same size as paper>
786* layoutoffset:(h,v)=(0.0pt,0.0pt)
787* modes: includehead includefoot
788* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt)
789* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt)
790* \paperwidth=364.19536pt
791* \paperheight=273.14662pt
792* \textwidth=342.2953pt
793* \textheight=244.6939pt
794* \oddsidemargin=-61.31996pt
795* \evensidemargin=-61.31996pt
796* \topmargin=-72.26999pt
797* \headheight=14.22636pt
798* \headsep=0.0pt
799* \topskip=11.0pt
800* \footskip=14.22636pt
801* \marginparwidth=4.0pt
802* \marginparsep=10.0pt
803* \columnsep=10.0pt
804* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
805* \hoffset=0.0pt
806* \voffset=0.0pt
807* \mag=1000
808* \@twocolumnfalse
809* \@twosidefalse
810* \@mparswitchfalse
811* \@reversemarginfalse
812* (1in=72.27pt=25.4mm, 1cm=28.453pt)
813
814(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
815[Loading MPS to PDF converter (version 2006.09.02).]
816\scratchcounter=\count321
817\scratchdimen=\dimen294
818\scratchbox=\box79
819\nofMPsegments=\count322
820\nofMParguments=\count323
821\everyMPshowfont=\toks47
822\MPscratchCnt=\count324
823\MPscratchDim=\dimen295
824\MPnumerator=\count325
825\makeMPintoPDFobject=\count326
826\everyMPtoPDFconversion=\toks48
827) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
828Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
829Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
83085.
831
832(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
833File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
834e
835))
836ABD: EveryShipout initializing macros
837\AtBeginShipoutBox=\box80
838Package hyperref Info: Link coloring OFF on input line 21.
839
840(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
841Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
842
843(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
844Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
845)
846(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
847Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
848)
849\c@section@level=\count327
850)
851LaTeX Info: Redefining \ref on input line 21.
852LaTeX Info: Redefining \pageref on input line 21.
853LaTeX Info: Redefining \nameref on input line 21.
854
855(./4-TikZ.out) (./4-TikZ.out)
856\@outlinefile=\write5
857\openout5 = `4-TikZ.out'.
858
859LaTeX Font Info: Overwriting symbol font `operators' in version `normal'
860(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 21.
861LaTeX Font Info: Overwriting symbol font `operators' in version `bold'
862(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 21.
863\symnumbers=\mathgroup6
864\sympureletters=\mathgroup7
865LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal'
866(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 21.
867LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 21.
868LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal'
869(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 21.
870LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
871(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 21.
872LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 21.
873LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal'
874(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 21.
875LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
876(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 21.
877LaTeX Font Info: Redeclaring math alphabet \mathit on input line 21.
878LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal'
879(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 21.
880LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
881(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 21.
882LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 21.
883LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal'
884(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 21.
885LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
886(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 21.
887LaTeX Font Info: Overwriting symbol font `numbers' in version `bold'
888(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 21.
889LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
890(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 21.
891LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold'
892(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 21.
893LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
894(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 21.
895LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
896(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 21.
897LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
898(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 21.
899LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
900(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 21.
901LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 21.
902LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal'
903(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 2
9041.
905LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
906(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 2
9071.
908LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
909(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp
910ut line 21.
911
912(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary
913-English.dict
914Dictionary: translator-basic-dictionary, Language: English
915)
916(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic
917tionary-English.dict
918Dictionary: translator-bibliography-dictionary, Language: English
919)
920(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict
921ionary-English.dict
922Dictionary: translator-environment-dictionary, Language: English
923)
924(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar
925y-English.dict
926Dictionary: translator-months-dictionary, Language: English
927)
928(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona
929ry-English.dict
930Dictionary: translator-numbers-dictionary, Language: English
931)
932(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona
933ry-English.dict
934Dictionary: translator-theorem-dictionary, Language: English
935) (./4-TikZ.nav)
936<img/unilu.jpg, id=20, 645.16031pt x 578.16pt>
937File: img/unilu.jpg Graphic file (type jpg)
938<use img/unilu.jpg>
939Package pdftex.def Info: img/unilu.jpg used on input line 25.
940(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
941 [1
942
943{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>]
944LaTeX Font Info: Trying to load font information for U+msa on input line 42.
945
946
947(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
948File: umsa.fd 2013/01/14 v3.01 AMS symbols A
949)
950LaTeX Font Info: Trying to load font information for U+msb on input line 42.
951
952
953(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
954File: umsb.fd 2013/01/14 v3.01 AMS symbols B
955)
956LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp
957ut line 42.
958
959(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd
960File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma
961thkerncmss.
962)
963File: img/unilu.jpg Graphic file (type jpg)
964<use img/unilu.jpg>
965Package pdftex.def Info: img/unilu.jpg used on input line 42.
966(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
967
968[2
969
970]
971File: img/unilu.jpg Graphic file (type jpg)
972<use img/unilu.jpg>
973Package pdftex.def Info: img/unilu.jpg used on input line 59.
974(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
975 [3
976
977]
978LaTeX Font Info: Trying to load font information for OMS+cmtt on input line
97980.
980 (/usr/share/texmf/tex/latex/R/tex/latex/omscmtt.fd
981File: omscmtt.fd
982)
983LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <10.95> not available
984(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 80.
985File: img/unilu.jpg Graphic file (type jpg)
986<use img/unilu.jpg>
987Package pdftex.def Info: img/unilu.jpg used on input line 80.
988(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
989 [4
990
991]
992File: img/unilu.jpg Graphic file (type jpg)
993<use img/unilu.jpg>
994Package pdftex.def Info: img/unilu.jpg used on input line 107.
995(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
996 [5
997
998]
999File: img/unilu.jpg Graphic file (type jpg)
1000<use img/unilu.jpg>
1001Package pdftex.def Info: img/unilu.jpg used on input line 119.
1002(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1003 [6
1004
1005]
1006File: img/unilu.jpg Graphic file (type jpg)
1007<use img/unilu.jpg>
1008Package pdftex.def Info: img/unilu.jpg used on input line 147.
1009(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1010
1011[7
1012
1013]
1014\openout4 = `4-TikZ.vrb'.
1015
1016 (./4-TikZ.vrb
1017Missing character: There is no ; in font nullfont!
1018)
1019File: img/unilu.jpg Graphic file (type jpg)
1020<use img/unilu.jpg>
1021Package pdftex.def Info: img/unilu.jpg used on input line 176.
1022(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1023 [8
1024
1025]
1026File: img/unilu.jpg Graphic file (type jpg)
1027<use img/unilu.jpg>
1028Package pdftex.def Info: img/unilu.jpg used on input line 196.
1029(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1030 [9
1031
1032]
1033File: img/unilu.jpg Graphic file (type jpg)
1034<use img/unilu.jpg>
1035Package pdftex.def Info: img/unilu.jpg used on input line 216.
1036(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1037 [10
1038
1039]
1040File: img/unilu.jpg Graphic file (type jpg)
1041<use img/unilu.jpg>
1042Package pdftex.def Info: img/unilu.jpg used on input line 242.
1043(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1044 [11
1045
1046]
1047LaTeX Font Info: Trying to load font information for TS1+cmtt on input line
1048259.
1049
1050(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmtt.fd
1051File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
1052)
1053File: img/unilu.jpg Graphic file (type jpg)
1054<use img/unilu.jpg>
1055Package pdftex.def Info: img/unilu.jpg used on input line 259.
1056(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1057 [12
1058
1059]
1060File: img/unilu.jpg Graphic file (type jpg)
1061<use img/unilu.jpg>
1062Package pdftex.def Info: img/unilu.jpg used on input line 273.
1063(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1064 [13
1065
1066]
1067\openout4 = `4-TikZ.vrb'.
1068
1069
1070(./4-TikZ.vrb
1071Overfull \hbox (77.3589pt too wide) in paragraph at lines 22--22
1072[] \OT1/cmtt/m/n/10.95 (\r/3,0) arc [start angle=0,end angle=\a,radius
1073=\r/3] -- cycle;[]
1074 []
1075
1076)
1077
1078Class beamer Warning: Frame text is shrunk by a factor of 20.6665 percent inste
1079ad of 0 percent on input line 297.
1080
1081File: img/unilu.jpg Graphic file (type jpg)
1082<use img/unilu.jpg>
1083Package pdftex.def Info: img/unilu.jpg used on input line 297.
1084(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1085[14
1086
1087]
1088LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <14.4> not available
1089(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 311.
1090File: img/unilu.jpg Graphic file (type jpg)
1091<use img/unilu.jpg>
1092Package pdftex.def Info: img/unilu.jpg used on input line 311.
1093(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1094 [15
1095
1096]
1097Missing character: There is no ; in font nullfont!
1098
1099Overfull \hbox (2.33415pt too wide) in paragraph at lines 326--326
1100[][]
1101 []
1102
1103File: img/unilu.jpg Graphic file (type jpg)
1104<use img/unilu.jpg>
1105Package pdftex.def Info: img/unilu.jpg used on input line 326.
1106(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1107[16
1108
1109]
1110File: img/unilu.jpg Graphic file (type jpg)
1111<use img/unilu.jpg>
1112Package pdftex.def Info: img/unilu.jpg used on input line 339.
1113(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1114 [17
1115
1116]
1117\openout4 = `4-TikZ.vrb'.
1118
1119 (./4-TikZ.vrb)
1120File: img/unilu.jpg Graphic file (type jpg)
1121<use img/unilu.jpg>
1122Package pdftex.def Info: img/unilu.jpg used on input line 350.
1123(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1124 [18
1125
1126]
1127File: img/unilu.jpg Graphic file (type jpg)
1128<use img/unilu.jpg>
1129Package pdftex.def Info: img/unilu.jpg used on input line 370.
1130(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1131 [19
1132
1133]
1134File: img/unilu.jpg Graphic file (type jpg)
1135<use img/unilu.jpg>
1136Package pdftex.def Info: img/unilu.jpg used on input line 391.
1137(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1138 [20
1139
1140]
1141\openout4 = `4-TikZ.vrb'.
1142
1143 (./4-TikZ.vrb)
1144Overfull \hbox (16.63608pt too wide) in paragraph at lines 2--417
1145[][]
1146 []
1147
1148File: img/unilu.jpg Graphic file (type jpg)
1149<use img/unilu.jpg>
1150Package pdftex.def Info: img/unilu.jpg used on input line 417.
1151(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1152[21
1153
1154]
1155\tf@nav=\write6
1156\openout6 = `4-TikZ.nav'.
1157
1158\tf@toc=\write7
1159\openout7 = `4-TikZ.toc'.
1160
1161\tf@snm=\write8
1162\openout8 = `4-TikZ.snm'.
1163
1164Package atveryend Info: Empty hook `BeforeClearDocument' on input line 419.
1165Package atveryend Info: Empty hook `AfterLastShipout' on input line 419.
1166 (./4-TikZ.aux)
1167Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 419.
1168Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 419.
1169Package rerunfilecheck Info: File `4-TikZ.out' has not changed.
1170(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0.
1171 )
1172Here is how much of TeX's memory you used:
1173 22504 strings out of 481239
1174 458377 string characters out of 5920377
1175 692835 words of memory out of 5000000
1176 37177 multiletter control sequences out of 15000+600000
1177 547815 words of font info for 81 fonts, out of 8000000 for 9000
1178 1141 hyphenation exceptions out of 8191
1179 58i,22n,89p,790b,1084s stack positions out of 5000i,500n,10000p,200000b,80000s
1180 </home/sebastiano/.texlive2019/texmf-var/fonts/pk/ljfour/jknappen/ec/tctt109
11815.600pk></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmitt10.p
1182fb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb></us
1183r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share
1184/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/texli
1185ve/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texlive/tex
1186mf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/texmf-dist
1187/fonts/type1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/font
1188s/type1/public/amsfonts/cm/cmssi12.pfb></usr/share/texlive/texmf-dist/fonts/typ
1189e1/public/amsfonts/cm/cmssi8.pfb></usr/share/texlive/texmf-dist/fonts/type1/pub
1190lic/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/am
1191sfonts/cm/cmsy8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/
1192cm/cmtt10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmt
1193t12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt8.pfb
1194></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt9.pfb>
1195Output written on 4-TikZ.pdf (21 pages, 224630 bytes).
1196PDF statistics:
1197 671 PDF objects out of 1000 (max. 8388607)
1198 612 compressed objects within 7 object streams
1199 43 named destinations out of 1000 (max. 500000)
1200 78 words of extra memory for PDF output out of 10000 (max. 10000000)
1201
diff --git a/src/Lecture3/slides/4-TikZ.nav b/src/Lecture3/slides/4-TikZ.nav
new file mode 100644
index 0000000..b90e3f7
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.nav
@@ -0,0 +1,47 @@
1\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
2\headcommand {\beamer@framepages {1}{1}}
3\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}
4\headcommand {\beamer@framepages {2}{2}}
5\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}
6\headcommand {\beamer@framepages {3}{3}}
7\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}
8\headcommand {\beamer@framepages {4}{4}}
9\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}
10\headcommand {\beamer@framepages {5}{5}}
11\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}
12\headcommand {\beamer@framepages {6}{6}}
13\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}
14\headcommand {\beamer@framepages {7}{7}}
15\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}
16\headcommand {\beamer@framepages {8}{8}}
17\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}
18\headcommand {\beamer@framepages {9}{9}}
19\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}
20\headcommand {\beamer@framepages {10}{10}}
21\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}
22\headcommand {\beamer@framepages {11}{11}}
23\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}
24\headcommand {\beamer@framepages {12}{12}}
25\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}
26\headcommand {\beamer@framepages {13}{13}}
27\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}
28\headcommand {\beamer@framepages {14}{14}}
29\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}
30\headcommand {\beamer@framepages {15}{15}}
31\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}
32\headcommand {\beamer@framepages {16}{16}}
33\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}
34\headcommand {\beamer@framepages {17}{17}}
35\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}
36\headcommand {\beamer@framepages {18}{18}}
37\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}
38\headcommand {\beamer@framepages {19}{19}}
39\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}
40\headcommand {\beamer@framepages {20}{20}}
41\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}
42\headcommand {\beamer@framepages {21}{21}}
43\headcommand {\beamer@partpages {1}{21}}
44\headcommand {\beamer@subsectionpages {1}{21}}
45\headcommand {\beamer@sectionpages {1}{21}}
46\headcommand {\beamer@documentpages {21}}
47\headcommand {\gdef \inserttotalframenumber {21}}
diff --git a/src/Lecture3/slides/4-TikZ.out b/src/Lecture3/slides/4-TikZ.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.out
diff --git a/src/Lecture3/slides/4-TikZ.pdf b/src/Lecture3/slides/4-TikZ.pdf
new file mode 100644
index 0000000..fde2b8c
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.pdf
Binary files differ
diff --git a/src/Lecture3/slides/4-TikZ.snm b/src/Lecture3/slides/4-TikZ.snm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.snm
diff --git a/src/Lecture3/slides/4-TikZ.tex b/src/Lecture3/slides/4-TikZ.tex
new file mode 100644
index 0000000..7148d0a
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.tex
@@ -0,0 +1,420 @@
1\documentclass[11pt]{beamer}
2\usetheme{Madrid}
3\usepackage[utf8]{inputenc}
4\usepackage{amsmath, amssymb, amsfonts, amsthm}
5\usepackage{xcolor}
6
7\usepackage{tikz-cd}
8%\usepackage{enumitem}
9
10\newcommand{\ti}{Ti\emph{k}Z}
11
12\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto}
13\title{The {\ti } graphics package}
14\logo{\includegraphics[scale=0.1]{img/unilu.jpg}}
15%\institute{University of Luxembourg}
16
17\newcommand{\bs}{\textbackslash}
18
19\date{2021-03-26}
20
21\begin{document}
22
23\begin{frame}
24 \titlepage
25\end{frame}
26
27
28\begin{frame}{\ti}
29 \begin{center}
30 ``{\ti } ist \emph{kein} Zeichenprogramm''
31 \end{center}
32
33 \vspace{1cm}
34 \begin{itemize}
35 \item ``Writing'' graphics as you write text and formulas in LaTeX
36 \begin{align*}
37 \text{\ti} : \text{graphics} = \text{LaTeX} : \text{text}
38 \end{align*}
39 \item Draw shapes, paths, diagrams...
40 \item Countless extension packages
41 \end{itemize}
42\end{frame}
43
44\begin{frame}{References}
45 \begin{itemize}
46 \item Wikibooks, short introduction:
47 \url{https://en.wikibooks.org/wiki/LaTeX/PGF/TikZ}
48
49 \vspace{0.2cm}
50 \item Official manual:
51 {\small\url{http://ctan.cs.uu.nl/graphics/pgf/base/doc/pgfmanual.pdf}}
52
53 (Too long, but nice examples in part \textrm{I})
54
55 \vspace{0.2cm}
56 \item Extension packages and their documentation:
57 \url{https://www.ctan.org/topic/pgf-tikz}
58 \end{itemize}
59\end{frame}
60
61\begin{frame}{Using {\ti}}
62 \begin{itemize}
63 \item In preamble:
64
65 \vspace{0.2cm}
66 \texttt{\bs usepackage\{tikz\}}
67
68 \texttt{\bs usetikzlibrary\{something\} \% if needed}
69
70 \vspace{0.2cm}
71 \item In document body:
72
73 \vspace{0.2cm}
74 \texttt{\bs begin\{tikzpicture\} (\dots) \bs end\{tikzpicture\}}
75
76 \vspace{0.2cm}
77 \item Use \texttt{[scale=\emph{n},rotate=\emph{angle}]} to scale or rotate
78 the whole picture.
79 \end{itemize}
80\end{frame}
81
82
83\begin{frame}{Coordinates}
84 \begin{itemize}
85 \item $3$ ways to express coordinates:
86
87 \vspace{0.2cm}
88 \begin{itemize}
89 \item Cartesian, no unit = cm
90
91 Example: \texttt{(2cm,11pt)}
92
93 \vspace{0.2cm}
94 \item Polar
95
96 Example: \texttt{(180:7cm)}
97
98 \vspace{0.2cm}
99 \item Intersection of vertical line through $p_1$ and horizontal line
100 through $p_2$, points expressed as above (no parenthesis)
101
102 Example: \texttt{(0,1 |- 30:2)}
103 \end{itemize}
104 \item More intersections: \texttt{\bs usetikzlibrary\{intersections\}}
105 \item Give names to points: \texttt{\bs coordinate (X) at (1,-4);}
106 \end{itemize}
107\end{frame}
108
109\begin{frame}{Drawing straight lines}
110 \begin{center}
111 \texttt{\bs draw (P1) -- (P2) -- ... -- (Pn);}
112 \end{center}
113
114 \vspace{0.5cm}
115 \begin{itemize}
116 \item Points expressed in coordinates as before.
117 \item Add \texttt{-- cycle} to close the path.
118 \end{itemize}
119\end{frame}
120
121\begin{frame}{Curved lines and other shapes}
122 \begin{tabular}{c|l}
123 \tikz \draw (0,0) arc [start angle=30, end angle=120, radius=2cm];
124 & \begin{tabular}{c}
125 \texttt{\bs draw (0,0) arc [start angle=30,} \\
126 \texttt{end angle=120, radius=2cm];}
127 \end{tabular} \\
128 \hline
129 \begin{tikzpicture}
130 \draw[white] (2,1) -- (2,1.2); % Just for spacing the table
131 \draw (0,0) rectangle (2,1);
132 \end{tikzpicture} &
133 \texttt{\bs draw (0,0) rectangle (2,1);} \\
134 \hline
135 \begin{tikzpicture}
136 \draw[white] (0,0) -- (0,0.7); % Just for spacing the table
137 \draw (0,0) circle [radius=0.5];
138 \end{tikzpicture} &
139 \texttt{\bs draw (0,0) circle [radius=0.5];} \\
140 \hline
141 \begin{tikzpicture}
142 \draw[white] (0,0) -- (0,0.7); % Just for spacing the table
143 \draw (0,0) circle [x radius=1,y radius=0.5];
144 \end{tikzpicture} &
145 \texttt{\dots [x radius=1,y radius=0.5];} \\
146 \end{tabular}
147\end{frame}
148
149\begin{frame}[fragile]{Bezier curves}
150 \texttt{\bs draw (P1) ..controls (C1) and (C2).. (P2);}
151
152 \vspace{0.5cm}
153 \begin{columns}
154 \column{0.6\textwidth}
155 A curve from \texttt{P1} to \texttt{P2}, starting in direction of
156 \texttt{C1} and arriving from the direction of \texttt{C2} (usually not
157 touching the control points).
158
159 \vspace{0.5cm}
160 \href{https://en.wikipedia.org/wiki/B\%C3\%A9zier\_curve}
161 {https://en.wikipedia.org/wiki/Bézier\_curve}
162 \column{0.4\textwidth}
163 \begin{tikzpicture}
164 \coordinate (P1) at (0,0);
165 \coordinate (P2) at (4,1);
166 \coordinate (C1) at (0,3);
167 \coordinate (C2) at (3,2);
168
169 \draw[lightgray] (P1) foreach \p in {P1,C1,C2,P2} {-- (\p)};
170 \foreach \p in {P1,C1,C2,P2} {
171 \fill[blue] (\p) circle[radius=0.1] node[label=\p] {};
172 };
173 \draw[thick] (P1) ..controls (C1) and (C2).. (P2);
174 \end{tikzpicture}
175 \end{columns}
176\end{frame}
177
178\begin{frame}{Colors}
179 \begin{itemize}
180 \item Color names already defined: \texttt{red, green, blue, yellow,}
181 \texttt{black, white, gray, darkgray, lightgray, brown, pink\dots}
182
183 \vspace{0.2cm}
184 \item Specify intensity: \texttt{color!n} with $0\leq n \leq 100$.
185
186 \vspace{0.2cm}
187 \item Mix colors: \texttt{color1!n1!color2!n2!\dots}
188
189 \vspace{0.2cm}
190 \item Example:
191 \begin{center}
192 \texttt{blue!50!red!50!green}
193 \end{center}
194 is 50\% blue, 25\% red and 25\% green.
195 \end{itemize}
196\end{frame}
197
198\begin{frame}{Filldraw, change color and line style}
199 \begin{itemize}
200 \item \texttt{\bs draw[\emph{colorname}]} to specify color.
201
202 \vspace{0.2cm}
203 \item \texttt{\bs filldraw[fill=\emph{fillcolor}, draw=\emph{bordercolor}]}
204 to fill path or \texttt{\bs fill} for no border.
205
206 \vspace{0.2cm}
207 \item Line width: \texttt{\bs draw[\emph{thickness}]}, where
208 \texttt{\emph{thickness}} can be \texttt{very thin, thin, thick, very
209 thick\dots} or \texttt{\bs draw[line width=\emph{length}]} where
210 \texttt{\emph{length}} can be \texttt{3pt, 0.1mm\dots}
211
212 \vspace{0.2cm}
213 \item Line style: \texttt{[dashed]} for dashed,
214 \texttt{[->]} or \texttt{[<-]} for arrow.
215 \end{itemize}
216\end{frame}
217
218
219\begin{frame}{Example}
220 \begin{center}
221 \begin{tikzpicture}[scale=0.6]
222 \colorlet{coscolor}{blue}
223 \colorlet{sincolor}{red}
224 \tikzset{anglefill/.style={draw=green,fill=green!30}}
225
226 \pgfmathsetmacro{\r}{4}
227 \pgfmathsetmacro{\a}{60}
228
229 \draw[lightgray!30] (-5,-5) grid[step=1] (5,5);
230 \draw[thick,->] (0,-5) -- (0,5);
231 \draw[thick,->] (-5,0) -- (5,0);
232
233 \filldraw[anglefill] (0,0) -- node[above]{$\a^\circ$}
234 (\r/3,0) arc [start angle=0,end angle=\a,radius=\r/3] -- cycle;
235 \draw[thick] (0,0) circle[radius=\r] -- (\a:\r);
236 \draw[very thick,coscolor] (0,0) --
237 node[below]{$\cos(\a^\circ)$} (\r*cos{\a},0);
238 \draw[very thick,sincolor] (\r*cos{\a},0) --
239 node[right]{$\sin\a^\circ$}(\a:\r);
240 \end{tikzpicture}
241 \end{center}
242\end{frame}
243
244\begin{frame}{Adding text: nodes}
245 \texttt{\bs draw (P1) {\color{red}--} node[\emph{position}]
246 \{\emph{text}\} (P2) \dots}
247
248 \vspace{0.5cm}
249 \texttt{\bs draw {\color{red}(P1)} node[\emph{position}]
250 \{\emph{text}\} -- (P2) \dots}
251
252 \vspace{0.5cm}
253 \begin{itemize}
254 \item A node can refer to a line or to a point
255 \item \texttt{\emph{position}} can be \texttt{above, below, left} or
256 \texttt{right}
257 \item \texttt{\emph{text}} can also be \texttt{\$math\$}
258 \end{itemize}
259\end{frame}
260
261\begin{frame}{Macros}
262 \texttt{\bs pgfmathsetmacro\{\bs x\}\{\emph{value}\}}
263
264 %\texttt{\bs colorlet\{\emph{colorname}\}\{\emph{color}\}}
265
266 \vspace{0.5cm}
267 Examples:
268
269 \vspace{0.2cm}
270 \texttt{\bs pgfmathsetmacro\{\bs r\}\{4\}}
271
272 \texttt{\bs pgfmathsetmacro\{\bs a\}\{30\}}
273\end{frame}
274
275\begin{frame}[fragile,shrink]{Example - {\ti } code}
276 \begin{verbatim}
277 \begin{tikzpicture}
278 \colorlet{coscolor}{blue}
279 \colorlet{sincolor}{red}
280 \tikzset{anglefill/.style={draw=green,fill=green!30}}
281 \pgfmathsetmacro{\r}{4}
282 \pgfmathsetmacro{\a}{60}
283
284 \draw[lightgray!30] (-5,-5) grid[step=1] (5,5);
285 \draw[thick,->] (0,-5) -- (0,5);
286 \draw[thick,->] (-5,0) -- (5,0);
287
288 \filldraw[anglefill] (0,0) -- node[above]{$\a^\circ$}
289 (\r/3,0) arc [start angle=0,end angle=\a,radius=\r/3] -- cycle;
290 \draw[thick] (0,0) circle[radius=\r] -- (\a:\r);
291 \draw[very thick,coscolor] (0,0) --
292 node[below]{$\cos(\a^\circ)$} (\r*cos{\a},0);
293 \draw[very thick,sincolor] (\r*cos{\a},0) --
294 node[right]{$\sin\a^\circ$}(\a:\r);
295 \end{tikzpicture}
296 \end{verbatim}
297\end{frame}
298
299\begin{frame}{The \texttt{\bs foreach} command}
300 \texttt{\bs foreach \bs i in \{\emph{list}\} \{ \emph{commands} \};}
301
302 \vspace{0.5cm}
303 \begin{itemize}
304 \item \texttt{\emph{list}} can be fully explicit (like
305 \texttt{\{1,7.2,-42\}}) or partially implicit
306 (like \texttt{\{1.5,1.6,\dots,5.0\}})
307 \item \texttt{\emph{commands}} will be repeated with \texttt{\bs i}
308 varying in \texttt{\emph{list}}
309 \item One can use \texttt{foreach} inside a \texttt{\bs draw}
310 \end{itemize}
311\end{frame}
312
313\begin{frame}{\texttt{\bs foreach} examples}
314 \begin{tabular}{c|l}
315 \tikz \foreach \i in {1,2,3,4} {\draw (\i,0) circle [radius=0.4];}; &
316 \begin{tabular}{l}
317 \texttt{\bs foreach \bs i in \{1,2,3,4\}} \\
318 \texttt{\{\bs draw (\bs i,0) circle [radius=0.4];\}}
319 \end{tabular} \\
320 \tikz[scale=2]\draw (0,0) \foreach\i in {0.0,0.3,...,1.5} {-- (\i,\i^2)}; &
321 \begin{tabular}{l}
322 \texttt{\bs draw (0,0) \bs foreach \bs i in} \\
323 \texttt{ \{0.0,0.3,...,1.5\} \{-- (\bs i,\bs i\^{}2)\};}
324 \end{tabular}
325 \end{tabular}
326\end{frame}
327
328\begin{frame}{External packages}
329 Many external packages, include with \texttt{\bs usepackage}:
330 \url{https://www.ctan.org/topic/pgf-tikz}
331
332 \vspace{0.3cm}
333 \begin{itemize}
334 \item Graphs and similar: \texttt{tikz-cd, adigraph, binarytree\dots}
335 \item Diagrams: \texttt{pgf-pie, bchart, venndiagram\dots}
336 \item Other sciences: \texttt{chemfig, CircuiTikZ\dots}
337 \item Fun: \texttt{battleship, TikZducks, tikz-among-us\dots}
338 \end{itemize}
339\end{frame}
340
341\begin{frame}[fragile]{Commutative diagrams}
342 \begin{center}
343 \begin{tikzcd}
344 T \arrow[drr, bend left, "x"] \arrow[ddr, bend right, "y"']
345 \arrow[dr, dotted, "{(x,y)}" description] & & \\
346 & X \times_Z Y \arrow[r, "p"] \arrow[d, "q"] & X \arrow[d, "f"] \\
347 & Y \arrow[r, "g"] & Z
348 \end{tikzcd}
349 \end{center}
350\end{frame}
351
352\begin{frame}{tikz-cd}
353
354 Reference:
355 {\footnotesize
356 \url{http://ctan.cs.uu.nl/graphics/pgf/contrib/tikz-cd/tikz-cd-doc.pdf}}
357
358 \vspace{0.7cm}
359 \texttt{\bs usepackage\{tikz-cd\}}
360
361 \vspace{0.2cm}
362 \texttt{\bs begin\{tikzcd\}\dots \bs end\{tikzcd\}}
363
364 \vspace{0.5cm}
365 \begin{itemize}
366 \item Works as a \texttt{tabular} or \texttt{matrix} (with \texttt{\&} and
367 \texttt{\bs\bs})
368 \item Everything is in math mode by default
369 \end{itemize}
370\end{frame}
371
372\begin{frame}{Arrows}
373 \texttt{\bs arrow[\emph{direction},"label",other options]}
374
375 \vspace{0.5cm}
376 \begin{itemize}
377 \item \texttt{\emph{direction}} can be any combination of the letters
378 \texttt r (right), \texttt l (left), \texttt d (down) and
379 \texttt u (up)
380 \item The target must exist:
381 \begin{center}
382 \begin{tabular}{ll}
383 \texttt{X \bs arrow[r] \& Y} & \texttt{\% Ok} \\
384 \texttt{X \bs arrow[r] } & \texttt{\% Error} \\
385 \texttt{X \bs arrow[r] \& \{\}} & \texttt{\% Ok}
386 \end{tabular}
387 \end{center}
388 \item Other options describe the shape and style of the arrow
389
390 \end{itemize}
391\end{frame}
392
393\begin{frame}[fragile]{Examples}
394 \begin{tabular}{c|l}
395 \begin{tikzcd} X\arrow[r,dashed,"f"] & Y \end{tikzcd} &
396 \begin{tabular}{l}
397 \texttt{X \bs arrow[r,dashed,"f"] \& Y}
398 \end{tabular} \\
399 & \quad \\
400 \begin{tikzcd}
401 A\arrow[r,bend right,"\pi^2"] & B\arrow[r,bend left,tail] & C
402 \end{tikzcd} &
403 \begin{tabular}{l}
404 \texttt{A \bs arrow[r,bend right,"\bs pi\^{}2"] \&} \\
405 \texttt{B \bs arrow[r,bend left,tail] \& C}
406 \end{tabular} \\
407 & \quad \\
408 \begin{tikzcd}
409 A \arrow[d,"1"'] \arrow[dr,"2"] & B \\
410 C & D \arrow[l] \arrow[u,out=45,in=0]
411 \end{tikzcd} &
412 \begin{tabular}{l}
413 \texttt{A \bs arrow[d,"1"'] \bs arrow[dr,"2"] \& B \bs\bs} \\
414 \texttt{C \& D \bs arrow[l] \bs arrow[u,out=45,in=0]}
415 \end{tabular}
416 \end{tabular}
417\end{frame}
418
419\end{document}
420
diff --git a/src/Lecture3/slides/4-TikZ.toc b/src/Lecture3/slides/4-TikZ.toc
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.toc
diff --git a/src/Lecture3/slides/4-TikZ.vrb b/src/Lecture3/slides/4-TikZ.vrb
new file mode 100644
index 0000000..e44a4eb
--- /dev/null
+++ b/src/Lecture3/slides/4-TikZ.vrb
@@ -0,0 +1,24 @@
1\frametitle{Examples}
2\begin{tabular}{c|l}
3 \begin{tikzcd} X\arrow[r,dashed,"f"] & Y \end{tikzcd} &
4 \begin{tabular}{l}
5 \texttt{X \bs arrow[r,dashed,"f"] \& Y}
6 \end{tabular} \\
7 & \quad \\
8 \begin{tikzcd}
9 A\arrow[r,bend right,"\pi^2"] & B\arrow[r,bend left,tail] & C
10 \end{tikzcd} &
11 \begin{tabular}{l}
12 \texttt{A \bs arrow[r,bend right,"\bs pi\^{}2"] \&} \\
13 \texttt{B \bs arrow[r,bend left,tail] \& C}
14 \end{tabular} \\
15 & \quad \\
16 \begin{tikzcd}
17 A \arrow[d,"1"'] \arrow[dr,"2"] & B \\
18 C & D \arrow[l] \arrow[u,out=45,in=0]
19 \end{tikzcd} &
20 \begin{tabular}{l}
21 \texttt{A \bs arrow[d,"1"'] \bs arrow[dr,"2"] \& B \bs\bs} \\
22 \texttt{C \& D \bs arrow[l] \bs arrow[u,out=45,in=0]}
23 \end{tabular}
24 \end{tabular}
diff --git a/src/Lecture3/slides/5-Beamer.aux b/src/Lecture3/slides/5-Beamer.aux
new file mode 100644
index 0000000..770cde1
--- /dev/null
+++ b/src/Lecture3/slides/5-Beamer.aux
@@ -0,0 +1,49 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
20\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
21\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}}
22\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}}
23\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}}
24\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}}
25\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}}
26\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}}
27\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}}
28\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}}
29\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}}
30\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}}
31\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}}
32\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}}
33\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}}
34\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}}
35\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}}
36\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}}
37\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}}
38\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}}
39\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}}
40\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}}
41\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}}
42\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}}
43\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/15}{}{0}}}
44\@writefile{nav}{\headcommand {\beamer@framepages {13}{15}}}
45\@writefile{nav}{\headcommand {\beamer@partpages {1}{15}}}
46\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{15}}}
47\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{15}}}
48\@writefile{nav}{\headcommand {\beamer@documentpages {15}}}
49\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {13}}}
diff --git a/src/Lecture3/slides/5-Beamer.log b/src/Lecture3/slides/5-Beamer.log
new file mode 100644
index 0000000..846eb60
--- /dev/null
+++ b/src/Lecture3/slides/5-Beamer.log
@@ -0,0 +1,1132 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2021.5.20) 25 MAY 2021 16:15
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**5-Beamer.tex
6(./5-Beamer.tex
7LaTeX2e <2020-02-02> patch level 2
8L3 programming layer <2020-02-14>
9(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
10Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations
11(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
12(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
13Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW)
14\etb@tempcnta=\count167
15)
16\beamer@tempbox=\box45
17\beamer@tempcount=\count168
18\c@beamerpauses=\count169
19
20(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
21\beamer@slideinframe=\count170
22\beamer@minimum=\count171
23\beamer@decode@box=\box46
24)
25\beamer@commentbox=\box47
26\beamer@modecount=\count172
27)
28(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
29Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead.
30
31(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
32Package: iftex 2019/11/07 v1.0c TeX engine tests
33))
34\headdp=\dimen134
35\footheight=\dimen135
36\sidebarheight=\dimen136
37\beamer@tempdim=\dimen137
38\beamer@finalheight=\dimen138
39\beamer@animht=\dimen139
40\beamer@animdp=\dimen140
41\beamer@animwd=\dimen141
42\beamer@leftmargin=\dimen142
43\beamer@rightmargin=\dimen143
44\beamer@leftsidebar=\dimen144
45\beamer@rightsidebar=\dimen145
46\beamer@boxsize=\dimen146
47\beamer@vboxoffset=\dimen147
48\beamer@descdefault=\dimen148
49\beamer@descriptionwidth=\dimen149
50\beamer@lastskip=\skip47
51\beamer@areabox=\box48
52\beamer@animcurrent=\box49
53\beamer@animshowbox=\box50
54\beamer@sectionbox=\box51
55\beamer@logobox=\box52
56\beamer@linebox=\box53
57\beamer@sectioncount=\count173
58\beamer@subsubsectionmax=\count174
59\beamer@subsectionmax=\count175
60\beamer@sectionmax=\count176
61\beamer@totalheads=\count177
62\beamer@headcounter=\count178
63\beamer@partstartpage=\count179
64\beamer@sectionstartpage=\count180
65\beamer@subsectionstartpage=\count181
66\beamer@animationtempa=\count182
67\beamer@animationtempb=\count183
68\beamer@xpos=\count184
69\beamer@ypos=\count185
70\beamer@ypos@offset=\count186
71\beamer@showpartnumber=\count187
72\beamer@currentsubsection=\count188
73\beamer@coveringdepth=\count189
74\beamer@sectionadjust=\count190
75\beamer@tocsectionnumber=\count191
76
77(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
78(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
79Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
80\KV@toks@=\toks14
81))
82\beamer@paperwidth=\skip48
83\beamer@paperheight=\skip49
84
85(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
86Package: geometry 2020/01/02 v5.9 Page Geometry
87
88(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
89Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
90)
91\Gm@cnth=\count192
92\Gm@cntv=\count193
93\c@Gm@tempcnt=\count194
94\Gm@bindingoffset=\dimen150
95\Gm@wd@mp=\dimen151
96\Gm@odd@mp=\dimen152
97\Gm@even@mp=\dimen153
98\Gm@layoutwidth=\dimen154
99\Gm@layoutheight=\dimen155
100\Gm@layouthoffset=\dimen156
101\Gm@layoutvoffset=\dimen157
102\Gm@dimlist=\toks15
103)
104(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
105File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option)
106)
107(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
108(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
109Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR)
110
111(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
112Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR)
113
114(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
115Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
116)
117(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
118File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
119)
120Package graphics Info: Driver file: pdftex.def on input line 105.
121
122(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
123File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
124))
125\Gin@req@height=\dimen158
126\Gin@req@width=\dimen159
127)
128(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
129(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
130(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
131\pgfutil@everybye=\toks16
132\pgfutil@tempdima=\dimen160
133\pgfutil@tempdimb=\dimen161
134
135(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t
136ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
137\pgfutil@abb=\box54
138(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty
139Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS)
140))
141(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
142(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex)
143Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b)
144))
145(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
146Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b)
147
148(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
149\pgfkeys@pathtoks=\toks17
150\pgfkeys@temptoks=\toks18
151
152(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t
153ex
154\pgfkeys@tmptoks=\toks19
155))
156\pgf@x=\dimen162
157\pgf@y=\dimen163
158\pgf@xa=\dimen164
159\pgf@ya=\dimen165
160\pgf@xb=\dimen166
161\pgf@yb=\dimen167
162\pgf@xc=\dimen168
163\pgf@yc=\dimen169
164\pgf@xd=\dimen170
165\pgf@yd=\dimen171
166\w@pgf@writea=\write3
167\r@pgf@reada=\read2
168\c@pgf@counta=\count195
169\c@pgf@countb=\count196
170\c@pgf@countc=\count197
171\c@pgf@countd=\count198
172\t@pgf@toka=\toks20
173\t@pgf@tokb=\toks21
174\t@pgf@tokc=\toks22
175\pgf@sys@id@count=\count199
176 (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
177File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b)
178)
179Driver file for pgf: pgfsys-pdftex.def
180
181(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
182File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b)
183
184(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de
185f
186File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b)
187)))
188(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.
189tex
190File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b)
191\pgfsyssoftpath@smallbuffer@items=\count266
192\pgfsyssoftpath@bigbuffer@items=\count267
193)
194(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.
195tex
196File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b)
197)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
198Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
199
200(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
201File: color.cfg 2016/01/02 v1.6 sample color configuration
202)
203Package xcolor Info: Driver file: pdftex.def on input line 225.
204Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
205Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
206Package xcolor Info: Model `RGB' extended on input line 1364.
207Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
208Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
209Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
210Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
211Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
212Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
213)
214(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
215Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b)
216
217(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
218(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
219(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
220(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
221\pgfmath@dimen=\dimen172
222\pgfmath@count=\count268
223\pgfmath@box=\box55
224\pgfmath@toks=\toks23
225\pgfmath@stack@operand=\toks24
226\pgfmath@stack@operation=\toks25
227)
228(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
229(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code
230.tex)
231(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet
232ric.code.tex)
233(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod
234e.tex)
235(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison
236.code.tex)
237(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.
238tex)
239(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code
240.tex)
241(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.
242tex)
243(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari
244thmetics.code.tex)))
245(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
246\c@pgfmathroundto@lastzeros=\count269
247))
248(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
249(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te
250x
251File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b)
252\pgf@picminx=\dimen173
253\pgf@picmaxx=\dimen174
254\pgf@picminy=\dimen175
255\pgf@picmaxy=\dimen176
256\pgf@pathminx=\dimen177
257\pgf@pathmaxx=\dimen178
258\pgf@pathminy=\dimen179
259\pgf@pathmaxy=\dimen180
260\pgf@xx=\dimen181
261\pgf@xy=\dimen182
262\pgf@yx=\dimen183
263\pgf@yy=\dimen184
264\pgf@zx=\dimen185
265\pgf@zy=\dimen186
266)
267(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.
268code.tex
269File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b)
270\pgf@path@lastx=\dimen187
271\pgf@path@lasty=\dimen188
272)
273(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code
274.tex
275File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
276\pgf@shorten@end@additional=\dimen189
277\pgf@shorten@start@additional=\dimen190
278)
279(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te
280x
281File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
282\pgfpic=\box56
283\pgf@hbox=\box57
284\pgf@layerbox@main=\box58
285\pgf@picture@serial@count=\count270
286)
287(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c
288ode.tex
289File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b)
290\pgflinewidth=\dimen191
291)
292(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation
293s.code.tex
294File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b)
295\pgf@pt@x=\dimen192
296\pgf@pt@y=\dimen193
297\pgf@pt@temp=\dimen194
298)
299(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
300File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b)
301)
302(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t
303ex
304File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b)
305)
306(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing
307.code.tex
308File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b)
309)
310(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te
311x
312File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b)
313\pgfarrowsep=\dimen195
314)
315(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
316File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b)
317\pgf@max=\dimen196
318\pgf@sys@shading@range@num=\count271
319\pgf@shadingcount=\count272
320)
321(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
322File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
323
324(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.
325tex
326File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b)
327\pgfexternal@startupbox=\box59
328))
329(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te
330x
331File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
332)
333(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c
334ode.tex
335File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b)
336)
337(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.
338tex
339File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b)
340)
341(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
342File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b)
343))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
344Package: xxcolor 2003/10/24 ver 0.1
345\XC@nummixins=\count273
346\XC@countmixins=\count274
347)
348(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
349Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO)
350
351(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
352Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
353)
354(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
355Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO)
356))
357(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
358Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX
359
360(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty
361Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO
362)
363Package pdftexcmds Info: \pdf@primitive is available.
364Package pdftexcmds Info: \pdf@ifprimitive is available.
365Package pdftexcmds Info: \pdfdraftmode found.
366)
367(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
368Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
369)
370(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
371Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
372)
373(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
374Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
375)
376(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
377Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
378)
379(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
380Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
381)
382(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
383Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
384)
385(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
386Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO)
387)
388\@linkdim=\dimen197
389\Hy@linkcounter=\count275
390\Hy@pagecounter=\count276
391
392(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
393File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO)
394Now handling font encoding PD1 ...
395... no UTF-8 mapping file for font encoding PD1
396)
397(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
398Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
399)
400(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
401Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
402)
403\Hy@SavedSpaceFactor=\count277
404\pdfmajorversion=\count278
405Package hyperref Info: Option `bookmarks' set `true' on input line 4421.
406Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421.
407Package hyperref Info: Option `implicit' set `false' on input line 4421.
408Package hyperref Info: Hyper figures OFF on input line 4547.
409Package hyperref Info: Link nesting OFF on input line 4552.
410Package hyperref Info: Hyper index ON on input line 4555.
411Package hyperref Info: Plain pages OFF on input line 4562.
412Package hyperref Info: Backreferencing OFF on input line 4567.
413Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals.
414Package hyperref Info: Bookmarks ON on input line 4800.
415\c@Hy@tempcnt=\count279
416
417(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty
418\Urlmuskip=\muskip16
419Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
420)
421LaTeX Info: Redefining \url on input line 5159.
422\XeTeXLinkMargin=\dimen198
423
424(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
425Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
426
427(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
428Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
429)
430))
431\Fld@menulength=\count280
432\Field@Width=\dimen199
433\Fld@charsize=\dimen256
434Package hyperref Info: Hyper figures OFF on input line 6430.
435Package hyperref Info: Link nesting OFF on input line 6435.
436Package hyperref Info: Hyper index ON on input line 6438.
437Package hyperref Info: backreferencing OFF on input line 6445.
438Package hyperref Info: Link coloring OFF on input line 6450.
439Package hyperref Info: Link coloring with OCG OFF on input line 6455.
440Package hyperref Info: PDF/A mode OFF on input line 6460.
441LaTeX Info: Redefining \ref on input line 6500.
442LaTeX Info: Redefining \pageref on input line 6504.
443\Hy@abspage=\count281
444
445
446Package hyperref Message: Stopped early.
447
448)
449Package hyperref Info: Driver (autodetected): hpdftex.
450 (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
451File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX
452
453(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
454Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO)
455)
456\Fld@listcount=\count282
457\c@bookmark@seq@number=\count283
458
459(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
460Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
461
462(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
463Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
464)
465Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
46686.
467))
468(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
469(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty)
470(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
471(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
472Package: amssymb 2013/01/14 v3.01 AMS font symbols
473
474(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
475Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
476\@emptytoks=\toks26
477\symAMSa=\mathgroup4
478\symAMSb=\mathgroup5
479LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
480LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
481(Font) U/euf/m/n --> U/euf/b/n on input line 106.
482))
483(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
484Package: sansmathaccent 2020/01/31
485
486(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
487Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files)
488)))
489(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
490(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
491Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX
492))
493(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty)
494(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty)
495(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
496\beamer@argscount=\count284
497\beamer@lastskipcover=\skip50
498\beamer@trivlistdepth=\count285
499)
500(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty)
501(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
502\c@lecture=\count286
503\c@part=\count287
504\c@section=\count288
505\c@subsection=\count289
506\c@subsubsection=\count290
507)
508(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
509\beamer@framebox=\box60
510\beamer@frametitlebox=\box61
511\beamer@zoombox=\box62
512\beamer@zoomcount=\count291
513\beamer@zoomframecount=\count292
514\beamer@frametextheight=\dimen257
515\c@subsectionslide=\count293
516\beamer@frametopskip=\skip51
517\beamer@framebottomskip=\skip52
518\beamer@frametopskipautobreak=\skip53
519\beamer@framebottomskipautobreak=\skip54
520\beamer@envbody=\toks27
521\framewidth=\dimen258
522\c@framenumber=\count294
523)
524(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
525\beamer@verbatimfileout=\write4
526)
527(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
528\beamer@splitbox=\box63
529\beamer@autobreakcount=\count295
530\beamer@autobreaklastheight=\dimen259
531\beamer@frametitletoks=\toks28
532\beamer@framesubtitletoks=\toks29
533)
534(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
535\beamer@footins=\box64
536)
537(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty)
538(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
539\beamer@frameboxcopy=\box65
540)
541(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty)
542(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
543\beamer@sbttoks=\toks30
544
545(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
546(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
547\bmb@box=\box66
548\bmb@colorbox=\box67
549\bmb@boxshadow=\box68
550\bmb@boxshadowball=\box69
551\bmb@boxshadowballlarge=\box70
552\bmb@temp=\dimen260
553\bmb@dima=\dimen261
554\bmb@dimb=\dimen262
555\bmb@prevheight=\dimen263
556)
557\beamer@blockheadheight=\dimen264
558))
559(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
560(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
561Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
562\@enLab=\toks31
563)
564\c@figure=\count296
565\c@table=\count297
566\abovecaptionskip=\skip55
567\belowcaptionskip=\skip56
568)
569(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
570\beamer@section@min@dim=\dimen265
571)
572(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
573(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
574Package: amsmath 2020/01/20 v2.17e AMS math features
575\@mathmargin=\skip57
576
577For additional information on amsmath, use the `?' option.
578(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
579Package: amstext 2000/06/29 v2.01 AMS text
580
581(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
582File: amsgen.sty 1999/11/30 v2.0 generic functions
583\@emptytoks=\toks32
584\ex@=\dimen266
585))
586(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
587Package: amsbsy 1999/11/29 v1.2d Bold Symbols
588\pmbraise@=\dimen267
589)
590(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
591Package: amsopn 2016/03/08 v2.02 operator names
592)
593\inf@bad=\count298
594LaTeX Info: Redefining \frac on input line 227.
595\uproot@=\count299
596\leftroot@=\count300
597LaTeX Info: Redefining \overline on input line 389.
598\classnum@=\count301
599\DOTSCASE@=\count302
600LaTeX Info: Redefining \ldots on input line 486.
601LaTeX Info: Redefining \dots on input line 489.
602LaTeX Info: Redefining \cdots on input line 610.
603\Mathstrutbox@=\box71
604\strutbox@=\box72
605\big@size=\dimen268
606LaTeX Font Info: Redeclaring font encoding OML on input line 733.
607LaTeX Font Info: Redeclaring font encoding OMS on input line 734.
608\macc@depth=\count303
609\c@MaxMatrixCols=\count304
610\dotsspace@=\muskip17
611\c@parentequation=\count305
612\dspbrk@lvl=\count306
613\tag@help=\toks33
614\row@=\count307
615\column@=\count308
616\maxfields@=\count309
617\andhelp@=\toks34
618\eqnshift@=\dimen269
619\alignsep@=\dimen270
620\tagshift@=\dimen271
621\tagwidth@=\dimen272
622\totwidth@=\dimen273
623\lineht@=\dimen274
624\@envbody=\toks35
625\multlinegap=\skip58
626\multlinetaggap=\skip59
627\mathdisplay@stack=\toks36
628LaTeX Info: Redefining \[ on input line 2859.
629LaTeX Info: Redefining \] on input line 2860.
630)
631(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
632Package: amsthm 2017/10/31 v2.20.4
633\thm@style=\toks37
634\thm@bodyfont=\toks38
635\thm@headfont=\toks39
636\thm@notefont=\toks40
637\thm@headpunct=\toks41
638\thm@preskip=\skip60
639\thm@postskip=\skip61
640\thm@headsep=\skip62
641\dth@everypar=\toks42
642)
643\c@theorem=\count310
644)
645(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty))
646(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
647(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty)
648(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty)
649(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
650\beamer@dima=\dimen275
651\beamer@dimb=\dimen276
652)
653(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty)))
654(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty
655(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty)
656(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty)
657(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty)
658(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty))
659(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
660Package: inputenc 2018/08/11 v1.3c Input encoding file
661\inpenc@prehook=\toks43
662\inpenc@posthook=\toks44
663)
664(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty
665Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ
666
667(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
668(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
669Package: pgf 2020/01/08 v3.1.5b (3.1.5b)
670
671(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
672File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
673\pgfnodeparttextbox=\box73
674) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
675File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b)
676)
677(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65
678.sty
679Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b)
680\pgf@nodesepstart=\dimen277
681\pgf@nodesepend=\dimen278
682)
683(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18
684.sty
685Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b)
686)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
687(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
688(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex))
689(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
690(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
691(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
692Package: pgffor 2020/01/08 v3.1.5b (3.1.5b)
693
694(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
695\pgffor@iter=\dimen279
696\pgffor@skip=\dimen280
697\pgffor@stack=\toks45
698\pgffor@toks=\toks46
699))
700(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
701Package: tikz 2020/01/08 v3.1.5b (3.1.5b)
702
703(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers
704.code.tex
705File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
706\pgf@plot@mark@count=\count311
707\pgfplotmarksize=\dimen281
708)
709\tikz@lastx=\dimen282
710\tikz@lasty=\dimen283
711\tikz@lastxsaved=\dimen284
712\tikz@lastysaved=\dimen285
713\tikz@lastmovetox=\dimen286
714\tikz@lastmovetoy=\dimen287
715\tikzleveldistance=\dimen288
716\tikzsiblingdistance=\dimen289
717\tikz@figbox=\box74
718\tikz@figbox@bg=\box75
719\tikz@tempbox=\box76
720\tikz@tempbox@bg=\box77
721\tikztreelevel=\count312
722\tikznumberofchildren=\count313
723\tikznumberofcurrentchild=\count314
724\tikz@fig@count=\count315
725
726(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
727File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
728\pgfmatrixcurrentrow=\count316
729\pgfmatrixcurrentcolumn=\count317
730\pgf@matrix@numberofcolumns=\count318
731)
732\tikz@expandcount=\count319
733
734(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
735zlibrarytopaths.code.tex
736File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b)
737)))
738(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex
739(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
740zlibrarymatrix.code.tex
741File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
742)
743(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
744zlibraryquotes.code.tex
745File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
746)
747(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.
748code.tex
749File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b)
750\pgfarrowinset=\dimen290
751\pgfarrowlength=\dimen291
752\pgfarrowwidth=\dimen292
753\pgfarrowlinewidth=\dimen293
754)))
755(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def
756File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode
757\l__kernel_color_stack_int=\count320
758\l__pdf_internal_box=\box78
759)
760(./5-Beamer.aux)
761\openout1 = `5-Beamer.aux'.
762
763LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 18.
764LaTeX Font Info: ... okay on input line 18.
765LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 18.
766LaTeX Font Info: ... okay on input line 18.
767LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 18.
768LaTeX Font Info: ... okay on input line 18.
769LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 18.
770LaTeX Font Info: ... okay on input line 18.
771LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 18.
772LaTeX Font Info: ... okay on input line 18.
773LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 18.
774LaTeX Font Info: ... okay on input line 18.
775LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 18.
776LaTeX Font Info: ... okay on input line 18.
777LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 18.
778LaTeX Font Info: ... okay on input line 18.
779
780*geometry* driver: auto-detecting
781*geometry* detected driver: pdftex
782*geometry* verbose mode - [ preamble ] result:
783* driver: pdftex
784* paper: custom
785* layout: <same size as paper>
786* layoutoffset:(h,v)=(0.0pt,0.0pt)
787* modes: includehead includefoot
788* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt)
789* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt)
790* \paperwidth=364.19536pt
791* \paperheight=273.14662pt
792* \textwidth=342.2953pt
793* \textheight=244.6939pt
794* \oddsidemargin=-61.31996pt
795* \evensidemargin=-61.31996pt
796* \topmargin=-72.26999pt
797* \headheight=14.22636pt
798* \headsep=0.0pt
799* \topskip=11.0pt
800* \footskip=14.22636pt
801* \marginparwidth=4.0pt
802* \marginparsep=10.0pt
803* \columnsep=10.0pt
804* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
805* \hoffset=0.0pt
806* \voffset=0.0pt
807* \mag=1000
808* \@twocolumnfalse
809* \@twosidefalse
810* \@mparswitchfalse
811* \@reversemarginfalse
812* (1in=72.27pt=25.4mm, 1cm=28.453pt)
813
814(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
815[Loading MPS to PDF converter (version 2006.09.02).]
816\scratchcounter=\count321
817\scratchdimen=\dimen294
818\scratchbox=\box79
819\nofMPsegments=\count322
820\nofMParguments=\count323
821\everyMPshowfont=\toks47
822\MPscratchCnt=\count324
823\MPscratchDim=\dimen295
824\MPnumerator=\count325
825\makeMPintoPDFobject=\count326
826\everyMPtoPDFconversion=\toks48
827) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
828Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
829Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
83085.
831
832(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
833File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
834e
835))
836ABD: EveryShipout initializing macros
837\AtBeginShipoutBox=\box80
838Package hyperref Info: Link coloring OFF on input line 18.
839
840(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
841Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
842
843(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
844Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
845)
846(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
847Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
848)
849\c@section@level=\count327
850)
851LaTeX Info: Redefining \ref on input line 18.
852LaTeX Info: Redefining \pageref on input line 18.
853LaTeX Info: Redefining \nameref on input line 18.
854
855(./5-Beamer.out) (./5-Beamer.out)
856\@outlinefile=\write5
857\openout5 = `5-Beamer.out'.
858
859LaTeX Font Info: Overwriting symbol font `operators' in version `normal'
860(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 18.
861LaTeX Font Info: Overwriting symbol font `operators' in version `bold'
862(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18.
863\symnumbers=\mathgroup6
864\sympureletters=\mathgroup7
865LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal'
866(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 18.
867LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 18.
868LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal'
869(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18.
870LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
871(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18.
872LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 18.
873LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal'
874(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 18.
875LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
876(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 18.
877LaTeX Font Info: Redeclaring math alphabet \mathit on input line 18.
878LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal'
879(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 18.
880LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
881(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 18.
882LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 18.
883LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal'
884(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18.
885LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
886(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18.
887LaTeX Font Info: Overwriting symbol font `numbers' in version `bold'
888(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18.
889LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
890(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18.
891LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold'
892(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 18.
893LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
894(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 18.
895LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
896(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18.
897LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
898(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18.
899LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
900(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 18.
901LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 18.
902LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal'
903(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 1
9048.
905LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
906(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 1
9078.
908LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
909(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp
910ut line 18.
911
912(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary
913-English.dict
914Dictionary: translator-basic-dictionary, Language: English
915)
916(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic
917tionary-English.dict
918Dictionary: translator-bibliography-dictionary, Language: English
919)
920(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict
921ionary-English.dict
922Dictionary: translator-environment-dictionary, Language: English
923)
924(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar
925y-English.dict
926Dictionary: translator-months-dictionary, Language: English
927)
928(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona
929ry-English.dict
930Dictionary: translator-numbers-dictionary, Language: English
931)
932(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona
933ry-English.dict
934Dictionary: translator-theorem-dictionary, Language: English
935) (./5-Beamer.nav)
936<img/unilu.jpg, id=20, 645.16031pt x 578.16pt>
937File: img/unilu.jpg Graphic file (type jpg)
938<use img/unilu.jpg>
939Package pdftex.def Info: img/unilu.jpg used on input line 22.
940(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
941 [1
942
943{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>]
944File: img/unilu.jpg Graphic file (type jpg)
945<use img/unilu.jpg>
946Package pdftex.def Info: img/unilu.jpg used on input line 42.
947(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
948 [2
949
950]
951<img/beamer.png, id=84, 595.22375pt x 609.27625pt>
952File: img/beamer.png Graphic file (type png)
953<use img/beamer.png>
954Package pdftex.def Info: img/beamer.png used on input line 46.
955(pdftex.def) Requested size: 208.33144pt x 213.24988pt.
956File: img/unilu.jpg Graphic file (type jpg)
957<use img/unilu.jpg>
958Package pdftex.def Info: img/unilu.jpg used on input line 46.
959(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
960 [3
961
962 <./img/beamer.png>]
963LaTeX Font Info: Trying to load font information for OMS+cmtt on input line
96459.
965
966(/usr/share/texmf/tex/latex/R/tex/latex/omscmtt.fd
967File: omscmtt.fd
968)
969LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <10.95> not available
970(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 59.
971File: img/unilu.jpg Graphic file (type jpg)
972<use img/unilu.jpg>
973Package pdftex.def Info: img/unilu.jpg used on input line 59.
974(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
975 [4
976
977]
978File: img/unilu.jpg Graphic file (type jpg)
979<use img/unilu.jpg>
980Package pdftex.def Info: img/unilu.jpg used on input line 79.
981(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
982 [5
983
984]
985File: img/unilu.jpg Graphic file (type jpg)
986<use img/unilu.jpg>
987Package pdftex.def Info: img/unilu.jpg used on input line 90.
988(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
989 [6
990
991]
992\openout4 = `5-Beamer.vrb'.
993
994 (./5-Beamer.vrb)
995File: img/unilu.jpg Graphic file (type jpg)
996<use img/unilu.jpg>
997Package pdftex.def Info: img/unilu.jpg used on input line 110.
998(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
999 [7
1000
1001]
1002LaTeX Font Info: Trying to load font information for U+msa on input line 139
1003.
1004 (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
1005File: umsa.fd 2013/01/14 v3.01 AMS symbols A
1006)
1007LaTeX Font Info: Trying to load font information for U+msb on input line 139
1008.
1009
1010(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
1011File: umsb.fd 2013/01/14 v3.01 AMS symbols B
1012)
1013LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp
1014ut line 139.
1015
1016(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd
1017File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma
1018thkerncmss.
1019)
1020File: img/unilu.jpg Graphic file (type jpg)
1021<use img/unilu.jpg>
1022Package pdftex.def Info: img/unilu.jpg used on input line 139.
1023(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1024
1025[8
1026
1027]
1028File: img/unilu.jpg Graphic file (type jpg)
1029<use img/unilu.jpg>
1030Package pdftex.def Info: img/unilu.jpg used on input line 148.
1031(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1032 [9
1033
1034]
1035File: img/unilu.jpg Graphic file (type jpg)
1036<use img/unilu.jpg>
1037Package pdftex.def Info: img/unilu.jpg used on input line 157.
1038(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1039 [10
1040
1041]
1042File: img/unilu.jpg Graphic file (type jpg)
1043<use img/unilu.jpg>
1044Package pdftex.def Info: img/unilu.jpg used on input line 168.
1045(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1046 [11
1047
1048]
1049File: img/unilu.jpg Graphic file (type jpg)
1050<use img/unilu.jpg>
1051Package pdftex.def Info: img/unilu.jpg used on input line 181.
1052(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1053 [12
1054
1055]
1056<img/diophantus.jpg, id=357, 617.30624pt x 727.71875pt>
1057File: img/diophantus.jpg Graphic file (type jpg)
1058<use img/diophantus.jpg>
1059Package pdftex.def Info: img/diophantus.jpg used on input line 200.
1060(pdftex.def) Requested size: 123.45906pt x 145.54117pt.
1061File: img/unilu.jpg Graphic file (type jpg)
1062<use img/unilu.jpg>
1063Package pdftex.def Info: img/unilu.jpg used on input line 200.
1064(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1065 [13
1066
1067 <./img/diophantus.jpg>]
1068File: img/diophantus.jpg Graphic file (type jpg)
1069<use img/diophantus.jpg>
1070Package pdftex.def Info: img/diophantus.jpg used on input line 200.
1071(pdftex.def) Requested size: 123.45906pt x 145.54117pt.
1072File: img/unilu.jpg Graphic file (type jpg)
1073<use img/unilu.jpg>
1074Package pdftex.def Info: img/unilu.jpg used on input line 200.
1075(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1076 [14
1077
1078]
1079File: img/diophantus.jpg Graphic file (type jpg)
1080<use img/diophantus.jpg>
1081Package pdftex.def Info: img/diophantus.jpg used on input line 200.
1082(pdftex.def) Requested size: 123.45906pt x 145.54117pt.
1083File: img/unilu.jpg Graphic file (type jpg)
1084<use img/unilu.jpg>
1085Package pdftex.def Info: img/unilu.jpg used on input line 200.
1086(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1087 [15
1088
1089]
1090\tf@nav=\write6
1091\openout6 = `5-Beamer.nav'.
1092
1093\tf@toc=\write7
1094\openout7 = `5-Beamer.toc'.
1095
1096\tf@snm=\write8
1097\openout8 = `5-Beamer.snm'.
1098
1099Package atveryend Info: Empty hook `BeforeClearDocument' on input line 203.
1100Package atveryend Info: Empty hook `AfterLastShipout' on input line 203.
1101 (./5-Beamer.aux)
1102Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 203.
1103Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 203.
1104Package rerunfilecheck Info: File `5-Beamer.out' has not changed.
1105(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0.
1106 )
1107Here is how much of TeX's memory you used:
1108 21979 strings out of 481239
1109 446491 string characters out of 5920377
1110 688897 words of memory out of 5000000
1111 36680 multiletter control sequences out of 15000+600000
1112 541024 words of font info for 56 fonts, out of 8000000 for 9000
1113 1141 hyphenation exceptions out of 8191
1114 58i,15n,89p,792b,780s stack positions out of 5000i,500n,10000p,200000b,80000s
1115</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmitt10.pfb></u
1116sr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/sha
1117re/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/tex
1118live/texmf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/te
1119xmf-dist/fonts/type1/public/amsfonts/cm/cmss9.pfb></usr/share/texlive/texmf-dis
1120t/fonts/type1/public/amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-dist/fo
1121nts/type1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/fonts/t
1122ype1/public/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/p
1123ublic/amsfonts/cm/cmtt10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/
1124amsfonts/cm/cmtt12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfon
1125ts/cm/cmtt8.pfb>
1126Output written on 5-Beamer.pdf (15 pages, 326492 bytes).
1127PDF statistics:
1128 483 PDF objects out of 1000 (max. 8388607)
1129 433 compressed objects within 5 object streams
1130 31 named destinations out of 1000 (max. 500000)
1131 100 words of extra memory for PDF output out of 10000 (max. 10000000)
1132
diff --git a/src/Lecture3/slides/5-Beamer.nav b/src/Lecture3/slides/5-Beamer.nav
new file mode 100644
index 0000000..86cb874
--- /dev/null
+++ b/src/Lecture3/slides/5-Beamer.nav
@@ -0,0 +1,31 @@
1\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
2\headcommand {\beamer@framepages {1}{1}}
3\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}
4\headcommand {\beamer@framepages {2}{2}}
5\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}
6\headcommand {\beamer@framepages {3}{3}}
7\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}
8\headcommand {\beamer@framepages {4}{4}}
9\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}
10\headcommand {\beamer@framepages {5}{5}}
11\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}
12\headcommand {\beamer@framepages {6}{6}}
13\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}
14\headcommand {\beamer@framepages {7}{7}}
15\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}
16\headcommand {\beamer@framepages {8}{8}}
17\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}
18\headcommand {\beamer@framepages {9}{9}}
19\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}
20\headcommand {\beamer@framepages {10}{10}}
21\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}
22\headcommand {\beamer@framepages {11}{11}}
23\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}
24\headcommand {\beamer@framepages {12}{12}}
25\headcommand {\slideentry {0}{0}{13}{13/15}{}{0}}
26\headcommand {\beamer@framepages {13}{15}}
27\headcommand {\beamer@partpages {1}{15}}
28\headcommand {\beamer@subsectionpages {1}{15}}
29\headcommand {\beamer@sectionpages {1}{15}}
30\headcommand {\beamer@documentpages {15}}
31\headcommand {\gdef \inserttotalframenumber {13}}
diff --git a/src/Lecture3/slides/5-Beamer.out b/src/Lecture3/slides/5-Beamer.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture3/slides/5-Beamer.out
diff --git a/src/Lecture3/slides/5-Beamer.pdf b/src/Lecture3/slides/5-Beamer.pdf
new file mode 100644
index 0000000..caf8aea
--- /dev/null
+++ b/src/Lecture3/slides/5-Beamer.pdf
Binary files differ
diff --git a/src/Lecture3/slides/5-Beamer.snm b/src/Lecture3/slides/5-Beamer.snm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture3/slides/5-Beamer.snm
diff --git a/src/Lecture3/slides/5-Beamer.tex b/src/Lecture3/slides/5-Beamer.tex
new file mode 100644
index 0000000..9e1ece7
--- /dev/null
+++ b/src/Lecture3/slides/5-Beamer.tex
@@ -0,0 +1,203 @@
1\documentclass[11pt]{beamer}
2\usetheme{Madrid}
3\usepackage[utf8]{inputenc}
4\usepackage{amsmath, amssymb, amsfonts, amsthm}
5\usepackage{xcolor}
6
7\usepackage{tikz-cd}
8
9\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto}
10\title{Presentations in LaTeX with Beamer}
11\logo{\includegraphics[scale=0.1]{img/unilu.jpg}}
12%\institute{University of Luxembourg}
13
14\newcommand{\bs}{\textbackslash}
15
16\date{2021-03-26}
17
18\begin{document}
19
20\begin{frame}
21 \titlepage
22\end{frame}
23
24\begin{frame}{Why presentation with LaTeX?}
25 Pros:
26
27 \vspace{0.2cm}
28 \begin{itemize}
29 \item Easy to include formulas and theorems
30 \item Portability: \texttt{pdf} = \textbf{portable} document format
31 \item Very fast to get ``good enough'' results (subjective)
32 \end{itemize}
33
34 \vspace{0.5cm}
35 Cons:
36
37 \vspace{0.2cm}
38 \begin{itemize}
39 \item Advanced animations not possible with pdf
40 \item Lack of other presentation-specific features
41 \end{itemize}
42\end{frame}
43
44\begin{frame}{Structure of a Beamer document}
45 \includegraphics[scale=0.35]{img/beamer.png}
46\end{frame}
47
48\begin{frame}{The \texttt{frame} environment}
49 \texttt{\bs begin\{frame\}[options]\{Title\} \,\dots\, \bs end\{frame\}}
50
51 \vspace{0.5cm}
52 Useful options:
53 \begin{itemize}
54 \item \texttt{plain}: no bars on bottom or side
55 \item \texttt{shrink}: content is shrunk to fit in the slide
56 \item \texttt{fragile}: when you have \texttt{tikzpicture},
57 \texttt{listings} or similar
58 \end{itemize}
59\end{frame}
60
61\begin{frame}{Basic animations}
62 \begin{itemize}
63 \item \texttt{\bs pause} for a simple break
64
65 \vspace{0.3cm}
66 \item \texttt{\bs only<start-(end)>\{\emph{stuff}\}} to show
67 \emph{\texttt{stuff}} only on some slides
68
69 Shortcut for lists: \texttt{\bs item<\dots>} or
70 \texttt{\bs begin\{itemize\}[<+->]}
71
72 \vspace{0.3cm}
73 \item Optional:
74 \texttt{\bs setbeamercovered\{transparent\}} (see end of slides)
75
76 \vspace{0.3cm}
77 \item \texttt{\bs uncover<\dots>} does not take space when invisible
78 \end{itemize}
79\end{frame}
80
81\begin{frame}{Theorems and lists}
82 \begin{theorem} This is a Theorem \end{theorem}
83 \begin{proof} With proof \end{proof}
84
85 \begin{itemize}
86 \item \texttt{theorem}, \texttt{proof} and \texttt{definition} already
87 included with beamer.
88 \item Define new theorems as usual (they get a box automatically)
89 \end{itemize}
90\end{frame}
91
92\begin{frame}[fragile]{Custom blocks}
93
94 {
95 \setbeamercolor{block title}{fg=blue,bg=green}
96 \setbeamercolor{block body}{fg=black,bg=pink!50}
97 \begin{block}{A custom block, with ugly colors}
98 \begin{verbatim}
99{
100 \setbeamercolor{block title}{fg=blue,bg=green}
101 \setbeamercolor{block body}{fg=black,bg=pink!50}
102
103 \begin{block}{A custom block, with ugly colors}
104 ...
105 \end{block}
106}
107 \end{verbatim}
108 \end{block}
109 }
110\end{frame}
111
112
113\begin{frame}{Multiple columns}
114 \begin{columns}
115 \column{0.3\textwidth}
116 \texttt{\bs begin\{columns\}}
117
118 \texttt{\qquad\bs column\{\emph{width}\}}
119
120 \texttt{\qquad(stuff)}
121
122 \texttt{\qquad\bs column\{\emph{width}\}}
123
124 \texttt{\qquad(more stuff)}
125
126 \texttt{\qquad\qquad\vdots}
127
128 \texttt{\bs end\{columns\}}
129 \column{0.7\textwidth}
130 \begin{itemize}
131 \item \texttt{\emph{width}} is a length (example:
132 \texttt{0.7\bs textwidth})
133 \item Example: picture on the left, text on the right
134 \item Not specific to Beamer
135 \item Alternative: \texttt{tabular}
136 \end{itemize}
137 \end{columns}
138
139\end{frame}
140
141\begin{frame}{Some advice}
142 \begin{itemize}
143 \item Do not prepare too many slides (1-2 minutes per slide)
144 \item Do not write too much in each slide (split if necessary)
145 \item Pictures and \texttt{itemize}s are great, sentences are not
146 \item Animations are ok (but are they worth the effort?)
147 \end{itemize}
148\end{frame}
149
150\begin{frame}{Examples}
151 Three examples will follow:
152 \begin{itemize}
153 \item A horrible slide
154 \item A better slide with the same content
155 \item A better better slide that took a little more time to write
156 \end{itemize}
157\end{frame}
158
159\begin{frame}{Diophantine equations (bad)}
160 Diophantine equations are a very old problem, dating back to Diophantus of
161 Alexandria (III century A.D.).
162
163 Despite this, they are still today a very hard problem, and there is
164 no general method or algorithm to solve them.
165
166 A notable example is \emph{Fermat's Last Theorem}, stated for the first time
167 in 1637 but proved to be true only in 1995, after more than 350 years!
168\end{frame}
169
170
171\begin{frame}{Diophantine Equations (better)}
172 \begin{itemize}
173 \item Very old problem
174
175 \vspace{0.3cm}
176 \item Very simple formulation, but very hard to solve!
177
178 \vspace{0.3cm}
179 \item ``Fermat's Last Theorem'': stated in 1637 - proved in 1995
180 \end{itemize}
181\end{frame}
182
183\setbeamercovered{transparent}
184\begin{frame}{Diophantine Equations (better better)}
185 \begin{columns}
186 \column{0.45\textwidth}
187 \begin{figure}
188 \begin{center}
189 \includegraphics[scale=0.2]{img/diophantus.jpg}
190 {\footnotesize Diophantus of Alexandria\\ (III century A.D.)}
191 \end{center}
192 \end{figure}
193 \column{0.55\textwidth}
194 \begin{itemize}
195 \item<1-> Very old problem
196 \item<2-> Very simple formulation, but very hard to solve!
197 \item<3-> \emph{Fermat's Last Theorem}: stated in 1637 - proved in 1995
198 \end{itemize}
199 \end{columns}
200\end{frame}
201
202
203\end{document}
diff --git a/src/Lecture3/slides/5-Beamer.toc b/src/Lecture3/slides/5-Beamer.toc
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture3/slides/5-Beamer.toc
diff --git a/src/Lecture3/slides/5-Beamer.vrb b/src/Lecture3/slides/5-Beamer.vrb
new file mode 100644
index 0000000..ef0a439
--- /dev/null
+++ b/src/Lecture3/slides/5-Beamer.vrb
@@ -0,0 +1,18 @@
1\frametitle{Custom blocks}
2
3 {
4 \setbeamercolor{block title}{fg=blue,bg=green}
5 \setbeamercolor{block body}{fg=black,bg=pink!50}
6 \begin{block}{A custom block, with ugly colors}
7 \begin{verbatim}
8{
9 \setbeamercolor{block title}{fg=blue,bg=green}
10 \setbeamercolor{block body}{fg=black,bg=pink!50}
11
12 \begin{block}{A custom block, with ugly colors}
13 ...
14 \end{block}
15}
16 \end{verbatim}
17 \end{block}
18 }
diff --git a/src/Lecture3/slides/img/beamer.png b/src/Lecture3/slides/img/beamer.png
new file mode 100644
index 0000000..032c2e4
--- /dev/null
+++ b/src/Lecture3/slides/img/beamer.png
Binary files differ
diff --git a/src/Lecture3/slides/img/diophantus.jpg b/src/Lecture3/slides/img/diophantus.jpg
new file mode 100644
index 0000000..c839140
--- /dev/null
+++ b/src/Lecture3/slides/img/diophantus.jpg
Binary files differ
diff --git a/src/Lecture3/slides/img/unilu.jpg b/src/Lecture3/slides/img/unilu.jpg
new file mode 100644
index 0000000..5265563
--- /dev/null
+++ b/src/Lecture3/slides/img/unilu.jpg
Binary files differ
diff --git a/src/Lecture4/live/live.zip b/src/Lecture4/live/live.zip
new file mode 100644
index 0000000..81e11a8
--- /dev/null
+++ b/src/Lecture4/live/live.zip
Binary files differ
diff --git a/src/Lecture4/live/live1.py b/src/Lecture4/live/live1.py
new file mode 100644
index 0000000..da505f2
--- /dev/null
+++ b/src/Lecture4/live/live1.py
@@ -0,0 +1,17 @@
1print(2+2)
2
3x = input("Input something: ")
4print("Your input was:", x, "of type", type(x))
5
6x_number = int(x)
7print("Converted to a number:", x_number, "of type", type(x_number))
8
9if x_number > 10:
10 print("Your number was large!")
11 print("It was larger than 10")
12 z = x_number-10
13 print("This is a smaller number:", z)
14else:
15 print("Your number was small")
16
17print("Bye")
diff --git a/src/Lecture4/live/live2.py b/src/Lecture4/live/live2.py
new file mode 100644
index 0000000..041bda3
--- /dev/null
+++ b/src/Lecture4/live/live2.py
@@ -0,0 +1,7 @@
1x = int(input("Input something: "))
2
3while x > 10:
4 print("Large number!", x)
5 x = x - 1
6
7print("Bye")
diff --git a/src/Lecture4/live/live3.py b/src/Lecture4/live/live3.py
new file mode 100644
index 0000000..14aa89b
--- /dev/null
+++ b/src/Lecture4/live/live3.py
@@ -0,0 +1,9 @@
1x = int(input("Input something: "))
2
3A = [1,2,3]
4
5for i in range(2,9):
6 z = 10**i
7 print("A power of 10:", z)
8
9print("Bye")
diff --git a/src/Lecture4/live/live4.py b/src/Lecture4/live/live4.py
new file mode 100644
index 0000000..b011675
--- /dev/null
+++ b/src/Lecture4/live/live4.py
@@ -0,0 +1,39 @@
1
2def fun(a, b):
3 print("This is function fun")
4 print("I am executing!")
5 print("Your parameter a:", a)
6 z = a + b
7 if z > 10:
8 print("Your sum is large!", z)
9 while z > 5:
10 print("Decreasing sum:", z-1)
11 z = z - 1
12
13#fun(2, 11)
14#print("..")
15#fun(0, 7)
16
17def g(x, y):
18 #print("This is function g")
19 return (x**2 +1)*y
20
21print(g(10,2)-100)
22
23
24def fibo(n):
25 if n == 0:
26 return 0
27 if n == 1:
28 return 1
29 return fibo(n-1) + fibo(n-2)
30
31
32
33print(fibo(5))
34F = [fibo(x) for x in range(6)]
35print(F)
36
37
38
39
diff --git a/src/Lecture4/live/live_interactive.py b/src/Lecture4/live/live_interactive.py
new file mode 100644
index 0000000..671cbad
--- /dev/null
+++ b/src/Lecture4/live/live_interactive.py
@@ -0,0 +1,172 @@
12+2
23*5
33/5
43 // 5
52.5 + (456 - 0.3)
62 ** 10
713 // 5
813 % 5
9sqrt(3)
10import math
11sqrt(3)
12math.sqrt(3)
13help()
14math
15asfdads
162+2
17help("import")
18sqrt(10)
19math.sqrt(10)
20from math import *
21sqrt(10)
2210 - _
23_
24x = 10 + sqrt(3)
25x
26abc_3 = 45+3*(2-1.4)
27abc_3
28x / (abc_3+2)
29x
30x = 3*abc_3
31x
32abc_3 = 0
33abc_3
34x
351 = 1
361 == 1
371 == 3
38x
39type(x)
40abc_3
41type(abc_3)
42type(3/2)
43type(3/1)
443/1
45type(1 == 1)
46y = False
47z = (2 == 2)
48y
49z
50type(z)
51type(y)
52y and z
53True and True
54y or z
55not True
563 >= 4
573 >= 3
583 > 3
593 != 4
60hello
61"hello"
62type("hello")
63st = "Hello, World!"
64st
65type(st)
66len(st)
67"hello" + ", world"
68"abc" + "abc"
692 * "abc"
7010 * "abc"
71"hello" * "abc"
72True + False
73[1,2,3,1,-1.5]
74[1,True,"hello"]
75L = [1,True,"hello"]
76type(L)
77{1,2,3,1,-1.5}
78{12, 25, 10, -1}
79len(L)
80len({1,1,1})
81{1,1,1}
821 in L
83-42 in L
841.5 in {2,3.1,1.5}
85S = {-2, 0, 10, 25}
86max(S)
87min(S)
88sum(S)
89sum([10,2,45])
90L
91min(L)
92L2 = [1,2, 1, -2, 0, 2]
93set(L2)
94list({1,2,1,3,-2})
95S
96list(S)
97[x**2 for x in [-1,4,1,0] if x < 3]
98{x**2 for x in [-1,4,1,0] if x < 3}
99{x+2 for x in [-1,4,1,0] if x < 3}
100{x+2 for x in {-1,4,1,0} if x < 3}
101[x+2 for x in {-1,4,1,0} if x < 3]
102[x+2 for x in {-1,4,1,0} if True]
103[x+2 for x in {-1,4,1,0}]
104[x+2 for x in {-1,4,1,0} if x+10-3.24 < x^2]
105[i*j for i in [0,1,2,3] for j in {-1,1}]
106range(0,4)
107type(range(0,4))
108[i*j for i in range(0,4) for j in {-1,1}]
109list(range(0,4))
110list(range(3,4))
111list(range(3,10))
112list(range(10))
113list(range(1,10,2))
114list(range(10,1,-1))
115L
116L[0]
117L[1]
118L[2]
119L[10]
120L[-1]
121L[len(L)-1]
122L[len(L)-3]
123L[-3]
124L2
125L[1:4]
126L2[1:4]
127L2[1:4:2]
128R=range(10)
129R
130R=list(range(10))
131R
132R[2:8:2]
133R[9:3:-1]
134R
135type(R)
136R[3]
137R[3] = 3.14
138R
139R.append(10)
140R
141R.insert(3,3.0)
142R
143R[3]
144del R[4]
145R
146L
147R
148L + R
149L
150R
151L * 3
1523 * L
153S
154type(S)
155S.add(3)
156S
157S.add(10)
158S
159S.remove(25)
160S
161T = {3, -2, 27, 99}
162{3, -2} < T
163{3, -2} < S
164S >= {3, -2}
165S >= S
166S > S
167S | T
168S & T
169S - T
1702+3
171import readline
172readline.write_history_file('live_interactive.py')
diff --git a/src/Lecture4/slides/6-PythonIntroduction.aux b/src/Lecture4/slides/6-PythonIntroduction.aux
new file mode 100644
index 0000000..49f1525
--- /dev/null
+++ b/src/Lecture4/slides/6-PythonIntroduction.aux
@@ -0,0 +1,76 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand{\transparent@use}[1]{}
4\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
5\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
6\global\let\oldcontentsline\contentsline
7\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
8\global\let\oldnewlabel\newlabel
9\gdef\newlabel#1#2{\newlabelxx{#1}#2}
10\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
11\AtEndDocument{\ifx\hyper@anchor\@undefined
12\let\contentsline\oldcontentsline
13\let\newlabel\oldnewlabel
14\fi}
15\fi}
16\global\let\hyper@last\relax
17\gdef\HyperFirstAtBeginDocument#1{#1}
18\providecommand\HyField@AuxAddToFields[1]{}
19\providecommand\HyField@AuxAddToCoFields[2]{}
20\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
21\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
22\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}}
23\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}}
24\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}}
25\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}}
26\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}}
27\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}}
28\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}}
29\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}}
30\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}}
31\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}}
32\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}}
33\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}}
34\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}}
35\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}}
36\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}}
37\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}}
38\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}}
39\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}}
40\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}}
41\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}}
42\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}}
43\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}}
44\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}}
45\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}}
46\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}}
47\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}}
48\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}}
49\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}}
50\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}}
51\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}}
52\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}}
53\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}}
54\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}}
55\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}}
56\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}}
57\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}}
58\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}}
59\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}}
60\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}}
61\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}}
62\@writefile{nav}{\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}}
63\@writefile{nav}{\headcommand {\beamer@framepages {22}{22}}}
64\@writefile{nav}{\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}}}
65\@writefile{nav}{\headcommand {\beamer@framepages {23}{23}}}
66\@writefile{nav}{\headcommand {\slideentry {0}{0}{24}{24/24}{}{0}}}
67\@writefile{nav}{\headcommand {\beamer@framepages {24}{24}}}
68\@writefile{nav}{\headcommand {\slideentry {0}{0}{25}{25/25}{}{0}}}
69\@writefile{nav}{\headcommand {\beamer@framepages {25}{25}}}
70\@writefile{nav}{\headcommand {\slideentry {0}{0}{26}{26/26}{}{0}}}
71\@writefile{nav}{\headcommand {\beamer@framepages {26}{26}}}
72\@writefile{nav}{\headcommand {\beamer@partpages {1}{26}}}
73\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{26}}}
74\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{26}}}
75\@writefile{nav}{\headcommand {\beamer@documentpages {26}}}
76\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {26}}}
diff --git a/src/Lecture4/slides/6-PythonIntroduction.log b/src/Lecture4/slides/6-PythonIntroduction.log
new file mode 100644
index 0000000..7f499c9
--- /dev/null
+++ b/src/Lecture4/slides/6-PythonIntroduction.log
@@ -0,0 +1,1283 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2021.5.20) 25 MAY 2021 16:16
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**6-PythonIntroduction.tex
6(./6-PythonIntroduction.tex
7LaTeX2e <2020-02-02> patch level 2
8L3 programming layer <2020-02-14>
9(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
10Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations
11(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
12(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
13Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW)
14\etb@tempcnta=\count167
15)
16\beamer@tempbox=\box45
17\beamer@tempcount=\count168
18\c@beamerpauses=\count169
19
20(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
21\beamer@slideinframe=\count170
22\beamer@minimum=\count171
23\beamer@decode@box=\box46
24)
25\beamer@commentbox=\box47
26\beamer@modecount=\count172
27)
28(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
29Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead.
30
31(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
32Package: iftex 2019/11/07 v1.0c TeX engine tests
33))
34\headdp=\dimen134
35\footheight=\dimen135
36\sidebarheight=\dimen136
37\beamer@tempdim=\dimen137
38\beamer@finalheight=\dimen138
39\beamer@animht=\dimen139
40\beamer@animdp=\dimen140
41\beamer@animwd=\dimen141
42\beamer@leftmargin=\dimen142
43\beamer@rightmargin=\dimen143
44\beamer@leftsidebar=\dimen144
45\beamer@rightsidebar=\dimen145
46\beamer@boxsize=\dimen146
47\beamer@vboxoffset=\dimen147
48\beamer@descdefault=\dimen148
49\beamer@descriptionwidth=\dimen149
50\beamer@lastskip=\skip47
51\beamer@areabox=\box48
52\beamer@animcurrent=\box49
53\beamer@animshowbox=\box50
54\beamer@sectionbox=\box51
55\beamer@logobox=\box52
56\beamer@linebox=\box53
57\beamer@sectioncount=\count173
58\beamer@subsubsectionmax=\count174
59\beamer@subsectionmax=\count175
60\beamer@sectionmax=\count176
61\beamer@totalheads=\count177
62\beamer@headcounter=\count178
63\beamer@partstartpage=\count179
64\beamer@sectionstartpage=\count180
65\beamer@subsectionstartpage=\count181
66\beamer@animationtempa=\count182
67\beamer@animationtempb=\count183
68\beamer@xpos=\count184
69\beamer@ypos=\count185
70\beamer@ypos@offset=\count186
71\beamer@showpartnumber=\count187
72\beamer@currentsubsection=\count188
73\beamer@coveringdepth=\count189
74\beamer@sectionadjust=\count190
75\beamer@tocsectionnumber=\count191
76
77(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
78(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
79Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
80\KV@toks@=\toks14
81))
82\beamer@paperwidth=\skip48
83\beamer@paperheight=\skip49
84
85(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
86Package: geometry 2020/01/02 v5.9 Page Geometry
87
88(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
89Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
90)
91\Gm@cnth=\count192
92\Gm@cntv=\count193
93\c@Gm@tempcnt=\count194
94\Gm@bindingoffset=\dimen150
95\Gm@wd@mp=\dimen151
96\Gm@odd@mp=\dimen152
97\Gm@even@mp=\dimen153
98\Gm@layoutwidth=\dimen154
99\Gm@layoutheight=\dimen155
100\Gm@layouthoffset=\dimen156
101\Gm@layoutvoffset=\dimen157
102\Gm@dimlist=\toks15
103)
104(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
105File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option)
106)
107(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
108(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
109Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR)
110
111(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
112Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR)
113
114(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
115Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
116)
117(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
118File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
119)
120Package graphics Info: Driver file: pdftex.def on input line 105.
121
122(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
123File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
124))
125\Gin@req@height=\dimen158
126\Gin@req@width=\dimen159
127)
128(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
129(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
130(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
131\pgfutil@everybye=\toks16
132\pgfutil@tempdima=\dimen160
133\pgfutil@tempdimb=\dimen161
134
135(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t
136ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
137\pgfutil@abb=\box54
138(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty
139Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS)
140))
141(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
142(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex)
143Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b)
144))
145(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
146Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b)
147
148(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
149\pgfkeys@pathtoks=\toks17
150\pgfkeys@temptoks=\toks18
151
152(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t
153ex
154\pgfkeys@tmptoks=\toks19
155))
156\pgf@x=\dimen162
157\pgf@y=\dimen163
158\pgf@xa=\dimen164
159\pgf@ya=\dimen165
160\pgf@xb=\dimen166
161\pgf@yb=\dimen167
162\pgf@xc=\dimen168
163\pgf@yc=\dimen169
164\pgf@xd=\dimen170
165\pgf@yd=\dimen171
166\w@pgf@writea=\write3
167\r@pgf@reada=\read2
168\c@pgf@counta=\count195
169\c@pgf@countb=\count196
170\c@pgf@countc=\count197
171\c@pgf@countd=\count198
172\t@pgf@toka=\toks20
173\t@pgf@tokb=\toks21
174\t@pgf@tokc=\toks22
175\pgf@sys@id@count=\count199
176 (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
177File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b)
178)
179Driver file for pgf: pgfsys-pdftex.def
180
181(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
182File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b)
183
184(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de
185f
186File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b)
187)))
188(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.
189tex
190File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b)
191\pgfsyssoftpath@smallbuffer@items=\count266
192\pgfsyssoftpath@bigbuffer@items=\count267
193)
194(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.
195tex
196File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b)
197)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
198Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
199
200(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
201File: color.cfg 2016/01/02 v1.6 sample color configuration
202)
203Package xcolor Info: Driver file: pdftex.def on input line 225.
204Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
205Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
206Package xcolor Info: Model `RGB' extended on input line 1364.
207Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
208Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
209Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
210Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
211Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
212Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
213)
214(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
215Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b)
216
217(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
218(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
219(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
220(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
221\pgfmath@dimen=\dimen172
222\pgfmath@count=\count268
223\pgfmath@box=\box55
224\pgfmath@toks=\toks23
225\pgfmath@stack@operand=\toks24
226\pgfmath@stack@operation=\toks25
227)
228(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
229(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code
230.tex)
231(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet
232ric.code.tex)
233(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod
234e.tex)
235(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison
236.code.tex)
237(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.
238tex)
239(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code
240.tex)
241(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.
242tex)
243(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari
244thmetics.code.tex)))
245(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
246\c@pgfmathroundto@lastzeros=\count269
247))
248(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
249(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te
250x
251File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b)
252\pgf@picminx=\dimen173
253\pgf@picmaxx=\dimen174
254\pgf@picminy=\dimen175
255\pgf@picmaxy=\dimen176
256\pgf@pathminx=\dimen177
257\pgf@pathmaxx=\dimen178
258\pgf@pathminy=\dimen179
259\pgf@pathmaxy=\dimen180
260\pgf@xx=\dimen181
261\pgf@xy=\dimen182
262\pgf@yx=\dimen183
263\pgf@yy=\dimen184
264\pgf@zx=\dimen185
265\pgf@zy=\dimen186
266)
267(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.
268code.tex
269File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b)
270\pgf@path@lastx=\dimen187
271\pgf@path@lasty=\dimen188
272)
273(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code
274.tex
275File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
276\pgf@shorten@end@additional=\dimen189
277\pgf@shorten@start@additional=\dimen190
278)
279(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te
280x
281File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
282\pgfpic=\box56
283\pgf@hbox=\box57
284\pgf@layerbox@main=\box58
285\pgf@picture@serial@count=\count270
286)
287(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c
288ode.tex
289File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b)
290\pgflinewidth=\dimen191
291)
292(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation
293s.code.tex
294File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b)
295\pgf@pt@x=\dimen192
296\pgf@pt@y=\dimen193
297\pgf@pt@temp=\dimen194
298)
299(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
300File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b)
301)
302(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t
303ex
304File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b)
305)
306(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing
307.code.tex
308File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b)
309)
310(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te
311x
312File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b)
313\pgfarrowsep=\dimen195
314)
315(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
316File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b)
317\pgf@max=\dimen196
318\pgf@sys@shading@range@num=\count271
319\pgf@shadingcount=\count272
320)
321(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
322File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
323
324(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.
325tex
326File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b)
327\pgfexternal@startupbox=\box59
328))
329(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te
330x
331File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
332)
333(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c
334ode.tex
335File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b)
336)
337(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.
338tex
339File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b)
340)
341(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
342File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b)
343))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
344Package: xxcolor 2003/10/24 ver 0.1
345\XC@nummixins=\count273
346\XC@countmixins=\count274
347)
348(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
349Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO)
350
351(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
352Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
353)
354(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
355Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO)
356))
357(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
358Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX
359
360(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty
361Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO
362)
363Package pdftexcmds Info: \pdf@primitive is available.
364Package pdftexcmds Info: \pdf@ifprimitive is available.
365Package pdftexcmds Info: \pdfdraftmode found.
366)
367(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
368Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
369)
370(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
371Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
372)
373(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
374Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
375)
376(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
377Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
378)
379(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
380Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
381)
382(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
383Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
384)
385(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
386Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO)
387)
388\@linkdim=\dimen197
389\Hy@linkcounter=\count275
390\Hy@pagecounter=\count276
391
392(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
393File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO)
394Now handling font encoding PD1 ...
395... no UTF-8 mapping file for font encoding PD1
396)
397(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
398Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
399)
400(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
401Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
402)
403\Hy@SavedSpaceFactor=\count277
404\pdfmajorversion=\count278
405Package hyperref Info: Option `bookmarks' set `true' on input line 4421.
406Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421.
407Package hyperref Info: Option `implicit' set `false' on input line 4421.
408Package hyperref Info: Hyper figures OFF on input line 4547.
409Package hyperref Info: Link nesting OFF on input line 4552.
410Package hyperref Info: Hyper index ON on input line 4555.
411Package hyperref Info: Plain pages OFF on input line 4562.
412Package hyperref Info: Backreferencing OFF on input line 4567.
413Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals.
414Package hyperref Info: Bookmarks ON on input line 4800.
415\c@Hy@tempcnt=\count279
416
417(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty
418\Urlmuskip=\muskip16
419Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
420)
421LaTeX Info: Redefining \url on input line 5159.
422\XeTeXLinkMargin=\dimen198
423
424(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
425Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
426
427(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
428Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
429)
430))
431\Fld@menulength=\count280
432\Field@Width=\dimen199
433\Fld@charsize=\dimen256
434Package hyperref Info: Hyper figures OFF on input line 6430.
435Package hyperref Info: Link nesting OFF on input line 6435.
436Package hyperref Info: Hyper index ON on input line 6438.
437Package hyperref Info: backreferencing OFF on input line 6445.
438Package hyperref Info: Link coloring OFF on input line 6450.
439Package hyperref Info: Link coloring with OCG OFF on input line 6455.
440Package hyperref Info: PDF/A mode OFF on input line 6460.
441LaTeX Info: Redefining \ref on input line 6500.
442LaTeX Info: Redefining \pageref on input line 6504.
443\Hy@abspage=\count281
444
445
446Package hyperref Message: Stopped early.
447
448)
449Package hyperref Info: Driver (autodetected): hpdftex.
450 (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
451File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX
452
453(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
454Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO)
455)
456\Fld@listcount=\count282
457\c@bookmark@seq@number=\count283
458
459(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
460Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
461
462(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
463Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
464)
465Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
46686.
467))
468(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
469(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty)
470(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
471(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
472Package: amssymb 2013/01/14 v3.01 AMS font symbols
473
474(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
475Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
476\@emptytoks=\toks26
477\symAMSa=\mathgroup4
478\symAMSb=\mathgroup5
479LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
480LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
481(Font) U/euf/m/n --> U/euf/b/n on input line 106.
482))
483(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
484Package: sansmathaccent 2020/01/31
485
486(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
487Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files)
488)))
489(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
490(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
491Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX
492))
493(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty)
494(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty)
495(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
496\beamer@argscount=\count284
497\beamer@lastskipcover=\skip50
498\beamer@trivlistdepth=\count285
499)
500(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty)
501(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
502\c@lecture=\count286
503\c@part=\count287
504\c@section=\count288
505\c@subsection=\count289
506\c@subsubsection=\count290
507)
508(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
509\beamer@framebox=\box60
510\beamer@frametitlebox=\box61
511\beamer@zoombox=\box62
512\beamer@zoomcount=\count291
513\beamer@zoomframecount=\count292
514\beamer@frametextheight=\dimen257
515\c@subsectionslide=\count293
516\beamer@frametopskip=\skip51
517\beamer@framebottomskip=\skip52
518\beamer@frametopskipautobreak=\skip53
519\beamer@framebottomskipautobreak=\skip54
520\beamer@envbody=\toks27
521\framewidth=\dimen258
522\c@framenumber=\count294
523)
524(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
525\beamer@verbatimfileout=\write4
526)
527(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
528\beamer@splitbox=\box63
529\beamer@autobreakcount=\count295
530\beamer@autobreaklastheight=\dimen259
531\beamer@frametitletoks=\toks28
532\beamer@framesubtitletoks=\toks29
533)
534(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
535\beamer@footins=\box64
536)
537(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty)
538(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
539\beamer@frameboxcopy=\box65
540)
541(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty)
542(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
543\beamer@sbttoks=\toks30
544
545(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
546(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
547\bmb@box=\box66
548\bmb@colorbox=\box67
549\bmb@boxshadow=\box68
550\bmb@boxshadowball=\box69
551\bmb@boxshadowballlarge=\box70
552\bmb@temp=\dimen260
553\bmb@dima=\dimen261
554\bmb@dimb=\dimen262
555\bmb@prevheight=\dimen263
556)
557\beamer@blockheadheight=\dimen264
558))
559(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
560(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
561Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
562\@enLab=\toks31
563)
564\c@figure=\count296
565\c@table=\count297
566\abovecaptionskip=\skip55
567\belowcaptionskip=\skip56
568)
569(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
570\beamer@section@min@dim=\dimen265
571)
572(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
573(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
574Package: amsmath 2020/01/20 v2.17e AMS math features
575\@mathmargin=\skip57
576
577For additional information on amsmath, use the `?' option.
578(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
579Package: amstext 2000/06/29 v2.01 AMS text
580
581(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
582File: amsgen.sty 1999/11/30 v2.0 generic functions
583\@emptytoks=\toks32
584\ex@=\dimen266
585))
586(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
587Package: amsbsy 1999/11/29 v1.2d Bold Symbols
588\pmbraise@=\dimen267
589)
590(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
591Package: amsopn 2016/03/08 v2.02 operator names
592)
593\inf@bad=\count298
594LaTeX Info: Redefining \frac on input line 227.
595\uproot@=\count299
596\leftroot@=\count300
597LaTeX Info: Redefining \overline on input line 389.
598\classnum@=\count301
599\DOTSCASE@=\count302
600LaTeX Info: Redefining \ldots on input line 486.
601LaTeX Info: Redefining \dots on input line 489.
602LaTeX Info: Redefining \cdots on input line 610.
603\Mathstrutbox@=\box71
604\strutbox@=\box72
605\big@size=\dimen268
606LaTeX Font Info: Redeclaring font encoding OML on input line 733.
607LaTeX Font Info: Redeclaring font encoding OMS on input line 734.
608\macc@depth=\count303
609\c@MaxMatrixCols=\count304
610\dotsspace@=\muskip17
611\c@parentequation=\count305
612\dspbrk@lvl=\count306
613\tag@help=\toks33
614\row@=\count307
615\column@=\count308
616\maxfields@=\count309
617\andhelp@=\toks34
618\eqnshift@=\dimen269
619\alignsep@=\dimen270
620\tagshift@=\dimen271
621\tagwidth@=\dimen272
622\totwidth@=\dimen273
623\lineht@=\dimen274
624\@envbody=\toks35
625\multlinegap=\skip58
626\multlinetaggap=\skip59
627\mathdisplay@stack=\toks36
628LaTeX Info: Redefining \[ on input line 2859.
629LaTeX Info: Redefining \] on input line 2860.
630)
631(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
632Package: amsthm 2017/10/31 v2.20.4
633\thm@style=\toks37
634\thm@bodyfont=\toks38
635\thm@headfont=\toks39
636\thm@notefont=\toks40
637\thm@headpunct=\toks41
638\thm@preskip=\skip60
639\thm@postskip=\skip61
640\thm@headsep=\skip62
641\dth@everypar=\toks42
642)
643\c@theorem=\count310
644)
645(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty))
646(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
647(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty)
648(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty)
649(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
650\beamer@dima=\dimen275
651\beamer@dimb=\dimen276
652)
653(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty)))
654(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty
655(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty)
656(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty)
657(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty)
658(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty))
659(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
660Package: inputenc 2018/08/11 v1.3c Input encoding file
661\inpenc@prehook=\toks43
662\inpenc@posthook=\toks44
663)
664(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
665(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
666Package: pgf 2020/01/08 v3.1.5b (3.1.5b)
667
668(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
669File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
670\pgfnodeparttextbox=\box73
671) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
672File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b)
673)
674(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65
675.sty
676Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b)
677\pgf@nodesepstart=\dimen277
678\pgf@nodesepend=\dimen278
679)
680(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18
681.sty
682Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b)
683)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
684(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
685(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex))
686(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
687(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
688(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
689Package: pgffor 2020/01/08 v3.1.5b (3.1.5b)
690
691(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
692\pgffor@iter=\dimen279
693\pgffor@skip=\dimen280
694\pgffor@stack=\toks45
695\pgffor@toks=\toks46
696))
697(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
698Package: tikz 2020/01/08 v3.1.5b (3.1.5b)
699
700(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers
701.code.tex
702File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
703\pgf@plot@mark@count=\count311
704\pgfplotmarksize=\dimen281
705)
706\tikz@lastx=\dimen282
707\tikz@lasty=\dimen283
708\tikz@lastxsaved=\dimen284
709\tikz@lastysaved=\dimen285
710\tikz@lastmovetox=\dimen286
711\tikz@lastmovetoy=\dimen287
712\tikzleveldistance=\dimen288
713\tikzsiblingdistance=\dimen289
714\tikz@figbox=\box74
715\tikz@figbox@bg=\box75
716\tikz@tempbox=\box76
717\tikz@tempbox@bg=\box77
718\tikztreelevel=\count312
719\tikznumberofchildren=\count313
720\tikznumberofcurrentchild=\count314
721\tikz@fig@count=\count315
722
723(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
724File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
725\pgfmatrixcurrentrow=\count316
726\pgfmatrixcurrentcolumn=\count317
727\pgf@matrix@numberofcolumns=\count318
728)
729\tikz@expandcount=\count319
730
731(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
732zlibrarytopaths.code.tex
733File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b)
734)))
735(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
736zlibrarycalc.code.tex
737File: tikzlibrarycalc.code.tex 2020/01/08 v3.1.5b (3.1.5b)
738) (/usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
739Package: svg 2020/01/13 v2.02e (include SVG pictures)
740
741(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
742Package: scrbase 2020/01/24 v3.29 KOMA-Script package (KOMA-Script-independent
743basics and keyval usage)
744)
745(/usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
746Package: shellesc 2019/11/08 v1.0c unified shell escape interface for LaTeX
747Package shellesc Info: Unrestricted shell escape enabled on input line 75.
748)
749(/usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
750Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
751)
752\svg@box=\box78
753\c@svg@param@lastpage=\count320
754\c@svg@param@currpage=\count321
755
756(/usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
757Package: ifplatform 2017/10/13 v0.4a Testing for the operating system
758
759(/usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
760Package: catchfile 2019/12/09 v1.8 Catch the contents of a file (HO)
761)
762(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
763Package: ifluatex 2019/10/25 v1.5 ifluatex legacy package. Use iftex instead.
764)
765runsystem(uname -s > "6-PythonIntroduction.w18")...executed.
766
767
768(./6-PythonIntroduction.w18)
769runsystem(rm -- "6-PythonIntroduction.w18")...executed.
770
771))
772(/usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
773Package: transparent 2019/11/29 v1.4 Transparency via pdfTeX's color stack (HO)
774
775)
776(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def
777File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode
778\l__kernel_color_stack_int=\count322
779\l__pdf_internal_box=\box79
780)
781(./6-PythonIntroduction.aux)
782\openout1 = `6-PythonIntroduction.aux'.
783
784LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 18.
785LaTeX Font Info: ... okay on input line 18.
786LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 18.
787LaTeX Font Info: ... okay on input line 18.
788LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 18.
789LaTeX Font Info: ... okay on input line 18.
790LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 18.
791LaTeX Font Info: ... okay on input line 18.
792LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 18.
793LaTeX Font Info: ... okay on input line 18.
794LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 18.
795LaTeX Font Info: ... okay on input line 18.
796LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 18.
797LaTeX Font Info: ... okay on input line 18.
798LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 18.
799LaTeX Font Info: ... okay on input line 18.
800
801*geometry* driver: auto-detecting
802*geometry* detected driver: pdftex
803*geometry* verbose mode - [ preamble ] result:
804* driver: pdftex
805* paper: custom
806* layout: <same size as paper>
807* layoutoffset:(h,v)=(0.0pt,0.0pt)
808* modes: includehead includefoot
809* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt)
810* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt)
811* \paperwidth=364.19536pt
812* \paperheight=273.14662pt
813* \textwidth=342.2953pt
814* \textheight=244.6939pt
815* \oddsidemargin=-61.31996pt
816* \evensidemargin=-61.31996pt
817* \topmargin=-72.26999pt
818* \headheight=14.22636pt
819* \headsep=0.0pt
820* \topskip=11.0pt
821* \footskip=14.22636pt
822* \marginparwidth=4.0pt
823* \marginparsep=10.0pt
824* \columnsep=10.0pt
825* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
826* \hoffset=0.0pt
827* \voffset=0.0pt
828* \mag=1000
829* \@twocolumnfalse
830* \@twosidefalse
831* \@mparswitchfalse
832* \@reversemarginfalse
833* (1in=72.27pt=25.4mm, 1cm=28.453pt)
834
835(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
836[Loading MPS to PDF converter (version 2006.09.02).]
837\scratchcounter=\count323
838\scratchdimen=\dimen290
839\scratchbox=\box80
840\nofMPsegments=\count324
841\nofMParguments=\count325
842\everyMPshowfont=\toks47
843\MPscratchCnt=\count326
844\MPscratchDim=\dimen291
845\MPnumerator=\count327
846\makeMPintoPDFobject=\count328
847\everyMPtoPDFconversion=\toks48
848) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
849Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
850Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
85185.
852
853(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
854File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
855e
856))
857ABD: EveryShipout initializing macros
858\AtBeginShipoutBox=\box81
859Package hyperref Info: Link coloring OFF on input line 18.
860
861(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
862Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
863
864(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
865Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
866)
867(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
868Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
869)
870\c@section@level=\count329
871)
872LaTeX Info: Redefining \ref on input line 18.
873LaTeX Info: Redefining \pageref on input line 18.
874LaTeX Info: Redefining \nameref on input line 18.
875
876(./6-PythonIntroduction.out) (./6-PythonIntroduction.out)
877\@outlinefile=\write5
878\openout5 = `6-PythonIntroduction.out'.
879
880LaTeX Font Info: Overwriting symbol font `operators' in version `normal'
881(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 18.
882LaTeX Font Info: Overwriting symbol font `operators' in version `bold'
883(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18.
884\symnumbers=\mathgroup6
885\sympureletters=\mathgroup7
886LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal'
887(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 18.
888LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 18.
889LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal'
890(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18.
891LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
892(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18.
893LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 18.
894LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal'
895(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 18.
896LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
897(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 18.
898LaTeX Font Info: Redeclaring math alphabet \mathit on input line 18.
899LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal'
900(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 18.
901LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
902(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 18.
903LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 18.
904LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal'
905(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18.
906LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
907(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18.
908LaTeX Font Info: Overwriting symbol font `numbers' in version `bold'
909(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18.
910LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
911(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18.
912LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold'
913(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 18.
914LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
915(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 18.
916LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
917(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18.
918LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
919(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18.
920LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
921(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 18.
922LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 18.
923LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal'
924(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 1
9258.
926LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
927(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 1
9288.
929LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
930(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp
931ut line 18.
932
933(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary
934-English.dict
935Dictionary: translator-basic-dictionary, Language: English
936)
937(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic
938tionary-English.dict
939Dictionary: translator-bibliography-dictionary, Language: English
940)
941(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict
942ionary-English.dict
943Dictionary: translator-environment-dictionary, Language: English
944)
945(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar
946y-English.dict
947Dictionary: translator-months-dictionary, Language: English
948)
949(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona
950ry-English.dict
951Dictionary: translator-numbers-dictionary, Language: English
952)
953(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona
954ry-English.dict
955Dictionary: translator-theorem-dictionary, Language: English
956) (./6-PythonIntroduction.nav)
957<img/unilu.jpg, id=20, 645.16031pt x 578.16pt>
958File: img/unilu.jpg Graphic file (type jpg)
959<use img/unilu.jpg>
960Package pdftex.def Info: img/unilu.jpg used on input line 22.
961(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
962 [1
963
964{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>]
965LaTeX Font Info: Trying to load font information for U+msa on input line 36.
966
967
968(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
969File: umsa.fd 2013/01/14 v3.01 AMS symbols A
970)
971LaTeX Font Info: Trying to load font information for U+msb on input line 36.
972
973
974(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
975File: umsb.fd 2013/01/14 v3.01 AMS symbols B
976)
977LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp
978ut line 36.
979
980(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd
981File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma
982thkerncmss.
983)
984File: img/unilu.jpg Graphic file (type jpg)
985<use img/unilu.jpg>
986Package pdftex.def Info: img/unilu.jpg used on input line 36.
987(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
988
989[2
990
991]
992<img/laptop.png, id=81, 1079.03125pt x 1079.03125pt>
993File: img/laptop.png Graphic file (type png)
994<use img/laptop.png>
995Package pdftex.def Info: img/laptop.png used on input line 54.
996(pdftex.def) Requested size: 129.47816pt x 129.47816pt.
997
998Overfull \hbox (9.67273pt too wide) in paragraph at lines 54--54
999[][]
1000 []
1001
1002<img/equal.png, id=82, 401.5pt x 401.5pt>
1003File: img/equal.png Graphic file (type png)
1004<use img/equal.png>
1005Package pdftex.def Info: img/equal.png used on input line 54.
1006(pdftex.def) Requested size: 48.17792pt x 48.17792pt.
1007
1008Overfull \hbox (13.9463pt too wide) in paragraph at lines 54--54
1009 []
1010 []
1011
1012<img/calc.jpg, id=84, 144.54pt x 144.54pt>
1013File: img/calc.jpg Graphic file (type jpg)
1014<use img/calc.jpg>
1015Package pdftex.def Info: img/calc.jpg used on input line 54.
1016(pdftex.def) Requested size: 130.08478pt x 130.08478pt.
1017
1018Overfull \hbox (10.27934pt too wide) in paragraph at lines 54--54
1019[][]
1020 []
1021
1022File: img/unilu.jpg Graphic file (type jpg)
1023<use img/unilu.jpg>
1024Package pdftex.def Info: img/unilu.jpg used on input line 54.
1025(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1026[3
1027
1028 <./img/laptop.png> <./img/equal.png> <./img/calc.jpg>]
1029<img/python.png, id=117, 602.25pt x 602.25pt>
1030File: img/python.png Graphic file (type png)
1031<use img/python.png>
1032Package pdftex.def Info: img/python.png used on input line 72.
1033(pdftex.def) Requested size: 96.36195pt x 96.36195pt.
1034
1035Overfull \hbox (10.78813pt too wide) in paragraph at lines 72--72
1036[][]
1037 []
1038
1039File: img/unilu.jpg Graphic file (type jpg)
1040<use img/unilu.jpg>
1041Package pdftex.def Info: img/unilu.jpg used on input line 72.
1042(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1043[4
1044
1045 <./img/python.png>]
1046<img/term.png, id=147, 860.21375pt x 482.80376pt>
1047File: img/term.png Graphic file (type png)
1048<use img/term.png>
1049Package pdftex.def Info: img/term.png used on input line 78.
1050(pdftex.def) Requested size: 258.06612pt x 144.84224pt.
1051File: img/unilu.jpg Graphic file (type jpg)
1052<use img/unilu.jpg>
1053Package pdftex.def Info: img/unilu.jpg used on input line 78.
1054(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1055 [5
1056
1057 <./img/term.png>]
1058File: img/unilu.jpg Graphic file (type jpg)
1059<use img/unilu.jpg>
1060Package pdftex.def Info: img/unilu.jpg used on input line 97.
1061(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1062 [6
1063
1064]
1065File: img/unilu.jpg Graphic file (type jpg)
1066<use img/unilu.jpg>
1067Package pdftex.def Info: img/unilu.jpg used on input line 108.
1068(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1069 [7
1070
1071]
1072File: img/unilu.jpg Graphic file (type jpg)
1073<use img/unilu.jpg>
1074Package pdftex.def Info: img/unilu.jpg used on input line 119.
1075(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1076 [8
1077
1078]
1079File: img/unilu.jpg Graphic file (type jpg)
1080<use img/unilu.jpg>
1081Package pdftex.def Info: img/unilu.jpg used on input line 131.
1082(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1083 [9
1084
1085]
1086File: img/unilu.jpg Graphic file (type jpg)
1087<use img/unilu.jpg>
1088Package pdftex.def Info: img/unilu.jpg used on input line 159.
1089(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1090 [10
1091
1092]
1093LaTeX Font Info: Trying to load font information for OMS+cmtt on input line
1094175.
1095
1096(/usr/share/texmf/tex/latex/R/tex/latex/omscmtt.fd
1097File: omscmtt.fd
1098)
1099LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <10.95> not available
1100(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 175.
1101File: img/unilu.jpg Graphic file (type jpg)
1102<use img/unilu.jpg>
1103Package pdftex.def Info: img/unilu.jpg used on input line 175.
1104(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1105 [11
1106
1107]
1108File: img/unilu.jpg Graphic file (type jpg)
1109<use img/unilu.jpg>
1110Package pdftex.def Info: img/unilu.jpg used on input line 192.
1111(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1112 [12
1113
1114]
1115File: img/unilu.jpg Graphic file (type jpg)
1116<use img/unilu.jpg>
1117Package pdftex.def Info: img/unilu.jpg used on input line 219.
1118(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1119 [13
1120
1121]
1122File: img/unilu.jpg Graphic file (type jpg)
1123<use img/unilu.jpg>
1124Package pdftex.def Info: img/unilu.jpg used on input line 231.
1125(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1126 [14
1127
1128]
1129File: img/unilu.jpg Graphic file (type jpg)
1130<use img/unilu.jpg>
1131Package pdftex.def Info: img/unilu.jpg used on input line 246.
1132(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1133
1134[15
1135
1136]
1137File: img/unilu.jpg Graphic file (type jpg)
1138<use img/unilu.jpg>
1139Package pdftex.def Info: img/unilu.jpg used on input line 268.
1140(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1141 [16
1142
1143]
1144<img/geany.png, id=472, 1274.7625pt x 680.5425pt>
1145File: img/geany.png Graphic file (type png)
1146<use img/geany.png>
1147Package pdftex.def Info: img/geany.png used on input line 272.
1148(pdftex.def) Requested size: 318.68985pt x 170.13521pt.
1149File: img/unilu.jpg Graphic file (type jpg)
1150<use img/unilu.jpg>
1151Package pdftex.def Info: img/unilu.jpg used on input line 272.
1152(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1153 [17
1154
1155 <./img/geany.png>]
1156File: img/unilu.jpg Graphic file (type jpg)
1157<use img/unilu.jpg>
1158Package pdftex.def Info: img/unilu.jpg used on input line 282.
1159(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1160 [18
1161
1162]
1163\openout4 = `6-PythonIntroduction.vrb'.
1164
1165 (./6-PythonIntroduction.vrb)
1166File: img/unilu.jpg Graphic file (type jpg)
1167<use img/unilu.jpg>
1168Package pdftex.def Info: img/unilu.jpg used on input line 322.
1169(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1170 [19
1171
1172]
1173\openout4 = `6-PythonIntroduction.vrb'.
1174
1175
1176(./6-PythonIntroduction.vrb)
1177File: img/unilu.jpg Graphic file (type jpg)
1178<use img/unilu.jpg>
1179Package pdftex.def Info: img/unilu.jpg used on input line 357.
1180(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1181 [20
1182
1183]
1184File: img/unilu.jpg Graphic file (type jpg)
1185<use img/unilu.jpg>
1186Package pdftex.def Info: img/unilu.jpg used on input line 374.
1187(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1188 [21
1189
1190]
1191File: img/unilu.jpg Graphic file (type jpg)
1192<use img/unilu.jpg>
1193Package pdftex.def Info: img/unilu.jpg used on input line 393.
1194(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1195 [22
1196
1197]
1198File: img/unilu.jpg Graphic file (type jpg)
1199<use img/unilu.jpg>
1200Package pdftex.def Info: img/unilu.jpg used on input line 413.
1201(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1202 [23
1203
1204]
1205Package svg Info: Last page of `./svg-inkscape/sage_svg-tex.pdf' is 1 on input
1206line 429.
1207
1208(./svg-inkscape/sage_svg-tex.pdf_tex
1209<./svg-inkscape/sage_svg-tex.pdf, id=660, page=1, 376.40625pt x 98.51555pt>
1210File: ./svg-inkscape/sage_svg-tex.pdf Graphic file (type pdf)
1211<use ./svg-inkscape/sage_svg-tex.pdf, page 1>
1212Package pdftex.def Info: ./svg-inkscape/sage_svg-tex.pdf , page1 used on input
1213line 56.
1214(pdftex.def) Requested size: 188.20313pt x 49.25914pt.
1215)
1216File: img/unilu.jpg Graphic file (type jpg)
1217<use img/unilu.jpg>
1218Package pdftex.def Info: img/unilu.jpg used on input line 429.
1219(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1220 [24
1221
1222 <./svg-inkscape/sage_svg-tex.pdf>]
1223Overfull \hbox (7.7703pt too wide) in paragraph at lines 452--452
1224[][]
1225 []
1226
1227File: img/unilu.jpg Graphic file (type jpg)
1228<use img/unilu.jpg>
1229Package pdftex.def Info: img/unilu.jpg used on input line 452.
1230(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1231[25
1232
1233]
1234File: img/unilu.jpg Graphic file (type jpg)
1235<use img/unilu.jpg>
1236Package pdftex.def Info: img/unilu.jpg used on input line 462.
1237(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1238 [26
1239
1240]
1241\tf@nav=\write6
1242\openout6 = `6-PythonIntroduction.nav'.
1243
1244\tf@toc=\write7
1245\openout7 = `6-PythonIntroduction.toc'.
1246
1247\tf@snm=\write8
1248\openout8 = `6-PythonIntroduction.snm'.
1249
1250Package atveryend Info: Empty hook `BeforeClearDocument' on input line 465.
1251Package atveryend Info: Empty hook `AfterLastShipout' on input line 465.
1252 (./6-PythonIntroduction.aux)
1253Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 465.
1254Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 465.
1255Package rerunfilecheck Info: File `6-PythonIntroduction.out' has not changed.
1256(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0.
1257 )
1258Here is how much of TeX's memory you used:
1259 22094 strings out of 481239
1260 437179 string characters out of 5920377
1261 700483 words of memory out of 5000000
1262 36741 multiletter control sequences out of 15000+600000
1263 544835 words of font info for 71 fonts, out of 8000000 for 9000
1264 1141 hyphenation exceptions out of 8191
1265 58i,15n,67p,804b,1064s stack positions out of 5000i,500n,10000p,200000b,80000s
1266</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmitt10.pfb></u
1267sr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/sha
1268re/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/tex
1269live/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texlive/t
1270exmf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/texmf-di
1271st/fonts/type1/public/amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-dist/f
1272onts/type1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/fonts/
1273type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/
1274public/amsfonts/cm/cmtt10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public
1275/amsfonts/cm/cmtt12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfo
1276nts/cm/cmtt8.pfb>
1277Output written on 6-PythonIntroduction.pdf (26 pages, 771892 bytes).
1278PDF statistics:
1279 851 PDF objects out of 1000 (max. 8388607)
1280 762 compressed objects within 8 object streams
1281 53 named destinations out of 1000 (max. 500000)
1282 118 words of extra memory for PDF output out of 10000 (max. 10000000)
1283
diff --git a/src/Lecture4/slides/6-PythonIntroduction.nav b/src/Lecture4/slides/6-PythonIntroduction.nav
new file mode 100644
index 0000000..39da4d7
--- /dev/null
+++ b/src/Lecture4/slides/6-PythonIntroduction.nav
@@ -0,0 +1,57 @@
1\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
2\headcommand {\beamer@framepages {1}{1}}
3\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}
4\headcommand {\beamer@framepages {2}{2}}
5\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}
6\headcommand {\beamer@framepages {3}{3}}
7\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}
8\headcommand {\beamer@framepages {4}{4}}
9\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}
10\headcommand {\beamer@framepages {5}{5}}
11\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}
12\headcommand {\beamer@framepages {6}{6}}
13\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}
14\headcommand {\beamer@framepages {7}{7}}
15\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}
16\headcommand {\beamer@framepages {8}{8}}
17\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}
18\headcommand {\beamer@framepages {9}{9}}
19\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}
20\headcommand {\beamer@framepages {10}{10}}
21\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}
22\headcommand {\beamer@framepages {11}{11}}
23\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}
24\headcommand {\beamer@framepages {12}{12}}
25\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}
26\headcommand {\beamer@framepages {13}{13}}
27\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}
28\headcommand {\beamer@framepages {14}{14}}
29\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}
30\headcommand {\beamer@framepages {15}{15}}
31\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}
32\headcommand {\beamer@framepages {16}{16}}
33\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}
34\headcommand {\beamer@framepages {17}{17}}
35\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}
36\headcommand {\beamer@framepages {18}{18}}
37\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}
38\headcommand {\beamer@framepages {19}{19}}
39\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}
40\headcommand {\beamer@framepages {20}{20}}
41\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}
42\headcommand {\beamer@framepages {21}{21}}
43\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}
44\headcommand {\beamer@framepages {22}{22}}
45\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}}
46\headcommand {\beamer@framepages {23}{23}}
47\headcommand {\slideentry {0}{0}{24}{24/24}{}{0}}
48\headcommand {\beamer@framepages {24}{24}}
49\headcommand {\slideentry {0}{0}{25}{25/25}{}{0}}
50\headcommand {\beamer@framepages {25}{25}}
51\headcommand {\slideentry {0}{0}{26}{26/26}{}{0}}
52\headcommand {\beamer@framepages {26}{26}}
53\headcommand {\beamer@partpages {1}{26}}
54\headcommand {\beamer@subsectionpages {1}{26}}
55\headcommand {\beamer@sectionpages {1}{26}}
56\headcommand {\beamer@documentpages {26}}
57\headcommand {\gdef \inserttotalframenumber {26}}
diff --git a/src/Lecture4/slides/6-PythonIntroduction.out b/src/Lecture4/slides/6-PythonIntroduction.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture4/slides/6-PythonIntroduction.out
diff --git a/src/Lecture4/slides/6-PythonIntroduction.pdf b/src/Lecture4/slides/6-PythonIntroduction.pdf
new file mode 100644
index 0000000..873c99a
--- /dev/null
+++ b/src/Lecture4/slides/6-PythonIntroduction.pdf
Binary files differ
diff --git a/src/Lecture4/slides/6-PythonIntroduction.snm b/src/Lecture4/slides/6-PythonIntroduction.snm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture4/slides/6-PythonIntroduction.snm
diff --git a/src/Lecture4/slides/6-PythonIntroduction.tex b/src/Lecture4/slides/6-PythonIntroduction.tex
new file mode 100644
index 0000000..6c2ec45
--- /dev/null
+++ b/src/Lecture4/slides/6-PythonIntroduction.tex
@@ -0,0 +1,466 @@
1\documentclass[11pt]{beamer}
2\usetheme{Madrid}
3\usepackage[utf8]{inputenc}
4\usepackage{amsmath}
5
6\usepackage{tikz}
7\usetikzlibrary{calc}
8\usepackage{svg}
9
10\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto}
11\title[Python Intro and a bit of Sage]%
12{A Practical Introduction to Python (and a bit of Sage)}
13\logo{\includegraphics[scale=0.1]{img/unilu.jpg}}
14%\institute{University of Luxembourg}
15
16\date{2021-04-02}
17
18\begin{document}
19
20\begin{frame}
21 \titlepage
22\end{frame}
23
24\begin{frame}{Second part - schedule}
25 \begin{tabular}{l|c|c|l}
26 \textbf{Date} & \textbf{Topics} & \textbf{Homework} & \textbf{Deadline} \\
27 \hline
28 April 2 & Python ``review'', a bit of Sage & (see March 26) & April 18 \\
29 \hline
30 April 23 & Sage: Algebra and Crypto & Homework 3 & May 9 \\
31 \hline
32 May 7 & Sage: Analysis and Statistics & Homework 4 & May 30 \\
33 \hline
34 May 21 & Fast code, other software &
35 \end{tabular}
36\end{frame}
37
38
39\begin{frame}{What is programming?}
40 \begin{columns}
41 \column{0.35\textwidth}
42 \includegraphics[scale=0.12]{img/laptop.png}
43 \column{0.1\textwidth}
44 \begin{center}\includegraphics[scale=0.12]{img/equal.png}\end{center}
45 \column{0.35\textwidth}
46 \includegraphics[scale=0.9]{img/calc.jpg}
47 \end{columns}
48 \begin{itemize}
49 \item Software (apps): commands written in a \emph{programming language}
50 \item Programming language: mix of English and symbols
51 \item The code is \emph{compiled} to machine language (C, C++) or\\
52 \emph{interpreted} by some software in the middle (Python)
53 \end{itemize}
54\end{frame}
55
56
57\begin{frame}{Python}
58 \begin{columns}
59 \column{0.7\textwidth}
60 \url{https://www.python.org}
61
62 \vspace{0.3cm}
63 \begin{itemize}
64 \item Interpreted: slower than C, usable interactively
65 \item Simple syntax, easy to learn
66 \item Very popular
67 \item Sage is based on Python
68 \end{itemize}
69 \column{0.25\textwidth}
70 \includegraphics[scale=0.16]{img/python.png}
71 \end{columns}
72\end{frame}
73
74\begin{frame}{The interpreter - Python as a calculator}
75 \begin{center}
76 \includegraphics[scale=0.3]{img/term.png}
77 \end{center}
78\end{frame}
79
80\begin{frame}{The interpreter - Python as a calculator}
81 \url{https://www.python.org/shell}
82
83 \vspace{0.3cm}
84 \begin{itemize}
85 \item Each line executed as you enter it, result is printed
86 \item Usual math operations work: try them!
87 \begin{center}
88 \texttt{a+b, a-b, a*b, a/b}\\
89 \texttt{a**b (power), a//b (integer division), a\%b (remainder)}
90 \end{center}
91 \item More math functions:
92 \begin{center} \begin{tabular}{l}
93 \texttt{import math} \\
94 \texttt{math.sqrt(3)}
95 \end{tabular} \end{center}
96 \end{itemize}
97\end{frame}
98
99
100\begin{frame}{Help!}
101 \begin{itemize}
102 \item Type \texttt{help()} for interactive help
103 \item Try \texttt{help("math")} and \texttt{help("import")}
104 \item What does
105 \begin{center} \texttt{from math import *} \end{center}
106 do?
107 \end{itemize}
108\end{frame}
109
110\begin{frame}{Variables}
111 \texttt{variable\_name = value \qquad \# This is an assignment}
112
113 \vspace{0.3cm}
114 \begin{itemize}
115 \item Save results, use them later
116 \item \texttt{variable\_name}: combination of letters, numbers, underscores
117 \item \texttt{=} always means \emph{assignment}, never \emph{equality}
118 \end{itemize}
119\end{frame}
120
121\begin{frame}{Types}
122 \texttt{type(variable\_name) \qquad \# Get the type of a variable}
123
124 \vspace{0.3cm}
125 \begin{itemize}
126 %\item Tells the computer how to read a variable
127 \item In other languages you must specify the type of a variable
128 \item Python figures out automatically (\emph{dynamic typing})
129 \item Each type allows different operations
130 \end{itemize}
131\end{frame}
132
133
134\begin{frame}{Other types: Boolean and String}
135 \texttt{my\_bool = True}
136
137 \texttt{s1 = "hello!" \qquad \# Same as 'hello!'}
138
139 \vspace{0.3cm}
140 \begin{itemize}
141 \item \texttt{bool}: \texttt{True} or \texttt{False}
142 \begin{itemize}
143 \item Operations on \texttt{bool}:
144 \texttt{and}, \texttt{or}, \texttt{not}
145 \item Operations with boolean result: \texttt{==}, \texttt{!=},
146 \texttt{>}, \texttt{<}, \texttt{>=}, \texttt{<=}
147 \end{itemize}
148 \item \texttt{str}: a string of characters
149 \begin{itemize}
150 \item Useful operations:
151
152 \begin{tabular}{ll}
153 \texttt{len({\bf str})} & \texttt{\# Length, integer value} \\
154 \texttt{{\bf str} + {\bf str}} & \texttt{\# Concatenation} \\
155 \texttt{{\bf int} * {\bf str}} & \texttt{\# Repetition}
156 \end{tabular}
157 \end{itemize}
158 \end{itemize}
159\end{frame}
160
161\begin{frame}{Lists and sets}
162 %\texttt{(2.5, True, "hello") \qquad \# Tuple}
163
164 \texttt{[2.5, True, "hello"] \qquad \# List}
165
166 \texttt{\{2.5, True, "hello"\} \qquad \# Set}
167
168 \vspace{0.3cm}
169 \begin{itemize}
170 %\item Different collections of objects
171 %\item Tuple: immutable
172 \item Lists: keep order and duplicates
173 \item Sets: disregard order and duplicates, allow set operations
174 \end{itemize}
175\end{frame}
176
177
178\begin{frame}{Lists and sets}
179 Things in common (\emph{\texttt{A} is a list or a set}):
180
181 \vspace{0.3cm}
182 \begin{itemize}
183 \item \texttt{len(A)}: number of elements (\texttt{\bf int})
184 \item \texttt{x in A}: check if \texttt{x} is in \texttt{A}
185 (\texttt{\bf bool})
186 \item If \texttt{A} contains numbers: \texttt{max(A)}, \texttt{min(A)},
187 \texttt{sum(A)}
188 \end{itemize}
189
190 \vspace{0.3cm}
191 Pass from one type to the other: \texttt{set(A)} and \texttt{list(A)}
192\end{frame}
193
194\begin{frame}{List (and set) comprehension}
195 \texttt{[x**2 {\bf for} x {\bf in} [-1,4,1,0] {\bf if} x < 3]
196 \quad\# Result: [1,1,0]}
197
198 \texttt{\{x**2 {\bf for} x {\bf in} [-1,4,1,0] {\bf if} x < 3\}
199 \quad\# Result: \{0,1\}}
200
201 \vspace{0.3cm}
202 \begin{itemize}
203 \item Mathematical way to define lists and sets
204 \item Complete syntax:
205
206 \vspace{0.2cm}
207 \texttt{[f(x,y,\dots) {\bf for} x {\bf in} L {\bf for} y {\bf in} M
208 \dots \quad {\bf if} cond(x,y,\dots)]}
209
210 \vspace{0.2cm}
211 \begin{itemize}
212 \item Use as many variables \texttt{x, y, \dots} as you want
213 \item \texttt{L, M, \dots} are lists or sets or other collections
214 \item \texttt{f(x,y,\dots)} is any expression depending on the
215 variables
216 \item \texttt{cond(x,y,\dots)} has Boolean value
217 \end{itemize}
218 \end{itemize}
219\end{frame}
220
221\begin{frame}{Lists: access elements and sublists}
222 \begin{tabular}{ll}
223 \texttt{A[i]} &
224 \texttt{\# i-th element of A ($i\in \{0,\dots,\texttt{len(A)}-1\}$)} \\
225 \texttt{A[i] = value} & \texttt{\# Change i-th element of A} \\
226 \texttt{A[i:j:k]} & \texttt{\# Sublist from A[i] to A[j] with step k} \\
227 \texttt{A[i:j]} & \texttt{\# Same as A[i:j:1]} \\
228 \texttt{A[i:]} & \texttt{\# Same as A[i:len(A):1]} \\
229 \texttt{A[:j]} & \texttt{\# Same as A[0:j:1]}
230 \end{tabular}
231\end{frame}
232
233\begin{frame}{List operations}
234 \begin{tabular}{ll}
235 \texttt{A.append(x)} & \texttt{\# Append x to A ({\bf change A})} \\
236 \texttt{A.insert(i,x)} &
237 \texttt{\# Insert x in position i ({\bf change A})} \\
238 \texttt{del A[i]} & \texttt{\# Remove i-th element of A ({\bf change A})}\\
239 \end{tabular}
240
241 \vspace{1cm}
242 \begin{tabular}{ll}
243 \texttt{A+B} & \texttt{\# Concatenation of A and B ({\bf list})} \\
244 \texttt{A*n} & \texttt{\# Repetition of A ({\bf list})} \\
245 \end{tabular}
246\end{frame}
247
248\begin{frame}{Set operations}
249 \begin{tabular}{ll}
250 \texttt{A.add(x)} & \texttt{\# Add x to A ({\bf change A})} \\
251 \texttt{A.remove(x)} & \texttt{\# Remove x from A ({\bf change A})}\\
252 \end{tabular}
253
254 \vspace{0.5cm}
255 \begin{tabular}{ll}
256 \texttt{A < B} (or \texttt{A <= B}) &
257 \texttt{\# A contained in (or equal to) B ({\bf bool})} \\
258 \texttt{A > B} (or \texttt{A >= B}) &
259 \texttt{\# A containes (or is equal to) B ({\bf bool})} \\
260 \end{tabular}
261
262 \vspace{0.5cm}
263 \begin{tabular}{ll}
264 \texttt{A | B} & \texttt{\# Union ({\bf set})} \\
265 \texttt{A \& B} & \texttt{\# Intersection ({\bf set})}\\
266 \texttt{A - B} & \texttt{\# Set difference ({\bf set})} \\
267 \end{tabular}
268\end{frame}
269
270\begin{frame}{Writing more complex programs}
271 \begin{center}\includegraphics[scale=0.25]{img/geany.png}\end{center}
272\end{frame}
273
274\begin{frame}{Non-interactive Python}
275 \begin{itemize}
276 \item You can write a file (for example with \url{https://www.geany.org})
277 \item Output results with \texttt{print("string", or, other, values)}
278 \item Get input (\texttt{str}) with \texttt{x = input("Prompt: ")},
279 convert with \texttt{int(x)} or \texttt{float(x)}\dots
280 \item Blocks of code: use \emph{indentation} (see next slides)
281 \end{itemize}
282\end{frame}
283
284\begin{frame}[fragile]{\texttt{if} statement}
285 \begin{columns}
286 \column{0.45\textwidth}
287 \texttt{{\bf if} \emph{condition}:}
288
289 \texttt{\qquad instruction1}
290
291 \texttt{\qquad instruction2}
292
293 \texttt{\qquad \dots}
294
295 \texttt{{\bf else}: \# This is optional}
296
297 \texttt{\qquad other inst}
298 \column{0.55\textwidth}
299 \begin{tikzpicture}
300 \tikzstyle{s} = [rectangle, rounded corners, text centered,
301 draw=black, fill=red!30]
302 \tikzstyle{p} = [rectangle, text centered, draw=black, fill=orange!30]
303 \tikzstyle{d} = [rectangle, text centered, draw=black, fill=green!30]
304
305 \node(start) [s] {Start};
306 \node(cond) [d, below of=start] {\texttt{\emph{condition}}?};
307 \node(inst1) [p, right of=cond, xshift=2.7cm] {\texttt{instruction1}};
308 \node(inst2) [p, below of=inst1] {\texttt{instruction2}};
309 \node(dots) [p, below of=inst2] {\texttt{\dots}};
310 \node(other) [p, below of=cond, yshift=-0.5cm] {\texttt{other inst}};
311 \node(end) [s, below of=other, yshift=-0.5cm] {End};
312
313 \draw[->] (start) -- (cond);
314 \draw[->] (cond) -- node[anchor=south] {\texttt{True}} (inst1);
315 \draw[->] (inst1) -- (inst2);
316 \draw[->] (inst2) -- (dots);
317 \draw[->] (cond) -- node[anchor=east] {\texttt{False}} (other);
318 \draw[->] (dots) |- (end);
319 \draw[->] (other) -- (end);
320 \end{tikzpicture}
321 \end{columns}
322\end{frame}
323
324
325\begin{frame}[fragile]{\texttt{while} loop}
326 \begin{columns}
327 \column{0.45\textwidth}
328 \texttt{{\bf while} \emph{condition}:}
329
330 \texttt{\qquad instruction1}
331
332 \texttt{\qquad instruction2}
333
334 \texttt{\qquad \dots}
335 \column{0.55\textwidth}
336 \begin{tikzpicture}
337 \tikzstyle{s} = [rectangle, rounded corners, text centered,
338 draw=black, fill=red!30]
339 \tikzstyle{p} = [rectangle, text centered, draw=black, fill=orange!30]
340 \tikzstyle{d} = [rectangle, text centered, draw=black, fill=green!30]
341
342 \node(start) [s] {Start};
343 \node(cond) [d, below of=start] {\texttt{\emph{condition}}?};
344 \node(inst1) [p, right of=cond, xshift=2.7cm] {\texttt{instruction1}};
345 \node(inst2) [p, below of=inst1] {\texttt{instruction2}};
346 \node(dots) [p, below of=inst2] {\texttt{\dots}};
347 \node(end) [s, below of=other, yshift=-0.5cm] {End};
348
349 \draw[->] (start) -- (cond);
350 \draw[->] (cond) -- node[anchor=south] {\texttt{True}} (inst1);
351 \draw[->] (inst1) -- (inst2);
352 \draw[->] (inst2) -- (dots);
353 \draw[->] (cond) -- node[anchor=east] {\texttt{False}} (end);
354 \draw[->] (dots) -| ($(cond.south)+(0.4,0)$);
355 \end{tikzpicture}
356 \end{columns}
357\end{frame}
358
359\begin{frame}{\texttt{for} loop}
360 \texttt{{\bf for} i {\bf in} A:}
361
362 \texttt{\qquad instruction1}
363
364 \texttt{\qquad instruction2}
365
366 \texttt{\qquad \dots}
367
368 \vspace{0.3cm}
369 \begin{itemize}
370 \item Repeats instructions as \texttt{i} varies in \texttt{A}
371 \item \texttt{A} can be list, set or other collection
372 \item Example: \texttt{A} can be \texttt{range(\emph{a,b,step})}
373 \end{itemize}
374\end{frame}
375
376
377\begin{frame}{Functions}
378 \texttt{{\bf def} f(x, y, \dots): }
379
380 \texttt{\qquad instruction1}
381
382 \texttt{\qquad instruction2}
383
384 \texttt{\qquad \dots}
385
386 \texttt{\qquad {\bf return} some\_value}
387
388 \vspace{0.3cm}
389 \begin{itemize}
390 \item Useful to divide programs into ``pieces''
391 \item The result of \texttt{f(x,y,\dots)} is given by \texttt{return \dots}
392 \end{itemize}
393\end{frame}
394
395\begin{frame}{An example of function (with recursion)}
396 \texttt{def fibonacci(n):}
397
398 \texttt{\qquad if n == 0:}
399
400 \texttt{\qquad \qquad return 0}
401
402 \texttt{\qquad if n == 1:}
403
404 \texttt{\qquad \qquad return 1}
405
406 \texttt{\qquad return fibonacci(n-1) + fibonacci(n-2)}
407
408 \vspace{0.3cm}
409 \begin{itemize}
410 \item Elegant, but slow (in this case)
411 \item Can get stuck in infinite loop: when?
412 \end{itemize}
413\end{frame}
414
415\begin{frame}{Sage}
416 \begin{center}
417 \includesvg[scale=0.5]{img/sage}
418
419 \url{https://www.sagemath.org}
420 \end{center}
421
422 \vspace{0.3cm}
423 \begin{itemize}
424 \item Mathematical software, uses Python as a language
425 \item Use it interactively or with Jupyter notebook
426 \item Try it online: \url{https://sagecell.sagemath.org} or
427 \url{https://cocalc.com/app}
428 \end{itemize}
429\end{frame}
430
431\begin{frame}{Differences with Python}
432 \begin{tabular}{l|l}
433 \textbf{Python} & \textbf{Sage} \\
434 \texttt{{\color{gray}>>>} {\color{blue}type(5)}} &
435 \texttt{{\color{gray}sage:} {\color{blue}type(5)}} \\
436 \texttt{<class 'int'>} & \texttt{<class 'sage.rings.integer.Integer'>} \\
437 \texttt{{\color{gray}>>>} {\color{blue}5/2}} &
438 \texttt{{\color{gray}sage:} {\color{blue}5/2}} \\
439 \texttt{2.5} & \texttt{5/2} \\
440 \texttt{{\color{gray}>>>} {\color{blue}type(5/2)}} &
441 \texttt{{\color{gray}sage:} {\color{blue}type(5/2)}} \\
442 \texttt{<class 'float'>} &
443 \texttt{<class 'sage.rings.rational.Rational'>} \\
444 \texttt{{\color{gray}>>>} {\color{blue}type(2.5)}} &
445 \texttt{{\color{gray}sage:} {\color{blue}type(2.5)}} \\
446 \texttt{<class 'float'>} &
447 \texttt{<class 'sage.rings.real\_mpfr.RealLiteral'>} \\
448 \texttt{{\color{gray}>>>} {\color{blue}5**3}} &
449 \texttt{{\color{gray}sage:} {\color{blue}5\^{}3}} \\
450 \texttt{125} & \texttt{125}
451 \end{tabular}
452\end{frame}
453
454\begin{frame}{Sage Documentation}
455 \begin{itemize}
456 \item Tutorial (guided examples): type \texttt{tutorial()} or visit
457 \url{https://doc.sagemath.org/html/en/tutorial}
458 \item \texttt{help()}: works as in Python
459 \item Reference manual (detailed technical information):
460 \url{https://doc.sagemath.org/html/en/reference}
461 \end{itemize}
462\end{frame}
463
464
465\end{document}
466
diff --git a/src/Lecture4/slides/6-PythonIntroduction.toc b/src/Lecture4/slides/6-PythonIntroduction.toc
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture4/slides/6-PythonIntroduction.toc
diff --git a/src/Lecture4/slides/6-PythonIntroduction.vrb b/src/Lecture4/slides/6-PythonIntroduction.vrb
new file mode 100644
index 0000000..401cc07
--- /dev/null
+++ b/src/Lecture4/slides/6-PythonIntroduction.vrb
@@ -0,0 +1,32 @@
1\frametitle{\texttt {while} loop}
2\begin{columns}
3 \column{0.45\textwidth}
4 \texttt{{\bf while} \emph{condition}:}
5
6 \texttt{\qquad instruction1}
7
8 \texttt{\qquad instruction2}
9
10 \texttt{\qquad \dots}
11 \column{0.55\textwidth}
12 \begin{tikzpicture}
13 \tikzstyle{s} = [rectangle, rounded corners, text centered,
14 draw=black, fill=red!30]
15 \tikzstyle{p} = [rectangle, text centered, draw=black, fill=orange!30]
16 \tikzstyle{d} = [rectangle, text centered, draw=black, fill=green!30]
17
18 \node(start) [s] {Start};
19 \node(cond) [d, below of=start] {\texttt{\emph{condition}}?};
20 \node(inst1) [p, right of=cond, xshift=2.7cm] {\texttt{instruction1}};
21 \node(inst2) [p, below of=inst1] {\texttt{instruction2}};
22 \node(dots) [p, below of=inst2] {\texttt{\dots}};
23 \node(end) [s, below of=other, yshift=-0.5cm] {End};
24
25 \draw[->] (start) -- (cond);
26 \draw[->] (cond) -- node[anchor=south] {\texttt{True}} (inst1);
27 \draw[->] (inst1) -- (inst2);
28 \draw[->] (inst2) -- (dots);
29 \draw[->] (cond) -- node[anchor=east] {\texttt{False}} (end);
30 \draw[->] (dots) -| ($(cond.south)+(0.4,0)$);
31 \end{tikzpicture}
32 \end{columns}
diff --git a/src/Lecture4/slides/img/calc.jpg b/src/Lecture4/slides/img/calc.jpg
new file mode 100644
index 0000000..09438d1
--- /dev/null
+++ b/src/Lecture4/slides/img/calc.jpg
Binary files differ
diff --git a/src/Lecture4/slides/img/equal.png b/src/Lecture4/slides/img/equal.png
new file mode 100644
index 0000000..39948a6
--- /dev/null
+++ b/src/Lecture4/slides/img/equal.png
Binary files differ
diff --git a/src/Lecture4/slides/img/geany.png b/src/Lecture4/slides/img/geany.png
new file mode 100644
index 0000000..7910546
--- /dev/null
+++ b/src/Lecture4/slides/img/geany.png
Binary files differ
diff --git a/src/Lecture4/slides/img/laptop.png b/src/Lecture4/slides/img/laptop.png
new file mode 100644
index 0000000..0f9eaf5
--- /dev/null
+++ b/src/Lecture4/slides/img/laptop.png
Binary files differ
diff --git a/src/Lecture4/slides/img/python.png b/src/Lecture4/slides/img/python.png
new file mode 100644
index 0000000..d775a99
--- /dev/null
+++ b/src/Lecture4/slides/img/python.png
Binary files differ
diff --git a/src/Lecture4/slides/img/sage.svg b/src/Lecture4/slides/img/sage.svg
new file mode 100644
index 0000000..642e67b
--- /dev/null
+++ b/src/Lecture4/slides/img/sage.svg
@@ -0,0 +1,72 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="500" height="130" id="svg2" sodipodi:version="0.32" inkscape:version="0.91 r13725" sodipodi:docname="sage-logo-2018.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.1">
4 <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:zoom="3.5216707" inkscape:cx="253.52082" inkscape:cy="12.127563" inkscape:document-units="px" inkscape:current-layer="g3993" showgrid="false" inkscape:window-width="2560" inkscape:window-height="1410" inkscape:window-x="0" inkscape:window-y="30" showguides="true" inkscape:guide-bbox="true" inkscape:window-maximized="1" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0"/>
5 <defs id="defs4"/>
6 <metadata id="metadata7">
7 <rdf:RDF>
8 <cc:Work rdf:about="">
9 <dc:format>image/svg+xml</dc:format>
10 <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
11 <dc:title/>
12 </cc:Work>
13 </rdf:RDF>
14 </metadata>
15 <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(-100.8642,-253.78876)">
16 <g id="g3993">
17 <rect ry="11.531985" rx="11.531984" y="253.78876" x="100.8642" height="130" width="500" id="rect3430" style="opacity:0.98999999;fill:#3131ff;fill-opacity:1;stroke:none" inkscape:export-xdpi="90" inkscape:export-ydpi="90"/>
18 <g id="g3432" transform="matrix(0.7759764,0,0,0.7759764,-1035.2282,-1486.6449)">
19 <path transform="matrix(0.9672595,0,0,0.9672595,235.69886,548.04605)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3434" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
20 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3436" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.9672595,0,0,0.9672595,308.74604,539.35166)"/>
21 <path transform="matrix(1.2053547,0,0,1.2053547,-25.196551,182.19849)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3438" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
22 <path transform="matrix(0.7953719,0,0,0.7953719,449.34462,925.45441)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3440" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
23 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3442" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.7953719,0,0,0.7953719,499.30379,973.24771)"/>
24 <path transform="matrix(0.7953719,0,0,0.7953719,556.29908,956.69427)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3444" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
25 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3446" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.7953719,0,0,0.7953719,581.00221,902.90894)"/>
26 <path transform="matrix(0.6234843,0,0,0.6234843,800.65848,1180.6657)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3448" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
27 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3450" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.6234843,0,0,0.6234843,766.33259,1139.9519)"/>
28 <path transform="matrix(0.6234843,0,0,0.6234843,664.75027,1230.1938)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3454" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
29 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3456" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.6234843,0,0,0.6234843,701.58781,1267.5497)"/>
30 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3458" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.7953719,0,0,0.7953719,440.41431,869.81028)"/>
31 <path transform="matrix(0.7953719,0,0,0.7953719,484.50773,829.39633)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3460" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
32 <path transform="matrix(0.6234843,0,0,0.6234843,699.00639,1196.6154)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3462" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
33 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3464" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.6234843,0,0,0.6234843,749.0301,1256.3969)"/>
34 <path id="path3468" d="m 1590.0065,2271.6035 -18.6281,72.6731" style="fill:none;stroke:#ffffff;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
35 <path id="path3470" d="m 1589.0995,2273.5223 -72.5588,8.4545" style="fill:none;stroke:#ffffff;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
36 <path id="path3472" d="m 1571.3087,2343.4372 -54.6982,-61.8801" style="fill:none;stroke:#ffffff;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
37 <path id="path3474" d="m 1571.3087,2343.8569 -18.07,55.944" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
38 <path id="path3476" d="m 1516.4012,2281.3172 21.0002,-24.3443" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
39 <path id="path3478" d="m 1493.9359,2295.4681 21.7676,-14.3307" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
40 <path id="path3480" d="m 1503.0057,2350.6326 13.3955,-69.9749" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
41 <path id="path3482" d="m 1552.1922,2398.5417 -49.5353,-46.59" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
42 <path id="path3484" d="m 1610.0997,2381.3328 -58.1168,16.969" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
43 <path id="path3486" d="m 1634.2395,2328.3869 -24.1398,53.1257" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
44 <path id="path3488" d="m 1570.5412,2343.4372 62.8611,-14.6306" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
45 <path id="path3491" d="m 1590.1461,2273.0426 43.1166,55.1644" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
46 <path id="path3493" d="m 1501.7987,2350.6326 66.9774,-7.1954" style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
47 <path id="path3495" d="m 1551.4038,2398.062 -24.4188,-13.1316" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
48 <path id="path3497" d="m 1489.38,2347.2747 36.3492,37.296" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
49 <path id="path3499" d="m 1493.2173,2295.9478 -2.721,51.3269" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
50 <path id="path3501" d="m 1537.3805,2254.8743 54.0702,1.8588" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
51 <path id="path3503" d="m 1627.172,2298.5261 -34.2562,-41.9729" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
52 <path id="path3505" d="m 1635.4744,2328.207 -9.0001,-30.1006" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
53 <path id="path3507" d="m 1589.4972,2272.2631 3.2093,-15.2902" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
54 <path id="path3509" d="m 1503.6825,2351.2305 -14.1629,-2.6983" style="fill:none;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
55 <path id="path3511" d="m 1526.985,2385.4084 46.7446,-11.4526" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
56 <path id="path3513" d="m 1574.9157,2373.8958 33.6282,7.2554" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
57 <path id="path3515" d="m 1492.5121,2295.941 61.203,-6.8478" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
58 <path id="path3517" d="m 1553.7151,2287.7387 36.4241,-13.5452" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
59 <path transform="matrix(0.6234843,0,0,0.6234843,726.86911,1170.9368)" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" sodipodi:ry="7.3256478" sodipodi:rx="7.3256478" sodipodi:cy="1792.4095" sodipodi:cx="1324.929" id="path3519" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" sodipodi:type="arc"/>
60 <path sodipodi:type="arc" style="opacity:0.98999999;fill:#ffffff;fill-opacity:1;stroke:none" id="path3521" sodipodi:cx="1324.929" sodipodi:cy="1792.4095" sodipodi:rx="7.3256478" sodipodi:ry="7.3256478" d="m 1332.2546,1792.4095 a 7.3256478,7.3256478 0 0 1 -7.3256,7.3257 7.3256478,7.3256478 0 0 1 -7.3257,-7.3257 7.3256478,7.3256478 0 0 1 7.3257,-7.3256 7.3256478,7.3256478 0 0 1 7.3256,7.3256 z" transform="matrix(0.5833906,0,0,0.5833906,837.2333,1298.2147)"/>
61 <path id="path3523" d="m 1609.6576,2343.739 16.404,-46.0639" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
62 <path id="path3525" d="m 1609.4298,2381.481 0.5696,-38.77" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
63 <path style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" d="m 1502.1919,2350.0723 23.4339,-35.9573" id="path3527" inkscape:connector-curvature="0"/>
64 <path style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" d="M 1537.8572,2255.3651 1524.94,2314.115" id="path3529" inkscape:connector-curvature="0"/>
65 </g>
66 <path style="fill:none;stroke:#ffffff;stroke-width:2.70117497;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" d="m 254.60496,253.34928 c 0,132.01 0,130.863 0,130.863" id="path3583" inkscape:connector-curvature="0"/>
67 <path inkscape:connector-curvature="0" style="fill:#ffffff;fill-opacity:1;stroke:none" d="m 346.54394,281.67999 c -0.37043,0.007 -0.76375,0.0151 -1.1923,0.0298 -4.7419,0.0171 -7.05535,-0.0322 -12.07595,0 -9.38453,-0.002 -18.5077,-0.009 -27.94282,0 -2.76724,0.002 -3.2464,0.74262 -4.15781,2.08965 -0.84157,1.257 -0.52,2.74748 -0.58086,4.35844 0.0491,9.26026 -0.11828,18.39755 0.0916,27.76254 2.3e-4,1.71546 0.22265,2.89833 2.96549,2.92551 11.90252,0.071 23.8385,-0.0528 35.73868,0.11936 1.86901,-0.0373 2.49921,0.36001 2.41519,2.71654 0.0938,5.34549 0.0594,8.55673 0.0916,13.01556 0.0616,1.51319 -0.93002,2.06621 -2.44578,2.05981 -11.81841,-0.14189 -23.64222,-0.0193 -35.46352,-0.0597 0,0 -19.44381,-0.0373 -19.74953,0 -1.40045,0.56851 -1.24661,1.72798 -1.28402,3.64197 0.0367,1.89735 -0.10303,3.39377 1.1923,3.6121 2.2304,0.43082 4.53877,0.12215 6.81757,0.23882 18.43643,-0.0193 38.42963,0.0406 56.86393,-0.0298 1.55646,0.0749 2.20791,-0.4696 2.14005,-2.35832 -0.0403,-9.55785 0.0816,-18.57222 -0.0612,-28.12078 -0.0638,-1.48128 -0.33764,-2.06013 -1.58975,-2.26876 l -34.88265,0 c -2.78601,0.032 -3.05366,-0.007 -3.7298,-0.71645 -0.6514,-0.68444 -0.7527,-1.59021 -0.70315,-6.06001 -0.0713,-4.92872 -0.0627,-3.07599 0,-8.00038 -0.0565,-3.81095 -0.27244,-4.9496 0.61143,-6.03015 0.9055,-1.10697 4.69087,-0.67763 8.34616,-0.65674 10.24285,-0.0305 23.70767,0.19061 30.20516,0 2.18319,-0.0642 2.0923,-1.30284 2.14004,-4.0599 0.0193,-3.86686 -1.16746,-4.25181 -3.76036,-4.20916 z m 23.4793,0 c -2.38324,0.004 -4.80548,0.0359 -7.3067,0.0895 -2.42348,-0.18934 -4.30516,1.00537 -4.18838,4.44799 0.0543,18.30196 -0.19041,35.13798 0,53.43544 0.19127,4.57432 2.39608,4.27143 5.8087,4.23901 13.51499,-0.0625 24.92875,-0.0434 38.64301,-0.47763 1.87754,-0.0594 3.45678,-1.4103 4.76925,-4.1196 1.74989,-3.13894 3.37176,-5.84613 5.25838,-9.40345 1.73378,-3.26914 2.76947,-6.45889 4.24951,-6.44807 1.48004,0.0109 2.52111,3.21701 4.86095,7.22423 2.33984,4.00723 5.11487,8.50015 7.52072,11.55281 1.90175,1.72645 5.04589,1.14142 8.04044,1.25378 8.37287,-0.0638 16.78431,0.22246 25.13019,0 2.26544,-0.0504 1.60002,-2.09729 1.71203,-3.64197 0.32736,-4.51419 -2.74798,-3.62595 -4.67752,-3.67182 -8.8857,-0.10758 -22.44645,0.74045 -25.68049,0.11936 -1.64482,-0.31584 -3.21958,-2.94907 -7.70414,-10.56769 -1.99177,-2.96156 -2.55627,-4.11539 -4.52466,-7.61233 -0.5719,-0.98583 -0.56688,-1.88964 -0.30572,-3.01504 2.62458,-5.434 1.5447,-3.00409 2.90434,-5.64208 4.10098,-6.79184 10.5605,-17.97616 11.12822,-18.8666 1.22636,-1.9235 2.83254,-1.53373 5.5641,-1.61201 7.76311,-0.0151 15.47704,-0.10563 23.2653,0.0298 3.76224,-0.009 3.78975,0.94091 3.72979,5.40325 -0.047,21.77964 0.10281,43.54142 -0.0612,65.31662 -0.65557,2.64801 -4.17524,2.40442 -6.45069,2.44788 -15.03857,0.0627 -30.0913,-0.1303 -45.1243,0.0895 -0.8338,1.30593 -0.90729,2.40815 -1.03945,4.1196 -0.0894,1.63569 -0.28797,3.95505 2.04832,3.88078 18.84775,0.0635 37.7046,0.0108 56.55823,0.0298 1.94799,-0.002 3.20688,-1.95119 3.14892,-4.1196 -0.0361,-26.28869 0.0651,-52.58481 -0.0612,-78.86953 0.0706,-2.49769 -1.23214,-5.52925 -4.24951,-5.52266 -12.40867,-0.0914 -24.82933,-0.0855 -37.23671,0 -3.77303,0.41319 -4.85765,4.65736 -6.72585,7.28393 -3.70935,6.17615 -7.25859,12.46514 -11.06705,18.56808 -1.53274,1.93131 -2.6533,-0.74347 -3.33236,-1.94039 -4.38793,-7.25285 -8.84035,-14.62797 -13.42111,-21.76227 -2.13904,-2.88031 -5.96126,-2.14883 -9.72191,-2.14935 -7.51296,0.046 -14.31183,-0.10541 -21.46155,-0.0895 z m 117.794,0 c -1.74522,0.40297 -2.82837,2.21505 -2.87379,3.91064 -0.002,17.91255 -0.0171,35.82253 0.0612,53.73396 0.0554,1.90805 1.00565,3.07483 2.75149,3.82109 1.82118,0.88335 3.66025,0.97694 5.93097,1.01496 l 67.96159,0 c 1.33481,0.0881 1.93085,-0.007 1.95662,-1.70156 0.0243,-1.66238 0.0528,-3.21199 0,-4.6868 0.0537,-1.796 -1.51141,-1.69348 -2.29289,-1.64188 l -65.88273,0 c -1.66979,-0.0346 -2.40612,-1.66458 -2.17059,-3.10462 0.0193,-13.82954 -0.0386,-27.69841 0.0305,-41.52442 -0.10862,-2.27759 0.93405,-2.96926 2.81262,-2.80612 12.70762,0.037 27.10367,-0.0691 39.80477,0.0596 1.47047,-0.0583 2.46521,0.86667 2.35404,2.41802 -0.0575,5.30572 0.11055,12.40667 -0.0916,17.70236 0.1698,2.06578 -1.3662,1.96895 -2.99605,1.94039 -11.6794,0.0193 -16.80653,0.0713 -36.53356,0.0596 -1.93222,-7.6e-4 -1.49203,1.87931 -1.55919,3.52254 0.0771,2.73125 -0.42735,4.24372 1.19234,4.23902 15.57389,-0.0453 30.24904,0.11398 45.49113,0 1.56318,0.12 2.4766,-1.17465 2.44576,-2.92552 -0.0487,-10.28849 0.117,-20.55088 -0.0612,-30.83733 -0.29732,-1.83355 -2.25243,-3.09594 -4.79982,-3.13447 -17.85306,-0.0357 -35.6799,0.0662 -53.5316,-0.0596 z m -114.85909,7.37348 c 2.82764,-0.0294 5.67113,0.20523 8.49904,0.14919 4.53418,-0.0522 7.52775,0.0539 12.07594,0 3.82394,-0.0764 4.71204,2.78726 5.35009,3.82109 3.747,6.07122 6.39261,10.52033 9.99705,16.56797 1.20991,2.01432 2.41944,3.65173 3.57693,5.49282 0.46804,0.98488 0.26631,2.0831 -0.24457,3.01507 -1.9047,2.84027 -3.54524,5.84743 -5.31952,8.77655 -1.898,3.02164 -3.43612,6.271 -5.71697,9.04521 -0.95342,1.39773 -3.14377,0.68796 -4.03552,0.92542 -8.07776,0.0916 -14.69346,0.0335 -22.77613,0.0596 -1.73097,-0.10862 -5.08644,0.40143 -6.54244,-0.53732 -1.7547,-1.13139 -1.53826,-2.95631 -1.5286,-4.59726 -0.0414,-7.1301 0.0129,-12.7755 0,-19.91142 -0.0987,-5.62971 0.0988,-9.77399 0,-15.40373 -0.087,-3.25177 0.16444,-3.72516 0.64203,-4.8062 0.57861,-1.30962 1.90723,-2.07022 3.17948,-2.44789 0.93799,-0.0835 1.90066,-0.13931 2.84319,-0.14919 z" id="path5088-7-1-3" sodipodi:nodetypes="cccccccccccccccccccccccccsccccccccccccscscccscsccccscccccccccccccccccccccccccccccccccccccccsccccccccscccccccscccsccc"/>
68 </g>
69 </g>
70 <svg version="1.1" baseProfile="full" id="body" width="8in" height="8in" viewBox="0 0 1 1" preserveAspectRatio="none" inkscape:version="0.48.4 r9939" transform="matrix(720,0,0,720,-100.8642,668.57342)"/>
71 <svg version="1.1" baseProfile="full" id="svg118829" width="8in" height="8in" viewBox="0 0 1 1" preserveAspectRatio="none" inkscape:version="0.48.4 r9939" transform="matrix(720,0,0,720,-100.8642,668.57342)"/>
72</svg> \ No newline at end of file
diff --git a/src/Lecture4/slides/img/term.png b/src/Lecture4/slides/img/term.png
new file mode 100644
index 0000000..fb0519a
--- /dev/null
+++ b/src/Lecture4/slides/img/term.png
Binary files differ
diff --git a/src/Lecture4/slides/img/unilu.jpg b/src/Lecture4/slides/img/unilu.jpg
new file mode 100644
index 0000000..5265563
--- /dev/null
+++ b/src/Lecture4/slides/img/unilu.jpg
Binary files differ
diff --git a/src/Lecture4/slides/svg-inkscape/sage_svg-tex.pdf b/src/Lecture4/slides/svg-inkscape/sage_svg-tex.pdf
new file mode 100644
index 0000000..5f75b82
--- /dev/null
+++ b/src/Lecture4/slides/svg-inkscape/sage_svg-tex.pdf
Binary files differ
diff --git a/src/Lecture4/slides/svg-inkscape/sage_svg-tex.pdf_tex b/src/Lecture4/slides/svg-inkscape/sage_svg-tex.pdf_tex
new file mode 100644
index 0000000..348dc56
--- /dev/null
+++ b/src/Lecture4/slides/svg-inkscape/sage_svg-tex.pdf_tex
@@ -0,0 +1,58 @@
1%% Creator: Inkscape 1.0.2 (e86c870879, 2021-01-15), www.inkscape.org
2%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
3%% Accompanies image file 'sage_svg-tex.pdf' (pdf, eps, ps)
4%%
5%% To include the image in your LaTeX document, write
6%% \input{<filename>.pdf_tex}
7%% instead of
8%% \includegraphics{<filename>.pdf}
9%% To scale the image, write
10%% \def\svgwidth{<desired width>}
11%% \input{<filename>.pdf_tex}
12%% instead of
13%% \includegraphics[width=<desired width>]{<filename>.pdf}
14%%
15%% Images with a different path to the parent latex file can
16%% be accessed with the `import' package (which may need to be
17%% installed) using
18%% \usepackage{import}
19%% in the preamble, and then including the image with
20%% \import{<path to file>}{<filename>.pdf_tex}
21%% Alternatively, one can specify
22%% \graphicspath{{<path to file>/}}
23%%
24%% For more information, please see info/svg-inkscape on CTAN:
25%% http://tug.ctan.org/tex-archive/info/svg-inkscape
26%%
27\begingroup%
28 \makeatletter%
29 \providecommand\color[2][]{%
30 \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
31 \renewcommand\color[2][]{}%
32 }%
33 \providecommand\transparent[1]{%
34 \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
35 \renewcommand\transparent[1]{}%
36 }%
37 \providecommand\rotatebox[2]{#2}%
38 \newcommand*\fsize{\dimexpr\f@size pt\relax}%
39 \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
40 \ifx\svgwidth\undefined%
41 \setlength{\unitlength}{375bp}%
42 \ifx\svgscale\undefined%
43 \relax%
44 \else%
45 \setlength{\unitlength}{\unitlength * \real{\svgscale}}%
46 \fi%
47 \else%
48 \setlength{\unitlength}{\svgwidth}%
49 \fi%
50 \global\let\svgwidth\undefined%
51 \global\let\svgscale\undefined%
52 \makeatother%
53 \begin{picture}(1,0.26172667)%
54 \lineheight{1}%
55 \setlength\tabcolsep{0pt}%
56 \put(0,0){\includegraphics[width=\unitlength,page=1]{sage_svg-tex.pdf}}%
57 \end{picture}%
58\endgroup%
diff --git a/src/Lecture5/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb b/src/Lecture5/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb
new file mode 100644
index 0000000..5ae74bf
--- /dev/null
+++ b/src/Lecture5/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb
@@ -0,0 +1,1067 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "This lecture's notes are in a different format: the presentation for the $\\LaTeX$ part were made with $\\LaTeX$, so this one is made with Sage, or rather with the [Jupyter Notebook](https://jupyter.org/).\n",
8 "\n",
9 "# The Jupyter Notebook\n",
10 "**Reference:** [[1](https://jupyter.org/documentation)]\n",
11 "\n",
12 "The Jupyter Notebook is one of the default interfaces for SageMath, along with the command line interface. You can access it via web browser, but it is running locally (notice the strange url: `http://localhost:8888/notebooks...`).\n",
13 "\n",
14 "You can create a new notebook by clicking on `New > SageMath 9.2`. You can also create a Python 3 notebook to write Python code.\n",
15 "\n",
16 "Jupyter saves and reads files in the `.ipynb` format. If you download the file for this lecture you can open it and follow the examples interactively.\n",
17 "\n",
18 "## Cells\n",
19 "\n",
20 "The notebook contains one or more *interactive cells* that you can run, like this one below:"
21 ]
22 },
23 {
24 "cell_type": "code",
25 "execution_count": 1,
26 "metadata": {},
27 "outputs": [
28 {
29 "data": {
30 "text/plain": [
31 "1/27"
32 ]
33 },
34 "execution_count": 1,
35 "metadata": {},
36 "output_type": "execute_result"
37 }
38 ],
39 "source": [
40 "2+2\n",
41 "2/5"
42 ]
43 },
44 {
45 "cell_type": "markdown",
46 "metadata": {},
47 "source": [
48 "If you are reading this from Jupyter rather than from the pdf file, you can edit the cell above and run it again. You can also add more cells by selecting `Insert` from the menu bar.\n",
49 "\n",
50 "Notice that only the last statement produces an output. You can force anything to be written as output with the `print()` command, which works like in Python. As an exercise, try to modify the cell below to provide more output!"
51 ]
52 },
53 {
54 "cell_type": "code",
55 "execution_count": 3,
56 "metadata": {},
57 "outputs": [
58 {
59 "data": {
60 "text/plain": [
61 "2/5"
62 ]
63 },
64 "execution_count": 3,
65 "metadata": {},
66 "output_type": "execute_result"
67 }
68 ],
69 "source": [
70 "# Exercise: modify this cell to use the print() command\n",
71 "2+2\n",
72 "2/5"
73 ]
74 },
75 {
76 "cell_type": "markdown",
77 "metadata": {},
78 "source": [
79 "## Markdown\n",
80 "\n",
81 "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n",
82 "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n",
83 "\n",
84 "You can also include some LaTeX code in Markdown cells, with the usual `\\(` and `\\)`, or even more complex things:\n",
85 "\n",
86 "\\begin{align*}\n",
87 "\\frac{(x+y)^2}{x+1} = \\frac{x^2+y^2}{x+1}\n",
88 "\\end{align*}\n",
89 "\n",
90 "When you are done writing a Markdown cell, you can run it to see the well-formatted text. To edit the text again, double-click on the cell. Try doing it now to correct the formula above!"
91 ]
92 },
93 {
94 "cell_type": "markdown",
95 "metadata": {},
96 "source": [
97 "# Symbolic expressions\n",
98 "\n",
99 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
100 "\n",
101 "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:"
102 ]
103 },
104 {
105 "cell_type": "code",
106 "execution_count": 5,
107 "metadata": {},
108 "outputs": [
109 {
110 "data": {
111 "text/plain": [
112 "[x == -sqrt(6) - 1, x == sqrt(6) - 1]"
113 ]
114 },
115 "execution_count": 5,
116 "metadata": {},
117 "output_type": "execute_result"
118 }
119 ],
120 "source": [
121 "f = x^2 + 2*x - 5 == 0\n",
122 "solve(f,x)"
123 ]
124 },
125 {
126 "cell_type": "markdown",
127 "metadata": {},
128 "source": [
129 "Notice the the single `=` is part of an assignment, as in Python: we are *assigning* the name `f` to the value `x^2 + 2*x - 5 >= 0`, which in this case is an equation, so it contains the symbol `==`. Keep in mind the difference between the two!\n",
130 "\n",
131 "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$."
132 ]
133 },
134 {
135 "cell_type": "markdown",
136 "metadata": {},
137 "source": [
138 "## Mathematical variables\n",
139 "\n",
140 "Last time we saw what *variables* are in Python, and that they are a little bit different from the *Mathematical variables* that you use in Mathematics. In Sage, both concepts are present, but they are still distinct. For example in the cell above `f` is a variable in the sense of computer science, while `x` is a Mathematical variable.\n",
141 "\n",
142 "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:"
143 ]
144 },
145 {
146 "cell_type": "code",
147 "execution_count": 14,
148 "metadata": {},
149 "outputs": [
150 {
151 "data": {
152 "text/plain": [
153 "[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 + 9) - 1/2]"
154 ]
155 },
156 "execution_count": 14,
157 "metadata": {},
158 "output_type": "execute_result"
159 }
160 ],
161 "source": [
162 "var('y')\n",
163 "solve(y^2 + (x+1)*y - 2 == 0, y)"
164 ]
165 },
166 {
167 "cell_type": "markdown",
168 "metadata": {},
169 "source": [
170 "Try removing the first line in the cell above and see what error you get!\n",
171 "\n",
172 "Here is another example:"
173 ]
174 },
175 {
176 "cell_type": "code",
177 "execution_count": 16,
178 "metadata": {},
179 "outputs": [
180 {
181 "data": {
182 "text/plain": [
183 "[x == -1/2*a - 1/2*sqrt(a^2 - 4*b), x == -1/2*a + 1/2*sqrt(a^2 - 4*b)]"
184 ]
185 },
186 "execution_count": 16,
187 "metadata": {},
188 "output_type": "execute_result"
189 }
190 ],
191 "source": [
192 "var('a', 'b')\n",
193 "f = x^2+a*x+b\n",
194 "solve(f,x)"
195 ]
196 },
197 {
198 "cell_type": "markdown",
199 "metadata": {},
200 "source": [
201 "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:"
202 ]
203 },
204 {
205 "cell_type": "code",
206 "execution_count": 17,
207 "metadata": {},
208 "outputs": [
209 {
210 "data": {
211 "text/plain": [
212 "-1"
213 ]
214 },
215 "execution_count": 17,
216 "metadata": {},
217 "output_type": "execute_result"
218 }
219 ],
220 "source": [
221 "e^(pi*I)"
222 ]
223 },
224 {
225 "cell_type": "markdown",
226 "metadata": {},
227 "source": [
228 "We will study symbolic expressions more in detail next time, in the context of calculus/analysis."
229 ]
230 },
231 {
232 "cell_type": "markdown",
233 "metadata": {},
234 "source": [
235 "# Basic rings and fields\n",
236 "\n",
237 "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n",
238 "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n",
239 "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n",
240 "\n",
241 "As you should know, a *field* is a Mathematical structure with two operations, addition and multiplication, which respect certain rules (distributivity, associativity, commutativity...). Some examples of fields are the Rationals $\\mathbb Q$, the Real numbers $\\mathbb R$ and the complex numbers $\\mathbb C$, but there are many more. As you should also know, a *ring* is like a field, except not all elements different from $0$ need have a multiplicative inverse. For example the integers $\\mathbb Z = \\{ \\dots, -1, 0, 1, 2, \\dots\\}$ are a ring, but not a field.\n",
242 "\n",
243 "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n",
244 "\n",
245 "|Mathematical object|Math symbol|Sage name|\n",
246 "|------------------:|:---------:|:--------|\n",
247 "|Integers|$\\mathbb Z$|`ZZ`|\n",
248 "|Rational numbers|$\\mathbb Q$|`QQ`|\n",
249 "|Real numbers|$\\mathbb R$|`RR`|\n",
250 "|Complex numbers|$\\mathbb C$|`CC`|\n",
251 "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n",
252 "|Finite fields|$\\mathbb F_p$|GF(p)|\n",
253 "|$\\dots$|$\\dots$|$\\dots$|"
254 ]
255 },
256 {
257 "cell_type": "markdown",
258 "metadata": {},
259 "source": [
260 "If you write a number or an expression, Sage will figure out where it \"lives\", choosing the most restrictive interpretation possible. For example `3` will be interpreted to be an integer, even if it is also a rational number, a real number and a complex number."
261 ]
262 },
263 {
264 "cell_type": "markdown",
265 "metadata": {},
266 "source": [
267 "## Parents and coercion\n",
268 "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n",
269 "\n",
270 "You can check where an object \"lives\" with the `parent()` command. It works more or less like the Python command `type()`, but it gives a more Mathematically inclined answer. Check the reference link [6] above if you want the boring details."
271 ]
272 },
273 {
274 "cell_type": "code",
275 "execution_count": 18,
276 "metadata": {},
277 "outputs": [
278 {
279 "data": {
280 "text/plain": [
281 "Rational Field"
282 ]
283 },
284 "execution_count": 18,
285 "metadata": {},
286 "output_type": "execute_result"
287 }
288 ],
289 "source": [
290 "#Edit this cell to find out the type of other objects that we used\n",
291 "parent(3/5)"
292 ]
293 },
294 {
295 "cell_type": "markdown",
296 "metadata": {},
297 "source": [
298 "Sometimes Sage does not give you the best possible interpretation, so you can force something to be interpreted as living in a smaller ring as follows:"
299 ]
300 },
301 {
302 "cell_type": "code",
303 "execution_count": 21,
304 "metadata": {},
305 "outputs": [
306 {
307 "name": "stdout",
308 "output_type": "stream",
309 "text": [
310 "Symbolic Ring\n",
311 "Integer Ring\n"
312 ]
313 }
314 ],
315 "source": [
316 "minus_one = e^(pi*I)\n",
317 "minus_one_coerced = ZZ(e^(pi*I))\n",
318 "print(parent(minus_one))\n",
319 "print(parent(minus_one_coerced))"
320 ]
321 },
322 {
323 "cell_type": "markdown",
324 "metadata": {},
325 "source": [
326 "**Remark.** Notice that there is a fundamental difference between the rings `RR` and `CC` and all the others in the table above: the real and complex numbers are *approximated*."
327 ]
328 },
329 {
330 "cell_type": "code",
331 "execution_count": 1,
332 "metadata": {},
333 "outputs": [
334 {
335 "name": "stdout",
336 "output_type": "stream",
337 "text": [
338 "3\n",
339 "3.00000000000000\n"
340 ]
341 }
342 ],
343 "source": [
344 "print(QQ(3))\n",
345 "print(RR(3))"
346 ]
347 },
348 {
349 "cell_type": "markdown",
350 "metadata": {},
351 "source": [
352 "You can also choose the precision of this approximation using the alternative name `RealField`."
353 ]
354 },
355 {
356 "cell_type": "code",
357 "execution_count": 4,
358 "metadata": {},
359 "outputs": [
360 {
361 "name": "stdout",
362 "output_type": "stream",
363 "text": [
364 "Real Field with 53 bits of precision\n",
365 "Real Field with 1000 bits of precision\n"
366 ]
367 }
368 ],
369 "source": [
370 "print(RR)\n",
371 "print(RealField(prec=1000))"
372 ]
373 },
374 {
375 "cell_type": "markdown",
376 "metadata": {},
377 "source": [
378 "# Polynomial rings\n",
379 "\n",
380 "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n",
381 "\n",
382 "If you want to work with polynomials over a certain ring it is better to use this specific construction."
383 ]
384 },
385 {
386 "cell_type": "code",
387 "execution_count": 9,
388 "metadata": {},
389 "outputs": [
390 {
391 "data": {
392 "text/plain": [
393 "Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of precision"
394 ]
395 },
396 "execution_count": 9,
397 "metadata": {},
398 "output_type": "execute_result"
399 }
400 ],
401 "source": [
402 "# Alternative notation: polring.<x,y,z> = PolynomialRing(RR)\n",
403 "polring.<x,y,z> = RR[]\n",
404 "polring"
405 ]
406 },
407 {
408 "cell_type": "markdown",
409 "metadata": {},
410 "source": [
411 "You can use as many variables as you like, and you can replace `RR` with any ring. In the example above `polring` is just the name of the variable (in the computer science sense).\n",
412 "\n",
413 "## Operations on polynomials\n",
414 "\n",
415 "The usual Mathematical operations are available on polynomial rings, including Euclidean division `//` and remainder `%`. There is also the single-slash division `/`, but the result may not be a polynomial anymore.\n",
416 "\n",
417 "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n",
418 "\n",
419 "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?"
420 ]
421 },
422 {
423 "cell_type": "code",
424 "execution_count": 14,
425 "metadata": {},
426 "outputs": [
427 {
428 "name": "stdout",
429 "output_type": "stream",
430 "text": [
431 "x + 1\n",
432 "-4\n",
433 "(x^2 + 2*x - 3)/(x + 1)\n"
434 ]
435 }
436 ],
437 "source": [
438 "polring.<x> = QQ[]\n",
439 "p = x^2 + 2*x - 3 # Always remember * for multiplication\n",
440 "q = p // (x+1)\n",
441 "r = p % (x+1)\n",
442 "f = p / (x+1)\n",
443 "print(q)\n",
444 "print(r)\n",
445 "print(f)"
446 ]
447 },
448 {
449 "cell_type": "markdown",
450 "metadata": {},
451 "source": [
452 "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n",
453 "\n",
454 "**Remark.** Notice how the result can change substantially if you change the base ring.\n",
455 "\n",
456 "**Remark.** [Factorizations](https://doc.sagemath.org/html/en/reference/structure/sage/structure/factorization.html) are a particular object in Sage. They are kinda like a list, but not really. You can get a list of pairs (factor, power) with `list(factor(f))`."
457 ]
458 },
459 {
460 "cell_type": "code",
461 "execution_count": 24,
462 "metadata": {},
463 "outputs": [
464 {
465 "name": "stdout",
466 "output_type": "stream",
467 "text": [
468 "(t + 1) * (t^2 - 3) * (t^2 + 1)\n",
469 "[(-1, 1)]\n"
470 ]
471 },
472 {
473 "data": {
474 "text/plain": [
475 "(y + 1) * x"
476 ]
477 },
478 "execution_count": 24,
479 "metadata": {},
480 "output_type": "execute_result"
481 }
482 ],
483 "source": [
484 "polring_onevar.<t> = QQ[]\n",
485 "\n",
486 "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n",
487 "print(factor(f))\n",
488 "print(f.roots()) # Result: list of pairs (root,multiplicity)\n",
489 "\n",
490 "polring_manyvar.<x,y,z> = QQ[]\n",
491 "factor(x*y+x)\n",
492 "\n",
493 "# The following line gives an error, because the polynomial\n",
494 "# is understood to possibly have many variables:\n",
495 "#(x^2-1).roots()"
496 ]
497 },
498 {
499 "cell_type": "markdown",
500 "metadata": {},
501 "source": [
502 "# Matrices and vectors\n",
503 "\n",
504 "**References:** [[8](https://doc.sagemath.org/html/en/reference/matrices/index.html)], but in particular the subections [[9](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/docs.html)] and [[10](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/matrix2.html)]\n",
505 "\n",
506 "In Sage you can easily manipulate matrices and vectors"
507 ]
508 },
509 {
510 "cell_type": "code",
511 "execution_count": 77,
512 "metadata": {},
513 "outputs": [
514 {
515 "name": "stdout",
516 "output_type": "stream",
517 "text": [
518 "[ 1 2 3]\n",
519 "[ 0 0 1]\n",
520 "[ 4 -3 22/7] \n",
521 "\n",
522 "[1/2 0 0]\n",
523 "[ 7 0 0]\n",
524 "[ 1 1 1] \n",
525 "\n",
526 "(3/2, 21, 6) \n",
527 "\n",
528 "[ -7/2 -10 80/7]\n",
529 "[ 17 -4 15/7]\n",
530 "[ 241/7 -18/7 869/49] \n",
531 "\n",
532 "Rank of A = 3\n",
533 "Rank of B = 2\n"
534 ]
535 }
536 ],
537 "source": [
538 "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n",
539 "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n",
540 "v = vector([3,4,-1])\n",
541 "\n",
542 "print(A, \"\\n\") # \\n just means \"newline\"\n",
543 "print(B, \"\\n\")\n",
544 "print(B*v, \"\\n\")\n",
545 "print(A^2 + 2*B - A*B, \"\\n\")\n",
546 "\n",
547 "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n",
548 "print(\"Rank of B =\", rank(B))"
549 ]
550 },
551 {
552 "cell_type": "markdown",
553 "metadata": {},
554 "source": [
555 "**Exercise:** in the cell above, compute the determinant, inverse and characteristic polynomial of the matrix `A`. *Hint: look at the reference [10] above (the functions are listed in alphabetic order).*\n",
556 "\n",
557 "As for polynomials, you can specify where a matrix or a vector lives"
558 ]
559 },
560 {
561 "cell_type": "code",
562 "execution_count": 57,
563 "metadata": {},
564 "outputs": [
565 {
566 "data": {
567 "text/plain": [
568 "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision"
569 ]
570 },
571 "execution_count": 57,
572 "metadata": {},
573 "output_type": "execute_result"
574 }
575 ],
576 "source": [
577 "M = matrix(CC, [[0,1],[1,0]])\n",
578 "parent(M)"
579 ]
580 },
581 {
582 "cell_type": "markdown",
583 "metadata": {},
584 "source": [
585 "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n",
586 "\n",
587 "**Warning.** In linear algebra there are distinct concepts of *left* and *right* eigenvalues (and eigenvector). The one you know is probably that of **right** eigen-{value,vector}, that is an element $\\lambda$ of the base field and a non-zero vector $\\mathbf v$ with $A\\mathbf v=\\lambda\\mathbf v$. The other concept corresponds to the equality $\\mathbf v^TA=\\lambda \\mathbf v$."
588 ]
589 },
590 {
591 "cell_type": "code",
592 "execution_count": 60,
593 "metadata": {},
594 "outputs": [
595 {
596 "data": {
597 "text/plain": [
598 "(0.289916349448506, 0.0241596957873755)"
599 ]
600 },
601 "execution_count": 60,
602 "metadata": {},
603 "output_type": "execute_result"
604 }
605 ],
606 "source": [
607 "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n",
608 "v = vector(RR, [3,0])\n",
609 "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v"
610 ]
611 },
612 {
613 "cell_type": "code",
614 "execution_count": 64,
615 "metadata": {},
616 "outputs": [
617 {
618 "data": {
619 "text/plain": [
620 "[\n",
621 "(-0.3722813232690144?, Vector space of degree 2 and dimension 1 over Algebraic Field\n",
622 "User basis matrix:\n",
623 "[ 1 -0.6861406616345072?]),\n",
624 "(5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic Field\n",
625 "User basis matrix:\n",
626 "[ 1 2.186140661634508?])\n",
627 "]"
628 ]
629 },
630 "execution_count": 64,
631 "metadata": {},
632 "output_type": "execute_result"
633 }
634 ],
635 "source": [
636 "A = Matrix(QQ, [[1,2],[3,4]])\n",
637 "A.eigenspaces_right() # Also: A.eigenvalues(), A.eigenvectors_right()"
638 ]
639 },
640 {
641 "cell_type": "markdown",
642 "metadata": {},
643 "source": [
644 "We can also extract a specific submatrix by selecting only some rows and columns, with a syntax similar to that of Python's lists. Check out more examples on the reference [9] above, and try them in the cell below."
645 ]
646 },
647 {
648 "cell_type": "code",
649 "execution_count": 94,
650 "metadata": {},
651 "outputs": [
652 {
653 "name": "stdout",
654 "output_type": "stream",
655 "text": [
656 "[-14 2 0 -1 1 -2 -1]\n",
657 "[ 0 -8 0 9 -2 11 1]\n",
658 "[ 0 3 1 -1 1 1 221]\n",
659 "[ -1 2 1 -25 -10 4 0]\n",
660 "[ -3 0 0 2 16 -1 -2]\n",
661 "[ 1 -3 3 -41 1 0 0]\n",
662 "[ -2 1 0 0 -6 2 12] \n",
663 "\n",
664 "[ 0 9 -2]\n",
665 "[ 1 -1 1] \n",
666 "\n",
667 "[-14 2 0 -1 1 -2 -1] \n",
668 "\n",
669 "[-14 2 0 -1 1]\n",
670 "[ 1 -3 3 -41 1]\n",
671 "[ 0 3 1 -1 1]\n"
672 ]
673 }
674 ],
675 "source": [
676 "A = MatrixSpace(ZZ, 7).random_element()\n",
677 "print(A, \"\\n\")\n",
678 "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n",
679 "print(A[0,0:], \"\\n\") # First row, all columns\n",
680 "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5"
681 ]
682 },
683 {
684 "cell_type": "markdown",
685 "metadata": {},
686 "source": [
687 "**Exercise:** write a sage function that computes the determinant of an $n\\times n$ matrix $A=(a_{ij})$ using Laplace's rule by the first row, that is \n",
688 "\\begin{align*}\n",
689 " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n",
690 "\\end{align*}\n",
691 "where $M_{0j}$ is the determinant of the $(n-1)\\times(n-1)$ matrix obtained by removing the $0$-th row and the $j$-th column from $A$."
692 ]
693 },
694 {
695 "cell_type": "code",
696 "execution_count": 91,
697 "metadata": {},
698 "outputs": [],
699 "source": [
700 "def my_det(A):\n",
701 " if not A.is_square():\n",
702 " print(\"Error: matrix is not square\")\n",
703 " \n",
704 " n = A.nrows() # size of the matrix\n",
705 " \n",
706 " # Continue from here!"
707 ]
708 },
709 {
710 "cell_type": "markdown",
711 "metadata": {},
712 "source": [
713 "# Number Theory\n",
714 "\n",
715 "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n",
716 "\n",
717 "Sage includes a large library of functions for computing with the integers, see the link above."
718 ]
719 },
720 {
721 "cell_type": "code",
722 "execution_count": 116,
723 "metadata": {},
724 "outputs": [
725 {
726 "name": "stdout",
727 "output_type": "stream",
728 "text": [
729 "3^2 * 3607 * 3803\n",
730 "True\n",
731 "True\n",
732 "619703040\n",
733 "9\n",
734 "13548070123626141\n"
735 ]
736 }
737 ],
738 "source": [
739 "n = 123456789\n",
740 "m = 987654321\n",
741 "p = 3607\n",
742 "\n",
743 "print(factor(n))\n",
744 "print(is_prime(p))\n",
745 "print(p.divides(n))\n",
746 "print(euler_phi(m))\n",
747 "print(gcd(n, m))\n",
748 "print(lcm(n, m))"
749 ]
750 },
751 {
752 "cell_type": "markdown",
753 "metadata": {},
754 "source": [
755 "## Primes\n",
756 "\n",
757 "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n",
758 "\n",
759 "The set of prime numbers is called `Primes()`. It is like an infinite list: for example you can get the one-millionth prime number or you can use this list to create other lists. You can also check what the first prime number larger than a given number is."
760 ]
761 },
762 {
763 "cell_type": "code",
764 "execution_count": 119,
765 "metadata": {},
766 "outputs": [
767 {
768 "name": "stdout",
769 "output_type": "stream",
770 "text": [
771 "Set of all prime numbers: 2, 3, 5, 7, ...\n",
772 "31 15485867\n",
773 "47\n",
774 "[79, 83, 89, 97]\n"
775 ]
776 }
777 ],
778 "source": [
779 "PP = Primes()\n",
780 "print(PP)\n",
781 "print(PP[10], PP[10^6])\n",
782 "print(PP.next(44))\n",
783 "\n",
784 "First_Thousand_Primes = PP[0:1000]\n",
785 "print([p for p in First_Thousand_Primes if p < 100 and p > 75])"
786 ]
787 },
788 {
789 "cell_type": "markdown",
790 "metadata": {},
791 "source": [
792 "## The Chinese remainder theorem (CRT)\n",
793 "\n",
794 "We say that two integers $a$ and $b$ are *congruent* modulo another integer $n>0$ if they have the same remainder when divided by $n$. We denote this by $a\\equiv b\\pmod n$, or in Python/Sage syntax `a % n == b % n`.\n",
795 "\n",
796 "The Chinese remainder theorem states that if $a,b\\in\\mathbb Z$ and $n,m\\in \\mathbb Z_{>0}$ are such that $\\gcd(n,m)=1$ then the system of congruences\n",
797 "\n",
798 "\\begin{align*}\n",
799 "\\begin{cases}\n",
800 " x \\equiv a \\pmod n\\\\\n",
801 " x \\equiv b \\pmod m\n",
802 "\\end{cases}\n",
803 "\\end{align*}\n",
804 "\n",
805 "has exactly one solution modulo $mn$. This means that there is one and only one number $x$ with $0\\leq x<mn$ such that $x\\equiv a\\pmod n$ and $x\\equiv b\\pmod m$.\n",
806 "\n",
807 "The procedure to find such a number is not too hard to describe (you might see it in an algebra or number theory course), but it can be a bit long. Luckily, Sage can do this for you:"
808 ]
809 },
810 {
811 "cell_type": "code",
812 "execution_count": 125,
813 "metadata": {},
814 "outputs": [
815 {
816 "name": "stdout",
817 "output_type": "stream",
818 "text": [
819 "74306 2 798\n"
820 ]
821 }
822 ],
823 "source": [
824 "a = 2\n",
825 "b = -1\n",
826 "n = 172\n",
827 "m = 799\n",
828 "\n",
829 "if gcd(n,m) != 1:\n",
830 " print(\"The numbers are not comprime, you will get an error!\")\n",
831 " \n",
832 "x = crt(a, b, n, m)\n",
833 "print(x, x%n, x%m)"
834 ]
835 },
836 {
837 "cell_type": "markdown",
838 "metadata": {},
839 "source": [
840 "**Exercise.** There is a more general version of the Chinese remainder theorem which says that if $a_0, a_1, \\dots, a_k\\in\\mathbb Z$ and $n_0, n_2, \\dots, n_k\\in\\mathbb Z_{>0}$ are such that $\\gcd(n_i, n_j)=1$ for $i\\neq j$, then the system of congruences\n",
841 "\n",
842 "\\begin{align*}\n",
843 "\\begin{cases}\n",
844 " x \\equiv a_0 \\pmod n_0\\\\\n",
845 " x \\equiv a_1 \\pmod n_1\\\\\n",
846 " \\dots \\\\\n",
847 " x \\equiv a_k \\pmod n_k\n",
848 "\\end{cases}\n",
849 "\\end{align*}\n",
850 "\n",
851 "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n",
852 "*Hint: start by running the command `help(crt)`*"
853 ]
854 },
855 {
856 "cell_type": "code",
857 "execution_count": 127,
858 "metadata": {},
859 "outputs": [],
860 "source": [
861 "#help(crt)"
862 ]
863 },
864 {
865 "cell_type": "markdown",
866 "metadata": {},
867 "source": [
868 "# Cryptography: RSA\n",
869 "\n",
870 "[Cryptography](https://en.wikipedia.org/wiki/Cryptography) is the discipline that studies methods to communicate secrets in such a way that any unauthorized listener would not be able to understand the message.\n",
871 "\n",
872 "A simple cryptographic protocol could be changing every letter of your text following a fixed scheme (or *cypher*), for example by turning every A into a B, every B into a C and so on. However this is not a very secure method, for many reasons. One of them is that at some point the people who want to communicate need to agree on what method to use, and anyone listening to that conversation would be able to decypher every subsequent conversation. A public-key cryptographic protocol solves this problem.\n",
873 "\n",
874 "## Public-key cryptography\n",
875 "\n",
876 "Public-key cryptographic protocols, such as RSA, work like this: there are two keys, a *private* key that is only known to person A (traditionally called Alice in every example), and a *public* key that does not need to be secret.\n",
877 "\n",
878 "The public key is used to *encypt* the message (that is to \"lock\" it, or \"hyde\" it), but one needs the private key to *decrypt* it. Imagine having two keys for your door, but one can only be used to lock it, while the other only to open it.\n",
879 "\n",
880 "The message exchange works like this: suppose that person B (Bob) wants to send a secret message to Alice. Then Alice secretely generates a private and a public key and sends only the public one to Bob. Now Bob encrypts the message and sends it to Alice, who can use the private key to decrypt it. Even if Eve (short for *eavesdropper*, an unauthorized listener) listens to every message exchanged, she won't be able to decypher the secret: the private key has never left Alice's house!\n",
881 "\n",
882 "Notice that such a protocol is a-symmetric: if Alice wanted to send a secret to Bob in reply, Bob would need to generate a pair of keys of his own.\n",
883 "\n",
884 "Let's see how we can do this in practice, using number theory!\n",
885 "\n",
886 "## RSA\n",
887 "\n",
888 "As many other cryptography protocols, RSA is based on a Mathematical process that is easy to do in one direction, but very hard to invert. In this case the hard process is integer factorization, that is decomposing an integer number as a product of primes."
889 ]
890 },
891 {
892 "cell_type": "code",
893 "execution_count": 97,
894 "metadata": {},
895 "outputs": [
896 {
897 "name": "stdout",
898 "output_type": "stream",
899 "text": [
900 "True True False\n"
901 ]
902 }
903 ],
904 "source": [
905 "p = 100003100019100043100057100069\n",
906 "q = 100144655312449572059845328443\n",
907 "n = p*q\n",
908 "print(is_prime(p), is_prime(q), is_prime(p*q))\n",
909 "\n",
910 "# Use the command below to see how long it takes\n",
911 "#timeit(\"factor(n)\")"
912 ]
913 },
914 {
915 "cell_type": "markdown",
916 "metadata": {},
917 "source": [
918 "In order to generate the keys, Alice picks a number $n$ which is the product of two large primes $p$ and $q$ of more or less the same size. Finding such primes is relatively easy compared to factoring the number $n$ she obtained. Then she computes the Euler totient $\\varphi(n)=(p-1)(q-1)$ of $n$, which she can do because she knows that $n=pq$ - it would be impossible otherwise!\n",
919 "\n",
920 "Then Alice can compute the (public key, private key) pair: two integers $(d,e)$ such that $de\\equiv 1\\pmod{\\varphi(n)}$. She will send the numbers $n$ and $d$ to Bob and keep $e$ secret.\n",
921 "\n",
922 "Of course, she does all of this using Sage!"
923 ]
924 },
925 {
926 "cell_type": "code",
927 "execution_count": 105,
928 "metadata": {},
929 "outputs": [
930 {
931 "data": {
932 "text/plain": [
933 "(419199544978969, 235530823946467, 80799425863927)"
934 ]
935 },
936 "execution_count": 105,
937 "metadata": {},
938 "output_type": "execute_result"
939 }
940 ],
941 "source": [
942 "def two_large_primes():\n",
943 " p, q = 0, 0\n",
944 " # We make sure that they are different\n",
945 " while p == q:\n",
946 " p = Primes()[randint(10^6, 2*10^6)]\n",
947 " q = Primes()[randint(10^6, 2*10^6)]\n",
948 " return p, q\n",
949 "\n",
950 "def random_unit_mod(N):\n",
951 " R = Integers(N)\n",
952 " d = R(0)\n",
953 " # We make sure that it is invertible\n",
954 " while not d.is_unit():\n",
955 " d = R.random_element()\n",
956 " return d\n",
957 "\n",
958 "def Alice_generate_keys():\n",
959 " p, q = two_large_primes()\n",
960 " n = p*q\n",
961 " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n",
962 " \n",
963 " d = random_unit_mod(phi_n)\n",
964 " e = d^-1\n",
965 " return n, d, e\n",
966 "\n",
967 "Alice_generate_keys()"
968 ]
969 },
970 {
971 "cell_type": "markdown",
972 "metadata": {},
973 "source": [
974 "Now, how does Bob encrypt his message? Let's say he wants to send to Alice the number $m$ with $1<m<n$ (In practice he would like to send her some text with emojis, or maybe a voice message; but for computers everything is a number, and there are different ways to translate any sort of information to a number. He just chooses one of the many standard methods that already exist, no cryptography is needed in this step. If the message $m$ is too long, he can split it up in some pieces and repeat the process multiple times.)\n",
975 "\n",
976 "Now he computes $m^d\\pmod n$ and sends it back to Alice. This is actually a very fast computation to do, and maybe we will see this in the last lecture."
977 ]
978 },
979 {
980 "cell_type": "code",
981 "execution_count": 106,
982 "metadata": {},
983 "outputs": [
984 {
985 "data": {
986 "text/plain": [
987 "149461597163501"
988 ]
989 },
990 "execution_count": 106,
991 "metadata": {},
992 "output_type": "execute_result"
993 }
994 ],
995 "source": [
996 "def Bob_encrypt(m, n, d):\n",
997 " R = Integers(n)\n",
998 " return R(m)^d # Assume that n is large enough\n",
999 " \n",
1000 "Bob_encrypt(42424242, 419199544978969, 235530823946467)"
1001 ]
1002 },
1003 {
1004 "cell_type": "markdown",
1005 "metadata": {},
1006 "source": [
1007 "Since $de\\equiv 1\\pmod{\\varphi(n)}$, it follows that $(m^d)^e\\equiv m\\pmod n$ (see [Wikipedia: Euler's theorem](https://en.wikipedia.org/wiki/Euler%27s_theorem)). So for Alice it is very easy to get back the original message:"
1008 ]
1009 },
1010 {
1011 "cell_type": "code",
1012 "execution_count": 108,
1013 "metadata": {},
1014 "outputs": [
1015 {
1016 "data": {
1017 "text/plain": [
1018 "42424242"
1019 ]
1020 },
1021 "execution_count": 108,
1022 "metadata": {},
1023 "output_type": "execute_result"
1024 }
1025 ],
1026 "source": [
1027 "def Alice_decrypt(m_encrypted, n, e):\n",
1028 " R = Integers(n)\n",
1029 " return R(m_encrypted)^e\n",
1030 "\n",
1031 "Alice_decrypt(149461597163501, 419199544978969, 80799425863927)"
1032 ]
1033 },
1034 {
1035 "cell_type": "markdown",
1036 "metadata": {},
1037 "source": [
1038 "Another assumption on which RSA relies is that even if one knows $M=m^e$ and $e$, extracting the $e$-th root of $M$ modulo $n$ (and thus obtaining $m$) is also hard. Currently the best known way to do this is by factorizing $n$ first, so this seems to be hard. However, there is no proof that faster algorithms can't be devised.\n",
1039 "\n",
1040 "Moreover, one day we will overcome the current technological difficulties and quantum computers will be available. Quantum computers are not just \"more powerful\" than classical hardware, but they work based on a completely different logical foundation and make the factorization problem much easier to solve: for example [Shor's algorithm](https://en.wikipedia.org/wiki/Shor%27s_algorithm) takes advantage of this different logic and can factorize numbers quickly, if run on a quantum computer.\n",
1041 "\n",
1042 "To this day the largest number factorized with a quantum computer is $21=3\\times 7$. Nonetheless, quantum-safe cryptography protocols (i.e. based on problems that are hard to solve also with quantum computers) have already been developed."
1043 ]
1044 }
1045 ],
1046 "metadata": {
1047 "kernelspec": {
1048 "display_name": "SageMath 9.2",
1049 "language": "sage",
1050 "name": "sagemath"
1051 },
1052 "language_info": {
1053 "codemirror_mode": {
1054 "name": "ipython",
1055 "version": 3
1056 },
1057 "file_extension": ".py",
1058 "mimetype": "text/x-python",
1059 "name": "python",
1060 "nbconvert_exporter": "python",
1061 "pygments_lexer": "ipython3",
1062 "version": "3.8.5"
1063 }
1064 },
1065 "nbformat": 4,
1066 "nbformat_minor": 4
1067}
diff --git a/src/Lecture5/live/7-SageAlgebra-modified+solutions.ipynb b/src/Lecture5/live/7-SageAlgebra-modified+solutions.ipynb
new file mode 100644
index 0000000..f4e39b2
--- /dev/null
+++ b/src/Lecture5/live/7-SageAlgebra-modified+solutions.ipynb
@@ -0,0 +1,1099 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "This lecture's notes are in a different format: the presentations for the $\\LaTeX$ part were made with $\\LaTeX$, so this one is made with Sage, or rather with the [Jupyter Notebook](https://jupyter.org/).\n",
8 "\n",
9 "# The Jupyter Notebook\n",
10 "**Reference:** [[1](https://jupyter.org/documentation)]\n",
11 "\n",
12 "The Jupyter Notebook is one of the default interfaces for SageMath, along with the command line interface. You can access it via web browser, but it is running locally on your device (notice the strange url: `http://localhost:8888/notebooks...`).\n",
13 "\n",
14 "You can create a new notebook by clicking on `New > SageMath 9.2`. You can also create a Python 3 notebook to write Python code.\n",
15 "\n",
16 "Jupyter saves and reads files in the `.ipynb` format. If you download the file for this lecture you can open it and follow the examples interactively.\n",
17 "\n",
18 "## Cells\n",
19 "\n",
20 "The notebook contains one or more *interactive cells* that you can run, like this one below:"
21 ]
22 },
23 {
24 "cell_type": "code",
25 "execution_count": null,
26 "metadata": {},
27 "outputs": [],
28 "source": [
29 "# Exercise: modify this cell to use the print() command\n",
30 "\n",
31 "a = 34*102\n",
32 "\n",
33 "print(2+2)\n",
34 "print(\"hello\")\n",
35 "print(a-1)"
36 ]
37 },
38 {
39 "cell_type": "markdown",
40 "metadata": {},
41 "source": [
42 "If you are reading this from Jupyter rather than from the pdf file, you can edit the cell above and run it again. You can also add more cells by selecting `Insert` from the menu bar.\n",
43 "\n",
44 "Notice that only the last statement produces an output. You can force anything to be written as output with the `print()` command, which works like in Python. As an exercise, try to modify the cell above to provide more output!"
45 ]
46 },
47 {
48 "cell_type": "code",
49 "execution_count": null,
50 "metadata": {},
51 "outputs": [],
52 "source": [
53 "print(a)"
54 ]
55 },
56 {
57 "cell_type": "markdown",
58 "metadata": {},
59 "source": [
60 "text *hello*\n",
61 "* this\n",
62 "* is\n",
63 "* a list"
64 ]
65 },
66 {
67 "cell_type": "markdown",
68 "metadata": {},
69 "source": [
70 "## Markdown\n",
71 "\n",
72 "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n",
73 "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n",
74 "\n",
75 "You can also include some LaTeX code in Markdown cells, with dollar signs $ or align environments:\n",
76 "\n",
77 "\\begin{align*}\n",
78 "\\frac{(x+y)^2}{x+1} = \\frac{x^2+2xy+y^2}{x+1}\n",
79 "\\end{align*}\n",
80 "\n",
81 "When you are done writing a Markdown cell, you can run it to see the well-formatted text. To edit the text again, double-click on the cell. Try doing it now to fix the formula above!"
82 ]
83 },
84 {
85 "cell_type": "markdown",
86 "metadata": {},
87 "source": [
88 "# Symbolic expressions\n",
89 "\n",
90 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
91 "\n",
92 "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:"
93 ]
94 },
95 {
96 "cell_type": "code",
97 "execution_count": 48,
98 "metadata": {},
99 "outputs": [
100 {
101 "name": "stdout",
102 "output_type": "stream",
103 "text": [
104 "[\n",
105 "x == -1/2*(I*sqrt(3) + 1)*(1/2*I*sqrt(3) - 1/2)^(1/3) + (1/2*I*sqrt(3) - 1/2)^(2/3) - 1,\n",
106 "x == (1/2*I*sqrt(3) - 1/2)^(4/3) - 1/2*(I*sqrt(3) + 1)/(1/2*I*sqrt(3) - 1/2)^(1/3) - 1,\n",
107 "x == (1/2*I*sqrt(3) - 1/2)^(1/3) + 1/(1/2*I*sqrt(3) - 1/2)^(1/3) - 1\n",
108 "]\n"
109 ]
110 }
111 ],
112 "source": [
113 "f = (x^2 + 2*x - 5 >= 0)\n",
114 "solve(f,x)\n",
115 "\n",
116 "g = x^3 + 3*x^2-1\n",
117 "print(solve(g==0, x))\n",
118 "\n",
119 "h = x^2 +3*x -1"
120 ]
121 },
122 {
123 "cell_type": "markdown",
124 "metadata": {},
125 "source": [
126 "Notice that the single `=` is part of an assignment, as in Python: we are *assigning* to the variable `f` the value `x^2 + 2*x - 5 >= 0`, which in this case is an equation, so it contains the symbol `==`. Keep in mind the difference between the two!\n",
127 "\n",
128 "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$."
129 ]
130 },
131 {
132 "cell_type": "markdown",
133 "metadata": {},
134 "source": [
135 "## Mathematical variables\n",
136 "\n",
137 "Last time we saw what *variables* are in Python, and that they are a little bit different from the *Mathematical variables* that you use in Mathematics. In Sage, both concepts are present, but they are still distinct. For example in the cell above `f` is a variable in the sense of computer science, while `x` is a Mathematical variable.\n",
138 "\n",
139 "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:"
140 ]
141 },
142 {
143 "cell_type": "code",
144 "execution_count": null,
145 "metadata": {},
146 "outputs": [],
147 "source": [
148 "var('z')\n",
149 "solve(z^2 + z - 2 == 0, z)"
150 ]
151 },
152 {
153 "cell_type": "markdown",
154 "metadata": {},
155 "source": [
156 "Try removing the first line in the cell above and see what error you get!\n",
157 "\n",
158 "Here is another example:"
159 ]
160 },
161 {
162 "cell_type": "code",
163 "execution_count": null,
164 "metadata": {},
165 "outputs": [],
166 "source": [
167 "var('a', 'b')\n",
168 "f = x^2+a*x+b == 0\n",
169 "solve(f,a)"
170 ]
171 },
172 {
173 "cell_type": "markdown",
174 "metadata": {},
175 "source": [
176 "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:"
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": null,
182 "metadata": {},
183 "outputs": [],
184 "source": [
185 "e^(pi*I)\n",
186 "print(N(pi), N(e))\n",
187 "e = 42\n",
188 "print(e)\n",
189 "reset('e')\n",
190 "print(N(e))"
191 ]
192 },
193 {
194 "cell_type": "markdown",
195 "metadata": {},
196 "source": [
197 "We will study symbolic expressions more in detail next time, in the context of calculus/analysis."
198 ]
199 },
200 {
201 "cell_type": "markdown",
202 "metadata": {},
203 "source": [
204 "# Basic rings and fields\n",
205 "\n",
206 "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n",
207 "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n",
208 "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n",
209 "\n",
210 "As you should know, a *field* is a Mathematical structure with two operations, addition and multiplication, which respect certain rules (distributivity, associativity, commutativity...). Some examples of fields are the Rational numbers $\\mathbb Q$, the Real numbers $\\mathbb R$ and the Complex numbers $\\mathbb C$, but there are many more. As you should also know, a *(commutative) ring* is like a field, except not all elements different from $0$ need have a multiplicative inverse. For example the integers $\\mathbb Z = \\{ \\dots, -1, 0, 1, 2, \\dots\\}$ are a ring, but not a field.\n",
211 "\n",
212 "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n",
213 "\n",
214 "|Mathematical object|Math symbol|Sage name|\n",
215 "|------------------:|:---------:|:--------|\n",
216 "|Integers|$\\mathbb Z$|`ZZ`|\n",
217 "|Rational numbers|$\\mathbb Q$|`QQ`|\n",
218 "|Real numbers|$\\mathbb R$|`RR`|\n",
219 "|Complex numbers|$\\mathbb C$|`CC`|\n",
220 "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n",
221 "|Finite fields|$\\mathbb F_p$|GF(p)|\n",
222 "|$\\dots$|$\\dots$|$\\dots$|"
223 ]
224 },
225 {
226 "cell_type": "markdown",
227 "metadata": {},
228 "source": [
229 "If you write a number or an expression, Sage will figure out where it \"lives\", choosing the most restrictive interpretation possible. For example `3` will be interpreted to be an integer, even if it is also a rational number, a real number and a complex number."
230 ]
231 },
232 {
233 "cell_type": "markdown",
234 "metadata": {},
235 "source": [
236 "## Parents and coercion\n",
237 "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n",
238 "\n",
239 "You can check where an object \"lives\" with the `parent()` command. It works more or less like the Python command `type()`, but it gives a more Mathematically inclined answer. Check the reference link [6] above if you want more details."
240 ]
241 },
242 {
243 "cell_type": "code",
244 "execution_count": null,
245 "metadata": {},
246 "outputs": [],
247 "source": [
248 "#Edit this cell to find out the type of other objects that we used\n",
249 "print(parent(3/5))\n",
250 "print(QQ)\n",
251 "print(type(3/5))"
252 ]
253 },
254 {
255 "cell_type": "markdown",
256 "metadata": {},
257 "source": [
258 "Sometimes Sage does not give you the best possible interpretation, so you can force something to be interpreted as living in a smaller ring as follows:"
259 ]
260 },
261 {
262 "cell_type": "code",
263 "execution_count": null,
264 "metadata": {},
265 "outputs": [],
266 "source": [
267 "minus_one = e^(pi*I)\n",
268 "print(minus_one)\n",
269 "minus_one_coerced = ZZ(e^(pi*I)) # coercion\n",
270 "#print(ZZ(1/2))\n",
271 "print(parent(minus_one))\n",
272 "print(parent(x^2))\n",
273 "print(parent(minus_one_coerced))\n",
274 "print(parent(5.2))\n",
275 "print(parent(QQ(5.2)))"
276 ]
277 },
278 {
279 "cell_type": "markdown",
280 "metadata": {},
281 "source": [
282 "**Remark.** Notice that there is a fundamental difference between the rings `RR` and `CC` and all the others in the table above: the real and complex numbers are *approximated*."
283 ]
284 },
285 {
286 "cell_type": "code",
287 "execution_count": null,
288 "metadata": {},
289 "outputs": [],
290 "source": [
291 "print(QQ(3))\n",
292 "print(RR(3))"
293 ]
294 },
295 {
296 "cell_type": "markdown",
297 "metadata": {},
298 "source": [
299 "You can also choose the precision of this approximation using the alternative name `RealField`."
300 ]
301 },
302 {
303 "cell_type": "code",
304 "execution_count": null,
305 "metadata": {},
306 "outputs": [],
307 "source": [
308 "print(RR)\n",
309 "print(RealField(prec=1000))"
310 ]
311 },
312 {
313 "cell_type": "markdown",
314 "metadata": {},
315 "source": [
316 "# Polynomial rings\n",
317 "\n",
318 "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n",
319 "\n",
320 "If you want to work with polynomials over a certain ring it is better to use this specific construction, rather than the symbolic expressions introduced above."
321 ]
322 },
323 {
324 "cell_type": "code",
325 "execution_count": 55,
326 "metadata": {},
327 "outputs": [
328 {
329 "name": "stdout",
330 "output_type": "stream",
331 "text": [
332 "Univariate Polynomial Ring in x over Rational Field\n",
333 "[]\n",
334 "[(-2, 2)]\n"
335 ]
336 }
337 ],
338 "source": [
339 "polring.<x> = QQ[] # Alternative: polring.<x,y,z> = PolynomialRing(RR)\n",
340 "polring\n",
341 "print(parent(x))\n",
342 "g = x^3 + 3*x^2-1\n",
343 "print(g.roots())\n",
344 "print((x^2+4*x+4).roots())"
345 ]
346 },
347 {
348 "cell_type": "markdown",
349 "metadata": {},
350 "source": [
351 "You can use as many variables as you like, and you can replace `RR` with any ring. In the example above `polring` is just the name of the variable (in the computer science sense) associated with this polynomial ring.\n",
352 "\n",
353 "## Operations on polynomials\n",
354 "\n",
355 "The usual Mathematical operations are available on polynomial rings, including Euclidean division `//` and remainder `%`. There is also the single-slash division `/`, but the result may not be a polynomial anymore.\n",
356 "\n",
357 "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n",
358 "\n",
359 "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?"
360 ]
361 },
362 {
363 "cell_type": "code",
364 "execution_count": 60,
365 "metadata": {},
366 "outputs": [
367 {
368 "name": "stdout",
369 "output_type": "stream",
370 "text": [
371 "x + 1\n",
372 "-4\n",
373 "(x^2 + 2*x - 3)/(x + 1)\n",
374 "Fraction Field of Univariate Polynomial Ring in x over Rational Field\n"
375 ]
376 },
377 {
378 "data": {
379 "text/plain": [
380 "x^4 + 2*x^3 - 4*x^2 - 2*x + 3"
381 ]
382 },
383 "execution_count": 60,
384 "metadata": {},
385 "output_type": "execute_result"
386 }
387 ],
388 "source": [
389 "polring.<x> = QQ[]\n",
390 "p = x^2 + 2*x - 3 # Don't forget * for multiplication!\n",
391 "q = p // (x+1)\n",
392 "r = p % (x+1)\n",
393 "f = p / (x+1)\n",
394 "print(q)\n",
395 "print(r)\n",
396 "print(f)\n",
397 "print(parent(f))\n",
398 "p*(x^2-1)"
399 ]
400 },
401 {
402 "cell_type": "markdown",
403 "metadata": {},
404 "source": [
405 "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n",
406 "\n",
407 "**Remark.** Notice how the result can change substantially if you change the base ring.\n",
408 "\n",
409 "**Remark.** [Factorizations](https://doc.sagemath.org/html/en/reference/structure/sage/structure/factorization.html) are a particular object in Sage. They are kinda like a list, but not really. You can get a list of pairs (factor, power) with `list(factor(f))`."
410 ]
411 },
412 {
413 "cell_type": "code",
414 "execution_count": 76,
415 "metadata": {
416 "scrolled": true
417 },
418 "outputs": [
419 {
420 "name": "stdout",
421 "output_type": "stream",
422 "text": [
423 "(t + 1) * (t^2 - 3) * (t^2 + 1)\n",
424 "[(t + 1, 1), (t^2 - 3, 1), (t^2 + 1, 1)]\n",
425 "t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n",
426 "t^2 - 1\n",
427 "[(-1, 1)]\n",
428 "Multivariate Polynomial Ring in x, y, z over Rational Field\n"
429 ]
430 },
431 {
432 "data": {
433 "text/plain": [
434 "Multivariate Polynomial Ring in x, y, z over Rational Field"
435 ]
436 },
437 "execution_count": 76,
438 "metadata": {},
439 "output_type": "execute_result"
440 }
441 ],
442 "source": [
443 "polring_onevar.<t> = QQ[]\n",
444 "\n",
445 "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n",
446 "fact = factor(f)\n",
447 "print(factor(f))\n",
448 "print(list(fact))\n",
449 "print((t + 1) * (t^2 - 3) * (t^2 + 1))\n",
450 "print((t+1)*(t-1))\n",
451 "print(f.roots()) # Result: list of pairs (root,multiplicity)\n",
452 "\n",
453 "polring_manyvar.<x,y,z> = QQ[]\n",
454 "factor(x*y+x)\n",
455 "\n",
456 "# The following line gives an error, because the polynomial\n",
457 "# is understood to possibly have many variables:\n",
458 "print(parent(x))\n",
459 "(QQ['x'](x^2-1)).roots()\n",
460 "parent(x)"
461 ]
462 },
463 {
464 "cell_type": "markdown",
465 "metadata": {},
466 "source": [
467 "# Matrices and vectors\n",
468 "\n",
469 "**References:** [[8](https://doc.sagemath.org/html/en/reference/matrices/index.html)], but in particular the subections [[9](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/docs.html)] and [[10](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/matrix2.html)]\n",
470 "\n",
471 "In Sage you can easily manipulate matrices and vectors"
472 ]
473 },
474 {
475 "cell_type": "code",
476 "execution_count": 94,
477 "metadata": {},
478 "outputs": [
479 {
480 "name": "stdout",
481 "output_type": "stream",
482 "text": [
483 "[ 1 2 3]\n",
484 "[ 0 0 1]\n",
485 "[ 4 -3 22/7] \n",
486 "\n",
487 "[1/2 0 0]\n",
488 "[ 7 0 0]\n",
489 "[ 1 1 1] \n",
490 "\n",
491 "[1 0]\n",
492 "[0 1] \n",
493 "\n",
494 "(3/2, 21, 6) \n",
495 "\n",
496 "[ -7/2 -10 80/7]\n",
497 "[ 17 -4 15/7]\n",
498 "[ 241/7 -18/7 869/49] \n",
499 "\n",
500 "Rank of A = 3\n",
501 "Rank of B = 2\n"
502 ]
503 },
504 {
505 "data": {
506 "text/plain": [
507 "11"
508 ]
509 },
510 "execution_count": 94,
511 "metadata": {},
512 "output_type": "execute_result"
513 }
514 ],
515 "source": [
516 "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n",
517 "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n",
518 "C = matrix([[1,0],[0,1]])\n",
519 "v = vector([3,4,-1])\n",
520 "\n",
521 "print(A, \"\\n\") # \\n just means \"newline\"\n",
522 "print(B, \"\\n\")\n",
523 "print(C, \"\\n\")\n",
524 "#print(A*C) Error!\n",
525 "print(B*v, \"\\n\")\n",
526 "print(A^2 + 2*B - A*B, \"\\n\")\n",
527 "\n",
528 "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n",
529 "print(\"Rank of B =\", rank(B))\n",
530 "A.determinant()"
531 ]
532 },
533 {
534 "cell_type": "markdown",
535 "metadata": {},
536 "source": [
537 "**Exercise:** in the cell above, compute the determinant, inverse and characteristic polynomial of the matrix `A`. *Hint: look at the reference [10] above (the functions are listed in alphabetic order).*\n",
538 "\n",
539 "As for polynomials, you can specify where a matrix or a vector lives"
540 ]
541 },
542 {
543 "cell_type": "code",
544 "execution_count": 97,
545 "metadata": {},
546 "outputs": [
547 {
548 "data": {
549 "text/plain": [
550 "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision"
551 ]
552 },
553 "execution_count": 97,
554 "metadata": {},
555 "output_type": "execute_result"
556 }
557 ],
558 "source": [
559 "M = matrix(CC, [[0,1/2],[1,0]])\n",
560 "parent(M)"
561 ]
562 },
563 {
564 "cell_type": "markdown",
565 "metadata": {},
566 "source": [
567 "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n",
568 "\n",
569 "**Warning.** In linear algebra there are distinct concepts of *left* and *right* eigenvalues (and eigenvector). The one you know is probably that of **right** eigen-{value,vector}, that is an element $\\lambda$ of the base field and a non-zero vector $\\mathbf v$ with $A\\mathbf v=\\lambda\\mathbf v$. The other concept corresponds to the equality $\\mathbf v^TA=\\lambda \\mathbf v$."
570 ]
571 },
572 {
573 "cell_type": "code",
574 "execution_count": null,
575 "metadata": {},
576 "outputs": [],
577 "source": [
578 "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n",
579 "v = vector(RR, [3,0])\n",
580 "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v"
581 ]
582 },
583 {
584 "cell_type": "code",
585 "execution_count": 103,
586 "metadata": {},
587 "outputs": [
588 {
589 "name": "stderr",
590 "output_type": "stream",
591 "text": [
592 "<ipython-input-103-d1ccc4990851>:2: UserWarning: Using generic algorithm for an inexact ring, which will probably give incorrect results due to numerical precision issues.\n",
593 " A.eigenvalues() # Also: A.eigenvalues(), A.eigenvectors_right()\n"
594 ]
595 },
596 {
597 "data": {
598 "text/plain": [
599 "[5.37228132326901, -0.372281323269014]"
600 ]
601 },
602 "execution_count": 103,
603 "metadata": {},
604 "output_type": "execute_result"
605 }
606 ],
607 "source": [
608 "A = Matrix(RR, [[1,2],[3,4]])\n",
609 "A.eigenvalues() # Also: A.eigenvalues(), A.eigenvectors_right()"
610 ]
611 },
612 {
613 "cell_type": "markdown",
614 "metadata": {},
615 "source": [
616 "We can also extract a specific submatrix by selecting only some rows and columns, with a syntax similar to that of Python's lists. Check out more examples in the reference [9] above, and try them in the cell below."
617 ]
618 },
619 {
620 "cell_type": "code",
621 "execution_count": 105,
622 "metadata": {},
623 "outputs": [
624 {
625 "name": "stdout",
626 "output_type": "stream",
627 "text": [
628 "[ -3 -25 -5 -3 61 0 -1]\n",
629 "[ 23 0 -1 1 0 1 -1]\n",
630 "[286 2 7 0 -21 -1 0]\n",
631 "[ 2 -1 -2 0 -1 4 0]\n",
632 "[ 1 -1 1 0 2 -2 7]\n",
633 "[ 0 15 -1 0 -3 1 -1]\n",
634 "[ -1 1 -2 0 2 1 1] \n",
635 "\n",
636 "[ -1 1 0]\n",
637 "[ 7 0 -21] \n",
638 "\n",
639 "[ -3 -25 -5 -3 61 0 -1] \n",
640 "\n",
641 "[ -3 -25 -5 -3 61]\n",
642 "[ 0 15 -1 0 -3]\n",
643 "[286 2 7 0 -21]\n",
644 "-25\n"
645 ]
646 }
647 ],
648 "source": [
649 "A = MatrixSpace(ZZ, 7).random_element()\n",
650 "print(A, \"\\n\")\n",
651 "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n",
652 "print(A[0,0:], \"\\n\") # First row, all columns\n",
653 "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5\n",
654 "print(A[0,1])"
655 ]
656 },
657 {
658 "cell_type": "markdown",
659 "metadata": {},
660 "source": [
661 "**Exercise:** write a sage function that computes the determinant of an $n\\times n$ matrix $A=(a_{ij})$ using Laplace's rule by the first row, that is \n",
662 "\\begin{align*}\n",
663 " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n",
664 "\\end{align*}\n",
665 "where $M_{0j}$ is the determinant of the $(n-1)\\times(n-1)$ matrix obtained by removing the $0$-th row and the $j$-th column from $A$."
666 ]
667 },
668 {
669 "cell_type": "code",
670 "execution_count": 6,
671 "metadata": {},
672 "outputs": [
673 {
674 "name": "stdout",
675 "output_type": "stream",
676 "text": [
677 "[ -1 -3 -1 11 2 -1 -5]\n",
678 "[ 1 0 0 -6 -1 0 1]\n",
679 "[ 1 0 -1 0 1 -1 0]\n",
680 "[-24 1 -2 -7 4 0 1]\n",
681 "[ -3 0 -1 0 6 -1 0]\n",
682 "[-17 -1 1 0 28 1 0]\n",
683 "[ 1 -4 1 1 -2 -6 -2]\n",
684 "Sage determinant: 13578\n",
685 "my_det: 13578\n"
686 ]
687 }
688 ],
689 "source": [
690 "def my_det(A):\n",
691 " if not A.is_square():\n",
692 " print(\"Error: matrix is not square\")\n",
693 " \n",
694 " n = A.nrows() # size of the matrix\n",
695 " \n",
696 " if n == 1:\n",
697 " return A[0,0]\n",
698 " \n",
699 " my_sum = 0\n",
700 " for j in range(0,n):\n",
701 " rows = range(1,n)\n",
702 " columns = [element for element in range(0,n) if element != j]\n",
703 " submatrix = A[rows,columns]\n",
704 " my_sum += (-1)^j * A[0,j] * my_det(submatrix)\n",
705 " \n",
706 " return my_sum\n",
707 "\n",
708 "A = MatrixSpace(ZZ, 7).random_element()\n",
709 "print(A)\n",
710 "print(\"Sage determinant: \", A.determinant())\n",
711 "print(\"my_det: \", my_det(A))"
712 ]
713 },
714 {
715 "cell_type": "markdown",
716 "metadata": {},
717 "source": [
718 "# Number Theory\n",
719 "\n",
720 "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n",
721 "\n",
722 "Sage includes a large library of functions for computing with the integers, see the link above."
723 ]
724 },
725 {
726 "cell_type": "code",
727 "execution_count": 8,
728 "metadata": {},
729 "outputs": [
730 {
731 "name": "stdout",
732 "output_type": "stream",
733 "text": [
734 "3^2 * 3607 * 3803\n",
735 "[(3, 2), (3607, 1), (3803, 1)]\n",
736 "True\n",
737 "True\n",
738 "619703040\n",
739 "9\n",
740 "13548070123626141\n"
741 ]
742 }
743 ],
744 "source": [
745 "n = 123456789\n",
746 "m = 987654321\n",
747 "p = 3607\n",
748 "\n",
749 "print(factor(n))\n",
750 "print(list(factor(n)))\n",
751 "print(is_prime(p))\n",
752 "print(p.divides(n))\n",
753 "print(euler_phi(m))\n",
754 "print(gcd(n, m))\n",
755 "print(lcm(n, m))"
756 ]
757 },
758 {
759 "cell_type": "markdown",
760 "metadata": {},
761 "source": [
762 "## Primes\n",
763 "\n",
764 "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n",
765 "\n",
766 "The set of prime numbers is called `Primes()`. It is like an infinite list: for example you can get the one-millionth prime number or you can use this list to create other lists. You can also check what the first prime number larger than a given number is."
767 ]
768 },
769 {
770 "cell_type": "code",
771 "execution_count": null,
772 "metadata": {},
773 "outputs": [
774 {
775 "name": "stdout",
776 "output_type": "stream",
777 "text": [
778 "Set of all prime numbers: 2, 3, 5, 7, ...\n",
779 "31 252097800629\n",
780 "47\n",
781 "[79, 83, 89, 97]\n"
782 ]
783 }
784 ],
785 "source": [
786 "PP = Primes()\n",
787 "print(PP)\n",
788 "print(PP[10], PP[10^10])\n",
789 "print(PP.next(44))\n",
790 "\n",
791 "First_Thousand_Primes = PP[0:1000]\n",
792 "print([p for p in First_Thousand_Primes if p < 100 and p > 75])\n",
793 "#print([p for p in PP if p < 100 and p > 75])"
794 ]
795 },
796 {
797 "cell_type": "markdown",
798 "metadata": {},
799 "source": [
800 "## The Chinese remainder theorem (CRT)\n",
801 "\n",
802 "We say that two integers $a$ and $b$ are *congruent* modulo another integer $n>0$ if they have the same remainder when divided by $n$. We denote this by $a\\equiv b\\pmod n$, or in Python/Sage syntax `a % n == b % n`.\n",
803 "\n",
804 "The Chinese remainder theorem states that if $a,b\\in\\mathbb Z$ and $n,m\\in \\mathbb Z_{>0}$ are such that $\\gcd(n,m)=1$ then the system of congruences\n",
805 "\n",
806 "\\begin{align*}\n",
807 "\\begin{cases}\n",
808 " x \\equiv a \\pmod n\\\\\n",
809 " x \\equiv b \\pmod m\n",
810 "\\end{cases}\n",
811 "\\end{align*}\n",
812 "\n",
813 "\n",
814 "has exactly one solution modulo $mn$. This means that there is one and only one number $x$ with $0\\leq x<mn$ such that $x\\equiv a\\pmod n$ and $x\\equiv b\\pmod m$.\n",
815 "\n",
816 "\n",
817 "For example:\n",
818 "\n",
819 "\\begin{align*}\n",
820 "\\begin{cases}\n",
821 " x \\equiv 1 \\pmod 3\\\\\n",
822 " x \\equiv 2 \\pmod 5\n",
823 "\\end{cases}\n",
824 "\\end{align*}\n",
825 "\n",
826 "Solution: $x=7$ (any other solution is congruent to $7$ modulo $15$; for example $22=15+7$ is also a solution).\n",
827 "\n",
828 "The procedure to find such a number is not too hard to describe (you might see it in an algebra or number theory course), but it can be a bit long. Luckily, Sage can do this for you:"
829 ]
830 },
831 {
832 "cell_type": "code",
833 "execution_count": 1,
834 "metadata": {},
835 "outputs": [
836 {
837 "name": "stdout",
838 "output_type": "stream",
839 "text": [
840 "74306 2 798\n"
841 ]
842 }
843 ],
844 "source": [
845 "a = 2\n",
846 "b = -1\n",
847 "n = 172\n",
848 "m = 799\n",
849 "\n",
850 "if gcd(n,m) != 1:\n",
851 " print(\"The numbers are not comprime, I can't solve this!\")\n",
852 "else:\n",
853 " x = crt(a, b, n, m)\n",
854 " print(x, x%n, x%m)"
855 ]
856 },
857 {
858 "cell_type": "markdown",
859 "metadata": {},
860 "source": [
861 "**Exercise.** There is a more general version of the Chinese remainder theorem which says that if $a_0, a_1, \\dots, a_k\\in\\mathbb Z$ and $n_0, n_2, \\dots, n_k\\in\\mathbb Z_{>0}$ are such that $\\gcd(n_i, n_j)=1$ for $i\\neq j$, then the system of congruences\n",
862 "\n",
863 "\\begin{align*}\n",
864 "\\begin{cases}\n",
865 " x \\equiv a_0 \\pmod {n_0}\\\\\n",
866 " x \\equiv a_1 \\pmod {n_1}\\\\\n",
867 " \\dots \\\\\n",
868 " x \\equiv a_k \\pmod {n_k}\n",
869 "\\end{cases}\n",
870 "\\end{align*}\n",
871 "\n",
872 "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n",
873 "*Hint: start by running the command `help(crt)`."
874 ]
875 },
876 {
877 "cell_type": "code",
878 "execution_count": 3,
879 "metadata": {},
880 "outputs": [],
881 "source": [
882 "#help(crt)"
883 ]
884 },
885 {
886 "cell_type": "markdown",
887 "metadata": {},
888 "source": [
889 "# Cryptography: RSA\n",
890 "\n",
891 "[Cryptography](https://en.wikipedia.org/wiki/Cryptography) is the discipline that studies methods to communicate secrets in such a way that any unauthorized listener would not be able to understand the message.\n",
892 "\n",
893 "A simple cryptographic protocol could be changing every letter of your text following a fixed scheme (or *cypher*), for example by turning every A into a B, every B into a C and so on. However this is not a very secure method, for many reasons. One of them is that at some point the people who want to communicate need to agree on what method to use, and anyone listening to that conversation would be able to decypher every subsequent conversation. A public-key cryptographic protocol solves this problem.\n",
894 "\n",
895 "## Public-key cryptography\n",
896 "\n",
897 "Public-key cryptographic protocols, such as RSA, work like this: there are two keys, a *private* key that is only known to person A (traditionally called Alice in every example), and a *public* key that does not need to be secret.\n",
898 "\n",
899 "The public key is used to *encrypt* the message (that is to \"lock\" it, or \"hyde\" it), but one needs the private key to *decrypt* it. Imagine having two keys for your door, but one can only be used to lock it, while the other only to open it.\n",
900 "\n",
901 "The message exchange works like this: suppose that person B (Bob) wants to send a secret message to Alice. Then Alice secretely generates a private and a public key and sends only the public one to Bob. Now Bob encrypts the message and sends it to Alice, who can use her private key to decrypt it. Even if Eve (short for *eavesdropper*, an unauthorized listener) listens to every message exchanged, she won't be able to decypher the secret: the private key has never left Alice's house!\n",
902 "\n",
903 "Notice that such a protocol is *asymmetric*: if Alice wanted to send a secret to Bob in reply, Bob would need to generate a pair of keys of his own.\n",
904 "\n",
905 "Let's see how we can do this in practice, using number theory!\n",
906 "\n",
907 "## RSA\n",
908 "\n",
909 "As many other cryptography protocols, RSA is based on a Mathematical process that is easy to do in one direction, but very hard to invert. In this case the hard process is integer factorization, that is decomposing an integer number as a product of primes."
910 ]
911 },
912 {
913 "cell_type": "code",
914 "execution_count": 5,
915 "metadata": {},
916 "outputs": [
917 {
918 "name": "stdout",
919 "output_type": "stream",
920 "text": [
921 "True True False\n"
922 ]
923 },
924 {
925 "data": {
926 "text/plain": [
927 "1 loop, best of 1: 9.06 s per loop"
928 ]
929 },
930 "execution_count": 5,
931 "metadata": {},
932 "output_type": "execute_result"
933 }
934 ],
935 "source": [
936 "p = 100003100019100043100057100069\n",
937 "q = 100144655312449572059845328443\n",
938 "n = p*q\n",
939 "print(is_prime(p), is_prime(q), is_prime(p*q))\n",
940 "\n",
941 "# Use the command below to see how long it takes\n",
942 "timeit(\"factor(n)\", number=1, repeat=1)"
943 ]
944 },
945 {
946 "cell_type": "markdown",
947 "metadata": {},
948 "source": [
949 "In order to generate the keys, Alice picks a number $n$ which is the product of two large primes $p$ and $q$ of more or less the same size. Finding such primes is relatively easy compared to factoring the number $n$ she obtained. Then she computes the Euler totient $\\varphi(n)=(p-1)(q-1)$ of $n$, which she can do because she knows that $n=pq$ - it would be impossible otherwise!\n",
950 "\n",
951 "Then Alice can compute two integers $(d,e)$ such that $de\\equiv 1\\pmod{\\varphi(n)}$. She will send the numbers $n$ and $d$ to Bob and keep $e$ secret. In this case the public key is the pair $(n,d)$, while $e$ is the private key.\n",
952 "\n",
953 "Of course, she does all of this using Sage!"
954 ]
955 },
956 {
957 "cell_type": "code",
958 "execution_count": 6,
959 "metadata": {},
960 "outputs": [
961 {
962 "data": {
963 "text/plain": [
964 "(338547806707501, 141995674537431, 107165393087271)"
965 ]
966 },
967 "execution_count": 6,
968 "metadata": {},
969 "output_type": "execute_result"
970 }
971 ],
972 "source": [
973 "def two_large_primes():\n",
974 " p, q = 0, 0\n",
975 " # We make sure that they are different\n",
976 " while p == q:\n",
977 " p = Primes()[randint(10^6, 2*10^6)]\n",
978 " q = Primes()[randint(10^6, 2*10^6)]\n",
979 " return p, q\n",
980 "\n",
981 "def random_unit_mod(N):\n",
982 " R = Integers(N)\n",
983 " d = R(0)\n",
984 " # We make sure that it is invertible\n",
985 " while not d.is_unit():\n",
986 " d = R.random_element()\n",
987 " return d\n",
988 "\n",
989 "def Alice_generate_keys():\n",
990 " p, q = two_large_primes()\n",
991 " n = p*q\n",
992 " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n",
993 " \n",
994 " d = random_unit_mod(phi_n)\n",
995 " e = d^-1\n",
996 " return n, d, e\n",
997 "\n",
998 "Alice_generate_keys()"
999 ]
1000 },
1001 {
1002 "cell_type": "markdown",
1003 "metadata": {},
1004 "source": [
1005 "Now, how does Bob encrypt his message? Let's say he wants to send to Alice the number $m$ with $1<m<n$ (In practice he would like to send her some text with emojis, or maybe a voice message; but for computers everything is a number, and there are different ways to translate any sort of information to a number. He just chooses one of the many standard methods that already exist, no cryptography is needed in this step. If the message $m$ is too long, he can split it up in some pieces and repeat the process multiple times.)\n",
1006 "\n",
1007 "Now he computes $m^d\\pmod n$ and sends it back to Alice."
1008 ]
1009 },
1010 {
1011 "cell_type": "code",
1012 "execution_count": 7,
1013 "metadata": {},
1014 "outputs": [
1015 {
1016 "data": {
1017 "text/plain": [
1018 "177776139844621"
1019 ]
1020 },
1021 "execution_count": 7,
1022 "metadata": {},
1023 "output_type": "execute_result"
1024 }
1025 ],
1026 "source": [
1027 "def Bob_encrypt(m, n, d):\n",
1028 " R = Integers(n)\n",
1029 " return R(m)^d # Assume that n is large enough\n",
1030 " \n",
1031 "message = 42424242\n",
1032 "Bob_encrypt(message, 338547806707501, 141995674537431)"
1033 ]
1034 },
1035 {
1036 "cell_type": "markdown",
1037 "metadata": {},
1038 "source": [
1039 "Since $de\\equiv 1\\pmod{\\varphi(n)}$, it follows that $(m^d)^e\\equiv m\\pmod n$ (see [Wikipedia: Euler's theorem](https://en.wikipedia.org/wiki/Euler%27s_theorem)). So for Alice it is very easy to get back the original message:"
1040 ]
1041 },
1042 {
1043 "cell_type": "code",
1044 "execution_count": 8,
1045 "metadata": {},
1046 "outputs": [
1047 {
1048 "data": {
1049 "text/plain": [
1050 "42424242"
1051 ]
1052 },
1053 "execution_count": 8,
1054 "metadata": {},
1055 "output_type": "execute_result"
1056 }
1057 ],
1058 "source": [
1059 "def Alice_decrypt(m_encrypted, n, e):\n",
1060 " R = Integers(n)\n",
1061 " return R(m_encrypted)^e\n",
1062 "\n",
1063 "Alice_decrypt(177776139844621, 338547806707501, 107165393087271)"
1064 ]
1065 },
1066 {
1067 "cell_type": "markdown",
1068 "metadata": {},
1069 "source": [
1070 "Another assumption on which RSA relies is that even if one knows $M=m^e$ and $e$, extracting the $e$-th root of $M$ modulo $n$ (and thus obtaining $m$) is very hard. Currently the best known way to do this is by factorizing $n$ first, which is considered to be a very hard problem. However, there is no proof that faster algorithms can't be devised.\n",
1071 "\n",
1072 "Moreover, one day we will overcome the current technological difficulties and quantum computers will be available. Quantum computers are not just \"more powerful\" than classical hardware, but they work based on completely different logical foundations and they make the factorization problem much easier to solve: for example [Shor's algorithm](https://en.wikipedia.org/wiki/Shor%27s_algorithm) takes advantage of this different logic and can factorize numbers quickly, if run on a quantum computer.\n",
1073 "\n",
1074 "To this day the largest number factorized with a quantum computer is $21=3\\times 7$. Nonetheless, quantum-safe cryptography protocols (i.e. based on problems that are hard to solve also with quantum computers) have already been developed."
1075 ]
1076 }
1077 ],
1078 "metadata": {
1079 "kernelspec": {
1080 "display_name": "SageMath 9.2",
1081 "language": "sage",
1082 "name": "sagemath"
1083 },
1084 "language_info": {
1085 "codemirror_mode": {
1086 "name": "ipython",
1087 "version": 3
1088 },
1089 "file_extension": ".py",
1090 "mimetype": "text/x-python",
1091 "name": "python",
1092 "nbconvert_exporter": "python",
1093 "pygments_lexer": "ipython3",
1094 "version": "3.8.5"
1095 }
1096 },
1097 "nbformat": 4,
1098 "nbformat_minor": 4
1099}
diff --git a/src/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb b/src/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb
new file mode 100644
index 0000000..59ea033
--- /dev/null
+++ b/src/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb
@@ -0,0 +1,1046 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "This lecture's notes are in a different format: the presentations for the $\\LaTeX$ part were made with $\\LaTeX$, so this one is made with Sage, or rather with the [Jupyter Notebook](https://jupyter.org/).\n",
8 "\n",
9 "# The Jupyter Notebook\n",
10 "**Reference:** [[1](https://jupyter.org/documentation)]\n",
11 "\n",
12 "The Jupyter Notebook is one of the default interfaces for SageMath, along with the command line interface. You can access it via web browser, but it is running locally on your device (notice the strange url: `http://localhost:8888/notebooks...`).\n",
13 "\n",
14 "You can create a new notebook by clicking on `New > SageMath 9.2`. You can also create a Python 3 notebook to write Python code.\n",
15 "\n",
16 "Jupyter saves and reads files in the `.ipynb` format. If you download the file for this lecture you can open it and follow the examples interactively.\n",
17 "\n",
18 "## Cells\n",
19 "\n",
20 "The notebook contains one or more *interactive cells* that you can run, like this one below:"
21 ]
22 },
23 {
24 "cell_type": "code",
25 "execution_count": 2,
26 "metadata": {},
27 "outputs": [
28 {
29 "data": {
30 "text/plain": [
31 "2/5"
32 ]
33 },
34 "execution_count": 2,
35 "metadata": {},
36 "output_type": "execute_result"
37 }
38 ],
39 "source": [
40 "# Exercise: modify this cell to use the print() command\n",
41 "2+2\n",
42 "2/5"
43 ]
44 },
45 {
46 "cell_type": "markdown",
47 "metadata": {},
48 "source": [
49 "If you are reading this from Jupyter rather than from the pdf file, you can edit the cell above and run it again. You can also add more cells by selecting `Insert` from the menu bar.\n",
50 "\n",
51 "Notice that only the last statement produces an output. You can force anything to be written as output with the `print()` command, which works like in Python. As an exercise, try to modify the cell above to provide more output!"
52 ]
53 },
54 {
55 "cell_type": "markdown",
56 "metadata": {},
57 "source": [
58 "## Markdown\n",
59 "\n",
60 "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n",
61 "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n",
62 "\n",
63 "You can also include some LaTeX code in Markdown cells, with dollar signs $ or align environments:\n",
64 "\n",
65 "\\begin{align*}\n",
66 "\\frac{(x+y)^2}{x+1} = \\frac{x^2+y^2}{x+1}\n",
67 "\\end{align*}\n",
68 "\n",
69 "When you are done writing a Markdown cell, you can run it to see the well-formatted text. To edit the text again, double-click on the cell. Try doing it now to fix the formula above!"
70 ]
71 },
72 {
73 "cell_type": "markdown",
74 "metadata": {},
75 "source": [
76 "# Symbolic expressions\n",
77 "\n",
78 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
79 "\n",
80 "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:"
81 ]
82 },
83 {
84 "cell_type": "code",
85 "execution_count": 3,
86 "metadata": {},
87 "outputs": [
88 {
89 "data": {
90 "text/plain": [
91 "[x == -sqrt(6) - 1, x == sqrt(6) - 1]"
92 ]
93 },
94 "execution_count": 3,
95 "metadata": {},
96 "output_type": "execute_result"
97 }
98 ],
99 "source": [
100 "f = x^2 + 2*x - 5 == 0\n",
101 "solve(f,x)"
102 ]
103 },
104 {
105 "cell_type": "markdown",
106 "metadata": {},
107 "source": [
108 "Notice that the single `=` is part of an assignment, as in Python: we are *assigning* to the variable `f` the value `x^2 + 2*x - 5 >= 0`, which in this case is an equation, so it contains the symbol `==`. Keep in mind the difference between the two!\n",
109 "\n",
110 "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$."
111 ]
112 },
113 {
114 "cell_type": "markdown",
115 "metadata": {},
116 "source": [
117 "## Mathematical variables\n",
118 "\n",
119 "Last time we saw what *variables* are in Python, and that they are a little bit different from the *Mathematical variables* that you use in Mathematics. In Sage, both concepts are present, but they are still distinct. For example in the cell above `f` is a variable in the sense of computer science, while `x` is a Mathematical variable.\n",
120 "\n",
121 "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:"
122 ]
123 },
124 {
125 "cell_type": "code",
126 "execution_count": 14,
127 "metadata": {},
128 "outputs": [
129 {
130 "data": {
131 "text/plain": [
132 "[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 + 9) - 1/2]"
133 ]
134 },
135 "execution_count": 14,
136 "metadata": {},
137 "output_type": "execute_result"
138 }
139 ],
140 "source": [
141 "var('y')\n",
142 "solve(y^2 + (x+1)*y - 2 == 0, y)"
143 ]
144 },
145 {
146 "cell_type": "markdown",
147 "metadata": {},
148 "source": [
149 "Try removing the first line in the cell above and see what error you get!\n",
150 "\n",
151 "Here is another example:"
152 ]
153 },
154 {
155 "cell_type": "code",
156 "execution_count": 16,
157 "metadata": {},
158 "outputs": [
159 {
160 "data": {
161 "text/plain": [
162 "[x == -1/2*a - 1/2*sqrt(a^2 - 4*b), x == -1/2*a + 1/2*sqrt(a^2 - 4*b)]"
163 ]
164 },
165 "execution_count": 16,
166 "metadata": {},
167 "output_type": "execute_result"
168 }
169 ],
170 "source": [
171 "var('a', 'b')\n",
172 "f = x^2+a*x+b\n",
173 "solve(f,x)"
174 ]
175 },
176 {
177 "cell_type": "markdown",
178 "metadata": {},
179 "source": [
180 "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:"
181 ]
182 },
183 {
184 "cell_type": "code",
185 "execution_count": 17,
186 "metadata": {},
187 "outputs": [
188 {
189 "data": {
190 "text/plain": [
191 "-1"
192 ]
193 },
194 "execution_count": 17,
195 "metadata": {},
196 "output_type": "execute_result"
197 }
198 ],
199 "source": [
200 "e^(pi*I)"
201 ]
202 },
203 {
204 "cell_type": "markdown",
205 "metadata": {},
206 "source": [
207 "We will study symbolic expressions more in detail next time, in the context of calculus/analysis."
208 ]
209 },
210 {
211 "cell_type": "markdown",
212 "metadata": {},
213 "source": [
214 "# Basic rings and fields\n",
215 "\n",
216 "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n",
217 "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n",
218 "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n",
219 "\n",
220 "As you should know, a *field* is a Mathematical structure with two operations, addition and multiplication, which respect certain rules (distributivity, associativity, commutativity...). Some examples of fields are the Rational numbers $\\mathbb Q$, the Real numbers $\\mathbb R$ and the Complex numbers $\\mathbb C$, but there are many more. As you should also know, a *(commutative) ring* is like a field, except not all elements different from $0$ need have a multiplicative inverse. For example the integers $\\mathbb Z = \\{ \\dots, -1, 0, 1, 2, \\dots\\}$ are a ring, but not a field.\n",
221 "\n",
222 "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n",
223 "\n",
224 "|Mathematical object|Math symbol|Sage name|\n",
225 "|------------------:|:---------:|:--------|\n",
226 "|Integers|$\\mathbb Z$|`ZZ`|\n",
227 "|Rational numbers|$\\mathbb Q$|`QQ`|\n",
228 "|Real numbers|$\\mathbb R$|`RR`|\n",
229 "|Complex numbers|$\\mathbb C$|`CC`|\n",
230 "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n",
231 "|Finite fields|$\\mathbb F_p$|GF(p)|\n",
232 "|$\\dots$|$\\dots$|$\\dots$|"
233 ]
234 },
235 {
236 "cell_type": "markdown",
237 "metadata": {},
238 "source": [
239 "If you write a number or an expression, Sage will figure out where it \"lives\", choosing the most restrictive interpretation possible. For example `3` will be interpreted to be an integer, even if it is also a rational number, a real number and a complex number."
240 ]
241 },
242 {
243 "cell_type": "markdown",
244 "metadata": {},
245 "source": [
246 "## Parents and coercion\n",
247 "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n",
248 "\n",
249 "You can check where an object \"lives\" with the `parent()` command. It works more or less like the Python command `type()`, but it gives a more Mathematically inclined answer. Check the reference link [6] above if you want more details."
250 ]
251 },
252 {
253 "cell_type": "code",
254 "execution_count": 18,
255 "metadata": {},
256 "outputs": [
257 {
258 "data": {
259 "text/plain": [
260 "Rational Field"
261 ]
262 },
263 "execution_count": 18,
264 "metadata": {},
265 "output_type": "execute_result"
266 }
267 ],
268 "source": [
269 "#Edit this cell to find out the type of other objects that we used\n",
270 "parent(3/5)"
271 ]
272 },
273 {
274 "cell_type": "markdown",
275 "metadata": {},
276 "source": [
277 "Sometimes Sage does not give you the best possible interpretation, so you can force something to be interpreted as living in a smaller ring as follows:"
278 ]
279 },
280 {
281 "cell_type": "code",
282 "execution_count": 4,
283 "metadata": {},
284 "outputs": [
285 {
286 "name": "stdout",
287 "output_type": "stream",
288 "text": [
289 "Symbolic Ring\n",
290 "Integer Ring\n"
291 ]
292 }
293 ],
294 "source": [
295 "minus_one = e^(pi*I)\n",
296 "minus_one_coerced = ZZ(e^(pi*I)) # coercion\n",
297 "print(parent(minus_one))\n",
298 "print(parent(minus_one_coerced))"
299 ]
300 },
301 {
302 "cell_type": "markdown",
303 "metadata": {},
304 "source": [
305 "**Remark.** Notice that there is a fundamental difference between the rings `RR` and `CC` and all the others in the table above: the real and complex numbers are *approximated*."
306 ]
307 },
308 {
309 "cell_type": "code",
310 "execution_count": 1,
311 "metadata": {},
312 "outputs": [
313 {
314 "name": "stdout",
315 "output_type": "stream",
316 "text": [
317 "3\n",
318 "3.00000000000000\n"
319 ]
320 }
321 ],
322 "source": [
323 "print(QQ(3))\n",
324 "print(RR(3))"
325 ]
326 },
327 {
328 "cell_type": "markdown",
329 "metadata": {},
330 "source": [
331 "You can also choose the precision of this approximation using the alternative name `RealField`."
332 ]
333 },
334 {
335 "cell_type": "code",
336 "execution_count": 4,
337 "metadata": {},
338 "outputs": [
339 {
340 "name": "stdout",
341 "output_type": "stream",
342 "text": [
343 "Real Field with 53 bits of precision\n",
344 "Real Field with 1000 bits of precision\n"
345 ]
346 }
347 ],
348 "source": [
349 "print(RR)\n",
350 "print(RealField(prec=1000))"
351 ]
352 },
353 {
354 "cell_type": "markdown",
355 "metadata": {},
356 "source": [
357 "# Polynomial rings\n",
358 "\n",
359 "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n",
360 "\n",
361 "If you want to work with polynomials over a certain ring it is better to use this specific construction, rather than the symbolic expressions introduced above."
362 ]
363 },
364 {
365 "cell_type": "code",
366 "execution_count": 5,
367 "metadata": {},
368 "outputs": [
369 {
370 "data": {
371 "text/plain": [
372 "Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of precision"
373 ]
374 },
375 "execution_count": 5,
376 "metadata": {},
377 "output_type": "execute_result"
378 }
379 ],
380 "source": [
381 "polring.<x,y,z> = RR[] # Alternative: polring.<x,y,z> = PolynomialRing(RR)\n",
382 "polring"
383 ]
384 },
385 {
386 "cell_type": "markdown",
387 "metadata": {},
388 "source": [
389 "You can use as many variables as you like, and you can replace `RR` with any ring. In the example above `polring` is just the name of the variable (in the computer science sense) associated with this polynomial ring.\n",
390 "\n",
391 "## Operations on polynomials\n",
392 "\n",
393 "The usual Mathematical operations are available on polynomial rings, including Euclidean division `//` and remainder `%`. There is also the single-slash division `/`, but the result may not be a polynomial anymore.\n",
394 "\n",
395 "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n",
396 "\n",
397 "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?"
398 ]
399 },
400 {
401 "cell_type": "code",
402 "execution_count": 6,
403 "metadata": {},
404 "outputs": [
405 {
406 "name": "stdout",
407 "output_type": "stream",
408 "text": [
409 "x + 1\n",
410 "-4\n",
411 "(x^2 + 2*x - 3)/(x + 1)\n"
412 ]
413 }
414 ],
415 "source": [
416 "polring.<x> = QQ[]\n",
417 "p = x^2 + 2*x - 3 # Don't forget * for multiplication!\n",
418 "q = p // (x+1)\n",
419 "r = p % (x+1)\n",
420 "f = p / (x+1)\n",
421 "print(q)\n",
422 "print(r)\n",
423 "print(f)"
424 ]
425 },
426 {
427 "cell_type": "markdown",
428 "metadata": {},
429 "source": [
430 "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n",
431 "\n",
432 "**Remark.** Notice how the result can change substantially if you change the base ring.\n",
433 "\n",
434 "**Remark.** [Factorizations](https://doc.sagemath.org/html/en/reference/structure/sage/structure/factorization.html) are a particular object in Sage. They are kinda like a list, but not really. You can get a list of pairs (factor, power) with `list(factor(f))`."
435 ]
436 },
437 {
438 "cell_type": "code",
439 "execution_count": 7,
440 "metadata": {},
441 "outputs": [
442 {
443 "name": "stdout",
444 "output_type": "stream",
445 "text": [
446 "(t + 1) * (t^2 - 3) * (t^2 + 1)\n",
447 "[(-1, 1)]\n"
448 ]
449 },
450 {
451 "data": {
452 "text/plain": [
453 "(y + 1) * x"
454 ]
455 },
456 "execution_count": 7,
457 "metadata": {},
458 "output_type": "execute_result"
459 }
460 ],
461 "source": [
462 "polring_onevar.<t> = QQ[]\n",
463 "\n",
464 "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n",
465 "print(factor(f))\n",
466 "print(f.roots()) # Result: list of pairs (root,multiplicity)\n",
467 "\n",
468 "polring_manyvar.<x,y,z> = QQ[]\n",
469 "factor(x*y+x)\n",
470 "\n",
471 "# The following line gives an error, because the polynomial\n",
472 "# is understood to possibly have many variables:\n",
473 "#(x^2-1).roots()"
474 ]
475 },
476 {
477 "cell_type": "markdown",
478 "metadata": {},
479 "source": [
480 "# Matrices and vectors\n",
481 "\n",
482 "**References:** [[8](https://doc.sagemath.org/html/en/reference/matrices/index.html)], but in particular the subections [[9](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/docs.html)] and [[10](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/matrix2.html)]\n",
483 "\n",
484 "In Sage you can easily manipulate matrices and vectors"
485 ]
486 },
487 {
488 "cell_type": "code",
489 "execution_count": 77,
490 "metadata": {},
491 "outputs": [
492 {
493 "name": "stdout",
494 "output_type": "stream",
495 "text": [
496 "[ 1 2 3]\n",
497 "[ 0 0 1]\n",
498 "[ 4 -3 22/7] \n",
499 "\n",
500 "[1/2 0 0]\n",
501 "[ 7 0 0]\n",
502 "[ 1 1 1] \n",
503 "\n",
504 "(3/2, 21, 6) \n",
505 "\n",
506 "[ -7/2 -10 80/7]\n",
507 "[ 17 -4 15/7]\n",
508 "[ 241/7 -18/7 869/49] \n",
509 "\n",
510 "Rank of A = 3\n",
511 "Rank of B = 2\n"
512 ]
513 }
514 ],
515 "source": [
516 "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n",
517 "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n",
518 "v = vector([3,4,-1])\n",
519 "\n",
520 "print(A, \"\\n\") # \\n just means \"newline\"\n",
521 "print(B, \"\\n\")\n",
522 "print(B*v, \"\\n\")\n",
523 "print(A^2 + 2*B - A*B, \"\\n\")\n",
524 "\n",
525 "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n",
526 "print(\"Rank of B =\", rank(B))"
527 ]
528 },
529 {
530 "cell_type": "markdown",
531 "metadata": {},
532 "source": [
533 "**Exercise:** in the cell above, compute the determinant, inverse and characteristic polynomial of the matrix `A`. *Hint: look at the reference [10] above (the functions are listed in alphabetic order).*\n",
534 "\n",
535 "As for polynomials, you can specify where a matrix or a vector lives"
536 ]
537 },
538 {
539 "cell_type": "code",
540 "execution_count": 57,
541 "metadata": {},
542 "outputs": [
543 {
544 "data": {
545 "text/plain": [
546 "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision"
547 ]
548 },
549 "execution_count": 57,
550 "metadata": {},
551 "output_type": "execute_result"
552 }
553 ],
554 "source": [
555 "M = matrix(CC, [[0,1],[1,0]])\n",
556 "parent(M)"
557 ]
558 },
559 {
560 "cell_type": "markdown",
561 "metadata": {},
562 "source": [
563 "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n",
564 "\n",
565 "**Warning.** In linear algebra there are distinct concepts of *left* and *right* eigenvalues (and eigenvector). The one you know is probably that of **right** eigen-{value,vector}, that is an element $\\lambda$ of the base field and a non-zero vector $\\mathbf v$ with $A\\mathbf v=\\lambda\\mathbf v$. The other concept corresponds to the equality $\\mathbf v^TA=\\lambda \\mathbf v$."
566 ]
567 },
568 {
569 "cell_type": "code",
570 "execution_count": 60,
571 "metadata": {},
572 "outputs": [
573 {
574 "data": {
575 "text/plain": [
576 "(0.289916349448506, 0.0241596957873755)"
577 ]
578 },
579 "execution_count": 60,
580 "metadata": {},
581 "output_type": "execute_result"
582 }
583 ],
584 "source": [
585 "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n",
586 "v = vector(RR, [3,0])\n",
587 "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v"
588 ]
589 },
590 {
591 "cell_type": "code",
592 "execution_count": 64,
593 "metadata": {},
594 "outputs": [
595 {
596 "data": {
597 "text/plain": [
598 "[\n",
599 "(-0.3722813232690144?, Vector space of degree 2 and dimension 1 over Algebraic Field\n",
600 "User basis matrix:\n",
601 "[ 1 -0.6861406616345072?]),\n",
602 "(5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic Field\n",
603 "User basis matrix:\n",
604 "[ 1 2.186140661634508?])\n",
605 "]"
606 ]
607 },
608 "execution_count": 64,
609 "metadata": {},
610 "output_type": "execute_result"
611 }
612 ],
613 "source": [
614 "A = Matrix(QQ, [[1,2],[3,4]])\n",
615 "A.eigenspaces_right() # Also: A.eigenvalues(), A.eigenvectors_right()"
616 ]
617 },
618 {
619 "cell_type": "markdown",
620 "metadata": {},
621 "source": [
622 "We can also extract a specific submatrix by selecting only some rows and columns, with a syntax similar to that of Python's lists. Check out more examples in the reference [9] above, and try them in the cell below."
623 ]
624 },
625 {
626 "cell_type": "code",
627 "execution_count": 94,
628 "metadata": {},
629 "outputs": [
630 {
631 "name": "stdout",
632 "output_type": "stream",
633 "text": [
634 "[-14 2 0 -1 1 -2 -1]\n",
635 "[ 0 -8 0 9 -2 11 1]\n",
636 "[ 0 3 1 -1 1 1 221]\n",
637 "[ -1 2 1 -25 -10 4 0]\n",
638 "[ -3 0 0 2 16 -1 -2]\n",
639 "[ 1 -3 3 -41 1 0 0]\n",
640 "[ -2 1 0 0 -6 2 12] \n",
641 "\n",
642 "[ 0 9 -2]\n",
643 "[ 1 -1 1] \n",
644 "\n",
645 "[-14 2 0 -1 1 -2 -1] \n",
646 "\n",
647 "[-14 2 0 -1 1]\n",
648 "[ 1 -3 3 -41 1]\n",
649 "[ 0 3 1 -1 1]\n"
650 ]
651 }
652 ],
653 "source": [
654 "A = MatrixSpace(ZZ, 7).random_element()\n",
655 "print(A, \"\\n\")\n",
656 "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n",
657 "print(A[0,0:], \"\\n\") # First row, all columns\n",
658 "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5"
659 ]
660 },
661 {
662 "cell_type": "markdown",
663 "metadata": {},
664 "source": [
665 "**Exercise:** write a sage function that computes the determinant of an $n\\times n$ matrix $A=(a_{ij})$ using Laplace's rule by the first row, that is \n",
666 "\\begin{align*}\n",
667 " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n",
668 "\\end{align*}\n",
669 "where $M_{0j}$ is the determinant of the $(n-1)\\times(n-1)$ matrix obtained by removing the $0$-th row and the $j$-th column from $A$."
670 ]
671 },
672 {
673 "cell_type": "code",
674 "execution_count": 91,
675 "metadata": {},
676 "outputs": [],
677 "source": [
678 "def my_det(A):\n",
679 " if not A.is_square():\n",
680 " print(\"Error: matrix is not square\")\n",
681 " \n",
682 " n = A.nrows() # size of the matrix\n",
683 " \n",
684 " # Continue from here!"
685 ]
686 },
687 {
688 "cell_type": "markdown",
689 "metadata": {},
690 "source": [
691 "# Number Theory\n",
692 "\n",
693 "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n",
694 "\n",
695 "Sage includes a large library of functions for computing with the integers, see the link above."
696 ]
697 },
698 {
699 "cell_type": "code",
700 "execution_count": 8,
701 "metadata": {},
702 "outputs": [
703 {
704 "name": "stdout",
705 "output_type": "stream",
706 "text": [
707 "3^2 * 3607 * 3803\n",
708 "True\n",
709 "True\n",
710 "619703040\n",
711 "9\n",
712 "13548070123626141\n"
713 ]
714 }
715 ],
716 "source": [
717 "n = 123456789\n",
718 "m = 987654321\n",
719 "p = 3607\n",
720 "\n",
721 "print(factor(n))\n",
722 "print(is_prime(p))\n",
723 "print(p.divides(n))\n",
724 "print(euler_phi(m))\n",
725 "print(gcd(n, m))\n",
726 "print(lcm(n, m))"
727 ]
728 },
729 {
730 "cell_type": "markdown",
731 "metadata": {},
732 "source": [
733 "## Primes\n",
734 "\n",
735 "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n",
736 "\n",
737 "The set of prime numbers is called `Primes()`. It is like an infinite list: for example you can get the one-millionth prime number or you can use this list to create other lists. You can also check what the first prime number larger than a given number is."
738 ]
739 },
740 {
741 "cell_type": "code",
742 "execution_count": 9,
743 "metadata": {},
744 "outputs": [
745 {
746 "name": "stdout",
747 "output_type": "stream",
748 "text": [
749 "Set of all prime numbers: 2, 3, 5, 7, ...\n",
750 "31 15485867\n",
751 "47\n",
752 "[79, 83, 89, 97]\n"
753 ]
754 }
755 ],
756 "source": [
757 "PP = Primes()\n",
758 "print(PP)\n",
759 "print(PP[10], PP[10^6])\n",
760 "print(PP.next(44))\n",
761 "\n",
762 "First_Thousand_Primes = PP[0:1000]\n",
763 "print([p for p in First_Thousand_Primes if p < 100 and p > 75])"
764 ]
765 },
766 {
767 "cell_type": "markdown",
768 "metadata": {},
769 "source": [
770 "## The Chinese remainder theorem (CRT)\n",
771 "\n",
772 "We say that two integers $a$ and $b$ are *congruent* modulo another integer $n>0$ if they have the same remainder when divided by $n$. We denote this by $a\\equiv b\\pmod n$, or in Python/Sage syntax `a % n == b % n`.\n",
773 "\n",
774 "The Chinese remainder theorem states that if $a,b\\in\\mathbb Z$ and $n,m\\in \\mathbb Z_{>0}$ are such that $\\gcd(n,m)=1$ then the system of congruences\n",
775 "\n",
776 "\\begin{align*}\n",
777 "\\begin{cases}\n",
778 " x \\equiv a \\pmod n\\\\\n",
779 " x \\equiv b \\pmod m\n",
780 "\\end{cases}\n",
781 "\\end{align*}\n",
782 "\n",
783 "has exactly one solution modulo $mn$. This means that there is one and only one number $x$ with $0\\leq x<mn$ such that $x\\equiv a\\pmod n$ and $x\\equiv b\\pmod m$.\n",
784 "\n",
785 "The procedure to find such a number is not too hard to describe (you might see it in an algebra or number theory course), but it can be a bit long. Luckily, Sage can do this for you:"
786 ]
787 },
788 {
789 "cell_type": "code",
790 "execution_count": 10,
791 "metadata": {},
792 "outputs": [
793 {
794 "name": "stdout",
795 "output_type": "stream",
796 "text": [
797 "74306 2 798\n"
798 ]
799 }
800 ],
801 "source": [
802 "a = 2\n",
803 "b = -1\n",
804 "n = 172\n",
805 "m = 799\n",
806 "\n",
807 "if gcd(n,m) != 1:\n",
808 " print(\"The numbers are not comprime, I can't solve this!\")\n",
809 "else:\n",
810 " x = crt(a, b, n, m)\n",
811 " print(x, x%n, x%m)"
812 ]
813 },
814 {
815 "cell_type": "markdown",
816 "metadata": {},
817 "source": [
818 "**Exercise.** There is a more general version of the Chinese remainder theorem which says that if $a_0, a_1, \\dots, a_k\\in\\mathbb Z$ and $n_0, n_2, \\dots, n_k\\in\\mathbb Z_{>0}$ are such that $\\gcd(n_i, n_j)=1$ for $i\\neq j$, then the system of congruences\n",
819 "\n",
820 "\\begin{align*}\n",
821 "\\begin{cases}\n",
822 " x \\equiv a_0 \\pmod {n_0}\\\\\n",
823 " x \\equiv a_1 \\pmod {n_1}\\\\\n",
824 " \\dots \\\\\n",
825 " x \\equiv a_k \\pmod {n_k}\n",
826 "\\end{cases}\n",
827 "\\end{align*}\n",
828 "\n",
829 "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n",
830 "*Hint: start by running the command `help(crt)`."
831 ]
832 },
833 {
834 "cell_type": "code",
835 "execution_count": 127,
836 "metadata": {},
837 "outputs": [],
838 "source": [
839 "#help(crt)"
840 ]
841 },
842 {
843 "cell_type": "markdown",
844 "metadata": {},
845 "source": [
846 "# Cryptography: RSA\n",
847 "\n",
848 "[Cryptography](https://en.wikipedia.org/wiki/Cryptography) is the discipline that studies methods to communicate secrets in such a way that any unauthorized listener would not be able to understand the message.\n",
849 "\n",
850 "A simple cryptographic protocol could be changing every letter of your text following a fixed scheme (or *cypher*), for example by turning every A into a B, every B into a C and so on. However this is not a very secure method, for many reasons. One of them is that at some point the people who want to communicate need to agree on what method to use, and anyone listening to that conversation would be able to decypher every subsequent conversation. A public-key cryptographic protocol solves this problem.\n",
851 "\n",
852 "## Public-key cryptography\n",
853 "\n",
854 "Public-key cryptographic protocols, such as RSA, work like this: there are two keys, a *private* key that is only known to person A (traditionally called Alice in every example), and a *public* key that does not need to be secret.\n",
855 "\n",
856 "The public key is used to *encrypt* the message (that is to \"lock\" it, or \"hyde\" it), but one needs the private key to *decrypt* it. Imagine having two keys for your door, but one can only be used to lock it, while the other only to open it.\n",
857 "\n",
858 "The message exchange works like this: suppose that person B (Bob) wants to send a secret message to Alice. Then Alice secretely generates a private and a public key and sends only the public one to Bob. Now Bob encrypts the message and sends it to Alice, who can use her private key to decrypt it. Even if Eve (short for *eavesdropper*, an unauthorized listener) listens to every message exchanged, she won't be able to decypher the secret: the private key has never left Alice's house!\n",
859 "\n",
860 "Notice that such a protocol is *asymmetric*: if Alice wanted to send a secret to Bob in reply, Bob would need to generate a pair of keys of his own.\n",
861 "\n",
862 "Let's see how we can do this in practice, using number theory!\n",
863 "\n",
864 "## RSA\n",
865 "\n",
866 "As many other cryptography protocols, RSA is based on a Mathematical process that is easy to do in one direction, but very hard to invert. In this case the hard process is integer factorization, that is decomposing an integer number as a product of primes."
867 ]
868 },
869 {
870 "cell_type": "code",
871 "execution_count": 2,
872 "metadata": {},
873 "outputs": [
874 {
875 "name": "stdout",
876 "output_type": "stream",
877 "text": [
878 "True True False\n"
879 ]
880 }
881 ],
882 "source": [
883 "p = 100003100019100043100057100069\n",
884 "q = 100144655312449572059845328443\n",
885 "n = p*q\n",
886 "print(is_prime(p), is_prime(q), is_prime(p*q))\n",
887 "\n",
888 "# Use the command below to see how long it takes\n",
889 "#timeit(\"factor(n)\", number=1, repeat=1)"
890 ]
891 },
892 {
893 "cell_type": "markdown",
894 "metadata": {},
895 "source": [
896 "In order to generate the keys, Alice picks a number $n$ which is the product of two large primes $p$ and $q$ of more or less the same size. Finding such primes is relatively easy compared to factoring the number $n$ she obtained. Then she computes the Euler totient $\\varphi(n)=(p-1)(q-1)$ of $n$, which she can do because she knows that $n=pq$ - it would be impossible otherwise!\n",
897 "\n",
898 "Then Alice can compute two integers $(d,e)$ such that $de\\equiv 1\\pmod{\\varphi(n)}$. She will send the numbers $n$ and $d$ to Bob and keep $e$ secret. In this case the public key is the pair $(n,d)$, while $e$ is the private key.\n",
899 "\n",
900 "Of course, she does all of this using Sage!"
901 ]
902 },
903 {
904 "cell_type": "code",
905 "execution_count": 105,
906 "metadata": {},
907 "outputs": [
908 {
909 "data": {
910 "text/plain": [
911 "(419199544978969, 235530823946467, 80799425863927)"
912 ]
913 },
914 "execution_count": 105,
915 "metadata": {},
916 "output_type": "execute_result"
917 }
918 ],
919 "source": [
920 "def two_large_primes():\n",
921 " p, q = 0, 0\n",
922 " # We make sure that they are different\n",
923 " while p == q:\n",
924 " p = Primes()[randint(10^6, 2*10^6)]\n",
925 " q = Primes()[randint(10^6, 2*10^6)]\n",
926 " return p, q\n",
927 "\n",
928 "def random_unit_mod(N):\n",
929 " R = Integers(N)\n",
930 " d = R(0)\n",
931 " # We make sure that it is invertible\n",
932 " while not d.is_unit():\n",
933 " d = R.random_element()\n",
934 " return d\n",
935 "\n",
936 "def Alice_generate_keys():\n",
937 " p, q = two_large_primes()\n",
938 " n = p*q\n",
939 " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n",
940 " \n",
941 " d = random_unit_mod(phi_n)\n",
942 " e = d^-1\n",
943 " return n, d, e\n",
944 "\n",
945 "Alice_generate_keys()"
946 ]
947 },
948 {
949 "cell_type": "markdown",
950 "metadata": {},
951 "source": [
952 "Now, how does Bob encrypt his message? Let's say he wants to send to Alice the number $m$ with $1<m<n$ (In practice he would like to send her some text with emojis, or maybe a voice message; but for computers everything is a number, and there are different ways to translate any sort of information to a number. He just chooses one of the many standard methods that already exist, no cryptography is needed in this step. If the message $m$ is too long, he can split it up in some pieces and repeat the process multiple times.)\n",
953 "\n",
954 "Now he computes $m^d\\pmod n$ and sends it back to Alice."
955 ]
956 },
957 {
958 "cell_type": "code",
959 "execution_count": 3,
960 "metadata": {},
961 "outputs": [
962 {
963 "data": {
964 "text/plain": [
965 "149461597163501"
966 ]
967 },
968 "execution_count": 3,
969 "metadata": {},
970 "output_type": "execute_result"
971 }
972 ],
973 "source": [
974 "def Bob_encrypt(m, n, d):\n",
975 " R = Integers(n)\n",
976 " return R(m)^d # Assume that n is large enough\n",
977 " \n",
978 "message = 42424242\n",
979 "Bob_encrypt(message, 419199544978969, 235530823946467)"
980 ]
981 },
982 {
983 "cell_type": "markdown",
984 "metadata": {},
985 "source": [
986 "Since $de\\equiv 1\\pmod{\\varphi(n)}$, it follows that $(m^d)^e\\equiv m\\pmod n$ (see [Wikipedia: Euler's theorem](https://en.wikipedia.org/wiki/Euler%27s_theorem)). So for Alice it is very easy to get back the original message:"
987 ]
988 },
989 {
990 "cell_type": "code",
991 "execution_count": 108,
992 "metadata": {},
993 "outputs": [
994 {
995 "data": {
996 "text/plain": [
997 "42424242"
998 ]
999 },
1000 "execution_count": 108,
1001 "metadata": {},
1002 "output_type": "execute_result"
1003 }
1004 ],
1005 "source": [
1006 "def Alice_decrypt(m_encrypted, n, e):\n",
1007 " R = Integers(n)\n",
1008 " return R(m_encrypted)^e\n",
1009 "\n",
1010 "Alice_decrypt(149461597163501, 419199544978969, 80799425863927)"
1011 ]
1012 },
1013 {
1014 "cell_type": "markdown",
1015 "metadata": {},
1016 "source": [
1017 "Another assumption on which RSA relies is that even if one knows $M=m^e$ and $e$, extracting the $e$-th root of $M$ modulo $n$ (and thus obtaining $m$) is very hard. Currently the best known way to do this is by factorizing $n$ first, which is considered to be a very hard problem. However, there is no proof that faster algorithms can't be devised.\n",
1018 "\n",
1019 "Moreover, one day we will overcome the current technological difficulties and quantum computers will be available. Quantum computers are not just \"more powerful\" than classical hardware, but they work based on completely different logical foundations and they make the factorization problem much easier to solve: for example [Shor's algorithm](https://en.wikipedia.org/wiki/Shor%27s_algorithm) takes advantage of this different logic and can factorize numbers quickly, if run on a quantum computer.\n",
1020 "\n",
1021 "To this day the largest number factorized with a quantum computer is $21=3\\times 7$. Nonetheless, quantum-safe cryptography protocols (i.e. based on problems that are hard to solve also with quantum computers) have already been developed."
1022 ]
1023 }
1024 ],
1025 "metadata": {
1026 "kernelspec": {
1027 "display_name": "SageMath 9.2",
1028 "language": "sage",
1029 "name": "sagemath"
1030 },
1031 "language_info": {
1032 "codemirror_mode": {
1033 "name": "ipython",
1034 "version": 3
1035 },
1036 "file_extension": ".py",
1037 "mimetype": "text/x-python",
1038 "name": "python",
1039 "nbconvert_exporter": "python",
1040 "pygments_lexer": "ipython3",
1041 "version": "3.8.5"
1042 }
1043 },
1044 "nbformat": 4,
1045 "nbformat_minor": 4
1046}
diff --git a/src/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-modified+solutions-checkpoint.ipynb b/src/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-modified+solutions-checkpoint.ipynb
new file mode 100644
index 0000000..f4e39b2
--- /dev/null
+++ b/src/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-modified+solutions-checkpoint.ipynb
@@ -0,0 +1,1099 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "This lecture's notes are in a different format: the presentations for the $\\LaTeX$ part were made with $\\LaTeX$, so this one is made with Sage, or rather with the [Jupyter Notebook](https://jupyter.org/).\n",
8 "\n",
9 "# The Jupyter Notebook\n",
10 "**Reference:** [[1](https://jupyter.org/documentation)]\n",
11 "\n",
12 "The Jupyter Notebook is one of the default interfaces for SageMath, along with the command line interface. You can access it via web browser, but it is running locally on your device (notice the strange url: `http://localhost:8888/notebooks...`).\n",
13 "\n",
14 "You can create a new notebook by clicking on `New > SageMath 9.2`. You can also create a Python 3 notebook to write Python code.\n",
15 "\n",
16 "Jupyter saves and reads files in the `.ipynb` format. If you download the file for this lecture you can open it and follow the examples interactively.\n",
17 "\n",
18 "## Cells\n",
19 "\n",
20 "The notebook contains one or more *interactive cells* that you can run, like this one below:"
21 ]
22 },
23 {
24 "cell_type": "code",
25 "execution_count": null,
26 "metadata": {},
27 "outputs": [],
28 "source": [
29 "# Exercise: modify this cell to use the print() command\n",
30 "\n",
31 "a = 34*102\n",
32 "\n",
33 "print(2+2)\n",
34 "print(\"hello\")\n",
35 "print(a-1)"
36 ]
37 },
38 {
39 "cell_type": "markdown",
40 "metadata": {},
41 "source": [
42 "If you are reading this from Jupyter rather than from the pdf file, you can edit the cell above and run it again. You can also add more cells by selecting `Insert` from the menu bar.\n",
43 "\n",
44 "Notice that only the last statement produces an output. You can force anything to be written as output with the `print()` command, which works like in Python. As an exercise, try to modify the cell above to provide more output!"
45 ]
46 },
47 {
48 "cell_type": "code",
49 "execution_count": null,
50 "metadata": {},
51 "outputs": [],
52 "source": [
53 "print(a)"
54 ]
55 },
56 {
57 "cell_type": "markdown",
58 "metadata": {},
59 "source": [
60 "text *hello*\n",
61 "* this\n",
62 "* is\n",
63 "* a list"
64 ]
65 },
66 {
67 "cell_type": "markdown",
68 "metadata": {},
69 "source": [
70 "## Markdown\n",
71 "\n",
72 "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n",
73 "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n",
74 "\n",
75 "You can also include some LaTeX code in Markdown cells, with dollar signs $ or align environments:\n",
76 "\n",
77 "\\begin{align*}\n",
78 "\\frac{(x+y)^2}{x+1} = \\frac{x^2+2xy+y^2}{x+1}\n",
79 "\\end{align*}\n",
80 "\n",
81 "When you are done writing a Markdown cell, you can run it to see the well-formatted text. To edit the text again, double-click on the cell. Try doing it now to fix the formula above!"
82 ]
83 },
84 {
85 "cell_type": "markdown",
86 "metadata": {},
87 "source": [
88 "# Symbolic expressions\n",
89 "\n",
90 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
91 "\n",
92 "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:"
93 ]
94 },
95 {
96 "cell_type": "code",
97 "execution_count": 48,
98 "metadata": {},
99 "outputs": [
100 {
101 "name": "stdout",
102 "output_type": "stream",
103 "text": [
104 "[\n",
105 "x == -1/2*(I*sqrt(3) + 1)*(1/2*I*sqrt(3) - 1/2)^(1/3) + (1/2*I*sqrt(3) - 1/2)^(2/3) - 1,\n",
106 "x == (1/2*I*sqrt(3) - 1/2)^(4/3) - 1/2*(I*sqrt(3) + 1)/(1/2*I*sqrt(3) - 1/2)^(1/3) - 1,\n",
107 "x == (1/2*I*sqrt(3) - 1/2)^(1/3) + 1/(1/2*I*sqrt(3) - 1/2)^(1/3) - 1\n",
108 "]\n"
109 ]
110 }
111 ],
112 "source": [
113 "f = (x^2 + 2*x - 5 >= 0)\n",
114 "solve(f,x)\n",
115 "\n",
116 "g = x^3 + 3*x^2-1\n",
117 "print(solve(g==0, x))\n",
118 "\n",
119 "h = x^2 +3*x -1"
120 ]
121 },
122 {
123 "cell_type": "markdown",
124 "metadata": {},
125 "source": [
126 "Notice that the single `=` is part of an assignment, as in Python: we are *assigning* to the variable `f` the value `x^2 + 2*x - 5 >= 0`, which in this case is an equation, so it contains the symbol `==`. Keep in mind the difference between the two!\n",
127 "\n",
128 "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$."
129 ]
130 },
131 {
132 "cell_type": "markdown",
133 "metadata": {},
134 "source": [
135 "## Mathematical variables\n",
136 "\n",
137 "Last time we saw what *variables* are in Python, and that they are a little bit different from the *Mathematical variables* that you use in Mathematics. In Sage, both concepts are present, but they are still distinct. For example in the cell above `f` is a variable in the sense of computer science, while `x` is a Mathematical variable.\n",
138 "\n",
139 "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:"
140 ]
141 },
142 {
143 "cell_type": "code",
144 "execution_count": null,
145 "metadata": {},
146 "outputs": [],
147 "source": [
148 "var('z')\n",
149 "solve(z^2 + z - 2 == 0, z)"
150 ]
151 },
152 {
153 "cell_type": "markdown",
154 "metadata": {},
155 "source": [
156 "Try removing the first line in the cell above and see what error you get!\n",
157 "\n",
158 "Here is another example:"
159 ]
160 },
161 {
162 "cell_type": "code",
163 "execution_count": null,
164 "metadata": {},
165 "outputs": [],
166 "source": [
167 "var('a', 'b')\n",
168 "f = x^2+a*x+b == 0\n",
169 "solve(f,a)"
170 ]
171 },
172 {
173 "cell_type": "markdown",
174 "metadata": {},
175 "source": [
176 "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:"
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": null,
182 "metadata": {},
183 "outputs": [],
184 "source": [
185 "e^(pi*I)\n",
186 "print(N(pi), N(e))\n",
187 "e = 42\n",
188 "print(e)\n",
189 "reset('e')\n",
190 "print(N(e))"
191 ]
192 },
193 {
194 "cell_type": "markdown",
195 "metadata": {},
196 "source": [
197 "We will study symbolic expressions more in detail next time, in the context of calculus/analysis."
198 ]
199 },
200 {
201 "cell_type": "markdown",
202 "metadata": {},
203 "source": [
204 "# Basic rings and fields\n",
205 "\n",
206 "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n",
207 "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n",
208 "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n",
209 "\n",
210 "As you should know, a *field* is a Mathematical structure with two operations, addition and multiplication, which respect certain rules (distributivity, associativity, commutativity...). Some examples of fields are the Rational numbers $\\mathbb Q$, the Real numbers $\\mathbb R$ and the Complex numbers $\\mathbb C$, but there are many more. As you should also know, a *(commutative) ring* is like a field, except not all elements different from $0$ need have a multiplicative inverse. For example the integers $\\mathbb Z = \\{ \\dots, -1, 0, 1, 2, \\dots\\}$ are a ring, but not a field.\n",
211 "\n",
212 "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n",
213 "\n",
214 "|Mathematical object|Math symbol|Sage name|\n",
215 "|------------------:|:---------:|:--------|\n",
216 "|Integers|$\\mathbb Z$|`ZZ`|\n",
217 "|Rational numbers|$\\mathbb Q$|`QQ`|\n",
218 "|Real numbers|$\\mathbb R$|`RR`|\n",
219 "|Complex numbers|$\\mathbb C$|`CC`|\n",
220 "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n",
221 "|Finite fields|$\\mathbb F_p$|GF(p)|\n",
222 "|$\\dots$|$\\dots$|$\\dots$|"
223 ]
224 },
225 {
226 "cell_type": "markdown",
227 "metadata": {},
228 "source": [
229 "If you write a number or an expression, Sage will figure out where it \"lives\", choosing the most restrictive interpretation possible. For example `3` will be interpreted to be an integer, even if it is also a rational number, a real number and a complex number."
230 ]
231 },
232 {
233 "cell_type": "markdown",
234 "metadata": {},
235 "source": [
236 "## Parents and coercion\n",
237 "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n",
238 "\n",
239 "You can check where an object \"lives\" with the `parent()` command. It works more or less like the Python command `type()`, but it gives a more Mathematically inclined answer. Check the reference link [6] above if you want more details."
240 ]
241 },
242 {
243 "cell_type": "code",
244 "execution_count": null,
245 "metadata": {},
246 "outputs": [],
247 "source": [
248 "#Edit this cell to find out the type of other objects that we used\n",
249 "print(parent(3/5))\n",
250 "print(QQ)\n",
251 "print(type(3/5))"
252 ]
253 },
254 {
255 "cell_type": "markdown",
256 "metadata": {},
257 "source": [
258 "Sometimes Sage does not give you the best possible interpretation, so you can force something to be interpreted as living in a smaller ring as follows:"
259 ]
260 },
261 {
262 "cell_type": "code",
263 "execution_count": null,
264 "metadata": {},
265 "outputs": [],
266 "source": [
267 "minus_one = e^(pi*I)\n",
268 "print(minus_one)\n",
269 "minus_one_coerced = ZZ(e^(pi*I)) # coercion\n",
270 "#print(ZZ(1/2))\n",
271 "print(parent(minus_one))\n",
272 "print(parent(x^2))\n",
273 "print(parent(minus_one_coerced))\n",
274 "print(parent(5.2))\n",
275 "print(parent(QQ(5.2)))"
276 ]
277 },
278 {
279 "cell_type": "markdown",
280 "metadata": {},
281 "source": [
282 "**Remark.** Notice that there is a fundamental difference between the rings `RR` and `CC` and all the others in the table above: the real and complex numbers are *approximated*."
283 ]
284 },
285 {
286 "cell_type": "code",
287 "execution_count": null,
288 "metadata": {},
289 "outputs": [],
290 "source": [
291 "print(QQ(3))\n",
292 "print(RR(3))"
293 ]
294 },
295 {
296 "cell_type": "markdown",
297 "metadata": {},
298 "source": [
299 "You can also choose the precision of this approximation using the alternative name `RealField`."
300 ]
301 },
302 {
303 "cell_type": "code",
304 "execution_count": null,
305 "metadata": {},
306 "outputs": [],
307 "source": [
308 "print(RR)\n",
309 "print(RealField(prec=1000))"
310 ]
311 },
312 {
313 "cell_type": "markdown",
314 "metadata": {},
315 "source": [
316 "# Polynomial rings\n",
317 "\n",
318 "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n",
319 "\n",
320 "If you want to work with polynomials over a certain ring it is better to use this specific construction, rather than the symbolic expressions introduced above."
321 ]
322 },
323 {
324 "cell_type": "code",
325 "execution_count": 55,
326 "metadata": {},
327 "outputs": [
328 {
329 "name": "stdout",
330 "output_type": "stream",
331 "text": [
332 "Univariate Polynomial Ring in x over Rational Field\n",
333 "[]\n",
334 "[(-2, 2)]\n"
335 ]
336 }
337 ],
338 "source": [
339 "polring.<x> = QQ[] # Alternative: polring.<x,y,z> = PolynomialRing(RR)\n",
340 "polring\n",
341 "print(parent(x))\n",
342 "g = x^3 + 3*x^2-1\n",
343 "print(g.roots())\n",
344 "print((x^2+4*x+4).roots())"
345 ]
346 },
347 {
348 "cell_type": "markdown",
349 "metadata": {},
350 "source": [
351 "You can use as many variables as you like, and you can replace `RR` with any ring. In the example above `polring` is just the name of the variable (in the computer science sense) associated with this polynomial ring.\n",
352 "\n",
353 "## Operations on polynomials\n",
354 "\n",
355 "The usual Mathematical operations are available on polynomial rings, including Euclidean division `//` and remainder `%`. There is also the single-slash division `/`, but the result may not be a polynomial anymore.\n",
356 "\n",
357 "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n",
358 "\n",
359 "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?"
360 ]
361 },
362 {
363 "cell_type": "code",
364 "execution_count": 60,
365 "metadata": {},
366 "outputs": [
367 {
368 "name": "stdout",
369 "output_type": "stream",
370 "text": [
371 "x + 1\n",
372 "-4\n",
373 "(x^2 + 2*x - 3)/(x + 1)\n",
374 "Fraction Field of Univariate Polynomial Ring in x over Rational Field\n"
375 ]
376 },
377 {
378 "data": {
379 "text/plain": [
380 "x^4 + 2*x^3 - 4*x^2 - 2*x + 3"
381 ]
382 },
383 "execution_count": 60,
384 "metadata": {},
385 "output_type": "execute_result"
386 }
387 ],
388 "source": [
389 "polring.<x> = QQ[]\n",
390 "p = x^2 + 2*x - 3 # Don't forget * for multiplication!\n",
391 "q = p // (x+1)\n",
392 "r = p % (x+1)\n",
393 "f = p / (x+1)\n",
394 "print(q)\n",
395 "print(r)\n",
396 "print(f)\n",
397 "print(parent(f))\n",
398 "p*(x^2-1)"
399 ]
400 },
401 {
402 "cell_type": "markdown",
403 "metadata": {},
404 "source": [
405 "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n",
406 "\n",
407 "**Remark.** Notice how the result can change substantially if you change the base ring.\n",
408 "\n",
409 "**Remark.** [Factorizations](https://doc.sagemath.org/html/en/reference/structure/sage/structure/factorization.html) are a particular object in Sage. They are kinda like a list, but not really. You can get a list of pairs (factor, power) with `list(factor(f))`."
410 ]
411 },
412 {
413 "cell_type": "code",
414 "execution_count": 76,
415 "metadata": {
416 "scrolled": true
417 },
418 "outputs": [
419 {
420 "name": "stdout",
421 "output_type": "stream",
422 "text": [
423 "(t + 1) * (t^2 - 3) * (t^2 + 1)\n",
424 "[(t + 1, 1), (t^2 - 3, 1), (t^2 + 1, 1)]\n",
425 "t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n",
426 "t^2 - 1\n",
427 "[(-1, 1)]\n",
428 "Multivariate Polynomial Ring in x, y, z over Rational Field\n"
429 ]
430 },
431 {
432 "data": {
433 "text/plain": [
434 "Multivariate Polynomial Ring in x, y, z over Rational Field"
435 ]
436 },
437 "execution_count": 76,
438 "metadata": {},
439 "output_type": "execute_result"
440 }
441 ],
442 "source": [
443 "polring_onevar.<t> = QQ[]\n",
444 "\n",
445 "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n",
446 "fact = factor(f)\n",
447 "print(factor(f))\n",
448 "print(list(fact))\n",
449 "print((t + 1) * (t^2 - 3) * (t^2 + 1))\n",
450 "print((t+1)*(t-1))\n",
451 "print(f.roots()) # Result: list of pairs (root,multiplicity)\n",
452 "\n",
453 "polring_manyvar.<x,y,z> = QQ[]\n",
454 "factor(x*y+x)\n",
455 "\n",
456 "# The following line gives an error, because the polynomial\n",
457 "# is understood to possibly have many variables:\n",
458 "print(parent(x))\n",
459 "(QQ['x'](x^2-1)).roots()\n",
460 "parent(x)"
461 ]
462 },
463 {
464 "cell_type": "markdown",
465 "metadata": {},
466 "source": [
467 "# Matrices and vectors\n",
468 "\n",
469 "**References:** [[8](https://doc.sagemath.org/html/en/reference/matrices/index.html)], but in particular the subections [[9](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/docs.html)] and [[10](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/matrix2.html)]\n",
470 "\n",
471 "In Sage you can easily manipulate matrices and vectors"
472 ]
473 },
474 {
475 "cell_type": "code",
476 "execution_count": 94,
477 "metadata": {},
478 "outputs": [
479 {
480 "name": "stdout",
481 "output_type": "stream",
482 "text": [
483 "[ 1 2 3]\n",
484 "[ 0 0 1]\n",
485 "[ 4 -3 22/7] \n",
486 "\n",
487 "[1/2 0 0]\n",
488 "[ 7 0 0]\n",
489 "[ 1 1 1] \n",
490 "\n",
491 "[1 0]\n",
492 "[0 1] \n",
493 "\n",
494 "(3/2, 21, 6) \n",
495 "\n",
496 "[ -7/2 -10 80/7]\n",
497 "[ 17 -4 15/7]\n",
498 "[ 241/7 -18/7 869/49] \n",
499 "\n",
500 "Rank of A = 3\n",
501 "Rank of B = 2\n"
502 ]
503 },
504 {
505 "data": {
506 "text/plain": [
507 "11"
508 ]
509 },
510 "execution_count": 94,
511 "metadata": {},
512 "output_type": "execute_result"
513 }
514 ],
515 "source": [
516 "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n",
517 "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n",
518 "C = matrix([[1,0],[0,1]])\n",
519 "v = vector([3,4,-1])\n",
520 "\n",
521 "print(A, \"\\n\") # \\n just means \"newline\"\n",
522 "print(B, \"\\n\")\n",
523 "print(C, \"\\n\")\n",
524 "#print(A*C) Error!\n",
525 "print(B*v, \"\\n\")\n",
526 "print(A^2 + 2*B - A*B, \"\\n\")\n",
527 "\n",
528 "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n",
529 "print(\"Rank of B =\", rank(B))\n",
530 "A.determinant()"
531 ]
532 },
533 {
534 "cell_type": "markdown",
535 "metadata": {},
536 "source": [
537 "**Exercise:** in the cell above, compute the determinant, inverse and characteristic polynomial of the matrix `A`. *Hint: look at the reference [10] above (the functions are listed in alphabetic order).*\n",
538 "\n",
539 "As for polynomials, you can specify where a matrix or a vector lives"
540 ]
541 },
542 {
543 "cell_type": "code",
544 "execution_count": 97,
545 "metadata": {},
546 "outputs": [
547 {
548 "data": {
549 "text/plain": [
550 "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision"
551 ]
552 },
553 "execution_count": 97,
554 "metadata": {},
555 "output_type": "execute_result"
556 }
557 ],
558 "source": [
559 "M = matrix(CC, [[0,1/2],[1,0]])\n",
560 "parent(M)"
561 ]
562 },
563 {
564 "cell_type": "markdown",
565 "metadata": {},
566 "source": [
567 "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n",
568 "\n",
569 "**Warning.** In linear algebra there are distinct concepts of *left* and *right* eigenvalues (and eigenvector). The one you know is probably that of **right** eigen-{value,vector}, that is an element $\\lambda$ of the base field and a non-zero vector $\\mathbf v$ with $A\\mathbf v=\\lambda\\mathbf v$. The other concept corresponds to the equality $\\mathbf v^TA=\\lambda \\mathbf v$."
570 ]
571 },
572 {
573 "cell_type": "code",
574 "execution_count": null,
575 "metadata": {},
576 "outputs": [],
577 "source": [
578 "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n",
579 "v = vector(RR, [3,0])\n",
580 "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v"
581 ]
582 },
583 {
584 "cell_type": "code",
585 "execution_count": 103,
586 "metadata": {},
587 "outputs": [
588 {
589 "name": "stderr",
590 "output_type": "stream",
591 "text": [
592 "<ipython-input-103-d1ccc4990851>:2: UserWarning: Using generic algorithm for an inexact ring, which will probably give incorrect results due to numerical precision issues.\n",
593 " A.eigenvalues() # Also: A.eigenvalues(), A.eigenvectors_right()\n"
594 ]
595 },
596 {
597 "data": {
598 "text/plain": [
599 "[5.37228132326901, -0.372281323269014]"
600 ]
601 },
602 "execution_count": 103,
603 "metadata": {},
604 "output_type": "execute_result"
605 }
606 ],
607 "source": [
608 "A = Matrix(RR, [[1,2],[3,4]])\n",
609 "A.eigenvalues() # Also: A.eigenvalues(), A.eigenvectors_right()"
610 ]
611 },
612 {
613 "cell_type": "markdown",
614 "metadata": {},
615 "source": [
616 "We can also extract a specific submatrix by selecting only some rows and columns, with a syntax similar to that of Python's lists. Check out more examples in the reference [9] above, and try them in the cell below."
617 ]
618 },
619 {
620 "cell_type": "code",
621 "execution_count": 105,
622 "metadata": {},
623 "outputs": [
624 {
625 "name": "stdout",
626 "output_type": "stream",
627 "text": [
628 "[ -3 -25 -5 -3 61 0 -1]\n",
629 "[ 23 0 -1 1 0 1 -1]\n",
630 "[286 2 7 0 -21 -1 0]\n",
631 "[ 2 -1 -2 0 -1 4 0]\n",
632 "[ 1 -1 1 0 2 -2 7]\n",
633 "[ 0 15 -1 0 -3 1 -1]\n",
634 "[ -1 1 -2 0 2 1 1] \n",
635 "\n",
636 "[ -1 1 0]\n",
637 "[ 7 0 -21] \n",
638 "\n",
639 "[ -3 -25 -5 -3 61 0 -1] \n",
640 "\n",
641 "[ -3 -25 -5 -3 61]\n",
642 "[ 0 15 -1 0 -3]\n",
643 "[286 2 7 0 -21]\n",
644 "-25\n"
645 ]
646 }
647 ],
648 "source": [
649 "A = MatrixSpace(ZZ, 7).random_element()\n",
650 "print(A, \"\\n\")\n",
651 "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n",
652 "print(A[0,0:], \"\\n\") # First row, all columns\n",
653 "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5\n",
654 "print(A[0,1])"
655 ]
656 },
657 {
658 "cell_type": "markdown",
659 "metadata": {},
660 "source": [
661 "**Exercise:** write a sage function that computes the determinant of an $n\\times n$ matrix $A=(a_{ij})$ using Laplace's rule by the first row, that is \n",
662 "\\begin{align*}\n",
663 " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n",
664 "\\end{align*}\n",
665 "where $M_{0j}$ is the determinant of the $(n-1)\\times(n-1)$ matrix obtained by removing the $0$-th row and the $j$-th column from $A$."
666 ]
667 },
668 {
669 "cell_type": "code",
670 "execution_count": 6,
671 "metadata": {},
672 "outputs": [
673 {
674 "name": "stdout",
675 "output_type": "stream",
676 "text": [
677 "[ -1 -3 -1 11 2 -1 -5]\n",
678 "[ 1 0 0 -6 -1 0 1]\n",
679 "[ 1 0 -1 0 1 -1 0]\n",
680 "[-24 1 -2 -7 4 0 1]\n",
681 "[ -3 0 -1 0 6 -1 0]\n",
682 "[-17 -1 1 0 28 1 0]\n",
683 "[ 1 -4 1 1 -2 -6 -2]\n",
684 "Sage determinant: 13578\n",
685 "my_det: 13578\n"
686 ]
687 }
688 ],
689 "source": [
690 "def my_det(A):\n",
691 " if not A.is_square():\n",
692 " print(\"Error: matrix is not square\")\n",
693 " \n",
694 " n = A.nrows() # size of the matrix\n",
695 " \n",
696 " if n == 1:\n",
697 " return A[0,0]\n",
698 " \n",
699 " my_sum = 0\n",
700 " for j in range(0,n):\n",
701 " rows = range(1,n)\n",
702 " columns = [element for element in range(0,n) if element != j]\n",
703 " submatrix = A[rows,columns]\n",
704 " my_sum += (-1)^j * A[0,j] * my_det(submatrix)\n",
705 " \n",
706 " return my_sum\n",
707 "\n",
708 "A = MatrixSpace(ZZ, 7).random_element()\n",
709 "print(A)\n",
710 "print(\"Sage determinant: \", A.determinant())\n",
711 "print(\"my_det: \", my_det(A))"
712 ]
713 },
714 {
715 "cell_type": "markdown",
716 "metadata": {},
717 "source": [
718 "# Number Theory\n",
719 "\n",
720 "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n",
721 "\n",
722 "Sage includes a large library of functions for computing with the integers, see the link above."
723 ]
724 },
725 {
726 "cell_type": "code",
727 "execution_count": 8,
728 "metadata": {},
729 "outputs": [
730 {
731 "name": "stdout",
732 "output_type": "stream",
733 "text": [
734 "3^2 * 3607 * 3803\n",
735 "[(3, 2), (3607, 1), (3803, 1)]\n",
736 "True\n",
737 "True\n",
738 "619703040\n",
739 "9\n",
740 "13548070123626141\n"
741 ]
742 }
743 ],
744 "source": [
745 "n = 123456789\n",
746 "m = 987654321\n",
747 "p = 3607\n",
748 "\n",
749 "print(factor(n))\n",
750 "print(list(factor(n)))\n",
751 "print(is_prime(p))\n",
752 "print(p.divides(n))\n",
753 "print(euler_phi(m))\n",
754 "print(gcd(n, m))\n",
755 "print(lcm(n, m))"
756 ]
757 },
758 {
759 "cell_type": "markdown",
760 "metadata": {},
761 "source": [
762 "## Primes\n",
763 "\n",
764 "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n",
765 "\n",
766 "The set of prime numbers is called `Primes()`. It is like an infinite list: for example you can get the one-millionth prime number or you can use this list to create other lists. You can also check what the first prime number larger than a given number is."
767 ]
768 },
769 {
770 "cell_type": "code",
771 "execution_count": null,
772 "metadata": {},
773 "outputs": [
774 {
775 "name": "stdout",
776 "output_type": "stream",
777 "text": [
778 "Set of all prime numbers: 2, 3, 5, 7, ...\n",
779 "31 252097800629\n",
780 "47\n",
781 "[79, 83, 89, 97]\n"
782 ]
783 }
784 ],
785 "source": [
786 "PP = Primes()\n",
787 "print(PP)\n",
788 "print(PP[10], PP[10^10])\n",
789 "print(PP.next(44))\n",
790 "\n",
791 "First_Thousand_Primes = PP[0:1000]\n",
792 "print([p for p in First_Thousand_Primes if p < 100 and p > 75])\n",
793 "#print([p for p in PP if p < 100 and p > 75])"
794 ]
795 },
796 {
797 "cell_type": "markdown",
798 "metadata": {},
799 "source": [
800 "## The Chinese remainder theorem (CRT)\n",
801 "\n",
802 "We say that two integers $a$ and $b$ are *congruent* modulo another integer $n>0$ if they have the same remainder when divided by $n$. We denote this by $a\\equiv b\\pmod n$, or in Python/Sage syntax `a % n == b % n`.\n",
803 "\n",
804 "The Chinese remainder theorem states that if $a,b\\in\\mathbb Z$ and $n,m\\in \\mathbb Z_{>0}$ are such that $\\gcd(n,m)=1$ then the system of congruences\n",
805 "\n",
806 "\\begin{align*}\n",
807 "\\begin{cases}\n",
808 " x \\equiv a \\pmod n\\\\\n",
809 " x \\equiv b \\pmod m\n",
810 "\\end{cases}\n",
811 "\\end{align*}\n",
812 "\n",
813 "\n",
814 "has exactly one solution modulo $mn$. This means that there is one and only one number $x$ with $0\\leq x<mn$ such that $x\\equiv a\\pmod n$ and $x\\equiv b\\pmod m$.\n",
815 "\n",
816 "\n",
817 "For example:\n",
818 "\n",
819 "\\begin{align*}\n",
820 "\\begin{cases}\n",
821 " x \\equiv 1 \\pmod 3\\\\\n",
822 " x \\equiv 2 \\pmod 5\n",
823 "\\end{cases}\n",
824 "\\end{align*}\n",
825 "\n",
826 "Solution: $x=7$ (any other solution is congruent to $7$ modulo $15$; for example $22=15+7$ is also a solution).\n",
827 "\n",
828 "The procedure to find such a number is not too hard to describe (you might see it in an algebra or number theory course), but it can be a bit long. Luckily, Sage can do this for you:"
829 ]
830 },
831 {
832 "cell_type": "code",
833 "execution_count": 1,
834 "metadata": {},
835 "outputs": [
836 {
837 "name": "stdout",
838 "output_type": "stream",
839 "text": [
840 "74306 2 798\n"
841 ]
842 }
843 ],
844 "source": [
845 "a = 2\n",
846 "b = -1\n",
847 "n = 172\n",
848 "m = 799\n",
849 "\n",
850 "if gcd(n,m) != 1:\n",
851 " print(\"The numbers are not comprime, I can't solve this!\")\n",
852 "else:\n",
853 " x = crt(a, b, n, m)\n",
854 " print(x, x%n, x%m)"
855 ]
856 },
857 {
858 "cell_type": "markdown",
859 "metadata": {},
860 "source": [
861 "**Exercise.** There is a more general version of the Chinese remainder theorem which says that if $a_0, a_1, \\dots, a_k\\in\\mathbb Z$ and $n_0, n_2, \\dots, n_k\\in\\mathbb Z_{>0}$ are such that $\\gcd(n_i, n_j)=1$ for $i\\neq j$, then the system of congruences\n",
862 "\n",
863 "\\begin{align*}\n",
864 "\\begin{cases}\n",
865 " x \\equiv a_0 \\pmod {n_0}\\\\\n",
866 " x \\equiv a_1 \\pmod {n_1}\\\\\n",
867 " \\dots \\\\\n",
868 " x \\equiv a_k \\pmod {n_k}\n",
869 "\\end{cases}\n",
870 "\\end{align*}\n",
871 "\n",
872 "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n",
873 "*Hint: start by running the command `help(crt)`."
874 ]
875 },
876 {
877 "cell_type": "code",
878 "execution_count": 3,
879 "metadata": {},
880 "outputs": [],
881 "source": [
882 "#help(crt)"
883 ]
884 },
885 {
886 "cell_type": "markdown",
887 "metadata": {},
888 "source": [
889 "# Cryptography: RSA\n",
890 "\n",
891 "[Cryptography](https://en.wikipedia.org/wiki/Cryptography) is the discipline that studies methods to communicate secrets in such a way that any unauthorized listener would not be able to understand the message.\n",
892 "\n",
893 "A simple cryptographic protocol could be changing every letter of your text following a fixed scheme (or *cypher*), for example by turning every A into a B, every B into a C and so on. However this is not a very secure method, for many reasons. One of them is that at some point the people who want to communicate need to agree on what method to use, and anyone listening to that conversation would be able to decypher every subsequent conversation. A public-key cryptographic protocol solves this problem.\n",
894 "\n",
895 "## Public-key cryptography\n",
896 "\n",
897 "Public-key cryptographic protocols, such as RSA, work like this: there are two keys, a *private* key that is only known to person A (traditionally called Alice in every example), and a *public* key that does not need to be secret.\n",
898 "\n",
899 "The public key is used to *encrypt* the message (that is to \"lock\" it, or \"hyde\" it), but one needs the private key to *decrypt* it. Imagine having two keys for your door, but one can only be used to lock it, while the other only to open it.\n",
900 "\n",
901 "The message exchange works like this: suppose that person B (Bob) wants to send a secret message to Alice. Then Alice secretely generates a private and a public key and sends only the public one to Bob. Now Bob encrypts the message and sends it to Alice, who can use her private key to decrypt it. Even if Eve (short for *eavesdropper*, an unauthorized listener) listens to every message exchanged, she won't be able to decypher the secret: the private key has never left Alice's house!\n",
902 "\n",
903 "Notice that such a protocol is *asymmetric*: if Alice wanted to send a secret to Bob in reply, Bob would need to generate a pair of keys of his own.\n",
904 "\n",
905 "Let's see how we can do this in practice, using number theory!\n",
906 "\n",
907 "## RSA\n",
908 "\n",
909 "As many other cryptography protocols, RSA is based on a Mathematical process that is easy to do in one direction, but very hard to invert. In this case the hard process is integer factorization, that is decomposing an integer number as a product of primes."
910 ]
911 },
912 {
913 "cell_type": "code",
914 "execution_count": 5,
915 "metadata": {},
916 "outputs": [
917 {
918 "name": "stdout",
919 "output_type": "stream",
920 "text": [
921 "True True False\n"
922 ]
923 },
924 {
925 "data": {
926 "text/plain": [
927 "1 loop, best of 1: 9.06 s per loop"
928 ]
929 },
930 "execution_count": 5,
931 "metadata": {},
932 "output_type": "execute_result"
933 }
934 ],
935 "source": [
936 "p = 100003100019100043100057100069\n",
937 "q = 100144655312449572059845328443\n",
938 "n = p*q\n",
939 "print(is_prime(p), is_prime(q), is_prime(p*q))\n",
940 "\n",
941 "# Use the command below to see how long it takes\n",
942 "timeit(\"factor(n)\", number=1, repeat=1)"
943 ]
944 },
945 {
946 "cell_type": "markdown",
947 "metadata": {},
948 "source": [
949 "In order to generate the keys, Alice picks a number $n$ which is the product of two large primes $p$ and $q$ of more or less the same size. Finding such primes is relatively easy compared to factoring the number $n$ she obtained. Then she computes the Euler totient $\\varphi(n)=(p-1)(q-1)$ of $n$, which she can do because she knows that $n=pq$ - it would be impossible otherwise!\n",
950 "\n",
951 "Then Alice can compute two integers $(d,e)$ such that $de\\equiv 1\\pmod{\\varphi(n)}$. She will send the numbers $n$ and $d$ to Bob and keep $e$ secret. In this case the public key is the pair $(n,d)$, while $e$ is the private key.\n",
952 "\n",
953 "Of course, she does all of this using Sage!"
954 ]
955 },
956 {
957 "cell_type": "code",
958 "execution_count": 6,
959 "metadata": {},
960 "outputs": [
961 {
962 "data": {
963 "text/plain": [
964 "(338547806707501, 141995674537431, 107165393087271)"
965 ]
966 },
967 "execution_count": 6,
968 "metadata": {},
969 "output_type": "execute_result"
970 }
971 ],
972 "source": [
973 "def two_large_primes():\n",
974 " p, q = 0, 0\n",
975 " # We make sure that they are different\n",
976 " while p == q:\n",
977 " p = Primes()[randint(10^6, 2*10^6)]\n",
978 " q = Primes()[randint(10^6, 2*10^6)]\n",
979 " return p, q\n",
980 "\n",
981 "def random_unit_mod(N):\n",
982 " R = Integers(N)\n",
983 " d = R(0)\n",
984 " # We make sure that it is invertible\n",
985 " while not d.is_unit():\n",
986 " d = R.random_element()\n",
987 " return d\n",
988 "\n",
989 "def Alice_generate_keys():\n",
990 " p, q = two_large_primes()\n",
991 " n = p*q\n",
992 " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n",
993 " \n",
994 " d = random_unit_mod(phi_n)\n",
995 " e = d^-1\n",
996 " return n, d, e\n",
997 "\n",
998 "Alice_generate_keys()"
999 ]
1000 },
1001 {
1002 "cell_type": "markdown",
1003 "metadata": {},
1004 "source": [
1005 "Now, how does Bob encrypt his message? Let's say he wants to send to Alice the number $m$ with $1<m<n$ (In practice he would like to send her some text with emojis, or maybe a voice message; but for computers everything is a number, and there are different ways to translate any sort of information to a number. He just chooses one of the many standard methods that already exist, no cryptography is needed in this step. If the message $m$ is too long, he can split it up in some pieces and repeat the process multiple times.)\n",
1006 "\n",
1007 "Now he computes $m^d\\pmod n$ and sends it back to Alice."
1008 ]
1009 },
1010 {
1011 "cell_type": "code",
1012 "execution_count": 7,
1013 "metadata": {},
1014 "outputs": [
1015 {
1016 "data": {
1017 "text/plain": [
1018 "177776139844621"
1019 ]
1020 },
1021 "execution_count": 7,
1022 "metadata": {},
1023 "output_type": "execute_result"
1024 }
1025 ],
1026 "source": [
1027 "def Bob_encrypt(m, n, d):\n",
1028 " R = Integers(n)\n",
1029 " return R(m)^d # Assume that n is large enough\n",
1030 " \n",
1031 "message = 42424242\n",
1032 "Bob_encrypt(message, 338547806707501, 141995674537431)"
1033 ]
1034 },
1035 {
1036 "cell_type": "markdown",
1037 "metadata": {},
1038 "source": [
1039 "Since $de\\equiv 1\\pmod{\\varphi(n)}$, it follows that $(m^d)^e\\equiv m\\pmod n$ (see [Wikipedia: Euler's theorem](https://en.wikipedia.org/wiki/Euler%27s_theorem)). So for Alice it is very easy to get back the original message:"
1040 ]
1041 },
1042 {
1043 "cell_type": "code",
1044 "execution_count": 8,
1045 "metadata": {},
1046 "outputs": [
1047 {
1048 "data": {
1049 "text/plain": [
1050 "42424242"
1051 ]
1052 },
1053 "execution_count": 8,
1054 "metadata": {},
1055 "output_type": "execute_result"
1056 }
1057 ],
1058 "source": [
1059 "def Alice_decrypt(m_encrypted, n, e):\n",
1060 " R = Integers(n)\n",
1061 " return R(m_encrypted)^e\n",
1062 "\n",
1063 "Alice_decrypt(177776139844621, 338547806707501, 107165393087271)"
1064 ]
1065 },
1066 {
1067 "cell_type": "markdown",
1068 "metadata": {},
1069 "source": [
1070 "Another assumption on which RSA relies is that even if one knows $M=m^e$ and $e$, extracting the $e$-th root of $M$ modulo $n$ (and thus obtaining $m$) is very hard. Currently the best known way to do this is by factorizing $n$ first, which is considered to be a very hard problem. However, there is no proof that faster algorithms can't be devised.\n",
1071 "\n",
1072 "Moreover, one day we will overcome the current technological difficulties and quantum computers will be available. Quantum computers are not just \"more powerful\" than classical hardware, but they work based on completely different logical foundations and they make the factorization problem much easier to solve: for example [Shor's algorithm](https://en.wikipedia.org/wiki/Shor%27s_algorithm) takes advantage of this different logic and can factorize numbers quickly, if run on a quantum computer.\n",
1073 "\n",
1074 "To this day the largest number factorized with a quantum computer is $21=3\\times 7$. Nonetheless, quantum-safe cryptography protocols (i.e. based on problems that are hard to solve also with quantum computers) have already been developed."
1075 ]
1076 }
1077 ],
1078 "metadata": {
1079 "kernelspec": {
1080 "display_name": "SageMath 9.2",
1081 "language": "sage",
1082 "name": "sagemath"
1083 },
1084 "language_info": {
1085 "codemirror_mode": {
1086 "name": "ipython",
1087 "version": 3
1088 },
1089 "file_extension": ".py",
1090 "mimetype": "text/x-python",
1091 "name": "python",
1092 "nbconvert_exporter": "python",
1093 "pygments_lexer": "ipython3",
1094 "version": "3.8.5"
1095 }
1096 },
1097 "nbformat": 4,
1098 "nbformat_minor": 4
1099}
diff --git a/src/Lecture5/notebook/.ipynb_checkpoints/scratchpad-checkpoint.ipynb b/src/Lecture5/notebook/.ipynb_checkpoints/scratchpad-checkpoint.ipynb
new file mode 100644
index 0000000..5232819
--- /dev/null
+++ b/src/Lecture5/notebook/.ipynb_checkpoints/scratchpad-checkpoint.ipynb
@@ -0,0 +1,52 @@
1{
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 1,
6 "metadata": {},
7 "outputs": [
8 {
9 "data": {
10 "text/plain": [
11 "9"
12 ]
13 },
14 "execution_count": 1,
15 "metadata": {},
16 "output_type": "execute_result"
17 }
18 ],
19 "source": [
20 "gcd(36,27)"
21 ]
22 },
23 {
24 "cell_type": "code",
25 "execution_count": null,
26 "metadata": {},
27 "outputs": [],
28 "source": []
29 }
30 ],
31 "metadata": {
32 "kernelspec": {
33 "display_name": "SageMath 9.2",
34 "language": "sage",
35 "name": "sagemath"
36 },
37 "language_info": {
38 "codemirror_mode": {
39 "name": "ipython",
40 "version": 3
41 },
42 "file_extension": ".py",
43 "mimetype": "text/x-python",
44 "name": "python",
45 "nbconvert_exporter": "python",
46 "pygments_lexer": "ipython3",
47 "version": "3.8.5"
48 }
49 },
50 "nbformat": 4,
51 "nbformat_minor": 4
52}
diff --git a/src/Lecture5/notebook/7-SageAlgebra.aux b/src/Lecture5/notebook/7-SageAlgebra.aux
new file mode 100644
index 0000000..a3f33b6
--- /dev/null
+++ b/src/Lecture5/notebook/7-SageAlgebra.aux
@@ -0,0 +1,56 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\providecommand \oddpage@label [2]{}
20\@writefile{toc}{\contentsline {section}{\numberline {1}The Jupyter Notebook}{1}{section.1}\protected@file@percent }
21\newlabel{the-jupyter-notebook}{{1}{1}{The Jupyter Notebook}{section.1}{}}
22\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Cells}{1}{subsection.1.1}\protected@file@percent }
23\newlabel{cells}{{1.1}{1}{Cells}{subsection.1.1}{}}
24\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Markdown}{1}{subsection.1.2}\protected@file@percent }
25\newlabel{markdown}{{1.2}{1}{Markdown}{subsection.1.2}{}}
26\@writefile{toc}{\contentsline {section}{\numberline {2}Symbolic expressions}{2}{section.2}\protected@file@percent }
27\newlabel{symbolic-expressions}{{2}{2}{Symbolic expressions}{section.2}{}}
28\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Mathematical variables}{2}{subsection.2.1}\protected@file@percent }
29\newlabel{mathematical-variables}{{2.1}{2}{Mathematical variables}{subsection.2.1}{}}
30\gdef \LT@i {\LT@entry
31 {1}{103.45363pt}\LT@entry
32 {1}{76.13344pt}\LT@entry
33 {2}{68.2421pt}}
34\@writefile{toc}{\contentsline {section}{\numberline {3}Basic rings and fields}{3}{section.3}\protected@file@percent }
35\newlabel{basic-rings-and-fields}{{3}{3}{Basic rings and fields}{section.3}{}}
36\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Parents and coercion}{3}{subsection.3.1}\protected@file@percent }
37\newlabel{parents-and-coercion}{{3.1}{3}{Parents and coercion}{subsection.3.1}{}}
38\@writefile{toc}{\contentsline {section}{\numberline {4}Polynomial rings}{4}{section.4}\protected@file@percent }
39\newlabel{polynomial-rings}{{4}{4}{Polynomial rings}{section.4}{}}
40\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Operations on polynomials}{4}{subsection.4.1}\protected@file@percent }
41\newlabel{operations-on-polynomials}{{4.1}{4}{Operations on polynomials}{subsection.4.1}{}}
42\@writefile{toc}{\contentsline {section}{\numberline {5}Matrices and vectors}{5}{section.5}\protected@file@percent }
43\newlabel{matrices-and-vectors}{{5}{5}{Matrices and vectors}{section.5}{}}
44\@writefile{toc}{\contentsline {section}{\numberline {6}Number Theory}{8}{section.6}\protected@file@percent }
45\newlabel{number-theory}{{6}{8}{Number Theory}{section.6}{}}
46\@writefile{toc}{\contentsline {subsection}{\numberline {6.1}Primes}{8}{subsection.6.1}\protected@file@percent }
47\newlabel{primes}{{6.1}{8}{Primes}{subsection.6.1}{}}
48\@writefile{toc}{\contentsline {subsection}{\numberline {6.2}The Chinese remainder theorem (CRT)}{9}{subsection.6.2}\protected@file@percent }
49\newlabel{the-chinese-remainder-theorem-crt}{{6.2}{9}{The Chinese remainder theorem (CRT)}{subsection.6.2}{}}
50\@writefile{toc}{\contentsline {section}{\numberline {7}Cryptography: RSA}{10}{section.7}\protected@file@percent }
51\newlabel{cryptography-rsa}{{7}{10}{Cryptography: RSA}{section.7}{}}
52\@writefile{toc}{\contentsline {subsection}{\numberline {7.1}Public-key cryptography}{10}{subsection.7.1}\protected@file@percent }
53\newlabel{public-key-cryptography}{{7.1}{10}{Public-key cryptography}{subsection.7.1}{}}
54\@writefile{toc}{\contentsline {subsection}{\numberline {7.2}RSA}{10}{subsection.7.2}\protected@file@percent }
55\newlabel{rsa}{{7.2}{10}{RSA}{subsection.7.2}{}}
56\gdef \@abspage@last{12}
diff --git a/src/Lecture5/notebook/7-SageAlgebra.ipynb b/src/Lecture5/notebook/7-SageAlgebra.ipynb
new file mode 100644
index 0000000..59ea033
--- /dev/null
+++ b/src/Lecture5/notebook/7-SageAlgebra.ipynb
@@ -0,0 +1,1046 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "This lecture's notes are in a different format: the presentations for the $\\LaTeX$ part were made with $\\LaTeX$, so this one is made with Sage, or rather with the [Jupyter Notebook](https://jupyter.org/).\n",
8 "\n",
9 "# The Jupyter Notebook\n",
10 "**Reference:** [[1](https://jupyter.org/documentation)]\n",
11 "\n",
12 "The Jupyter Notebook is one of the default interfaces for SageMath, along with the command line interface. You can access it via web browser, but it is running locally on your device (notice the strange url: `http://localhost:8888/notebooks...`).\n",
13 "\n",
14 "You can create a new notebook by clicking on `New > SageMath 9.2`. You can also create a Python 3 notebook to write Python code.\n",
15 "\n",
16 "Jupyter saves and reads files in the `.ipynb` format. If you download the file for this lecture you can open it and follow the examples interactively.\n",
17 "\n",
18 "## Cells\n",
19 "\n",
20 "The notebook contains one or more *interactive cells* that you can run, like this one below:"
21 ]
22 },
23 {
24 "cell_type": "code",
25 "execution_count": 2,
26 "metadata": {},
27 "outputs": [
28 {
29 "data": {
30 "text/plain": [
31 "2/5"
32 ]
33 },
34 "execution_count": 2,
35 "metadata": {},
36 "output_type": "execute_result"
37 }
38 ],
39 "source": [
40 "# Exercise: modify this cell to use the print() command\n",
41 "2+2\n",
42 "2/5"
43 ]
44 },
45 {
46 "cell_type": "markdown",
47 "metadata": {},
48 "source": [
49 "If you are reading this from Jupyter rather than from the pdf file, you can edit the cell above and run it again. You can also add more cells by selecting `Insert` from the menu bar.\n",
50 "\n",
51 "Notice that only the last statement produces an output. You can force anything to be written as output with the `print()` command, which works like in Python. As an exercise, try to modify the cell above to provide more output!"
52 ]
53 },
54 {
55 "cell_type": "markdown",
56 "metadata": {},
57 "source": [
58 "## Markdown\n",
59 "\n",
60 "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n",
61 "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n",
62 "\n",
63 "You can also include some LaTeX code in Markdown cells, with dollar signs $ or align environments:\n",
64 "\n",
65 "\\begin{align*}\n",
66 "\\frac{(x+y)^2}{x+1} = \\frac{x^2+y^2}{x+1}\n",
67 "\\end{align*}\n",
68 "\n",
69 "When you are done writing a Markdown cell, you can run it to see the well-formatted text. To edit the text again, double-click on the cell. Try doing it now to fix the formula above!"
70 ]
71 },
72 {
73 "cell_type": "markdown",
74 "metadata": {},
75 "source": [
76 "# Symbolic expressions\n",
77 "\n",
78 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
79 "\n",
80 "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:"
81 ]
82 },
83 {
84 "cell_type": "code",
85 "execution_count": 3,
86 "metadata": {},
87 "outputs": [
88 {
89 "data": {
90 "text/plain": [
91 "[x == -sqrt(6) - 1, x == sqrt(6) - 1]"
92 ]
93 },
94 "execution_count": 3,
95 "metadata": {},
96 "output_type": "execute_result"
97 }
98 ],
99 "source": [
100 "f = x^2 + 2*x - 5 == 0\n",
101 "solve(f,x)"
102 ]
103 },
104 {
105 "cell_type": "markdown",
106 "metadata": {},
107 "source": [
108 "Notice that the single `=` is part of an assignment, as in Python: we are *assigning* to the variable `f` the value `x^2 + 2*x - 5 >= 0`, which in this case is an equation, so it contains the symbol `==`. Keep in mind the difference between the two!\n",
109 "\n",
110 "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$."
111 ]
112 },
113 {
114 "cell_type": "markdown",
115 "metadata": {},
116 "source": [
117 "## Mathematical variables\n",
118 "\n",
119 "Last time we saw what *variables* are in Python, and that they are a little bit different from the *Mathematical variables* that you use in Mathematics. In Sage, both concepts are present, but they are still distinct. For example in the cell above `f` is a variable in the sense of computer science, while `x` is a Mathematical variable.\n",
120 "\n",
121 "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:"
122 ]
123 },
124 {
125 "cell_type": "code",
126 "execution_count": 14,
127 "metadata": {},
128 "outputs": [
129 {
130 "data": {
131 "text/plain": [
132 "[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 + 9) - 1/2]"
133 ]
134 },
135 "execution_count": 14,
136 "metadata": {},
137 "output_type": "execute_result"
138 }
139 ],
140 "source": [
141 "var('y')\n",
142 "solve(y^2 + (x+1)*y - 2 == 0, y)"
143 ]
144 },
145 {
146 "cell_type": "markdown",
147 "metadata": {},
148 "source": [
149 "Try removing the first line in the cell above and see what error you get!\n",
150 "\n",
151 "Here is another example:"
152 ]
153 },
154 {
155 "cell_type": "code",
156 "execution_count": 16,
157 "metadata": {},
158 "outputs": [
159 {
160 "data": {
161 "text/plain": [
162 "[x == -1/2*a - 1/2*sqrt(a^2 - 4*b), x == -1/2*a + 1/2*sqrt(a^2 - 4*b)]"
163 ]
164 },
165 "execution_count": 16,
166 "metadata": {},
167 "output_type": "execute_result"
168 }
169 ],
170 "source": [
171 "var('a', 'b')\n",
172 "f = x^2+a*x+b\n",
173 "solve(f,x)"
174 ]
175 },
176 {
177 "cell_type": "markdown",
178 "metadata": {},
179 "source": [
180 "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:"
181 ]
182 },
183 {
184 "cell_type": "code",
185 "execution_count": 17,
186 "metadata": {},
187 "outputs": [
188 {
189 "data": {
190 "text/plain": [
191 "-1"
192 ]
193 },
194 "execution_count": 17,
195 "metadata": {},
196 "output_type": "execute_result"
197 }
198 ],
199 "source": [
200 "e^(pi*I)"
201 ]
202 },
203 {
204 "cell_type": "markdown",
205 "metadata": {},
206 "source": [
207 "We will study symbolic expressions more in detail next time, in the context of calculus/analysis."
208 ]
209 },
210 {
211 "cell_type": "markdown",
212 "metadata": {},
213 "source": [
214 "# Basic rings and fields\n",
215 "\n",
216 "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n",
217 "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n",
218 "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n",
219 "\n",
220 "As you should know, a *field* is a Mathematical structure with two operations, addition and multiplication, which respect certain rules (distributivity, associativity, commutativity...). Some examples of fields are the Rational numbers $\\mathbb Q$, the Real numbers $\\mathbb R$ and the Complex numbers $\\mathbb C$, but there are many more. As you should also know, a *(commutative) ring* is like a field, except not all elements different from $0$ need have a multiplicative inverse. For example the integers $\\mathbb Z = \\{ \\dots, -1, 0, 1, 2, \\dots\\}$ are a ring, but not a field.\n",
221 "\n",
222 "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n",
223 "\n",
224 "|Mathematical object|Math symbol|Sage name|\n",
225 "|------------------:|:---------:|:--------|\n",
226 "|Integers|$\\mathbb Z$|`ZZ`|\n",
227 "|Rational numbers|$\\mathbb Q$|`QQ`|\n",
228 "|Real numbers|$\\mathbb R$|`RR`|\n",
229 "|Complex numbers|$\\mathbb C$|`CC`|\n",
230 "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n",
231 "|Finite fields|$\\mathbb F_p$|GF(p)|\n",
232 "|$\\dots$|$\\dots$|$\\dots$|"
233 ]
234 },
235 {
236 "cell_type": "markdown",
237 "metadata": {},
238 "source": [
239 "If you write a number or an expression, Sage will figure out where it \"lives\", choosing the most restrictive interpretation possible. For example `3` will be interpreted to be an integer, even if it is also a rational number, a real number and a complex number."
240 ]
241 },
242 {
243 "cell_type": "markdown",
244 "metadata": {},
245 "source": [
246 "## Parents and coercion\n",
247 "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n",
248 "\n",
249 "You can check where an object \"lives\" with the `parent()` command. It works more or less like the Python command `type()`, but it gives a more Mathematically inclined answer. Check the reference link [6] above if you want more details."
250 ]
251 },
252 {
253 "cell_type": "code",
254 "execution_count": 18,
255 "metadata": {},
256 "outputs": [
257 {
258 "data": {
259 "text/plain": [
260 "Rational Field"
261 ]
262 },
263 "execution_count": 18,
264 "metadata": {},
265 "output_type": "execute_result"
266 }
267 ],
268 "source": [
269 "#Edit this cell to find out the type of other objects that we used\n",
270 "parent(3/5)"
271 ]
272 },
273 {
274 "cell_type": "markdown",
275 "metadata": {},
276 "source": [
277 "Sometimes Sage does not give you the best possible interpretation, so you can force something to be interpreted as living in a smaller ring as follows:"
278 ]
279 },
280 {
281 "cell_type": "code",
282 "execution_count": 4,
283 "metadata": {},
284 "outputs": [
285 {
286 "name": "stdout",
287 "output_type": "stream",
288 "text": [
289 "Symbolic Ring\n",
290 "Integer Ring\n"
291 ]
292 }
293 ],
294 "source": [
295 "minus_one = e^(pi*I)\n",
296 "minus_one_coerced = ZZ(e^(pi*I)) # coercion\n",
297 "print(parent(minus_one))\n",
298 "print(parent(minus_one_coerced))"
299 ]
300 },
301 {
302 "cell_type": "markdown",
303 "metadata": {},
304 "source": [
305 "**Remark.** Notice that there is a fundamental difference between the rings `RR` and `CC` and all the others in the table above: the real and complex numbers are *approximated*."
306 ]
307 },
308 {
309 "cell_type": "code",
310 "execution_count": 1,
311 "metadata": {},
312 "outputs": [
313 {
314 "name": "stdout",
315 "output_type": "stream",
316 "text": [
317 "3\n",
318 "3.00000000000000\n"
319 ]
320 }
321 ],
322 "source": [
323 "print(QQ(3))\n",
324 "print(RR(3))"
325 ]
326 },
327 {
328 "cell_type": "markdown",
329 "metadata": {},
330 "source": [
331 "You can also choose the precision of this approximation using the alternative name `RealField`."
332 ]
333 },
334 {
335 "cell_type": "code",
336 "execution_count": 4,
337 "metadata": {},
338 "outputs": [
339 {
340 "name": "stdout",
341 "output_type": "stream",
342 "text": [
343 "Real Field with 53 bits of precision\n",
344 "Real Field with 1000 bits of precision\n"
345 ]
346 }
347 ],
348 "source": [
349 "print(RR)\n",
350 "print(RealField(prec=1000))"
351 ]
352 },
353 {
354 "cell_type": "markdown",
355 "metadata": {},
356 "source": [
357 "# Polynomial rings\n",
358 "\n",
359 "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n",
360 "\n",
361 "If you want to work with polynomials over a certain ring it is better to use this specific construction, rather than the symbolic expressions introduced above."
362 ]
363 },
364 {
365 "cell_type": "code",
366 "execution_count": 5,
367 "metadata": {},
368 "outputs": [
369 {
370 "data": {
371 "text/plain": [
372 "Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of precision"
373 ]
374 },
375 "execution_count": 5,
376 "metadata": {},
377 "output_type": "execute_result"
378 }
379 ],
380 "source": [
381 "polring.<x,y,z> = RR[] # Alternative: polring.<x,y,z> = PolynomialRing(RR)\n",
382 "polring"
383 ]
384 },
385 {
386 "cell_type": "markdown",
387 "metadata": {},
388 "source": [
389 "You can use as many variables as you like, and you can replace `RR` with any ring. In the example above `polring` is just the name of the variable (in the computer science sense) associated with this polynomial ring.\n",
390 "\n",
391 "## Operations on polynomials\n",
392 "\n",
393 "The usual Mathematical operations are available on polynomial rings, including Euclidean division `//` and remainder `%`. There is also the single-slash division `/`, but the result may not be a polynomial anymore.\n",
394 "\n",
395 "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n",
396 "\n",
397 "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?"
398 ]
399 },
400 {
401 "cell_type": "code",
402 "execution_count": 6,
403 "metadata": {},
404 "outputs": [
405 {
406 "name": "stdout",
407 "output_type": "stream",
408 "text": [
409 "x + 1\n",
410 "-4\n",
411 "(x^2 + 2*x - 3)/(x + 1)\n"
412 ]
413 }
414 ],
415 "source": [
416 "polring.<x> = QQ[]\n",
417 "p = x^2 + 2*x - 3 # Don't forget * for multiplication!\n",
418 "q = p // (x+1)\n",
419 "r = p % (x+1)\n",
420 "f = p / (x+1)\n",
421 "print(q)\n",
422 "print(r)\n",
423 "print(f)"
424 ]
425 },
426 {
427 "cell_type": "markdown",
428 "metadata": {},
429 "source": [
430 "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n",
431 "\n",
432 "**Remark.** Notice how the result can change substantially if you change the base ring.\n",
433 "\n",
434 "**Remark.** [Factorizations](https://doc.sagemath.org/html/en/reference/structure/sage/structure/factorization.html) are a particular object in Sage. They are kinda like a list, but not really. You can get a list of pairs (factor, power) with `list(factor(f))`."
435 ]
436 },
437 {
438 "cell_type": "code",
439 "execution_count": 7,
440 "metadata": {},
441 "outputs": [
442 {
443 "name": "stdout",
444 "output_type": "stream",
445 "text": [
446 "(t + 1) * (t^2 - 3) * (t^2 + 1)\n",
447 "[(-1, 1)]\n"
448 ]
449 },
450 {
451 "data": {
452 "text/plain": [
453 "(y + 1) * x"
454 ]
455 },
456 "execution_count": 7,
457 "metadata": {},
458 "output_type": "execute_result"
459 }
460 ],
461 "source": [
462 "polring_onevar.<t> = QQ[]\n",
463 "\n",
464 "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n",
465 "print(factor(f))\n",
466 "print(f.roots()) # Result: list of pairs (root,multiplicity)\n",
467 "\n",
468 "polring_manyvar.<x,y,z> = QQ[]\n",
469 "factor(x*y+x)\n",
470 "\n",
471 "# The following line gives an error, because the polynomial\n",
472 "# is understood to possibly have many variables:\n",
473 "#(x^2-1).roots()"
474 ]
475 },
476 {
477 "cell_type": "markdown",
478 "metadata": {},
479 "source": [
480 "# Matrices and vectors\n",
481 "\n",
482 "**References:** [[8](https://doc.sagemath.org/html/en/reference/matrices/index.html)], but in particular the subections [[9](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/docs.html)] and [[10](https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/matrix2.html)]\n",
483 "\n",
484 "In Sage you can easily manipulate matrices and vectors"
485 ]
486 },
487 {
488 "cell_type": "code",
489 "execution_count": 77,
490 "metadata": {},
491 "outputs": [
492 {
493 "name": "stdout",
494 "output_type": "stream",
495 "text": [
496 "[ 1 2 3]\n",
497 "[ 0 0 1]\n",
498 "[ 4 -3 22/7] \n",
499 "\n",
500 "[1/2 0 0]\n",
501 "[ 7 0 0]\n",
502 "[ 1 1 1] \n",
503 "\n",
504 "(3/2, 21, 6) \n",
505 "\n",
506 "[ -7/2 -10 80/7]\n",
507 "[ 17 -4 15/7]\n",
508 "[ 241/7 -18/7 869/49] \n",
509 "\n",
510 "Rank of A = 3\n",
511 "Rank of B = 2\n"
512 ]
513 }
514 ],
515 "source": [
516 "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n",
517 "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n",
518 "v = vector([3,4,-1])\n",
519 "\n",
520 "print(A, \"\\n\") # \\n just means \"newline\"\n",
521 "print(B, \"\\n\")\n",
522 "print(B*v, \"\\n\")\n",
523 "print(A^2 + 2*B - A*B, \"\\n\")\n",
524 "\n",
525 "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n",
526 "print(\"Rank of B =\", rank(B))"
527 ]
528 },
529 {
530 "cell_type": "markdown",
531 "metadata": {},
532 "source": [
533 "**Exercise:** in the cell above, compute the determinant, inverse and characteristic polynomial of the matrix `A`. *Hint: look at the reference [10] above (the functions are listed in alphabetic order).*\n",
534 "\n",
535 "As for polynomials, you can specify where a matrix or a vector lives"
536 ]
537 },
538 {
539 "cell_type": "code",
540 "execution_count": 57,
541 "metadata": {},
542 "outputs": [
543 {
544 "data": {
545 "text/plain": [
546 "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision"
547 ]
548 },
549 "execution_count": 57,
550 "metadata": {},
551 "output_type": "execute_result"
552 }
553 ],
554 "source": [
555 "M = matrix(CC, [[0,1],[1,0]])\n",
556 "parent(M)"
557 ]
558 },
559 {
560 "cell_type": "markdown",
561 "metadata": {},
562 "source": [
563 "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n",
564 "\n",
565 "**Warning.** In linear algebra there are distinct concepts of *left* and *right* eigenvalues (and eigenvector). The one you know is probably that of **right** eigen-{value,vector}, that is an element $\\lambda$ of the base field and a non-zero vector $\\mathbf v$ with $A\\mathbf v=\\lambda\\mathbf v$. The other concept corresponds to the equality $\\mathbf v^TA=\\lambda \\mathbf v$."
566 ]
567 },
568 {
569 "cell_type": "code",
570 "execution_count": 60,
571 "metadata": {},
572 "outputs": [
573 {
574 "data": {
575 "text/plain": [
576 "(0.289916349448506, 0.0241596957873755)"
577 ]
578 },
579 "execution_count": 60,
580 "metadata": {},
581 "output_type": "execute_result"
582 }
583 ],
584 "source": [
585 "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n",
586 "v = vector(RR, [3,0])\n",
587 "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v"
588 ]
589 },
590 {
591 "cell_type": "code",
592 "execution_count": 64,
593 "metadata": {},
594 "outputs": [
595 {
596 "data": {
597 "text/plain": [
598 "[\n",
599 "(-0.3722813232690144?, Vector space of degree 2 and dimension 1 over Algebraic Field\n",
600 "User basis matrix:\n",
601 "[ 1 -0.6861406616345072?]),\n",
602 "(5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic Field\n",
603 "User basis matrix:\n",
604 "[ 1 2.186140661634508?])\n",
605 "]"
606 ]
607 },
608 "execution_count": 64,
609 "metadata": {},
610 "output_type": "execute_result"
611 }
612 ],
613 "source": [
614 "A = Matrix(QQ, [[1,2],[3,4]])\n",
615 "A.eigenspaces_right() # Also: A.eigenvalues(), A.eigenvectors_right()"
616 ]
617 },
618 {
619 "cell_type": "markdown",
620 "metadata": {},
621 "source": [
622 "We can also extract a specific submatrix by selecting only some rows and columns, with a syntax similar to that of Python's lists. Check out more examples in the reference [9] above, and try them in the cell below."
623 ]
624 },
625 {
626 "cell_type": "code",
627 "execution_count": 94,
628 "metadata": {},
629 "outputs": [
630 {
631 "name": "stdout",
632 "output_type": "stream",
633 "text": [
634 "[-14 2 0 -1 1 -2 -1]\n",
635 "[ 0 -8 0 9 -2 11 1]\n",
636 "[ 0 3 1 -1 1 1 221]\n",
637 "[ -1 2 1 -25 -10 4 0]\n",
638 "[ -3 0 0 2 16 -1 -2]\n",
639 "[ 1 -3 3 -41 1 0 0]\n",
640 "[ -2 1 0 0 -6 2 12] \n",
641 "\n",
642 "[ 0 9 -2]\n",
643 "[ 1 -1 1] \n",
644 "\n",
645 "[-14 2 0 -1 1 -2 -1] \n",
646 "\n",
647 "[-14 2 0 -1 1]\n",
648 "[ 1 -3 3 -41 1]\n",
649 "[ 0 3 1 -1 1]\n"
650 ]
651 }
652 ],
653 "source": [
654 "A = MatrixSpace(ZZ, 7).random_element()\n",
655 "print(A, \"\\n\")\n",
656 "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n",
657 "print(A[0,0:], \"\\n\") # First row, all columns\n",
658 "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5"
659 ]
660 },
661 {
662 "cell_type": "markdown",
663 "metadata": {},
664 "source": [
665 "**Exercise:** write a sage function that computes the determinant of an $n\\times n$ matrix $A=(a_{ij})$ using Laplace's rule by the first row, that is \n",
666 "\\begin{align*}\n",
667 " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n",
668 "\\end{align*}\n",
669 "where $M_{0j}$ is the determinant of the $(n-1)\\times(n-1)$ matrix obtained by removing the $0$-th row and the $j$-th column from $A$."
670 ]
671 },
672 {
673 "cell_type": "code",
674 "execution_count": 91,
675 "metadata": {},
676 "outputs": [],
677 "source": [
678 "def my_det(A):\n",
679 " if not A.is_square():\n",
680 " print(\"Error: matrix is not square\")\n",
681 " \n",
682 " n = A.nrows() # size of the matrix\n",
683 " \n",
684 " # Continue from here!"
685 ]
686 },
687 {
688 "cell_type": "markdown",
689 "metadata": {},
690 "source": [
691 "# Number Theory\n",
692 "\n",
693 "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n",
694 "\n",
695 "Sage includes a large library of functions for computing with the integers, see the link above."
696 ]
697 },
698 {
699 "cell_type": "code",
700 "execution_count": 8,
701 "metadata": {},
702 "outputs": [
703 {
704 "name": "stdout",
705 "output_type": "stream",
706 "text": [
707 "3^2 * 3607 * 3803\n",
708 "True\n",
709 "True\n",
710 "619703040\n",
711 "9\n",
712 "13548070123626141\n"
713 ]
714 }
715 ],
716 "source": [
717 "n = 123456789\n",
718 "m = 987654321\n",
719 "p = 3607\n",
720 "\n",
721 "print(factor(n))\n",
722 "print(is_prime(p))\n",
723 "print(p.divides(n))\n",
724 "print(euler_phi(m))\n",
725 "print(gcd(n, m))\n",
726 "print(lcm(n, m))"
727 ]
728 },
729 {
730 "cell_type": "markdown",
731 "metadata": {},
732 "source": [
733 "## Primes\n",
734 "\n",
735 "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n",
736 "\n",
737 "The set of prime numbers is called `Primes()`. It is like an infinite list: for example you can get the one-millionth prime number or you can use this list to create other lists. You can also check what the first prime number larger than a given number is."
738 ]
739 },
740 {
741 "cell_type": "code",
742 "execution_count": 9,
743 "metadata": {},
744 "outputs": [
745 {
746 "name": "stdout",
747 "output_type": "stream",
748 "text": [
749 "Set of all prime numbers: 2, 3, 5, 7, ...\n",
750 "31 15485867\n",
751 "47\n",
752 "[79, 83, 89, 97]\n"
753 ]
754 }
755 ],
756 "source": [
757 "PP = Primes()\n",
758 "print(PP)\n",
759 "print(PP[10], PP[10^6])\n",
760 "print(PP.next(44))\n",
761 "\n",
762 "First_Thousand_Primes = PP[0:1000]\n",
763 "print([p for p in First_Thousand_Primes if p < 100 and p > 75])"
764 ]
765 },
766 {
767 "cell_type": "markdown",
768 "metadata": {},
769 "source": [
770 "## The Chinese remainder theorem (CRT)\n",
771 "\n",
772 "We say that two integers $a$ and $b$ are *congruent* modulo another integer $n>0$ if they have the same remainder when divided by $n$. We denote this by $a\\equiv b\\pmod n$, or in Python/Sage syntax `a % n == b % n`.\n",
773 "\n",
774 "The Chinese remainder theorem states that if $a,b\\in\\mathbb Z$ and $n,m\\in \\mathbb Z_{>0}$ are such that $\\gcd(n,m)=1$ then the system of congruences\n",
775 "\n",
776 "\\begin{align*}\n",
777 "\\begin{cases}\n",
778 " x \\equiv a \\pmod n\\\\\n",
779 " x \\equiv b \\pmod m\n",
780 "\\end{cases}\n",
781 "\\end{align*}\n",
782 "\n",
783 "has exactly one solution modulo $mn$. This means that there is one and only one number $x$ with $0\\leq x<mn$ such that $x\\equiv a\\pmod n$ and $x\\equiv b\\pmod m$.\n",
784 "\n",
785 "The procedure to find such a number is not too hard to describe (you might see it in an algebra or number theory course), but it can be a bit long. Luckily, Sage can do this for you:"
786 ]
787 },
788 {
789 "cell_type": "code",
790 "execution_count": 10,
791 "metadata": {},
792 "outputs": [
793 {
794 "name": "stdout",
795 "output_type": "stream",
796 "text": [
797 "74306 2 798\n"
798 ]
799 }
800 ],
801 "source": [
802 "a = 2\n",
803 "b = -1\n",
804 "n = 172\n",
805 "m = 799\n",
806 "\n",
807 "if gcd(n,m) != 1:\n",
808 " print(\"The numbers are not comprime, I can't solve this!\")\n",
809 "else:\n",
810 " x = crt(a, b, n, m)\n",
811 " print(x, x%n, x%m)"
812 ]
813 },
814 {
815 "cell_type": "markdown",
816 "metadata": {},
817 "source": [
818 "**Exercise.** There is a more general version of the Chinese remainder theorem which says that if $a_0, a_1, \\dots, a_k\\in\\mathbb Z$ and $n_0, n_2, \\dots, n_k\\in\\mathbb Z_{>0}$ are such that $\\gcd(n_i, n_j)=1$ for $i\\neq j$, then the system of congruences\n",
819 "\n",
820 "\\begin{align*}\n",
821 "\\begin{cases}\n",
822 " x \\equiv a_0 \\pmod {n_0}\\\\\n",
823 " x \\equiv a_1 \\pmod {n_1}\\\\\n",
824 " \\dots \\\\\n",
825 " x \\equiv a_k \\pmod {n_k}\n",
826 "\\end{cases}\n",
827 "\\end{align*}\n",
828 "\n",
829 "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n",
830 "*Hint: start by running the command `help(crt)`."
831 ]
832 },
833 {
834 "cell_type": "code",
835 "execution_count": 127,
836 "metadata": {},
837 "outputs": [],
838 "source": [
839 "#help(crt)"
840 ]
841 },
842 {
843 "cell_type": "markdown",
844 "metadata": {},
845 "source": [
846 "# Cryptography: RSA\n",
847 "\n",
848 "[Cryptography](https://en.wikipedia.org/wiki/Cryptography) is the discipline that studies methods to communicate secrets in such a way that any unauthorized listener would not be able to understand the message.\n",
849 "\n",
850 "A simple cryptographic protocol could be changing every letter of your text following a fixed scheme (or *cypher*), for example by turning every A into a B, every B into a C and so on. However this is not a very secure method, for many reasons. One of them is that at some point the people who want to communicate need to agree on what method to use, and anyone listening to that conversation would be able to decypher every subsequent conversation. A public-key cryptographic protocol solves this problem.\n",
851 "\n",
852 "## Public-key cryptography\n",
853 "\n",
854 "Public-key cryptographic protocols, such as RSA, work like this: there are two keys, a *private* key that is only known to person A (traditionally called Alice in every example), and a *public* key that does not need to be secret.\n",
855 "\n",
856 "The public key is used to *encrypt* the message (that is to \"lock\" it, or \"hyde\" it), but one needs the private key to *decrypt* it. Imagine having two keys for your door, but one can only be used to lock it, while the other only to open it.\n",
857 "\n",
858 "The message exchange works like this: suppose that person B (Bob) wants to send a secret message to Alice. Then Alice secretely generates a private and a public key and sends only the public one to Bob. Now Bob encrypts the message and sends it to Alice, who can use her private key to decrypt it. Even if Eve (short for *eavesdropper*, an unauthorized listener) listens to every message exchanged, she won't be able to decypher the secret: the private key has never left Alice's house!\n",
859 "\n",
860 "Notice that such a protocol is *asymmetric*: if Alice wanted to send a secret to Bob in reply, Bob would need to generate a pair of keys of his own.\n",
861 "\n",
862 "Let's see how we can do this in practice, using number theory!\n",
863 "\n",
864 "## RSA\n",
865 "\n",
866 "As many other cryptography protocols, RSA is based on a Mathematical process that is easy to do in one direction, but very hard to invert. In this case the hard process is integer factorization, that is decomposing an integer number as a product of primes."
867 ]
868 },
869 {
870 "cell_type": "code",
871 "execution_count": 2,
872 "metadata": {},
873 "outputs": [
874 {
875 "name": "stdout",
876 "output_type": "stream",
877 "text": [
878 "True True False\n"
879 ]
880 }
881 ],
882 "source": [
883 "p = 100003100019100043100057100069\n",
884 "q = 100144655312449572059845328443\n",
885 "n = p*q\n",
886 "print(is_prime(p), is_prime(q), is_prime(p*q))\n",
887 "\n",
888 "# Use the command below to see how long it takes\n",
889 "#timeit(\"factor(n)\", number=1, repeat=1)"
890 ]
891 },
892 {
893 "cell_type": "markdown",
894 "metadata": {},
895 "source": [
896 "In order to generate the keys, Alice picks a number $n$ which is the product of two large primes $p$ and $q$ of more or less the same size. Finding such primes is relatively easy compared to factoring the number $n$ she obtained. Then she computes the Euler totient $\\varphi(n)=(p-1)(q-1)$ of $n$, which she can do because she knows that $n=pq$ - it would be impossible otherwise!\n",
897 "\n",
898 "Then Alice can compute two integers $(d,e)$ such that $de\\equiv 1\\pmod{\\varphi(n)}$. She will send the numbers $n$ and $d$ to Bob and keep $e$ secret. In this case the public key is the pair $(n,d)$, while $e$ is the private key.\n",
899 "\n",
900 "Of course, she does all of this using Sage!"
901 ]
902 },
903 {
904 "cell_type": "code",
905 "execution_count": 105,
906 "metadata": {},
907 "outputs": [
908 {
909 "data": {
910 "text/plain": [
911 "(419199544978969, 235530823946467, 80799425863927)"
912 ]
913 },
914 "execution_count": 105,
915 "metadata": {},
916 "output_type": "execute_result"
917 }
918 ],
919 "source": [
920 "def two_large_primes():\n",
921 " p, q = 0, 0\n",
922 " # We make sure that they are different\n",
923 " while p == q:\n",
924 " p = Primes()[randint(10^6, 2*10^6)]\n",
925 " q = Primes()[randint(10^6, 2*10^6)]\n",
926 " return p, q\n",
927 "\n",
928 "def random_unit_mod(N):\n",
929 " R = Integers(N)\n",
930 " d = R(0)\n",
931 " # We make sure that it is invertible\n",
932 " while not d.is_unit():\n",
933 " d = R.random_element()\n",
934 " return d\n",
935 "\n",
936 "def Alice_generate_keys():\n",
937 " p, q = two_large_primes()\n",
938 " n = p*q\n",
939 " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n",
940 " \n",
941 " d = random_unit_mod(phi_n)\n",
942 " e = d^-1\n",
943 " return n, d, e\n",
944 "\n",
945 "Alice_generate_keys()"
946 ]
947 },
948 {
949 "cell_type": "markdown",
950 "metadata": {},
951 "source": [
952 "Now, how does Bob encrypt his message? Let's say he wants to send to Alice the number $m$ with $1<m<n$ (In practice he would like to send her some text with emojis, or maybe a voice message; but for computers everything is a number, and there are different ways to translate any sort of information to a number. He just chooses one of the many standard methods that already exist, no cryptography is needed in this step. If the message $m$ is too long, he can split it up in some pieces and repeat the process multiple times.)\n",
953 "\n",
954 "Now he computes $m^d\\pmod n$ and sends it back to Alice."
955 ]
956 },
957 {
958 "cell_type": "code",
959 "execution_count": 3,
960 "metadata": {},
961 "outputs": [
962 {
963 "data": {
964 "text/plain": [
965 "149461597163501"
966 ]
967 },
968 "execution_count": 3,
969 "metadata": {},
970 "output_type": "execute_result"
971 }
972 ],
973 "source": [
974 "def Bob_encrypt(m, n, d):\n",
975 " R = Integers(n)\n",
976 " return R(m)^d # Assume that n is large enough\n",
977 " \n",
978 "message = 42424242\n",
979 "Bob_encrypt(message, 419199544978969, 235530823946467)"
980 ]
981 },
982 {
983 "cell_type": "markdown",
984 "metadata": {},
985 "source": [
986 "Since $de\\equiv 1\\pmod{\\varphi(n)}$, it follows that $(m^d)^e\\equiv m\\pmod n$ (see [Wikipedia: Euler's theorem](https://en.wikipedia.org/wiki/Euler%27s_theorem)). So for Alice it is very easy to get back the original message:"
987 ]
988 },
989 {
990 "cell_type": "code",
991 "execution_count": 108,
992 "metadata": {},
993 "outputs": [
994 {
995 "data": {
996 "text/plain": [
997 "42424242"
998 ]
999 },
1000 "execution_count": 108,
1001 "metadata": {},
1002 "output_type": "execute_result"
1003 }
1004 ],
1005 "source": [
1006 "def Alice_decrypt(m_encrypted, n, e):\n",
1007 " R = Integers(n)\n",
1008 " return R(m_encrypted)^e\n",
1009 "\n",
1010 "Alice_decrypt(149461597163501, 419199544978969, 80799425863927)"
1011 ]
1012 },
1013 {
1014 "cell_type": "markdown",
1015 "metadata": {},
1016 "source": [
1017 "Another assumption on which RSA relies is that even if one knows $M=m^e$ and $e$, extracting the $e$-th root of $M$ modulo $n$ (and thus obtaining $m$) is very hard. Currently the best known way to do this is by factorizing $n$ first, which is considered to be a very hard problem. However, there is no proof that faster algorithms can't be devised.\n",
1018 "\n",
1019 "Moreover, one day we will overcome the current technological difficulties and quantum computers will be available. Quantum computers are not just \"more powerful\" than classical hardware, but they work based on completely different logical foundations and they make the factorization problem much easier to solve: for example [Shor's algorithm](https://en.wikipedia.org/wiki/Shor%27s_algorithm) takes advantage of this different logic and can factorize numbers quickly, if run on a quantum computer.\n",
1020 "\n",
1021 "To this day the largest number factorized with a quantum computer is $21=3\\times 7$. Nonetheless, quantum-safe cryptography protocols (i.e. based on problems that are hard to solve also with quantum computers) have already been developed."
1022 ]
1023 }
1024 ],
1025 "metadata": {
1026 "kernelspec": {
1027 "display_name": "SageMath 9.2",
1028 "language": "sage",
1029 "name": "sagemath"
1030 },
1031 "language_info": {
1032 "codemirror_mode": {
1033 "name": "ipython",
1034 "version": 3
1035 },
1036 "file_extension": ".py",
1037 "mimetype": "text/x-python",
1038 "name": "python",
1039 "nbconvert_exporter": "python",
1040 "pygments_lexer": "ipython3",
1041 "version": "3.8.5"
1042 }
1043 },
1044 "nbformat": 4,
1045 "nbformat_minor": 4
1046}
diff --git a/src/Lecture5/notebook/7-SageAlgebra.log b/src/Lecture5/notebook/7-SageAlgebra.log
new file mode 100644
index 0000000..615d65f
--- /dev/null
+++ b/src/Lecture5/notebook/7-SageAlgebra.log
@@ -0,0 +1,967 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.4.20) 22 APR 2021 15:19
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**7-SageAlgebra.tex
6(./7-SageAlgebra.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size11.clo
12File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty
27Package: tcolorbox 2020/10/09 version 4.42 text color boxes
28
29(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
30(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
31(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
32\pgfutil@everybye=\toks15
33\pgfutil@tempdima=\dimen139
34\pgfutil@tempdimb=\dimen140
35
36(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
37(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
38\pgfutil@abb=\box47
39)
40(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
41(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
42Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
43))
44Package: pgf 2020/12/01 v3.1.7a (3.1.7a)
45
46(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
47(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
48Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
49
50(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
51Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
52\KV@toks@=\toks16
53)
54(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
55Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
56
57(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
58Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
59)
60(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
61File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
62)
63Package graphics Info: Driver file: pdftex.def on input line 105.
64
65(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
66File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
67))
68\Gin@req@height=\dimen141
69\Gin@req@width=\dimen142
70)
71(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
72(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
73Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
74
75(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
76\pgfkeys@pathtoks=\toks17
77\pgfkeys@temptoks=\toks18
78
79(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
80\pgfkeys@tmptoks=\toks19
81))
82\pgf@x=\dimen143
83\pgf@y=\dimen144
84\pgf@xa=\dimen145
85\pgf@ya=\dimen146
86\pgf@xb=\dimen147
87\pgf@yb=\dimen148
88\pgf@xc=\dimen149
89\pgf@yc=\dimen150
90\pgf@xd=\dimen151
91\pgf@yd=\dimen152
92\w@pgf@writea=\write3
93\r@pgf@reada=\read2
94\c@pgf@counta=\count185
95\c@pgf@countb=\count186
96\c@pgf@countc=\count187
97\c@pgf@countd=\count188
98\t@pgf@toka=\toks20
99\t@pgf@tokb=\toks21
100\t@pgf@tokc=\toks22
101\pgf@sys@id@count=\count189
102
103(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
104File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
105)
106Driver file for pgf: pgfsys-pdftex.def
107
108(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
109File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
110
111(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
112File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
113)))
114(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
115File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
116\pgfsyssoftpath@smallbuffer@items=\count190
117\pgfsyssoftpath@bigbuffer@items=\count191
118)
119(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
120File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
121))
122(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
123Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
124
125(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
126File: color.cfg 2016/01/02 v1.6 sample color configuration
127)
128Package xcolor Info: Driver file: pdftex.def on input line 225.
129Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
130Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
131Package xcolor Info: Model `RGB' extended on input line 1364.
132Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
133Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
134Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
135Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
136Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
137Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
138)
139(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
140Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
141
142(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
143(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
144(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
145(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
146\pgfmath@dimen=\dimen153
147\pgfmath@count=\count192
148\pgfmath@box=\box48
149\pgfmath@toks=\toks23
150\pgfmath@stack@operand=\toks24
151\pgfmath@stack@operation=\toks25
152)
153(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
154(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
155(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
156.tex)
157(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
158(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
159x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
160(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
161(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
162(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
163.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
164\c@pgfmathroundto@lastzeros=\count193
165)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
166(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
167File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
168\pgf@picminx=\dimen154
169\pgf@picmaxx=\dimen155
170\pgf@picminy=\dimen156
171\pgf@picmaxy=\dimen157
172\pgf@pathminx=\dimen158
173\pgf@pathmaxx=\dimen159
174\pgf@pathminy=\dimen160
175\pgf@pathmaxy=\dimen161
176\pgf@xx=\dimen162
177\pgf@xy=\dimen163
178\pgf@yx=\dimen164
179\pgf@yy=\dimen165
180\pgf@zx=\dimen166
181\pgf@zy=\dimen167
182)
183(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
184File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
185\pgf@path@lastx=\dimen168
186\pgf@path@lasty=\dimen169
187) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
188File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
189\pgf@shorten@end@additional=\dimen170
190\pgf@shorten@start@additional=\dimen171
191)
192(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
193File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
194\pgfpic=\box49
195\pgf@hbox=\box50
196\pgf@layerbox@main=\box51
197\pgf@picture@serial@count=\count194
198)
199(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
200File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
201\pgflinewidth=\dimen172
202)
203(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
204ex
205File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
206\pgf@pt@x=\dimen173
207\pgf@pt@y=\dimen174
208\pgf@pt@temp=\dimen175
209) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
210File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
211)
212(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
213File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
214)
215(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
216x
217File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
218) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
219File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
220\pgfarrowsep=\dimen176
221)
222(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
223File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
224\pgf@max=\dimen177
225\pgf@sys@shading@range@num=\count195
226\pgf@shadingcount=\count196
227)
228(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
229File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
230
231(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
232File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
233\pgfexternal@startupbox=\box52
234))
235(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
236File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
237)
238(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
239File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
240) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
241File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
242)
243(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
244File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
245)))
246(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
247File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
248\pgfnodeparttextbox=\box53
249)
250(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
251File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a)
252)
253(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
254Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a)
255\pgf@nodesepstart=\dimen178
256\pgf@nodesepend=\dimen179
257)
258(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
259Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a)
260))
261(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty
262Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements
263\every@verbatim=\toks26
264\verbatim@line=\toks27
265\verbatim@in@stream=\read3
266)
267(/usr/share/texmf-dist/tex/latex/environ/environ.sty
268Package: environ 2014/05/04 v0.3 A new way to define environments
269
270(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty
271Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
272)
273\@envbody=\toks28
274)
275(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
276Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
277\etb@tempcnta=\count197
278)
279\tcb@titlebox=\box54
280\tcb@upperbox=\box55
281\tcb@lowerbox=\box56
282\tcb@phantombox=\box57
283\c@tcbbreakpart=\count198
284\c@tcblayer=\count199
285\c@tcolorbox@number=\count266
286\tcb@temp=\box58
287\tcb@temp=\box59
288\tcb@temp=\box60
289\tcb@temp=\box61
290\tcb@out=\write4
291\tcb@record@out=\write5
292
293(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex
294Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42'
295(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty
296Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO)
297
298(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
299Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO)
300)
301(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
302Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
303)
304(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
305Package: iftex 2020/03/06 v1.0d TeX engine tests
306))
307Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23.
308\tcb@testbox=\box62
309\tcb@totalupperbox=\box63
310\tcb@totallowerbox=\box64
311))
312(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty
313Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments
314
315(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
316Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)
317
318(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
319Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
320)))
321(/usr/share/texmf-dist/tex/latex/base/fontenc.sty
322Package: fontenc 2020/08/10 v2.0s Standard LaTeX package
323)
324(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
325Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS)
326\symupright=\mathgroup4
327)
328(/usr/share/texmf-dist/tex/latex/caption/caption.sty
329Package: caption 2020/10/26 v3.5g Customizing captions (AR)
330
331(/usr/share/texmf-dist/tex/latex/caption/caption3.sty
332Package: caption3 2020/10/21 v2.2e caption3 kernel (AR)
333\captionmargin=\dimen180
334\captionmargin@=\dimen181
335\captionwidth=\dimen182
336\caption@tempdima=\dimen183
337\caption@indent=\dimen184
338\caption@parindent=\dimen185
339\caption@hangindent=\dimen186
340Package caption Info: Standard document class detected.
341)
342\c@caption@flags=\count267
343\c@continuedfloat=\count268
344)
345(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty
346Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...)
347
348(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty
349Package: xkeyval 2020/11/20 v2.8 package option processing (HA)
350
351(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex
352(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex
353\XKV@toks=\toks29
354\XKV@tempa@toks=\toks30
355)
356\XKV@depth=\count269
357File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
358))
359(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty
360Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back
361-ends (calc, etex, pgfmath)
362)
363(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty
364Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material
365
366(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty
367Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes
368\collectedbox=\box65
369)
370\tc@llx=\dimen187
371\tc@lly=\dimen188
372\tc@urx=\dimen189
373\tc@ury=\dimen190
374Package trimclip Info: Using driver 'tc-pdftex.def'.
375
376(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def
377File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex
378))
379\adjbox@Width=\dimen191
380\adjbox@Height=\dimen192
381\adjbox@Depth=\dimen193
382\adjbox@Totalheight=\dimen194
383\adjbox@pwidth=\dimen195
384\adjbox@pheight=\dimen196
385\adjbox@pdepth=\dimen197
386\adjbox@ptotalheight=\dimen198
387
388(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty
389Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection
390\c@checkoddpage=\count270
391)
392(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty
393Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages
394\@vwid@box=\box66
395\sift@deathcycles=\count271
396\@vwid@loff=\dimen199
397\@vwid@roff=\dimen256
398))
399(/usr/share/texmf-dist/tex/latex/float/float.sty
400Package: float 2001/11/08 v1.3d Float enhancements (AL)
401\c@float@type=\count272
402\float@exts=\toks31
403\float@box=\box67
404\@float@everytoks=\toks32
405\@floatcapt=\box68
406)
407(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty
408Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
409\@enLab=\toks33
410)
411(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
412Package: geometry 2020/01/02 v5.9 Page Geometry
413
414(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
415Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
416)
417\Gm@cnth=\count273
418\Gm@cntv=\count274
419\c@Gm@tempcnt=\count275
420\Gm@bindingoffset=\dimen257
421\Gm@wd@mp=\dimen258
422\Gm@odd@mp=\dimen259
423\Gm@even@mp=\dimen260
424\Gm@layoutwidth=\dimen261
425\Gm@layoutheight=\dimen262
426\Gm@layouthoffset=\dimen263
427\Gm@layoutvoffset=\dimen264
428\Gm@dimlist=\toks34
429)
430(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
431Package: amsmath 2020/09/23 v2.17i AMS math features
432\@mathmargin=\skip49
433
434For additional information on amsmath, use the `?' option.
435(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
436Package: amstext 2000/06/29 v2.01 AMS text
437
438(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
439File: amsgen.sty 1999/11/30 v2.0 generic functions
440\@emptytoks=\toks35
441\ex@=\dimen265
442))
443(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
444Package: amsbsy 1999/11/29 v1.2d Bold Symbols
445\pmbraise@=\dimen266
446)
447(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
448Package: amsopn 2016/03/08 v2.02 operator names
449)
450\inf@bad=\count276
451LaTeX Info: Redefining \frac on input line 234.
452\uproot@=\count277
453\leftroot@=\count278
454LaTeX Info: Redefining \overline on input line 399.
455\classnum@=\count279
456\DOTSCASE@=\count280
457LaTeX Info: Redefining \ldots on input line 496.
458LaTeX Info: Redefining \dots on input line 499.
459LaTeX Info: Redefining \cdots on input line 620.
460\Mathstrutbox@=\box69
461\strutbox@=\box70
462\big@size=\dimen267
463LaTeX Font Info: Redeclaring font encoding OML on input line 743.
464LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
465\macc@depth=\count281
466\c@MaxMatrixCols=\count282
467\dotsspace@=\muskip16
468\c@parentequation=\count283
469\dspbrk@lvl=\count284
470\tag@help=\toks36
471\row@=\count285
472\column@=\count286
473\maxfields@=\count287
474\andhelp@=\toks37
475\eqnshift@=\dimen268
476\alignsep@=\dimen269
477\tagshift@=\dimen270
478\tagwidth@=\dimen271
479\totwidth@=\dimen272
480\lineht@=\dimen273
481\@envbody=\toks38
482\multlinegap=\skip50
483\multlinetaggap=\skip51
484\mathdisplay@stack=\toks39
485LaTeX Info: Redefining \[ on input line 2923.
486LaTeX Info: Redefining \] on input line 2924.
487)
488(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
489Package: amssymb 2013/01/14 v3.01 AMS font symbols
490
491(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
492Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
493\symAMSa=\mathgroup5
494\symAMSb=\mathgroup6
495LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
496LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
497(Font) U/euf/m/n --> U/euf/b/n on input line 106.
498))
499(/usr/share/texmf-dist/tex/latex/base/textcomp.sty
500Package: textcomp 2020/02/02 v2.0n Standard LaTeX package
501)
502(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty
503Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba
504tim
505)
506(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty
507Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro''
508\@eurobox=\box71
509)
510(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty
511Package: ucs 2013/05/11 v2.2 UCS: Unicode input support
512
513(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def
514File: uni-global.def 2013/05/13 UCS: Unicode global data
515)
516\uc@secondtry=\count288
517\uc@combtoks=\toks40
518\uc@combtoksb=\toks41
519\uc@temptokena=\toks42
520)
521(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
522Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv)
523\FV@CodeLineNo=\count289
524\FV@InFile=\read4
525\FV@TabBox=\box72
526\c@FancyVerbLine=\count290
527\FV@StepNumber=\count291
528\FV@OutFile=\write6
529)
530(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty
531Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac
532y)
533Package grffile Info: This package is an empty stub for compatibility on input
534line 40.
535)
536(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
537Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX
538
539(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
540Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO
541)
542Package pdftexcmds Info: \pdf@primitive is available.
543Package pdftexcmds Info: \pdf@ifprimitive is available.
544Package pdftexcmds Info: \pdfdraftmode found.
545)
546(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
547Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
548)
549(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
550Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
551)
552(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
553Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
554)
555(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
556Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
557)
558(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
559Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
560)
561\@linkdim=\dimen274
562\Hy@linkcounter=\count292
563\Hy@pagecounter=\count293
564
565(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
566File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO)
567Now handling font encoding PD1 ...
568... no UTF-8 mapping file for font encoding PD1
569)
570(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
571Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
572)
573(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty
574Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
575)
576\Hy@SavedSpaceFactor=\count294
577Package hyperref Info: Hyper figures OFF on input line 4464.
578Package hyperref Info: Link nesting OFF on input line 4469.
579Package hyperref Info: Hyper index ON on input line 4472.
580Package hyperref Info: Plain pages OFF on input line 4479.
581Package hyperref Info: Backreferencing OFF on input line 4484.
582Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
583Package hyperref Info: Bookmarks ON on input line 4717.
584\c@Hy@tempcnt=\count295
585
586(/usr/share/texmf-dist/tex/latex/url/url.sty
587\Urlmuskip=\muskip17
588Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
589)
590LaTeX Info: Redefining \url on input line 5076.
591\XeTeXLinkMargin=\dimen275
592
593(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty
594Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
595
596(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
597Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
598)
599))
600\Fld@menulength=\count296
601\Field@Width=\dimen276
602\Fld@charsize=\dimen277
603Package hyperref Info: Hyper figures OFF on input line 6347.
604Package hyperref Info: Link nesting OFF on input line 6352.
605Package hyperref Info: Hyper index ON on input line 6355.
606Package hyperref Info: backreferencing OFF on input line 6362.
607Package hyperref Info: Link coloring OFF on input line 6367.
608Package hyperref Info: Link coloring with OCG OFF on input line 6372.
609Package hyperref Info: PDF/A mode OFF on input line 6377.
610LaTeX Info: Redefining \ref on input line 6417.
611LaTeX Info: Redefining \pageref on input line 6421.
612
613(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty
614Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa
615ge
616with kernel methods
617)
618\Hy@abspage=\count297
619\c@Item=\count298
620\c@Hfootnote=\count299
621)
622Package hyperref Info: Driver (autodetected): hpdftex.
623
624(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
625File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX
626
627(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty
628Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag
629e
630with kernel methods
631)
632\Fld@listcount=\count300
633\c@bookmark@seq@number=\count301
634
635(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
636Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
637
638(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
639Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
640)
641Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
64286.
643)
644\Hy@SectionHShift=\skip52
645)
646(/usr/share/texmf-dist/tex/latex/titling/titling.sty
647Package: titling 2009/09/04 v2.1d maketitle typesetting
648\thanksmarkwidth=\skip53
649\thanksmargin=\skip54
650\droptitle=\skip55
651)
652(/usr/share/texmf-dist/tex/latex/tools/longtable.sty
653Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC)
654\LTleft=\skip56
655\LTright=\skip57
656\LTpre=\skip58
657\LTpost=\skip59
658\LTchunksize=\count302
659\LTcapwidth=\dimen278
660\LT@head=\box73
661\LT@firsthead=\box74
662\LT@foot=\box75
663\LT@lastfoot=\box76
664\LT@cols=\count303
665\LT@rows=\count304
666\c@LT@tables=\count305
667\c@LT@chunks=\count306
668\LT@p@ftn=\toks43
669)
670(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty
671Package: booktabs 2020/01/12 v1.61803398 Publication quality tables
672\heavyrulewidth=\dimen279
673\lightrulewidth=\dimen280
674\cmidrulewidth=\dimen281
675\belowrulesep=\dimen282
676\belowbottomsep=\dimen283
677\aboverulesep=\dimen284
678\abovetopsep=\dimen285
679\cmidrulesep=\dimen286
680\cmidrulekern=\dimen287
681\defaultaddspace=\dimen288
682\@cmidla=\count307
683\@cmidlb=\count308
684\@aboverulesep=\dimen289
685\@belowrulesep=\dimen290
686\@thisruleclass=\count309
687\@lastruleclass=\count310
688\@thisrulewidth=\dimen291
689)
690(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty
691Package: enumitem 2019/06/20 v3.9 Customized lists
692\labelindent=\skip60
693\enit@outerparindent=\dimen292
694\enit@toks=\toks44
695\enit@inbox=\box77
696\enit@count@id=\count311
697\enitdp@description=\count312
698)
699(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty
700\UL@box=\box78
701\UL@hyphenbox=\box79
702\UL@skip=\skip61
703\UL@hook=\toks45
704\UL@height=\dimen293
705\UL@pe=\count313
706\UL@pixel=\dimen294
707\ULC@box=\box80
708Package: ulem 2019/11/18
709\ULdepth=\dimen295
710)
711(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty
712Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk)
713\symrsfs=\mathgroup7
714)
715\Wrappedcontinuationbox=\box81
716\Wrappedvisiblespacebox=\box82
717Package hyperref Info: Option `breaklinks' set `true' on input line 361.
718Package hyperref Info: Option `colorlinks' set `true' on input line 361.
719LaTeX Font Info: Trying to load font information for T1+ppl on input line 36
7208.
721
722(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
723File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
724)
725(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
726File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
727\l__kernel_color_stack_int=\count314
728\l__pdf_internal_box=\box83
729)
730No file 7-SageAlgebra.aux.
731\openout1 = `7-SageAlgebra.aux'.
732
733LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 368.
734LaTeX Font Info: ... okay on input line 368.
735LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 368.
736LaTeX Font Info: ... okay on input line 368.
737LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 368.
738LaTeX Font Info: ... okay on input line 368.
739LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 368.
740LaTeX Font Info: ... okay on input line 368.
741LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 368.
742LaTeX Font Info: ... okay on input line 368.
743LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 368.
744LaTeX Font Info: ... okay on input line 368.
745LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 368.
746LaTeX Font Info: ... okay on input line 368.
747LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 368.
748LaTeX Font Info: ... okay on input line 368.
749(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
750[Loading MPS to PDF converter (version 2006.09.02).]
751\scratchcounter=\count315
752\scratchdimen=\dimen296
753\scratchbox=\box84
754\nofMPsegments=\count316
755\nofMParguments=\count317
756\everyMPshowfont=\toks46
757\MPscratchCnt=\count318
758\MPscratchDim=\dimen297
759\MPnumerator=\count319
760\makeMPintoPDFobject=\count320
761\everyMPtoPDFconversion=\toks47
762) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
763Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
764Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
76585.
766
767(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
768File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
769e
770))
771Package caption Info: Begin \AtBeginDocument code.
772Package caption Info: float package is loaded.
773Package caption Info: hyperref package is loaded.
774Package caption Info: longtable package is loaded.
775
776(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty
777Package: ltcaption 2020/05/30 v1.4b longtable captions (AR)
778)
779Package caption Info: End \AtBeginDocument code.
780
781*geometry* driver: auto-detecting
782*geometry* detected driver: pdftex
783*geometry* verbose mode - [ preamble ] result:
784* driver: pdftex
785* paper: <default>
786* layout: <same size as paper>
787* layoutoffset:(h,v)=(0.0pt,0.0pt)
788* modes:
789* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)
790* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)
791* \paperwidth=614.295pt
792* \paperheight=794.96999pt
793* \textwidth=469.75502pt
794* \textheight=650.43001pt
795* \oddsidemargin=0.0pt
796* \evensidemargin=0.0pt
797* \topmargin=-37.0pt
798* \headheight=12.0pt
799* \headsep=25.0pt
800* \topskip=11.0pt
801* \footskip=30.0pt
802* \marginparwidth=59.0pt
803* \marginparsep=10.0pt
804* \columnsep=10.0pt
805* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
806* \hoffset=0.0pt
807* \voffset=0.0pt
808* \mag=1000
809* \@twocolumnfalse
810* \@twosidefalse
811* \@mparswitchfalse
812* \@reversemarginfalse
813* (1in=72.27pt=25.4mm, 1cm=28.453pt)
814
815(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def
816File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3
817)
818Package hyperref Info: Link coloring ON on input line 368.
819
820(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
821Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
822
823(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty
824Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
825)
826(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
827Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
828)
829\c@section@level=\count321
830)
831LaTeX Info: Redefining \ref on input line 368.
832LaTeX Info: Redefining \pageref on input line 368.
833LaTeX Info: Redefining \nameref on input line 368.
834\@outlinefile=\write7
835\openout7 = `7-SageAlgebra.out'.
836
837LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3
83870.
839
840(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
841File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
842)
843LaTeX Font Info: Trying to load font information for OML+zplm on input line
844370.
845
846(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
847File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
848)
849LaTeX Font Info: Trying to load font information for OMS+zplm on input line
850370.
851
852(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd
853File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
854)
855LaTeX Font Info: Trying to load font information for OMX+zplm on input line
856370.
857
858(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
859File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
860)
861LaTeX Font Info: Trying to load font information for OT1+zplm on input line
862370.
863
864(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
865File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
866)
867LaTeX Font Info: Font shape `U/msa/m/n' will be
868(Font) scaled to size 12.50409pt on input line 370.
869LaTeX Font Info: Font shape `U/msa/m/n' will be
870(Font) scaled to size 9.37807pt on input line 370.
871LaTeX Font Info: Font shape `U/msa/m/n' will be
872(Font) scaled to size 7.29405pt on input line 370.
873LaTeX Font Info: Font shape `U/msb/m/n' will be
874(Font) scaled to size 12.50409pt on input line 370.
875LaTeX Font Info: Font shape `U/msb/m/n' will be
876(Font) scaled to size 9.37807pt on input line 370.
877LaTeX Font Info: Font shape `U/msb/m/n' will be
878(Font) scaled to size 7.29405pt on input line 370.
879LaTeX Font Info: Trying to load font information for U+rsfs on input line 37
8800.
881
882(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd
883File: ursfs.fd 1998/03/24 rsfs font definition file (jk)
884)
885LaTeX Font Info: Trying to load font information for T1+cmtt on input line 3
88670.
887
888(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd
889File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
890)
891LaTeX Font Info: Font shape `U/msa/m/n' will be
892(Font) scaled to size 11.40997pt on input line 376.
893LaTeX Font Info: Font shape `U/msa/m/n' will be
894(Font) scaled to size 8.33606pt on input line 376.
895LaTeX Font Info: Font shape `U/msa/m/n' will be
896(Font) scaled to size 6.25204pt on input line 376.
897LaTeX Font Info: Font shape `U/msb/m/n' will be
898(Font) scaled to size 11.40997pt on input line 376.
899LaTeX Font Info: Font shape `U/msb/m/n' will be
900(Font) scaled to size 8.33606pt on input line 376.
901LaTeX Font Info: Font shape `U/msb/m/n' will be
902(Font) scaled to size 6.25204pt on input line 376.
903 [1
904
905{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
906LaTeX Font Info: Trying to load font information for TS1+cmtt on input line
907496.
908 (/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd
909File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
910) [2]
911LaTeX Font Info: Trying to load font information for U+fplmbb on input line
912562.
913 (/usr/share/texmf-dist/tex/latex/psnfss/ufplmbb.fd
914File: ufplmbb.fd 2003/10/30 Fontinst v1.914 font definitions for U/fplmbb.
915)
916
917Package longtable Warning: Column widths have changed
918(longtable) in table 1 on input line 587.
919
920[3] [4]
921LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available
922(Font) Font shape `T1/cmtt/m/n' tried instead on input line 798.
923 [5] [6] [7] [8] [9] [10] [11] [12]
924
925Package longtable Warning: Table widths have changed. Rerun LaTeX.
926
927(./7-SageAlgebra.aux)
928
929Package rerunfilecheck Warning: File `7-SageAlgebra.out' has changed.
930(rerunfilecheck) Rerun to get outlines right
931(rerunfilecheck) or use package `bookmark'.
932
933Package rerunfilecheck Info: Checksums for `7-SageAlgebra.out':
934(rerunfilecheck) Before: <no file>
935(rerunfilecheck) After: 961D93ACE9582C324C6D1EA7B5DE7C92;970.
936
937LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
938
939 )
940Here is how much of TeX's memory you used:
941 21321 strings out of 479383
942 388521 string characters out of 5875798
943 751012 words of memory out of 5000000
944 37920 multiletter control sequences out of 15000+600000
945 445530 words of font info for 135 fonts, out of 8000000 for 9000
946 1141 hyphenation exceptions out of 8191
947 107i,14n,111p,506b,616s stack positions out of 5000i,500n,10000p,200000b,80000s
948{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/
949texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/usr/share/texmf-dist/font
950s/enc/dvips/base/8r.enc}</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c
951mex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></us
952r/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-d
953ist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type
9541/public/mathpazo/fplmbb.pfb></usr/share/texmf-dist/fonts/type1/public/mathpazo
955/fplmr.pfb></usr/share/texmf-dist/fonts/type1/public/mathpazo/fplmri.pfb></usr/
956share/texmf-dist/fonts/type1/public/cm-super/sfit1095.pfb></usr/share/texmf-dis
957t/fonts/type1/public/cm-super/sftt1095.pfb></usr/share/texmf-dist/fonts/type1/p
958ublic/cm-super/sftt1200.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/upl
959b8a.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplr8a.pfb></usr/share/
960texmf-dist/fonts/type1/urw/palatino/uplri8a.pfb>
961Output written on 7-SageAlgebra.pdf (12 pages, 226346 bytes).
962PDF statistics:
963 184 PDF objects out of 1000 (max. 8388607)
964 155 compressed objects within 2 object streams
965 46 named destinations out of 1000 (max. 500000)
966 13 words of extra memory for PDF output out of 10000 (max. 10000000)
967
diff --git a/src/Lecture5/notebook/7-SageAlgebra.out b/src/Lecture5/notebook/7-SageAlgebra.out
new file mode 100644
index 0000000..a3ec270
--- /dev/null
+++ b/src/Lecture5/notebook/7-SageAlgebra.out
@@ -0,0 +1,16 @@
1\BOOKMARK [1][-]{section.1}{The Jupyter Notebook}{}% 1
2\BOOKMARK [2][-]{subsection.1.1}{Cells}{section.1}% 2
3\BOOKMARK [2][-]{subsection.1.2}{Markdown}{section.1}% 3
4\BOOKMARK [1][-]{section.2}{Symbolic expressions}{}% 4
5\BOOKMARK [2][-]{subsection.2.1}{Mathematical variables}{section.2}% 5
6\BOOKMARK [1][-]{section.3}{Basic rings and fields}{}% 6
7\BOOKMARK [2][-]{subsection.3.1}{Parents and coercion}{section.3}% 7
8\BOOKMARK [1][-]{section.4}{Polynomial rings}{}% 8
9\BOOKMARK [2][-]{subsection.4.1}{Operations on polynomials}{section.4}% 9
10\BOOKMARK [1][-]{section.5}{Matrices and vectors}{}% 10
11\BOOKMARK [1][-]{section.6}{Number Theory}{}% 11
12\BOOKMARK [2][-]{subsection.6.1}{Primes}{section.6}% 12
13\BOOKMARK [2][-]{subsection.6.2}{The Chinese remainder theorem \(CRT\)}{section.6}% 13
14\BOOKMARK [1][-]{section.7}{Cryptography: RSA}{}% 14
15\BOOKMARK [2][-]{subsection.7.1}{Public-key cryptography}{section.7}% 15
16\BOOKMARK [2][-]{subsection.7.2}{RSA}{section.7}% 16
diff --git a/src/Lecture5/notebook/7-SageAlgebra.pdf b/src/Lecture5/notebook/7-SageAlgebra.pdf
new file mode 100644
index 0000000..3b9d17c
--- /dev/null
+++ b/src/Lecture5/notebook/7-SageAlgebra.pdf
Binary files differ
diff --git a/src/Lecture5/notebook/7-SageAlgebra.tex b/src/Lecture5/notebook/7-SageAlgebra.tex
new file mode 100644
index 0000000..a9c6c72
--- /dev/null
+++ b/src/Lecture5/notebook/7-SageAlgebra.tex
@@ -0,0 +1,1297 @@
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
376the \(\LaTeX\) part were made with \(\LaTeX\), so this one is made with
377Sage, 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
384The Jupyter Notebook is one of the default interfaces for SageMath,
385along with the command line interface. You can access it via web
386browser, but it is running locally on your device (notice the strange
387url: \texttt{http://localhost:8888/notebooks...}).
388
389You can create a new notebook by clicking on
390\texttt{New\ \textgreater{}\ SageMath\ 9.2}. You can also create a
391Python 3 notebook to write Python code.
392
393Jupyter saves and reads files in the \texttt{.ipynb} format. If you
394download the file for this lecture you can open it and follow the
395examples interactively.
396
397\hypertarget{cells}{%
398\subsection{Cells}\label{cells}}
399
400The notebook contains one or more \emph{interactive cells} that you can
401run, 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=\\\{\}]
4152/5
416\end{Verbatim}
417\end{tcolorbox}
418
419 If you are reading this from Jupyter rather than from the pdf file, you
420can edit the cell above and run it again. You can also add more cells by
421selecting \texttt{Insert} from the menu bar.
422
423Notice that only the last statement produces an output. You can force
424anything to be written as output with the \texttt{print()} command,
425which works like in Python. As an exercise, try to modify the cell above
426to 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
432markup language - think of LaTeX or html, but much simpler. You can add
433text to your notebook with Markdown cells by selecting
434\texttt{Cell\ \textgreater{}\ Cell\ Type\ \textgreater{}\ Markdown}.
435
436You can also include some LaTeX code in Markdown cells, with dollar
437signs \$ 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
443When you are done writing a Markdown cell, you can run it to see the
444well-formatted text. To edit the text again, double-click on the cell.
445Try 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
453Now, let's get started with Sage. One thing you might want to do is
454manipulating 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
472Python: 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
474an equation, so it contains the symbol \texttt{==}. Keep in mind the
475difference between the two!
476
477\textbf{Exercise:} change the code above to solve the corresponding
478inequality \(x^2+2x-5\geq 0\).
479
480 \hypertarget{mathematical-variables}{%
481\subsection{Mathematical variables}\label{mathematical-variables}}
482
483Last time we saw what \emph{variables} are in Python, and that they are
484a little bit different from the \emph{Mathematical variables} that you
485use in Mathematics. In Sage, both concepts are present, but they are
486still distinct. For example in the cell above \texttt{f} is a variable
487in the sense of computer science, while \texttt{x} is a Mathematical
488variable.
489
490If you want to use Mathematical variables other than \texttt{x}, you
491first 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 +
5059) - 1/2]
506\end{Verbatim}
507\end{tcolorbox}
508
509 Try removing the first line in the cell above and see what error you
510get!
511
512Here 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
532defined} 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
549context 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
559As you should know, a \emph{field} is a Mathematical structure with two
560operations, addition and multiplication, which respect certain rules
561(distributivity, associativity, commutativity\ldots). Some examples of
562fields are the Rational numbers \(\mathbb Q\), the Real numbers
563\(\mathbb R\) and the Complex numbers \(\mathbb C\), but there are many
564more. As you should also know, a \emph{(commutative) ring} is like a
565field, except not all elements different from \(0\) need have a
566multiplicative inverse. For example the integers
567\(\mathbb Z = \{ \dots, -1, 0, 1, 2, \dots\}\) are a ring, but not a
568field.
569
570These structures are already implemented in Sage. Some of the most
571common are listed in the following table:
572
573\begin{longtable}[]{@{}rcl@{}}
574\toprule
575Mathematical object & Math symbol & Sage name \\
576\midrule
577\endhead
578Integers & \(\mathbb Z\) & \texttt{ZZ} \\
579Rational numbers & \(\mathbb Q\) & \texttt{QQ} \\
580Real numbers & \(\mathbb R\) & \texttt{RR} \\
581Complex numbers & \(\mathbb C\) & \texttt{CC} \\
582Integers modulo \(n\) & \(\mathbb Z/n\mathbb Z\) &
583\texttt{Integers(n)} \\
584Finite 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
591example \texttt{3} will be interpreted to be an integer, even if it is
592also 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
600You can check where an object ``lives'' with the \texttt{parent()}
601command. It works more or less like the Python command \texttt{type()},
602but it gives a more Mathematically inclined answer. Check the reference
603link {[}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=\\\{\}]
616Rational Field
617\end{Verbatim}
618\end{tcolorbox}
619
620 Sometimes Sage does not give you the best possible interpretation, so
621you can force something to be interpreted as living in a smaller ring as
622follows:
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=\\\{\}]
635Symbolic Ring
636Integer Ring
637 \end{Verbatim}
638
639 \textbf{Remark.} Notice that there is a fundamental difference between
640the rings \texttt{RR} and \texttt{CC} and all the others in the table
641above: 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=\\\{\}]
6523
6533.00000000000000
654 \end{Verbatim}
655
656 You can also choose the precision of this approximation using the
657alternative 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=\\\{\}]
668Real Field with 53 bits of precision
669Real 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
678If you want to work with polynomials over a certain ring it is better to
679use this specific construction, rather than the symbolic expressions
680introduced 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=\\\{\}]
693Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of
694precision
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
700the name of the variable (in the computer science sense) associated with
701this polynomial ring.
702
703\hypertarget{operations-on-polynomials}{%
704\subsection{Operations on polynomials}\label{operations-on-polynomials}}
705
706The usual Mathematical operations are available on polynomial rings,
707including Euclidean division \texttt{//} and remainder \texttt{\%}.
708There is also the single-slash division \texttt{/}, but the result may
709not be a polynomial anymore.
710
711\textbf{Exercise:} use the \texttt{parent()} command to find out what
712the quotient of two polynomials is.
713
714\textbf{Question:} what happens if you remove the first line in the cell
715below? 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=\\\{\}]
732x + 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
741change the base ring.
742
743\textbf{Remark.}
744\href{https://doc.sagemath.org/html/en/reference/structure/sage/structure/factorization.html}{Factorizations}
745are a particular object in Sage. They are kinda like a list, but not
746really. 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}{]},
784but in particular the subections
785{[}\href{https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/docs.html}{9}{]}
786and
787{[}\href{https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/matrix2.html}{10}{]}
788
789In 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
823Rank of A = 3
824Rank of B = 2
825 \end{Verbatim}
826
827 \textbf{Exercise:} in the cell above, compute the determinant, inverse
828and characteristic polynomial of the matrix \texttt{A}. \emph{Hint: look
829at the reference {[}10{]} above (the functions are listed in alphabetic
830order).}
831
832As 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=\\\{\}]
845Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of
846precision
847\end{Verbatim}
848\end{tcolorbox}
849
850 You can also solve linear systems and compute eigenvalues and
851eigenvectors 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
855know is probably that of \textbf{right} eigen-\{value,vector\}, that is
856an element \(\lambda\) of the base field and a non-zero vector
857\(\mathbf v\) with \(A\mathbf v=\lambda\mathbf v\). The other concept
858corresponds 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
889Field
890User basis matrix:
891[ 1 -0.6861406616345072?]),
892(5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic
893Field
894User 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
901columns, with a syntax similar to that of Python's lists. Check out more
902examples 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
935of an \(n\times n\) matrix \(A=(a_{ij})\) using Laplace's rule by the
936first 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
940the \(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
961Sage includes a large library of functions for computing with the
962integers, 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=\\\{\}]
9813\^{}2 * 3607 * 3803
982True
983True
984619703040
9859
98613548070123626141
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
995The set of prime numbers is called \texttt{Primes()}. It is like an
996infinite list: for example you can get the one-millionth prime number or
997you can use this list to create other lists. You can also check what the
998first 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=\\\{\}]
1014Set of all prime numbers: 2, 3, 5, 7, {\ldots}
101531 15485867
101647
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
1024We say that two integers \(a\) and \(b\) are \emph{congruent} modulo
1025another 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
1029The 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
1031of 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
1040has exactly one solution modulo \(mn\). This means that there is one and
1041only one number \(x\) with \(0\leq x<mn\) such that \(x\equiv a\pmod n\)
1042and \(x\equiv b\pmod m\).
1043
1044The procedure to find such a number is not too hard to describe (you
1045might see it in an algebra or number theory course), but it can be a bit
1046long. 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=\\\{\}]
106574306 2 798
1066 \end{Verbatim}
1067
1068 \textbf{Exercise.} There is a more general version of the Chinese
1069remainder 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
1083has exactly one solution modulo \(\prod_{i=0}^kn_i\). Use the
1084\texttt{crt()} function to find a solution to such a system. *Hint:
1085start 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
1098discipline that studies methods to communicate secrets in such a way
1099that any unauthorized listener would not be able to understand the
1100message.
1101
1102A simple cryptographic protocol could be changing every letter of your
1103text following a fixed scheme (or \emph{cypher}), for example by turning
1104every A into a B, every B into a C and so on. However this is not a very
1105secure method, for many reasons. One of them is that at some point the
1106people who want to communicate need to agree on what method to use, and
1107anyone listening to that conversation would be able to decypher every
1108subsequent conversation. A public-key cryptographic protocol solves this
1109problem.
1110
1111\hypertarget{public-key-cryptography}{%
1112\subsection{Public-key cryptography}\label{public-key-cryptography}}
1113
1114Public-key cryptographic protocols, such as RSA, work like this: there
1115are 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
1117that does not need to be secret.
1118
1119The 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
1122only be used to lock it, while the other only to open it.
1123
1124The message exchange works like this: suppose that person B (Bob) wants
1125to send a secret message to Alice. Then Alice secretely generates a
1126private and a public key and sends only the public one to Bob. Now Bob
1127encrypts the message and sends it to Alice, who can use her private key
1128to decrypt it. Even if Eve (short for \emph{eavesdropper}, an
1129unauthorized listener) listens to every message exchanged, she won't be
1130able to decypher the secret: the private key has never left Alice's
1131house!
1132
1133Notice that such a protocol is \emph{asymmetric}: if Alice wanted to
1134send a secret to Bob in reply, Bob would need to generate a pair of keys
1135of his own.
1136
1137Let's see how we can do this in practice, using number theory!
1138
1139\hypertarget{rsa}{%
1140\subsection{RSA}\label{rsa}}
1141
1142As many other cryptography protocols, RSA is based on a Mathematical
1143process that is easy to do in one direction, but very hard to invert. In
1144this case the hard process is integer factorization, that is decomposing
1145an 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=\\\{\}]
1161True True False
1162 \end{Verbatim}
1163
1164 In order to generate the keys, Alice picks a number \(n\) which is the
1165product of two large primes \(p\) and \(q\) of more or less the same
1166size. Finding such primes is relatively easy compared to factoring the
1167number \(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
1169that \(n=pq\) - it would be impossible otherwise!
1170
1171Then 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
1174pair \((n,d)\), while \(e\) is the private key.
1175
1176Of 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
1218Alice the number \(m\) with \(1<m<n\) (In practice he would like to send
1219her some text with emojis, or maybe a voice message; but for computers
1220everything is a number, and there are different ways to translate any
1221sort of information to a number. He just chooses one of the many
1222standard methods that already exist, no cryptography is needed in this
1223step. If the message \(m\) is too long, he can split it up in some
1224pieces and repeat the process multiple times.)
1225
1226Now 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=\\\{\}]
1243149461597163501
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:
1250Euler's theorem}). So for Alice it is very easy to get back the original
1251message:
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=\\\{\}]
126742424242
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
1274do this is by factorizing \(n\) first, which is considered to be a very
1275hard problem. However, there is no proof that faster algorithms can't be
1276devised.
1277
1278Moreover, one day we will overcome the current technological
1279difficulties and quantum computers will be available. Quantum computers
1280are not just ``more powerful'' than classical hardware, but they work
1281based on completely different logical foundations and they make the
1282factorization problem much easier to solve: for example
1283\href{https://en.wikipedia.org/wiki/Shor\%27s_algorithm}{Shor's
1284algorithm} takes advantage of this different logic and can factorize
1285numbers quickly, if run on a quantum computer.
1286
1287To 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
1290computers) have already been developed.
1291
1292
1293 % Add a bibliography block to the postdoc
1294
1295
1296
1297\end{document}
diff --git a/src/Lecture6/live/8-SageCalculus-modified.ipynb b/src/Lecture6/live/8-SageCalculus-modified.ipynb
new file mode 100644
index 0000000..5933058
--- /dev/null
+++ b/src/Lecture6/live/8-SageCalculus-modified.ipynb
@@ -0,0 +1,1614 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Symbolic expressions\n",
8 "\n",
9 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
10 "\n",
11 "Last time we saw the basics of symbolic expressions:\n",
12 "* How to define and manipulate symbolic expressions\n",
13 "* How to introduce new variables (in the Mathematical sense) with `var()`\n",
14 "* How to solve equations and inequalities\n",
15 "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n",
16 "\n",
17 "Here are some examples to remind you of these basic things:"
18 ]
19 },
20 {
21 "cell_type": "code",
22 "execution_count": 1,
23 "metadata": {},
24 "outputs": [
25 {
26 "name": "stdout",
27 "output_type": "stream",
28 "text": [
29 "[\n",
30 "x == -sqrt(-pi),\n",
31 "x == sqrt(-pi)\n",
32 "]\n",
33 "[\n",
34 "z == -sqrt(pi + x^2),\n",
35 "z == sqrt(pi + x^2)\n",
36 "]\n",
37 "[[y < -2], [y > 1]]\n",
38 "2*pi + e is approximately 9.00146713563863\n"
39 ]
40 }
41 ],
42 "source": [
43 "var('y', 'z') # Define new variables (x is already defined by Sage)\n",
44 "f = x^2 + pi\n",
45 "g = y^2 + y - 2 > 0\n",
46 "print( solve(f==0, x) )\n",
47 "print( solve(z^2 - f, z) )\n",
48 "print( solve(g, y) )\n",
49 "print( 2*pi + e, \"is approximately\", n(2*pi + e) )"
50 ]
51 },
52 {
53 "cell_type": "markdown",
54 "metadata": {},
55 "source": [
56 "Now we will see some more details about solving equations and manipulating their solutions."
57 ]
58 },
59 {
60 "cell_type": "markdown",
61 "metadata": {},
62 "source": [
63 "## Solving equations and inequalities\n",
64 "\n",
65 "**Reference** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)] for the details of `solve()` and `find_root()`, [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html#solving)] for examples.\n",
66 "\n",
67 "Other than equations and inequalities, we can also solve systems: it is enough to give Sage a list of expressions and a list of variables with respect to which we want to solve. For example the system\n",
68 "\n",
69 "\\begin{align*}\n",
70 " \\begin{cases}\n",
71 " x + y = 2 \\\\\n",
72 " 2x - y = 6\n",
73 " \\end{cases}\n",
74 "\\end{align*}\n",
75 "\n",
76 "Can be solved as"
77 ]
78 },
79 {
80 "cell_type": "code",
81 "execution_count": 2,
82 "metadata": {},
83 "outputs": [
84 {
85 "data": {
86 "text/plain": [
87 "[[x == (8/3), y == (-2/3)]]"
88 ]
89 },
90 "execution_count": 2,
91 "metadata": {},
92 "output_type": "execute_result"
93 }
94 ],
95 "source": [
96 "solve([x+y == 2, 2*x - y == 6], [x,y])"
97 ]
98 },
99 {
100 "cell_type": "markdown",
101 "metadata": {},
102 "source": [
103 "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x+1$."
104 ]
105 },
106 {
107 "cell_type": "markdown",
108 "metadata": {},
109 "source": [
110 "**Solution:** the system is\n",
111 "\\begin{align*}\n",
112 " \\begin{cases}\n",
113 " y^2 = x^2 - 2x +1\\\\\n",
114 " x^2 + y^2 = 4\n",
115 " \\end{cases}\n",
116 "\\end{align*}"
117 ]
118 },
119 {
120 "cell_type": "code",
121 "execution_count": 5,
122 "metadata": {},
123 "outputs": [
124 {
125 "data": {
126 "text/plain": [
127 "[[x == -1/2*sqrt(7) + 1/2, y == 1/2*sqrt(7) + 1/2], [x == 1/2*sqrt(7) + 1/2, y == -1/2*sqrt(7) + 1/2], [x == -1/2*sqrt(7) + 1/2, y == -1/2*sqrt(7) - 1/2], [x == 1/2*sqrt(7) + 1/2, y == 1/2*sqrt(7) - 1/2]]"
128 ]
129 },
130 "execution_count": 5,
131 "metadata": {},
132 "output_type": "execute_result"
133 }
134 ],
135 "source": [
136 "var('y')\n",
137 "eq1 = y^2 == x^2-2*x+1\n",
138 "eq2 = x^2 + y^2 == 4\n",
139 "solve([eq1, eq2], [x,y])"
140 ]
141 },
142 {
143 "cell_type": "markdown",
144 "metadata": {},
145 "source": [
146 "### The set of solutions\n",
147 "\n",
148 "One would expect the result of `solve()` to be a list of solutions, but it is actually a list of expressions (technically it is not a list but a different type of Python collection, but this is not so important)"
149 ]
150 },
151 {
152 "cell_type": "code",
153 "execution_count": 11,
154 "metadata": {},
155 "outputs": [
156 {
157 "name": "stdout",
158 "output_type": "stream",
159 "text": [
160 "-3\n"
161 ]
162 }
163 ],
164 "source": [
165 "solutions = solve(x^2-9 == 0, x)\n",
166 "solutions[0] # This is the expression 'x == -3'\n",
167 "\n",
168 "# Using rhs() explained below\n",
169 "print(solutions[0].rhs())"
170 ]
171 },
172 {
173 "cell_type": "markdown",
174 "metadata": {},
175 "source": [
176 "To read the actual solution without the `x ==` part you can use the `rhs()` or `lhs()` functions, which can be applied to any expression containing a relation operator (like `==`, `<`, `>=`...) and return the *right hand side* and *left hand side* of the expression, respectively"
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": 10,
182 "metadata": {},
183 "outputs": [
184 {
185 "name": "stdout",
186 "output_type": "stream",
187 "text": [
188 "rhs: -y + 2\n",
189 "lhs: x^2 + y\n"
190 ]
191 }
192 ],
193 "source": [
194 "f = x^2+y <= 2-y\n",
195 "print(\"rhs:\", f.rhs())\n",
196 "print(\"lhs:\", f.lhs())"
197 ]
198 },
199 {
200 "cell_type": "markdown",
201 "metadata": {},
202 "source": [
203 "When you solve an inequality or a system, the set of solutions can be more complicated to describe. In this case the result is a list containing lists of expressions that have to be `True` at the same time. It is easier to explain with an example:"
204 ]
205 },
206 {
207 "cell_type": "code",
208 "execution_count": 12,
209 "metadata": {},
210 "outputs": [
211 {
212 "name": "stdout",
213 "output_type": "stream",
214 "text": [
215 "Simple inequality: [[x < -3], [x > 3]]\n",
216 "System of inequalities:\n",
217 " [\n",
218 "[3 < x, x < 6],\n",
219 "[x < -3]\n",
220 "]\n"
221 ]
222 }
223 ],
224 "source": [
225 "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n",
226 "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))"
227 ]
228 },
229 {
230 "cell_type": "markdown",
231 "metadata": {},
232 "source": [
233 "In the last example (system of inequalities), Sage is telling us that the system\n",
234 "\\begin{align*}\n",
235 " \\begin{cases}\n",
236 " x^2-9 > 9 \\\\\n",
237 " x < 6\n",
238 " \\end{cases}\n",
239 "\\end{align*}\n",
240 "has two solutions:\n",
241 "* $x$ is between $3$ and $6$;\n",
242 "* $x$ is less than $-3$.\n",
243 "\n",
244 "Since in Sage (and in Python) expressions can have at most on relational operator like `<`, the first solution requires two expressions to be described. Hence the \"list of lists\".\n"
245 ]
246 },
247 {
248 "cell_type": "markdown",
249 "metadata": {},
250 "source": [
251 "**Exercise.** In the first exercise you were asked to solve a system of equations, but some of its solutions were complex numbers. Select only the real solutions and print them as pairs $(x,y)$."
252 ]
253 },
254 {
255 "cell_type": "code",
256 "execution_count": 24,
257 "metadata": {},
258 "outputs": [
259 {
260 "name": "stdout",
261 "output_type": "stream",
262 "text": [
263 "All solutions:\n",
264 "[\n",
265 "[x == (-1/2*I + 1/2), y == -sqrt(1/2*I + 4)],\n",
266 "[x == (-1/2*I + 1/2), y == sqrt(1/2*I + 4)],\n",
267 "[x == (1/2*I + 1/2), y == -sqrt(-1/2*I + 4)],\n",
268 "[x == (1/2*I + 1/2), y == sqrt(-1/2*I + 4)]\n",
269 "]\n"
270 ]
271 }
272 ],
273 "source": [
274 "# We use a different equation because the first exercise only\n",
275 "# had real solutions.\n",
276 "var('y')\n",
277 "eq1 = y^2 == x^2-2*x+5\n",
278 "eq2 = x^2 + y^2 == 4\n",
279 "solutions = solve([eq1, eq2], [x,y])\n",
280 "\n",
281 "print(\"All solutions:\")\n",
282 "print(solutions)\n",
283 "\n",
284 "for s in solutions:\n",
285 " #print(\"One solutions is:\", s)\n",
286 " x0 = s[0].rhs()\n",
287 " y0 = s[1].rhs()\n",
288 " if x0 in RR and y0 in RR:\n",
289 " print((x0, y0))"
290 ]
291 },
292 {
293 "cell_type": "markdown",
294 "metadata": {},
295 "source": [
296 "When solving a system of equations (not inequalities), you can use the option `solution_dict=True` to have the solutions arranged as a *dictionary*, which is a type of Python collection that we did not treat in this course"
297 ]
298 },
299 {
300 "cell_type": "code",
301 "execution_count": 25,
302 "metadata": {},
303 "outputs": [
304 {
305 "data": {
306 "text/plain": [
307 "[{x: 8/3, y: -2/3}]"
308 ]
309 },
310 "execution_count": 25,
311 "metadata": {},
312 "output_type": "execute_result"
313 }
314 ],
315 "source": [
316 "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)"
317 ]
318 },
319 {
320 "cell_type": "markdown",
321 "metadata": {},
322 "source": [
323 "### Alternative method for real roots: `find_root()`\n",
324 "\n",
325 "The `solve()` method is very useful when solving *symbolic* equations, for example when you have two variables and you want to solve for one of them in terms of the other. However, it does not always find explicit solutions.\n",
326 "\n",
327 "When you want to find an explicit, even if approximate, solution, it can be better to use `find_root()`. This function works *numerically*, which means that it finds an approximation of the root. It only works for real solutions and you need to specify an interval where you want the root to be searched:"
328 ]
329 },
330 {
331 "cell_type": "code",
332 "execution_count": 28,
333 "metadata": {},
334 "outputs": [
335 {
336 "name": "stdout",
337 "output_type": "stream",
338 "text": [
339 "Using solve():\n",
340 " [\n",
341 "x == -e^x + 10\n",
342 "]\n",
343 "Using find_root(): 2.070579904980303\n"
344 ]
345 }
346 ],
347 "source": [
348 "f = e^x + x - 10\n",
349 "print(\"Using solve():\\n\", solve(f, x))\n",
350 "print(\"Using find_root():\", f.find_root(0,10))"
351 ]
352 },
353 {
354 "cell_type": "markdown",
355 "metadata": {},
356 "source": [
357 "## Evaluating functions\n",
358 "\n",
359 "If an expression contains only one variable you can evaluate it easily, even if it is not a function."
360 ]
361 },
362 {
363 "cell_type": "code",
364 "execution_count": 29,
365 "metadata": {},
366 "outputs": [
367 {
368 "name": "stdout",
369 "output_type": "stream",
370 "text": [
371 "1\n",
372 "y + 3 > (y + 3)^2\n"
373 ]
374 }
375 ],
376 "source": [
377 "var('y')\n",
378 "f = x^2-3\n",
379 "g = x > x^2\n",
380 "\n",
381 "print(f(2))\n",
382 "print(g(3+y))"
383 ]
384 },
385 {
386 "cell_type": "markdown",
387 "metadata": {},
388 "source": [
389 "If an expression contains more than one variable, you can specify a value for each of them and they will be substituted in alphabetic order. You can also specify a value only for some of the variables."
390 ]
391 },
392 {
393 "cell_type": "code",
394 "execution_count": 32,
395 "metadata": {},
396 "outputs": [
397 {
398 "name": "stdout",
399 "output_type": "stream",
400 "text": [
401 "-2 == 0\n",
402 "3*y == 2\n"
403 ]
404 }
405 ],
406 "source": [
407 "var('y','z')\n",
408 "\n",
409 "f = y*z^2 - y == z\n",
410 "print(f(2, 0))\n",
411 "print(f(z = 2))"
412 ]
413 },
414 {
415 "cell_type": "markdown",
416 "metadata": {},
417 "source": [
418 "## Symbolic computations\n",
419 "\n",
420 "Sage can understand and simplify symbolic expressions such as sums (finite or infinite) and products. In the following cell, we compute the following sums using the [`sum()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.sum) function:\n",
421 "\n",
422 "\\begin{align*}\n",
423 " \\begin{array}{llcc}\n",
424 " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n",
425 " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n",
426 " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n",
427 " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n",
428 " \\end{array}\n",
429 "\\end{align*}\n",
430 "Recall that $\\binom nk=\\frac{n!}{k!(n-k)!}$"
431 ]
432 },
433 {
434 "cell_type": "code",
435 "execution_count": 41,
436 "metadata": {},
437 "outputs": [
438 {
439 "name": "stdout",
440 "output_type": "stream",
441 "text": [
442 "(1) 1/2*n^2 + 1/2*n\n",
443 "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n",
444 "(3) 2^n\n",
445 "(4) 1/6*pi^2\n"
446 ]
447 }
448 ],
449 "source": [
450 "var('k', 'n') # Remember to declare all variables\n",
451 "\n",
452 "s = []\n",
453 "s.append( sum(k, k, 0, n) )\n",
454 "s.append( sum(k^4, k, 0, n) )\n",
455 "s.append( sum(binomial(n,k), k, 0, n) )\n",
456 "s.append( sum(1/k^2, k, 1, infinity) )\n",
457 "\n",
458 "for i in range(len(s)):\n",
459 " print(\"({}) {}\".format(i+1, s[i]))"
460 ]
461 },
462 {
463 "cell_type": "markdown",
464 "metadata": {},
465 "source": [
466 "An alternative notation is `expression.sum(k, a, b)`. There is an analogous [`prod()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.prod) for products."
467 ]
468 },
469 {
470 "cell_type": "code",
471 "execution_count": 43,
472 "metadata": {},
473 "outputs": [
474 {
475 "data": {
476 "text/plain": [
477 "factorial(n)^2"
478 ]
479 },
480 "execution_count": 43,
481 "metadata": {},
482 "output_type": "execute_result"
483 }
484 ],
485 "source": [
486 "(x^2).prod(x, 1, n)"
487 ]
488 },
489 {
490 "cell_type": "markdown",
491 "metadata": {},
492 "source": [
493 "Sometimes Sage tries to keep an expression in its original form without expanding out sums and products. To change this behavior you can use the [`expand()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.expand) function:"
494 ]
495 },
496 {
497 "cell_type": "code",
498 "execution_count": 44,
499 "metadata": {},
500 "outputs": [
501 {
502 "name": "stdout",
503 "output_type": "stream",
504 "text": [
505 "(x + 1)^2 - (x - 1)^2\n",
506 "4*x\n"
507 ]
508 }
509 ],
510 "source": [
511 "f = (x+1)^2 - (x-1)^2\n",
512 "print(f)\n",
513 "print(f.expand())"
514 ]
515 },
516 {
517 "cell_type": "markdown",
518 "metadata": {},
519 "source": [
520 "### The Symbolic Ring\n",
521 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n",
522 "\n",
523 "The symbolic expressions that we have seen so far live in a ring called *symbolic ring* and denoted by `SR` in Sage. This ring works like the ring `ZZ` of integers or `RR` of reals numbers. In particular, you can define matrices and other objects using it as a \"basis\"."
524 ]
525 },
526 {
527 "cell_type": "code",
528 "execution_count": 50,
529 "metadata": {},
530 "outputs": [
531 {
532 "name": "stdout",
533 "output_type": "stream",
534 "text": [
535 "-b*c + a*d\n",
536 "[(-a, 2)]\n"
537 ]
538 }
539 ],
540 "source": [
541 "var('a', 'b', 'c', 'd')\n",
542 "\n",
543 "M = matrix([[a,b], [c,d]])\n",
544 "print(M.determinant())\n",
545 "\n",
546 "polring.<x> = SR[]\n",
547 "f = x^2 + 2*a*x + a^2\n",
548 "print(f.roots())"
549 ]
550 },
551 {
552 "cell_type": "markdown",
553 "metadata": {},
554 "source": [
555 "**Exercise.** Compute the eigenvalues of the matrix\n",
556 "\\begin{align*}\n",
557 "\\begin{pmatrix}\n",
558 "\\cos \\alpha & \\sin \\alpha\\\\\n",
559 "-\\sin\\alpha & \\cos \\alpha\n",
560 "\\end{pmatrix}\n",
561 "\\end{align*}"
562 ]
563 },
564 {
565 "cell_type": "code",
566 "execution_count": 55,
567 "metadata": {},
568 "outputs": [
569 {
570 "name": "stdout",
571 "output_type": "stream",
572 "text": [
573 "-I\n"
574 ]
575 }
576 ],
577 "source": [
578 "var('a')\n",
579 "M = matrix([[cos(a), sin(a)], [-sin(a), cos(a)]])\n",
580 "M.eigenvalues()\n",
581 "lam = M.eigenvalues()[0]\n",
582 "print(lam(pi/2))"
583 ]
584 },
585 {
586 "cell_type": "markdown",
587 "metadata": {},
588 "source": [
589 "# Calculus\n",
590 "**Reference:** [[4](https://doc.sagemath.org/html/en/reference/calculus/index.html)] for an overview, but most functions are described in [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]"
591 ]
592 },
593 {
594 "cell_type": "markdown",
595 "metadata": {},
596 "source": [
597 "## Limits and series\n",
598 "\n",
599 "**References:** [[5](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html#sage.calculus.calculus.limit)] for limits, [[6](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.series)] for series\n",
600 "\n",
601 "You can compute limits"
602 ]
603 },
604 {
605 "cell_type": "code",
606 "execution_count": 59,
607 "metadata": {},
608 "outputs": [
609 {
610 "name": "stdout",
611 "output_type": "stream",
612 "text": [
613 "1\n",
614 "+Infinity\n"
615 ]
616 }
617 ],
618 "source": [
619 "var('x')\n",
620 "f = sin(x)/x\n",
621 "#print(f(0)) # This one gives an error\n",
622 "print( f.limit(x=0) )\n",
623 "\n",
624 "print( (e^(-x)).limit(x=-infinity) )"
625 ]
626 },
627 {
628 "cell_type": "markdown",
629 "metadata": {},
630 "source": [
631 "**Exercise.** Compute the constant $e$ using a limit."
632 ]
633 },
634 {
635 "cell_type": "code",
636 "execution_count": 62,
637 "metadata": {},
638 "outputs": [
639 {
640 "data": {
641 "text/plain": [
642 "e^x"
643 ]
644 },
645 "execution_count": 62,
646 "metadata": {},
647 "output_type": "execute_result"
648 }
649 ],
650 "source": [
651 "expression = (1+x/n)^n\n",
652 "expression.limit(n=infinity)"
653 ]
654 },
655 {
656 "cell_type": "markdown",
657 "metadata": {},
658 "source": [
659 "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit."
660 ]
661 },
662 {
663 "cell_type": "code",
664 "execution_count": 63,
665 "metadata": {},
666 "outputs": [
667 {
668 "name": "stdout",
669 "output_type": "stream",
670 "text": [
671 "und\n",
672 "1\n",
673 "-1\n"
674 ]
675 },
676 {
677 "data": {
678 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkoAAAGECAYAAADJKQ/AAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAcAUlEQVR4nO3df5DVdb348dcJZZEZzrFxhV3KgJoEN7MhSIFJsxxX8cZYdr361UH43iIxHSOGqaiZhOaWWek4Xo4RpZY/+uadVkyDIakA/V6XWotVU2T8w1xq2Ai/dlYsQfHz/cOv+3WF93Lg7O75sD4eM2fG89n353zexz1zeO7nnPM+hSzLAgCA/b2t3hMAAMgroQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBuVR4TbFQKBTqPRfgreuoAbgNK1YCA65SqUSpVIpKpVLvqQDDU1V/hDmjBACQIJQAABKEEgBAglACDurBBx+MOXPmxPjx46NQKMS999570H02bdoU06ZNi1GjRsW73/3uWLly5eBPFGCACSXgoF588cX4wAc+ECtWrKhq/DPPPBPnnXdenH766bFly5b4yle+EldffXW0tbUN8kwBBlYhy2r+0JpPvcFbSKFQiNWrV8cnPvGJ5JgvfelLcd9998XWrVt7ty1cuDAeffTRaG9vP+A+e/bsiT179vRe/8MfdsdHP/qO+PznK9HQUByw+QPD17HHRixdWvXwqj71NhDLAwD00d7eHq2trX22nXPOOXHLLbfEyy+/HEcfffR++1x77bWxfPnyN2y5JiIi7r8/4m3OfQNVaG4+pFCqilACBlx3d3eMGzeuz7Zx48bFK6+8Ert27Yrm5ub99lm6dGksXry49/qXvrQnVq5cHlu2RBSdUALqRCgBg+LNC2q//jJ/aqHthoaGaGhoeMP1nsGbHECVnNAGBlxTU1N0d3f32bZz58446qij4rjjjqvTrAAOnVACBtzMmTNj/fr1fbY98MADMX369AO+Pwkgr4QScFC7d++Ozs7O6OzsjIjXPv7f2dkZXV1dEfHa+4suu+yy3vELFy6MZ599NhYvXhxbt26NW2+9NW655ZZYsmRJPaYPcNi8Rwk4qEceeSQ++tGP9l5//U3X8+bNix/96EexY8eO3miKiJg0aVKsXbs2vvCFL0S5XI7x48fHTTfdFJ/61KeGfO4AtbCOEpBLn/98T9x0UykqlUoUfewNGHhVraPkpTcAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJyKXaVy4BqJ1QAgBIEEoAAAlCCQAgQSgBuVIul6OlpSXuvPOOek8FwHe9Afl09dU98Z//6bvegEHju94AAGohlIBcsjwAkAdCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAJyyfIAQB4IJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgnIlXK5HC0tLfGTn9xV76kARCGrfbESq50AA+7KK3vi5ptLUalUolgs1ns6wPBTqGaQM0oAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSkEu1r1wCUDuhBACQIJQAABKEEgBAglACAEgQSgAACUIJACBBKAG5ZHkAIA+EEgBAglACAEgQSkCulMvlaGlpiZ/+9H/VeyoAUchqfyOAdxIAA+6KK3pi5cpSVCqVKBaL9Z4OMPwUqhnkjBIAQIJQAgBIEEpALlkeAMgDoQQAkCCUAAAShBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSAECCUAIASBBKAAAJQgnIlXK5HC0tLXH33XfXeyoAUciyrNbbqPkGAN7s8st7YtWqUlQqlSgWi/WeDjD8FKoZ5IwSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBORS7SuXANROKAEAJAglAIAEoQQAkCCUAAAShBIAQIJQAqpy8803x6RJk2LUqFExbdq0eOihh5JjN27cGIVCYb/LU089NYQzBqidUAIO6u67745FixbFV7/61diyZUucfvrpMXv27Ojq6up3v23btsWOHTt6L+9973urPqblAYA8EErAQd1www3x6U9/Oj7zmc/ESSedFDfeeGOccMIJ8b3vfa/f/caOHRtNTU29lxEjRiTH7tmzJ3p6enove/fuHei7AXDIhBLQr71798bvf//7aG1t7bO9tbU1Hn744X73nTp1ajQ3N8dZZ50VGzZs6HfstddeG6VSqfdy++0/qnXqADUTSkC/du3aFfv27Ytx48b12T5u3Ljo7u4+4D7Nzc2xatWqaGtri3vuuScmT54cZ511Vjz44IPJ4yxdujQqlUrv5bLL5g/k3QA4LEfVewLAkaFQKPS5nmXZftteN3ny5Jg8eXLv9ZkzZ8b27dvju9/9bpxxxhkH3KehoSEaGhp6r48c2TMAswaojTNKQL8aGxtjxIgR+5092rlz535nmfozY8aMePrppwd6egCDSigB/Ro5cmRMmzYt1q9f32f7+vXrY9asWVXfzpYtW6K5uXmgpwcwqLz0BhzU4sWLY+7cuTF9+vSYOXNmrFq1Krq6umLhwoUR8dr7i/7yl7/E7bffHhERN954Y0ycODHe9773xd69e+POO++Mtra2aGtrq/qYlgcA8kAoAQd10UUXxXPPPRdf//rXY8eOHXHyySfH2rVrY8KECRERsWPHjj5rKu3duzeWLFkSf/nLX+KYY46J973vfbFmzZo477zz6nUXAA5LIav9zzZ/9wED7jOf6YlbbilFpVKJYrFY7+kAw8+BP43yJt6jBACQIJQAABKEEgBAglACAEgQSkAuWR4AyAOhBACQIJQAABKEEgBAglACAEgQSgAACUIJyJVyuRwtLS3R1vazek8FwHe9Afn06U/3xK23+q43YND4rjfgyGUdJSAPhBIAQIJQAgBIEEoAAAlCCQAgQSgBACQIJQCABKEE5JLlAYA8EEoAAAlCCQAgQSgBACQIJQCABKEEAJAglAAAEoQSkEuWBwDyQCgBACQIJSBXyuVytLS0xL333lPvqQBEIav9/LYT5MCAmz+/J37841JUKpUoFov1ng4w/BSqGeSMEgBAglACAEgQSgAACUIJyCXLAwB5IJQAABKEEgBAglACAEgQSgAACUIJACBBKAEAJAglIJcsDwDkgVACAEgQSgAACUIJACBBKAEAJAglIFfK5XK0tLTEz39+b72nAhCFrPaPlvhsCjDgLrusJ+64oxSVSiWKxWK9pwMMP4VqBjmjBACQIJSAXLKOEpAHQgkAIEEoAQAkCCUAgAShBACQIJQAABKEEgBAglACcsnyAEAeCCUAgAShBACQIJQAABKEEgBAglACAEgQSgAACUIJyCXLAwB5IJSAXCmXy9HS0hK/+MX99Z4KQBSy2v9s83cfMOAuvbQnfvKTUlQqlSgWi/WeDjD8FKoZ5IwSAECCUAIASBBKAAAJQgkAIEEoAblkeQAgD4QSAECCUAIASBBKAAAJQgkAIEEoAQAkCCUAgAShBOSS5QGAPBBKAAAJQgkAIEEoAQAkHFXLzoVCoVCpVAZqLsBb2J49e2LPnj291//5z5cjIqKnp6deUwKGsVKpVIyIF7Ks/3dEFg7y834VCoViRCglAOBIVMqyrN+/xmoNpUKlUnm1mrE9PT1xwgknxPbt26NYLB72Mav1oQ99KDo6Ogb9OI5VG48Lx3rdm88oXX75P2Lt2snx5JNPxjve8Y4BP96bDYf/h2+VYw3X543h+LsaymMd6uOiVCqVooozSjW99HawGz+QYrE4JA/sESNGDMlxHGtgeFw41puNHr0rIiLGjBnjseFYBzTcnjeG6+8qr4+Lg51Jet2wfTP3lVde6VhH0LGGynD9/zccjzXU6ygNx/+Hw/lYQ2mo7tdw/V0d6Y+Lml56+3+quoGenp4olUpRqVSGtCzJN48LUv71X3dFW9vxsX379njnO99Z7+mQI543OJDDeFwUqhk0ZGeUGhoa4pprromGhoahOiRHAI8LUt72thERER4b7MfzBgcyWI+LITujBHAoLr64J+6+21kDYNDk64wSAMCRRigBACQIJQCABKEE5NJQLw8AcCCDGkrf+MY3YtasWTF69Og49thjq9ony7JYtmxZjB8/Po455pg488wz44knnhjMaTLEnn/++Zg7d26USqUolUoxd+7c+Pvf/97vPvPnz49CodDnMmPGjKGZMDCkbr755pg0aVKMGjUqpk2bFg899FBy7MaNG/d7bigUCvHUU08N4YwZCg8++GDMmTMnxo8fH4VCIe69996D7rNp06aYNm1ajBo1Kt797nfHypUrD/m4gxpKe/fujQsvvDCuuOKKqvf59re/HTfccEOsWLEiOjo6oqmpKc4+++x44YUXBnGmDKVLLrkkOjs7Y926dbFu3bro7OyMuXPnHnS/c889N3bs2NF7Wbt27RDMFhhKd999dyxatCi++tWvxpYtW+L000+P2bNnR1dXV7/7bdu2rc/zw3vf+94hmjFD5cUXX4wPfOADsWLFiqrGP/PMM3HeeefF6aefHlu2bImvfOUrcfXVV0dbW9uhHTjLslovB3XbbbdlpVLpoONeffXVrKmpKfvWt77Vu+2ll17KSqVStnLlymoORc49+eSTWURkmzdv7t3W3t6eRUT21FNPJfebN29edv755w/BDMmLf/u3ShYRWaVSqfdUGEKnnnpqtnDhwj7bpkyZkn35y18+4PgNGzZkEZE9//zzQzA78iIistWrV/c75otf/GI2ZcqUPtsuv/zybMaMGb03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\n",
679 "text/plain": [
680 "Graphics object consisting of 1 graphics primitive"
681 ]
682 },
683 "execution_count": 63,
684 "metadata": {},
685 "output_type": "execute_result"
686 }
687 ],
688 "source": [
689 "f = abs(x)/x # 1 if x>0, -1 if x<0\n",
690 "print( f.limit(x=0) ) # undefined\n",
691 "print( f.limit(x=0, dir=\"+\") )\n",
692 "print( f.limit(x=0, dir=\"-\") )\n",
693 "plot(f)"
694 ]
695 },
696 {
697 "cell_type": "code",
698 "execution_count": 71,
699 "metadata": {},
700 "outputs": [
701 {
702 "name": "stdout",
703 "output_type": "stream",
704 "text": [
705 "+Infinity\n",
706 "+Infinity\n",
707 "+Infinity\n"
708 ]
709 },
710 {
711 "data": {
712 "image/png": "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HADFy8pmJypMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAPJKPB5XNBpVLBYLeigA0MmybTvXY3M+EACcJJNJRSIRJRIJhcPhoIcDoHhZ2exEhQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQlAXonH44pGo4rFYkEPBQA6WbZt53pszgcCgJNkMqlIJKJEIqFwOBz0cAAULyubnagwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAXDd2LFjZVlWl+3RRx8NelgAkLMBQQ8AQHF6/PHHtWjRos7HQ4YMCXA0ANA3BCYAnhg6dKiqqqqy3j+VSimVSnU+TiaTXgwLAHLClBwATzz55JMaMWKErr/+eq1YsULt7e097r9q1SpFIpHObfTo0T6NFACcWbZt53pszgcCKG4//vGPdeONN2r48OF6++23tXTpUn3jG9/Qs88+2+0xmSpMo0ePViKRUDgc9mPYAC5NVlY7EZgAZKO+vl7Lly/vcZ+GhgbdfPPNFz3/0ksv6Zvf/KYOHz6sESNGZNVfMplUJBIhMAHwGoEJgHsOHz6sw4cP97jP2LFjNXjw4Iue379/v0aNGqW33npLkyZNyqo/AhMAn2QVmFj0DSArFRUVqqioyOnYHTt2SJKqq6vdHBIA+IbABMBVW7Zs0VtvvaXp06crEomooaFBDz/8sObOnasxY8YEPTwAyAmBCYCrQqGQfvnLX2r58uVKpVK64oortGjRIj3yyCNBDw0AcsYaJgB5iTVMAHyS1RomzsMEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEIK/E43FFo1HFYrGghwIAnbiWHIC8xLXkAPiEa8kBAAC4gcAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEIK/E43FFo1HFYrGghwIAnSzbtnM9NucDAcBJMplUJBJRIpFQOBwOejgAipeVzU5UmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmADklXg8rmg0qlgsFvRQAKCTZdt2rsfmfCAAOEkmk4pEIkokEgqHw0EPB0DxsrLZiQoTAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITgLwSj8cVjUYVi8WCHgoAdLJs28712JwPBAAnyWRSkUhEiURC4XA46OEAKF5WNjtRYQIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYALQKytWrNCUKVNUWlqqYcOGZdxn3759mjNnjsrKylRRUaGHHnpI7e3t/g4UAFw0IOgBACgs7e3tuuuuuzR58mQ999xzF73e0dGh2bNn67LLLtObb76pzz//XAsXLpRt2/rJT34SwIgBoO8s27ZzPTbnAwEUvrVr12rx4sU6evRol+dfffVVff3rX1dzc7NqamokSS+++KLuvfdeHTp0SOFwOKv2k8mkIpGIEolE1scAQA6sbHZiSg6Aq7Zs2aLx48d3hiVJmjlzplKplLZv397tcalUSslksssGAPmCwATAVS0tLaqsrOzy3PDhwzVo0CC1tLR0e9yqVasUiUQ6t9GjR3s9VADIGoEJgOrr62VZVo/btm3bsm7Psi6ucNu2nfH5tKVLlyqRSHRuzc3NOf0sAOAFFn0D0IMPPqj58+f3uM/YsWOzaquqqkpbt27t8lxra6tOnz59UeXpfKFQSKFQKKs+AMBvBCYAqqioUEVFhSttTZ48WStWrNCBAwdUXV0tSVq/fr1CoZBuuukmV/oAAL8RmAD0yr59+3TkyBHt27dPHR0d2rlzpyTpqquu0pAhQzRjxgxFo1Hdc889evrpp3XkyBEtWbJEixYt4ttuAAoWpxUA0Cv33nuv1q1bd9HzGzZs0LRp0ySZUPXAAw/o97//vUpKSrRgwQL98Ic/7NWUG6cVAOCTrE4rQGACkJcITAB84nlgAgDPWJYVlpSQFLFtm5MyAQgUgQlAXrLMOQiGSjpm80EFIGAEJgAAAAecuBIAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMDB/wEYcmVlzttqbwAAAABJRU5ErkJggg==\n",
713 "text/plain": [
714 "Graphics object consisting of 1 graphics primitive"
715 ]
716 },
717 "execution_count": 71,
718 "metadata": {},
719 "output_type": "execute_result"
720 }
721 ],
722 "source": [
723 "f = 1/x^2\n",
724 "print( f.limit(x=0) )\n",
725 "print( f.limit(x=0, dir=\"+\") )\n",
726 "print( f.limit(x=0, dir=\"-\") )\n",
727 "plot(f, (x, -10, 10), ymax = 10, ymin = -10)"
728 ]
729 },
730 {
731 "cell_type": "markdown",
732 "metadata": {},
733 "source": [
734 "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`."
735 ]
736 },
737 {
738 "cell_type": "markdown",
739 "metadata": {},
740 "source": [
741 "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does."
742 ]
743 },
744 {
745 "cell_type": "code",
746 "execution_count": 81,
747 "metadata": {},
748 "outputs": [
749 {
750 "name": "stdout",
751 "output_type": "stream",
752 "text": [
753 "1*(x - 1) + (-1/2)*(x - 1)^2 + 1/3*(x - 1)^3 + Order((x - 1)^4)\n",
754 "1*x^2 + (-5/6)*x^4 + Order(x^6)\n"
755 ]
756 }
757 ],
758 "source": [
759 "f = e^x\n",
760 "g = sin(x) - 2*cos(x)\n",
761 "h = log(x)\n",
762 "\n",
763 "#print(f.series(x==0, 5))\n",
764 "#print(g.series(x==0, 7))\n",
765 "print(h.series(x==1, 4))\n",
766 "\n",
767 "print((sin(x)^2*cos(x)).series(x==0, 6))"
768 ]
769 },
770 {
771 "cell_type": "markdown",
772 "metadata": {},
773 "source": [
774 "## Derivatives\n",
775 "**References:** [[7](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.derivative)] and [[8](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html#sage.calculus.functional.derivative)] for derivatives, [[9](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html#sage.calculus.functions.jacobian)] for the Jacobian matrix and [[10](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.hessian)] for the Hessian."
776 ]
777 },
778 {
779 "cell_type": "markdown",
780 "metadata": {},
781 "source": [
782 "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one."
783 ]
784 },
785 {
786 "cell_type": "code",
787 "execution_count": 84,
788 "metadata": {},
789 "outputs": [
790 {
791 "name": "stdout",
792 "output_type": "stream",
793 "text": [
794 "8*y^3\n",
795 "6*x^2 - 1\n"
796 ]
797 }
798 ],
799 "source": [
800 "var('y')\n",
801 "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n",
802 "print( (2*x^3-x+2).derivative() )"
803 ]
804 },
805 {
806 "cell_type": "markdown",
807 "metadata": {},
808 "source": [
809 "You can also compute higher order derivatives:"
810 ]
811 },
812 {
813 "cell_type": "code",
814 "execution_count": 85,
815 "metadata": {},
816 "outputs": [
817 {
818 "name": "stdout",
819 "output_type": "stream",
820 "text": [
821 "6*x\n",
822 "84*x^5*y + 10*y^4 + 24*x^2*y\n",
823 "1680*x^3 + 48\n"
824 ]
825 }
826 ],
827 "source": [
828 "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n",
829 "\n",
830 "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n",
831 "print( f.derivative(x, x, y) ) # Twice in x, once in y\n",
832 "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y"
833 ]
834 },
835 {
836 "cell_type": "markdown",
837 "metadata": {},
838 "source": [
839 "Jacobian and Hessian matrices are also easy to compute:"
840 ]
841 },
842 {
843 "cell_type": "code",
844 "execution_count": 86,
845 "metadata": {},
846 "outputs": [
847 {
848 "name": "stdout",
849 "output_type": "stream",
850 "text": [
851 "[-2*x + 2*y 2*x]\n",
852 "[ 0 3*y^2]\n",
853 "[ y + 1 x + 1] \n",
854 "\n",
855 "[ 2 -4*y + 1]\n",
856 "[ -4*y + 1 -4*x + 6*y]\n"
857 ]
858 }
859 ],
860 "source": [
861 "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n",
862 "print( jacobian(f, [x,y]), \"\\n\" )\n",
863 "\n",
864 "g = x^2 + x*y + y^3 -2*x*y^2 -3\n",
865 "print( g.hessian() )"
866 ]
867 },
868 {
869 "cell_type": "markdown",
870 "metadata": {},
871 "source": [
872 "*Note:* the notation `f.jacobian([x,y])` is also valid, but only if you specify that `f` is vector by declaring it as `f = vector([...])`."
873 ]
874 },
875 {
876 "cell_type": "markdown",
877 "metadata": {},
878 "source": [
879 "## Integrals\n",
880 "**References:** [[11](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html)] for symbolic integration and [[12](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html)] for numerical methods.\n",
881 "\n",
882 "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n",
883 "When using a computer software to solve your integrals, you have two choices:\n",
884 "\n",
885 "1. You can try to compute a primitive function exactly, and then (if you are computing a definite integral) substitute the endpoints of your integration interval to get the result. We can call this *symbolic integration*.\n",
886 "2. You can get an *approximated* result with a *numerical method*. This method always gives some kind of result, but it cannot be used to compute indefinite integrals.\n",
887 "\n",
888 "Sage can do both of these things, although people that work in numerical analysis and use often the second method tend to prefer other programs, such as Matlab (or its open-source clone Octave)."
889 ]
890 },
891 {
892 "cell_type": "markdown",
893 "metadata": {},
894 "source": [
895 "### Symbolic integration\n",
896 "\n",
897 "Symbolic integrals work more or less like derivatives. You must specify an integration variable, but the endpoints of the integration interval are optional. If they are not given you get an indefinite integral."
898 ]
899 },
900 {
901 "cell_type": "code",
902 "execution_count": 88,
903 "metadata": {},
904 "outputs": [
905 {
906 "name": "stdout",
907 "output_type": "stream",
908 "text": [
909 "1/2*x^2 - cos(x)\n",
910 "0\n",
911 "1/2*pi^2 + 2\n"
912 ]
913 }
914 ],
915 "source": [
916 "var('a', 'b')\n",
917 "f = x + sin(x)\n",
918 "print( f.integral(x) ) # Alternative: integral(f, x)\n",
919 "print( f.integral(x, -10, 10) )\n",
920 "print( f.integral(x, 0, pi) )"
921 ]
922 },
923 {
924 "cell_type": "markdown",
925 "metadata": {},
926 "source": [
927 "Your endpoints can also be $\\pm\\infty$:"
928 ]
929 },
930 {
931 "cell_type": "code",
932 "execution_count": 89,
933 "metadata": {},
934 "outputs": [
935 {
936 "name": "stdout",
937 "output_type": "stream",
938 "text": [
939 "1\n",
940 "sqrt(pi)\n"
941 ]
942 }
943 ],
944 "source": [
945 "print( integral(e^(-x), x, 0, infinity) )\n",
946 "print( integral(e^(-x^2), x, -infinity, infinity) )"
947 ]
948 },
949 {
950 "cell_type": "markdown",
951 "metadata": {},
952 "source": [
953 "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:"
954 ]
955 },
956 {
957 "cell_type": "code",
958 "execution_count": 92,
959 "metadata": {},
960 "outputs": [
961 {
962 "name": "stdout",
963 "output_type": "stream",
964 "text": [
965 "1/2*sqrt(pi)*erf(x)\n",
966 "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n"
967 ]
968 }
969 ],
970 "source": [
971 "print( integral(e^(-x^2), x) )\n",
972 "print( integral(e^(-x^2), x, 1, 2) )"
973 ]
974 },
975 {
976 "cell_type": "markdown",
977 "metadata": {},
978 "source": [
979 "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)."
980 ]
981 },
982 {
983 "cell_type": "markdown",
984 "metadata": {},
985 "source": [
986 "### Numerical integration\n",
987 "\n",
988 "In order to get an explicit value for the computations above, we can use a *numerical* method.\n",
989 "\n",
990 "The word \"numerical\" does not have much to do with numbers, but it refers to the fact that we are trying to compute explicit results rather than symbolic or algebraic ones. [Numerical analysis](https://en.wikipedia.org/wiki/Numerical_analysis) is the branch of mathematics that studies methods to approximate computations over the real or complex numbers. With these methods there is usually a trade-off between speed and precision.\n",
991 "\n",
992 "The Sage function [`numerical_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.numerical_integral) takes as a parameter a real-valued one-variable function and the integration endpoints, and it returns both an approximate value for the integral and an error estimate."
993 ]
994 },
995 {
996 "cell_type": "code",
997 "execution_count": 93,
998 "metadata": {},
999 "outputs": [
1000 {
1001 "data": {
1002 "text/plain": [
1003 "(0.13525725794999466, 1.5016572202374808e-15)"
1004 ]
1005 },
1006 "execution_count": 93,
1007 "metadata": {},
1008 "output_type": "execute_result"
1009 }
1010 ],
1011 "source": [
1012 "numerical_integral(e^(-x^2), 1, 2)"
1013 ]
1014 },
1015 {
1016 "cell_type": "markdown",
1017 "metadata": {},
1018 "source": [
1019 "The result above means, in symbols\n",
1020 "\\begin{align*}\n",
1021 "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n",
1022 "\\end{align*}\n",
1023 "\n",
1024 "There is also a [`monte_carlo_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.monte_carlo_integral) method for functions with more than one variable."
1025 ]
1026 },
1027 {
1028 "cell_type": "markdown",
1029 "metadata": {},
1030 "source": [
1031 "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$."
1032 ]
1033 },
1034 {
1035 "cell_type": "markdown",
1036 "metadata": {},
1037 "source": [
1038 "**Solution:** First, rewrite the equation as:\n",
1039 "\\begin{align*}\n",
1040 "y = \\sqrt{1- \\left(\\frac{x}{3}\\right)^2}\n",
1041 "\\end{align*}"
1042 ]
1043 },
1044 {
1045 "cell_type": "code",
1046 "execution_count": 104,
1047 "metadata": {},
1048 "outputs": [
1049 {
1050 "data": {
1051 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGECAYAAADEN3+HAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA7hUlEQVR4nO3deXxTVf7/8XdopSDQsFQqS1lkk7KIlrKURUGsoqIoKIgDqMhQxAUYHQVn1NFRxvGnolgWFxYVARVZVAQqIzsoBSoIyI4FaUFQUtZC2/z+OF9AoCUtTXJvktfz8biPQkhuPom1feeccz/H4Xa7BQAAgIKVsLoAAAAAuyMwAQAAeEBgAgAA8IDABAAA4AGBCQAAwAMCEwAAgAcEJgAAAA8ITABsx2FEOhwOh9W1AIAkhV/CY+h0CcCnXC6XnE6nXC6X1aUACA0eP5wxwgQAAOABgQkAAMADAhMAAIAHBCYAAAAPCEwAAAAeEJgAAAA8IDABsI3k5GTFxsYqPj7e6lIA4BwOt7vIbZXowwTAp7Kyss70YYqMjLS6HADBjz5MAAAAxUVgAgAA8IDABAAA4AGBCQAAwAMCEwAAgAcEJgAAAA8ITAAAAB4QmAAAADwgMAEAAHhAYAIAAPCAwAQAAOABgQkAAMADAhMA20hOTlZsbKzi4+OtLgUAzuFwu91FfUyRHwAARZGVlSWn0ymXy6XIyEirywEQ/Bye7sAIEwAAgAcEJgAAAA8ITAAAAB4QmAAAADwgMAEAAHhAYAIAAPCAwAQAAOABgQkAAMADAhOAi1q8eLG6dOmiqlWryuFwaObMmR4fs2jRIsXFxalUqVK66qqrNHbsWN8XCgA+RGACcFFHjx7VNddco3feeadQ99+5c6duvfVWtWvXTmvXrtXw4cP1+OOPa/r06T6uFAB8J9zqAgDYW+fOndW5c+dC33/s2LGqUaOGRo4cKUmqX7+hli37Sa+8MkmNGnXTsWPSyZPmyM42X48cOaXs7FOSJIdDOnHimCTpyy+lMmXMbZIUFiaVKiWVLm2OP//59FGypFdfPgBIYi85AIWUlyeFhUXp7ben6pprOum333Tm2L//7J+//36LwsMrKCLiCh05Ih07dinPliXJKcklqWh7yZUqJZUvLzmd536tWFGqXFmKjj779fSfnc6zoQxASPL4E4DABEBut/T779K2bdIvv0i7d5977Nkj7dtnQtOfhYVJUVHSFVecPebNm6ymTa9SYmJrlSsnlS0r7d27Wc89N1gzZnykmJgoRUSYkaDTX93ubOXkZOv0j6OsrCw1bRqjnTtdKls28sztubnSiRPS8eNnjz///dgxyeUyx6FDZ78eOiQdPGiC3f79Uk7Oua8jIsKEp5gYqUaNc4+aNc1Xp9PH/xEAWInABMBwu03o2bYt/8PlOnvfMmVMePjzUaWKlJR0t15+eYjuvrudrrhCqlBBKnHeSsj69evrwQcf1LBhw87ctmzZMrVt21YZGRm68sorPdaalZUlp9Mpl8ulyMiijTB54nZLf/xhgtO+febYv1/KzDTh8JdfpPR08+c/ByunU6pbV6pX78KjUiWvlgjA/zwGJtYwAUFo/37pp58uPA4fPnuf6tWlOnWkZs2k7t1NGKhTR6pVy0xh5TdFlZQ0Q7GxfXT11QU/95VXXqnMzMzz6tmv8PBwVbJBsnA4zPRcxYq66OvIzTUhKj3dHDt3mmC5ZYu0cKH5t9OioqTGjaUmTc5+bdRI8nLWA2AhAhMQwPLypK1bpVWrpNRUad06E4x++838e0SE1LCh+SV+550mINStK111lVkg7QutW7fWl19+ec5t8+fPV/PmzXXZZZf55kl9ICxMqlbNHK1bX/jvhw+bALV1q7Rpk3nf58+XkpPPTl3WrHk2QF13nRQfb25jvRQQeJiSAwKE2y3t2mWC0emAtHq1lJVl/v30aNGfRzrq1JHCi/mx6MiRI9q2bZsk6dprr9Ubb7yhDh06qGLFiqpRo4aGDRumX3/9VR9++KEk01agcePGGjBggPr3768VK1YoKSlJU6ZMUbdu3Qr1nL6ckvO1EyfOBqj1683XdeukX381/x4VJTVvbsLT6aMQs5QAfIs1TECgOn5c+uEHackSadkyE5IOHjT/FhNjftGe/sUbF2fWE/nCwoUL1aFDhwtu79u3ryZOnKgHHnhAu3bt0sKFC8/826JFizRkyBBt2LBBVatW1dNPP62kpKRCP2cgB6aC7Ntn/hv++ThwwPxb9epSy5ZS27ZS+/bSNdeYES4AfkNgAgLF77+bYLR0qQlJqanSqVNmsXFCgvmFejocRUdbXa1vBWNgOp/bbdZGnQ5PK1dK339velOVKye1aSO1a2cCVHy8mV4F4DMEJsCujh0z4ejbb82RlmZ+iVatan5RtmtnRhwaNw690YZQCEz5yc424WnJEmnxYhOgDx82YallS+mGG6TERPPn4k61AjgHgQmwi9xcac0aE45SUswvw5MnzeX6nTpJHTua0YTatVkUHKqB6Xy5udKPP54NUAsXmpHIyEjpxhtNeLr5ZvM9A6BYCEyAlVwuad48s8XHnDnml13ZslKHDiYkdepkrmIL9YB0PgJT/nJzzUL/+fPNsWKF6RVVt+7Z8NSxo/keA1AkBCbA33bsMAHpyy+lRYvML7SmTaUuXaRbbjHTKQF0db0lCEyFk5UlffedCeXz50vbt5vpuxtvlLp2Nd9zXIEHFAqBCfC13FyzWPfLL6XZs6WNG812Hx06mF9Yt99ueu+g8AhMl2bbNumrr6SZM800ntsttWplwlPXrlL9+hYXCNgXgQnwhbw8aflyado06fPPTdfnqCjptttMSEpMNFc64dIQmIrvwAHp669NeJo3z7SpuPpqE5y6dzeNNJkKBs4gMAHe4nabvkjTpkmffWY2pK1WTbrnHvMLqFWr0LuazduSk5OVnJys3NxcbdmyhcDkJceOmYsNZs40o6AHD5p1Tz16SD17misxgRBHYAKKw+2W1q41IenTT02n7ehoE5B69DC9cs7ffBbFxwiT7+TkmHVPU6dKX3whHTokxcaa4PSXv3DFHUIWgQm4FHv3Sh9/LE2caLa5qFRJ6tbNhKTrr2ckydcITP5x8qRZLD5tmhl9OnLEfH/37Ws+FDCtjBBCYAIK68QJadYsE5LmzzcLt++6S+rTx1x1xJVt/kNg8r+jR82I06RJ0v/+ZzZnvvtu8/3fsSMfEhD0CEyAJ2vXSu++K02ZYvomJSRIDzwg3Xuv2ZYE/kdgstbu3dJHH5nwtGWL2euuTx/p4YeZskPQIjAB+Tl61KzhGDfObEVRrZoJSX36cOm1HRCY7MHtNi0zJk0yHyiyskxzzKQkc0Uo27MgiBCYgD9bt86EpI8/Nnt03XKL+eF/66388LcTApP9HD1q1jqNHXv2Q0b//mbUqVo1q6sDio3ABOTmmgWtI0eazW6rVJH69TM/6GkoaU8EJntbs8Z88Jg82az9u/126dFHzVo/ejshQHn8zuWCaAQtl0t64w3Tb6Z7d3P5/+efS7/8Ir30EmEJuFTXXWcC09690qhRZjugm26SmjSR3n/fNMkEgg0jTAg627ZJb78tTZggZWdL990nPfGE+SGPwMAIU2Bxu82+iSNHmsaYFStKAwZIjzzCdB0CBlNyCA1ut7RwofmB/eWXpm/SwIHmqFLF6upQVASmwLV9uxl1Gj/ejDT17Cn9/e9m9AmwMabkENzy8qTp06XmzU2vmB07pPfek9LTpRdfJCwB/lanjvngsmeP9Npr0uLFUtOm5qq60xsCA4GIwISAlJNjrnRr3NisTypf3jSbXLfOLOguXdrqCoHQFhkpDR5spsg//NB8iGnf3mwnNGuW+bADBBICEwJKdrYZQWrQQOrdW7rqKmn5cmnBArPolCt0AHu57DLz/+q6ddJXX5mO4V27mlGnzz4jOCFwEJgQEI4dMwu569Qxi0nj4kyH7q++klq3tro6eEtycrJiY2MVHx9vdSnwMofj7LTc0qVmMfi990rNmplpdYIT7I5F37C148elMWOkV1+VDh6U7r9feuYZqWFDqyuDL7HoOzQsWya98IL07bdmxOmFF6Q77zQtQAA/Y9E3AtPJkyYo1a1rrrC54w6zp9WkSYQlIFi0aSOlpJhRpyuuMJv9xsWZRrMsDofdEJhgKzk5JhQ1aCANGiR16CD9/LNZt3TVVVZXB8AX2rY1o0yLFkkVKkh33WWC05w5BCfYB4EJtuB2m3UMTZqYTXCvu05av95cCVe3rtXVAfCH9u2l//3P9FQrW9aseerY0exdB1iNwATLLV9uhua7d5dq1DA/HKdPlxo1sroyAFa4/noz2vTVV9KBA1KLFmaB+NatVleGUEZggmW2bJG6dTNh6fhxs5Zh3jzThBJAaDt9VV1amtnmaMUKKTbWTNXv3291dQhFBCb43aFD0pAhZgQpNVX66CNp9WqpUyerKwNgN2FhZpp+yxbplVekTz6R6teX3nxTOnXK6uoQSghM8JvcXLN4u3598/XFF6XNm6W//IXLiAFcXOnS0lNPmWm5++6TnnzStCKYN8/qyhAq+DUFv1i6VIqPl/76V+nmm01QGjZMKlXK6soABJKoKNNyZM0aqXJl6ZZbTNuRbdusrgzBjsAEn9qzR+rVS2rXzgytL19upuCqVbO6MgCB7JprzNV006aZdU6NGpmmtocPW10ZghWBCT5x8qRZb9Cggdnn7YMPpO+/ZxsTAN7jcJir537+WRo+XHrrLfMz56OP6N8E7yMwweuWLjX7Qz33nJSUZBZrPvQQ65QA+Mbll0vPP2+m+tu1k/r0Mf2btmyxujIEE36FwWv++MOsUWrXToqMNGsMXn9dcjqtrgyBgs13URw1apgpuvnzpd27zaLwl14yI95AcbH5LorN7ZamTpUGD5ZOnJBGjJAGDDBrloBLwea7KK7jx01Yeu01qV496d13zRYsQAHYfBe+tWOH1LmzWdh9/fXSpk3SI48QlgBYq3Rps45yzRozyt2unfkgd+iQ1ZUhUBGYcElycqT//ldq3NiEpC+/lD79VKpa1erKAOCsJk3MusrkZGnKFOnqq83PKhaFo6gITCiyjRulhATTR2ngQPP322+3uioAyF9YmBn53rTJbMXUo4fZloktVlAUBCYUWk6OWZ907bWm18myZWZRd5kyVlcGAJ5Vq2Y29v78c2nJEtO76fPPra4KgYLAhELZvNmMKv3jH2Zx99q1UqtWVlcFAEXXrZu0YYPUvr10zz1Sz57SwYNWVwW7IzDhotxusw3BtddKLpfp1P3qq2xpAiCwVa5sRpc++cS0IWjUSJo92+qqYGcEJhRo3z6zNumRR6S+fc3VJi1bWl0VAHiHw2E28t2wwex1eeed0oMPsr0K8kdgQr5mzzZXl6SmSl99ZUaZWKsEIBhVqWJ+5o0fb0adrr3WbOUE/BmBCec4csR0677zTrNGaf166bbbrK4KVhs9erRq166tUqVKKS4uTkuWLLno/SdPnqxrrrlGl19+uapUqaIHH3xQB1kkAhtzOMzo0tq1UqVK5mq6f/9bys21ujLYBYEJZ6Smmk9WkyebrrizZpl5foS2adOmafDgwXr22We1du1atWvXTp07d1Z6enq+91+6dKn69Omjfv36acOGDfrss8+0atUqPfzww36uHCi6unVN36Zhw8z+dDfcIBXwrY4QQ2CC3G7T1K1NG6l8eSktTerf33ziAt544w3169dPDz/8sBo2bKiRI0cqJiZGY8aMyff+K1euVK1atfT444+rdu3aatu2rQYMGKDU1FQ/Vw5cmssuM9uqLFxowlKzZqY5L0IbgSnEZWWZS2offdRsG7B0qdl3CZCkkydPavXq1UpMTDzn9sTERC1fvjzfxyQkJGjPnj2aM2eO3G639u3bp88//1y3XWRuNzs7W1lZWeccgNXatTMfINu3l+64Q/rb39jIN5QRmELYjz9KzZtL33wjffaZ9PbbUkSE1VXBTg4cOKDc3FxFR0efc3t0dLQyMzPzfUxCQoImT56sHj16qGTJkrryyitVvnx5jRo1qsDnGTFihJxO55kjJibGq68DuFQVKkgzZkhvvimNGmVC1K5dVlcFKxCYQpDbLb33nmkRUKaMaRfQvbvVVcHOHOfNz7rd7gtuO23jxo16/PHH9dxzz2n16tWaO3eudu7cqaSkpALPP2zYMLlcrjPH7t27vVo/UBwOh2nYu3Sp2U7l2mvNGk+EFgJTiDlyROrTx1wJ17evaURZt67VVcGuoqKiFBYWdsFo0v79+y8YdTptxIgRatOmjZ566ik1bdpUN998s0aPHq3x48crIyMj38dEREQoMjLynAOwmxYtzAfMG26QunaVhg/nKrpQQmAKIRs3mv/hZ8yQPv5YGjdOKl3a6qpgZyVLllRcXJxSUlLOuT0lJUUJCQn5PubYsWMqUeLcHy1hYWGSzMgUEMgqVJC++MLsePDqq1KXLtIff1hdFfyBwBQiZs0yU3AlSkirVkn33291RQgUQ4cO1fvvv6/x48dr06ZNGjJkiNLT089MsQ0bNkx9+vQ5c/8uXbroiy++0JgxY7Rjxw4tW7ZMjz/+uFq0aKGqVata9TIAr3E4pL//3az/XLnSdAn/6Serq4KvhVtdAHzL7ZZeecVsmnv33dKkSVLZslZXhUDSo0cPHTx4UC+++KIyMjLUuHFjzZkzRzVr1pQkZWRknNOT6YEHHtDhw4f1zjvv6G9/+5vKly+vjh076tVXX7XqJQA+kZhoPoDedZdp9DtpktnYF8HJcQlD5IypB4hjx6SHHpKmTZNeeEH65z/NCBNgd1lZWXI6nXK5XKxngu0dPWp+1n76qWl4+dJL0v/NQiNweOw8yAhTkNq92yxK/PlnszcSn3oAwDfKlJGmTpXi4kxgSkszOyZUqGB1ZfAmxhuC0PLlpr/SgQPmz4QlAPCt/NY1bdxodVXwJgJTkBk/3lzy2qCBmVu/5hqrKwKA0JGYaPblLF1aat1a+vZbqyuCtxCYgkROjjRkiNSvn9lx+9tv2TgXAKxw1VXSsmVSQoLUubP0/vtWVwRvIDAFgSNHzHqlUaPMJrpjx0olS1pdFQCErshIs2Fv//7mePppKS/P6qpQHCz6DnCZmdJtt0lbt0pz5pjhYACA9cLDzYfYevXMxr3bt0sffihdfrnVleFSMMIUwDZuNL0/9u2TliwhLCHwJScnKzY2VvHx8VaXAniFw2GWS8yYYRaEd+hg9qND4KEPU4BatMhMw8XEmJGl6tWtrgjwHvowIRitXm1mBCIjpfnzpVq1rK4If+KxDxMjTAFo5kwzmtS8uRlZIiwBgP3FxZlWL3l5ZkH4+vVWV4SiIDAFmAkTTF+lrl2lr7+WnE6rKwIAFNZVV0lLl0rR0VL79uZqOgQGAlMAef11036/f3/pk0+4Eg4AAtGVV0oLF5o+eZ06mQ+/sD8CUwBwu027/SeflJ59Vhozhn2KACCQOZ3S3LnSLbdId95prp6DvdFWwOZyc6WBA6X33pPeeMNcbQEACHylSkmffSYlJUl9+5rtrIYOtboqFITAZGPZ2dJf/mIuR5040fwPBQAIHuHh5gNx5cqmV9Nvv0mvvGLaEcBeCEw2dfy4dNddZp77iy+kO+6wuiIAgC84HCYkRUWZ0HTihJlRIDTZC4HJho4dMwFpxYqzjc4AAMFt6FAzTTdokNkf9O23CU12QmCymaNHpdtvl1atMmGpfXurKwIA+Msjj5hpugEDzBrWd96RSnB5li0QmGzkyBHTBXbNGnP1RNu2VlcEAPC3v/7VhKaHH5ZOnZLGjSM02QGBySYOH5Y6d5bWrZPmzTNdYAEAoemhh0z7mAcfNNNz779POxmrEZhswOUyYWnDBrO/UKtWVlcEALBa375mpKlPHzM9N2ECoclKBCaLHT0q3XqrtHGjlJIitWhhdUWAdZKTk5WcnKzc3FyrSwFs4f77TWi6/34zLTd+PNNzVnG43e6iPqbID0D+TpwwC7y//15asICwBJyWlZUlp9Mpl8ulyMhIq8sBLDdliglNAweaheBcPed1Ht9RRpgscuqU1KOH2Xjxm28ISwCAgt13n2k58/DDUpky0quvEpr8jcBkgdxc6YEHpDlzpFmzpBtusLoiAIDd9etnlnE88YRUtqz03HNWVxRaCEx+5nabPhtTp5rj1lutrggAECgef9yEpuHDzUjT3/5mdUWhg8DkR2639NRT0rvvmoV799xjdUUAgEAzbJjp2/fkkyY0JSVZXVFoIDD50UsvSa+/Lr31lumtAQDApfj3v81I08CBUoUKZk0sfIvA5CcjR0rPP2++yR9/3OpqAACBzOGQ3nxTOnjQ9GmKjmY9rK/RzcEPpk6Vhgwx03HDh1tdDQAgGDgc0gcfmD1Hu3aV1q+3uqLgRh8mH1u4ULr5ZjNcOmkSl4EChUEfJqDwsrKk66+XfvtNWrFCiomxuqKA5PG3MyNMPrRhg0n97dubfYAISwAAb4uMNG1qwsPNNlt//GF1RcGJwOQjv/5qvnFr1pSmT5dKlrS6IgBAsKpSRZo7V8rIMB/UT5ywuqLgQ2Dygayss/2VvvnGpH8AAHzp6qul2bOlH34wC8Hz8qyuKLgQmLzs1CmpWzcpPd2EpapVra4ICBzJycmKjY1VfHy81aUAAalNG7Pv3PTp0tChpv8fvINF3142cKC5aiElxSzCA1B0LPoGimf0aGnQIGnUKOnRR62uJiCw+a4/jR4tjR1rAhNhCQBglUcekbZulQYPlho0kG66yeqKAh8jTF6yYIFpH/DYY6aZGIBLxwgTUHw5OVKXLqbVwPffm+CEAnkcYSIwecG2bVKLFub46itzaSeAS0dgArzD5ZJatTILwFeuNNuoIF/0YfI1l0u64w7piitMR2/CEgDALpxO6csvTVPLe+81o064NASmYsjNlXr1kvbuNZdyli9vdUUAAJyrbl3p88/NzhNDhlhdTeAiMBXDsGGmUdinnzI3DACwr44dzRVz77wjvfuu1dUEJiaQLtGkSdJrr0kjR0qJiVZXAwDAxSUlST/+aC5OatbMrLtF4bHo+xKsWSMlJEh/+Yv03nvsEQd4G4u+Ad/IzpZuuEHas0davVqqXNnqimyDRd/eduiQ1L271LixlJxMWEJoGD16tGrXrq1SpUopLi5OS5Ysuej9s7Oz9eyzz6pmzZqKiIhQnTp1NH78eD9VC6AgERFmPdPJk1KPHiwCLwqm5IrA7ZYefNDsBL1ggfnGA4LdtGnTNHjwYI0ePVpt2rTRuHHj1LlzZ23cuFE1atTI9zH33nuv9u3bpw8++EB169bV/v37lcNPZsAWqlUza29vvNGsxX3tNasrCgxMyRXB669LTz5projr0sXqagD/aNmypa677jqNGTPmzG0NGzZU165dNWLEiAvuP3fuXPXs2VM7duxQxYoVL+k5mZIDfO/NN81+c9OnS3ffbXU1lmNKzluWLZOeflr6+98JSwgdJ0+e1OrVq5V43pUNiYmJWr58eb6PmT17tpo3b67//ve/qlatmurXr68nn3xSx48fL/B5srOzlZWVdc4BwLcGDzZBqV8/adcuq6uxPwJTIezfb+Z6ExKkl1+2uhrAfw4cOKDc3FxFR0efc3t0dLQyMzPzfcyOHTu0dOlS/fTTT5oxY4ZGjhypzz//XIMGDSrweUaMGCGn03nmiImJ8errAHAhh8Psfep0SvfdJ506ZXVF9kZg8iA3V7r/fvONRCdvhCrHeVc3uN3uC247LS8vTw6HQ5MnT1aLFi1066236o033tDEiRMLHGUaNmyYXC7XmWP37t1efw0ALlS+vPndlpoq/fOfVldjbwQmD156ySzw/uQTqWpVq6sB/CsqKkphYWEXjCbt37//glGn06pUqaJq1arJ6XSeua1hw4Zyu93as2dPvo+JiIhQZGTkOQcA/2jVysyevPqqNG+e1dXYF4HpIhYtkl58UfrXv8zVBECoKVmypOLi4pSSknLO7SkpKUpISMj3MW3atNHevXt15MiRM7dt2bJFJUqUUPXq1X1aL4BL8+ST0s03S717SxkZVldjTwSmAvzxh2lM2b69NHy41dUA1hk6dKjef/99jR8/Xps2bdKQIUOUnp6upKQkSWY6rU+fPmfu36tXL1WqVEkPPvigNm7cqMWLF+upp57SQw89pNKlS1v1MgBcRIkS0ocfmmUnvXub5Sg4Fyty8uF2SwMGSEeOSB99JIWFWV0RYJ0ePXro4MGDevHFF5WRkaHGjRtrzpw5qlmzpiQpIyND6enpZ+5ftmxZpaSk6LHHHlPz5s1VqVIl3Xvvvfr3v/9t1UsAUAiVK0sffyx16iT95z/Ss89aXZG90IcpH5MmSQ88YBp73XOP1dUAoYc+TIB1nnvOrGlatEhq29bqavzGYx8mAtN5tm83mxJ27y5NmGB1NUBoIjAB1snJkTp0kHbvNpv1/un6jWBG48qiOHXKtBCIjpbeftvqagAA8L/wcLMc5fffpb/9zepq7IPA9Ccvv2x6UUyeLJUrZ3U1AABYo1Ytsx3YBx9Ic+ZYXY09MCX3f9LSpPh4c0Xcv/5ldTVAaGNKDrCe2y117iytXy/99JNUoYLVFfkUa5gK49QpE5bcbmnVKqlkSasrAkIbgQmwhz17pMaNpTvuMG0HghhrmApjxAiTnidOJCwBAHBa9erSW2+ZNU2zZlldjbVCfoTpxx+l5s2lYcNMV28A1mOECbAPt9uMMK1aJW3YIFWqZHVFPsGU3MWcOiW1aGE6mqamMroEWC05OVnJycnKzc3Vli1bCEyATWRkSI0ame1TpkyxuhqfIDBdzEsvmQXe338vxcVZXQ2A0xhhAuznk09M653PPjO9CoMMgakg69aZqbi//11ixwbAXghMgP243VK3btKSJdLPPwfd1ByBKT85OVKrVlJ2tpmKi4iwuiIAf0ZgAuxp3z6pQQMzwvT++1ZX41VcJZefMWOkNWtMQy7CEgAAhRMdbTbm/eADM9IUSkJuhCkz06Tj++6Txo61uhoA+WGECbCvvDwpIUE6csQMPgTJBVOMMJ3vqafMf9xXXrG6EgAAAk+JEtK4cWYd0xtvWF2N/4RUYFq0SPr4Y+nVV6WKFa2uBgCAwHTNNdITT5j+hTt3Wl2Nf4TMlNypU1KzZpLTKS1dahIyAHtiSg6wvyNHpIYNpSZNpK+/lhweJ7VsjSm500aONMOHo0cTlgAAKK6yZaVRo6RvvpGmT7e6Gt8LiRGmPXukq6+W+vUze+IAsDdGmIDAceedpkXPpk1SAP/vygiTJA0ZIpUrx15xAAB429tvS4cOmZ0zglnQB6b586XPP5def92sXwIAAN5Ts6Y0fLgJTlu2WF2N7wT1lNyJE2YxWkyMtGBBwC9IA4Iem+8Cgen4cbMAvGlTafZsq6u5JKG9NcrLL0svvCD9+KMUG2t1NQAKizVMQOD59FOpRw8zs3PTTVZXU2ShG5gyMqR69aQBA8x0HIDAQWACAo/bLbVvL/3xh5SWJoWHW11RkYTuou/nnzf7xP3jH1ZXAgBA8HM4TAufjRuld9+1uhrvC8rA9NNPZmPA556TKlSwuhoAAEJDXJz0wAPm9+8ff1hdjXcFZWB66impdm1p4ECrKwEAILS8/LKUnS299JLVlXhX0AWm+fOluXPNfnFBsoMyAAABo0oV6e9/l5KTpfR0q6vxnqBa9J2bK113nWnXvnQpbQSAQMWibyCwHT4s1aljuoC/957V1RRKaC36njxZWrfOXBVHWAIAwBrlyplmlhMmBE8zy6AZYTp5UmrQQGrWTJoxw+pqABQHI0xA4DtxQqpfX0pIkKZOtboaj0JnhOmDD6Rffgm+RWYAAASiUqVMi59p06S1a62upviCYoTp+HGpbl2pQwfp44+trgZAcTHCBASHnBypUSPzO/rrr62u5qJCY4Rp9Ghp3z6zDQoAALCH8HAz8zNnjrkYK5AF/AhTVpZ01VVSt27SuHFWVwPAGxhhAoJHXp5paFmunLRokW0vygr+Eaa335aOHJH++U+rKwFQXMnJyYqNjVV8fLzVpQDwkhIlpFdekZYskebNs7qaSxfQI0xHjkg1a0q9ekmjRlldDQBvYYQJCC6nN+Y9elRavdqWo0zBPcI0bpyZknvqKasrAQAABXE4zFqmtWvNeqZAFLAjTCdOmP3ibr3VtBQAEDwYYQKCj9sttWtnrpxbscJ2o0zBO8I0YYK0f7/0zDNWVwIAADxxOKRnn5W+/1763/+srqboAnKE6dQpqV49qXVracoUq6sB4G2MMAHBye2WmjeXnE7bhabgHGH65BPT1Xv4cKsrAQAAhXV6lOm776Rly6yupmgCboQpN9d0DW3QQJo1y8pKAPgKI0xA8MrLk5o0MVe522gBePCNMH3xhbR5s0moAAAgsJQoIT39tPTNN9LGjVZXU3gBNcLkdkvXXSdFRUkpKVZVAcDXGGECgtvJk1KtWtLtt0vvvmt1NZKCbYRpwQIpLU0aNszqSoDQMnr0aNWuXVulSpVSXFyclixZUqjHLVu2TOHh4WrWrJlvCwQQUEqWlAYNkj76SDpwwOpqCiegAtPbb0tNm0odOlhdCRA6pk2bpsGDB+vZZ5/V2rVr1a5dO3Xu3Fnp6ekXfZzL5VKfPn104403+qlSAIFkwADzdexYa+sorICZktu+3bQSeO89qV8/KyoAQlPLli113XXXacyYMWdua9iwobp27aoRI0YU+LiePXuqXr16CgsL08yZM5WWllbgfbOzs5WdnX3m71lZWYqJiWFKDghyAwZIs2dLu3ZJERGWlhI8U3LvvCNVrGj2jQPgHydPntTq1auVmJh4zu2JiYlavnx5gY+bMGGCtm/frueff75QzzNixAg5nc4zR0xMTLHqBhAYBg+WMjOladOsrsSzgAhMhw9L48dLf/2rVLq01dUAoePAgQPKzc1VdHT0ObdHR0crMzMz38ds3bpVzzzzjCZPnqzw8PBCPc+wYcPkcrnOHLt37y527QDsr2FDqXNn6Y03zIVddhYQgWnSJLPD8SOPWF0JEJoc52365Ha7L7hNknJzc9WrVy/961//Uv369Qt9/oiICEVGRp5zAAgNQ4ZIP/4oLVxodSUXV7iPfxbKy5NGjZK6dZOqV7e6GiC0REVFKSws7ILRpP37918w6iRJhw8fVmpqqtauXatHH31UkpSXlye3263w8HDNnz9fHTt29EvtAAJDp05S48bSm2/a+6Iu248wzZsnbdkiPf641ZUAoadkyZKKi4tTynmNz1JSUpSQkHDB/SMjI7V+/XqlpaWdOZKSktSgQQOlpaWpZcuW/iodQIBwOMxapq++krZutbqagtl+hOntt6W4OCmfn80A/GDo0KHq3bu3mjdvrtatW+vdd99Venq6kpKSJJn1R7/++qs+/PBDlShRQo0bNz7n8ZUrV1apUqUuuB0ATrv/ftNj8Z13pLfesrqa/Nk6MP38szR3rlnDlM9yCQB+0KNHDx08eFAvvviiMjIy1LhxY82ZM0c1a9aUJGVkZHjsyQQAF1OqlPTgg6Z10Kuvmr/bja37MD3xhDR1qpSebnl/BgB+xNYoQOjZulWqX1/6+GMz4uRngduH6cQJ0zL9wQcJSwAABLt69cyib5vsLXcB2wammTOlP/4wgQkAAAS//v2lxYulzZutruRCtg1M48dLbdtKDRpYXQkAAPCHu+6SKlUya5nsxpaB6ZdfpG+/lR56yOpKAACAv5QqJfXpYy72+tP2krZgy8A0YYJUpox0zz1WVwIAAPypf3/pwAFp1iyrKzmX7QJTXp4JTD17SmXLWl0NAADwp4YNzZIcuy3+tl1gWrDAtBFgOg4IPcnJyYqNjVV8fLzVpQCwUP/+Jg/s3Gl1JWfZrg9Tz57SunXShg00qwRCFX2YgNB29KgUHS0984z0j3/45SkDqw/T779LM2ZI/foRlgAACFVlykjdukkffigVfVzHN2wVmKZPl3JyLOnwCQAAbKR3b9P9+4cfrK7EsFVgmjpV6thRuvJKqysBAABW6tBBqlrV7PphB7YJTBkZ0nffmTVMAAAgtIWFSb16mcGUU6esrsZGgemzz6TwcOnuu62uBAAA2EGvXtLBg2ZAxWq2CUxTp0q33CJVqGB1JQAAwA6aNZPq1DGDKlazRWDatUtasYLpOAAAcJbDIXXvbq6gz8mxthZbBKZp06TSpaU77rC6EgAAYCfdu5tpuUWLrK3DFoFp6lSpSxe2QgEAAOeKi5Nq1bJ+Ws7ywLR5s5SWJvXoYXUlAADAbk5Py33xhZSba10dlgemWbPMdFznzlZXAgAA7Oiee6TffpOWLLGuBssD0+zZUmKiCU0AAADni4+XYmKsnZazNDDt3y8tX85ibwBGcnKyYmNjFR8fb3UpAGzEDtNyDnfRd7Xz2jZ4EyaYjXYzM6XKlb11VgCBLisrS06nUy6XS5GRkVaXA8AGVqyQEhKkxYuldu28fnqHpztYOsI0e7bUujVhCQAAXFzLlmav2dmzrXl+ywLT8ePS/PlMxwEAAM9KlJBuu0366iuLnt+ap5UWLJCOHZPuvNOqCgAAQCC5/Xbp55+lbdv8/9yWBabZs6V69aQGDayqAAAABJJOnaSSJaWvv/b/c1sSmPLypC+/NNNxDo/LrAAAAMyOIB07WjMtZ0lgSkszV8bdfrsVzw4AAALVzTebBpbHj/v3eS0JTPPnS2XKmMsDAQAACqtTJyk7W1q61L/Pa1lg6tDBzEMCAAAUVqNGpr3At9/693n9HpiOHjWpMDHR388MAAACncNhRplSUvz7vH4PTIsWSadOEZgAAMCluekmae1a6cAB/z2n3wPT/PlSjRpS/fr+fmYAABAMbrzRfF2wwH/P6ffAtGCBGUqjnQCA87H5LoDCqFZNio317zomv26++/vvUqVK0qRJUp8+l3oWAMGOzXcBePLEE9KsWdLOnV4ZhLHX5runLwH0wS7DAAAghNx0k/TLL9L27f55Pr8GpiVLzDBarVr+fFYAABBsrr9eCgvz3zomvwem9u1ZvwQAAIqnXDnp2mv918DSb4Hp6FFp9Wqm4wAAgHe0bRuEgWnlSiknh8AEAAC8o21badcu6ddfff9cfgtMixdLFSuaywABAACKq00b83XZMt8/l98C05IlJgmWsGT3OgAAEGyuvFKqW9c/03J+iS8nT5opOabjAACAN/lrHZNfAtPatdLx4+ZFAQg8o0ePVu3atVWqVCnFxcVpyZIlBd73iy++0E033aQrrrhCkZGRat26tebNm+fHagGEkjZtpB9/NBeX+ZJfAlNqqnTZZebyPwCBZdq0aRo8eLCeffZZrV27Vu3atVPnzp2Vnp6e7/0XL16sm266SXPmzNHq1avVoUMHdenSRWvXrvVz5QBCQXy8lJcnpaX59nn8sjXKQw+ZF7JmTVEfCcBqLVu21HXXXacxY8acua1hw4bq2rWrRowYUahzNGrUSD169NBzzz1XqPuzNQqAwjp1SoqMlP7zH7NdyiWyx9YoqalS8+b+eCYA3nTy5EmtXr1aiYmJ59yemJio5cuXF+oceXl5Onz4sCpWrFjgfbKzs5WVlXXOAQCFcdllUrNmJmv4ks8D07Fj0saNBCYgEB04cEC5ubmKjo4+5/bo6GhlZmYW6hyvv/66jh49qnvvvbfA+4wYMUJOp/PMERMTU6y6AYSW5s2lVat8+xw+D0w//ijl5kpxcb5+JgC+4jhvPyO3233BbfmZMmWKXnjhBU2bNk2VK1cu8H7Dhg2Ty+U6c+zevbvYNQMIHc2bS5s3S74cnA733amN1aulkiWlxo19/UwAvC0qKkphYWEXjCbt37//glGn802bNk39+vXTZ599pk6dOl30vhEREYqIiCh2vQBC0+lBmTVrpBtu8M1z+HyEKTVVatJE4mchEHhKliypuLg4paSknHN7SkqKEhISCnzclClT9MADD+iTTz7Rbbfd5usyAYS4q6+WLr/ct+uYfD7ClJpK/yUgkA0dOlS9e/dW8+bN1bp1a7377rtKT09XUlKSJDOd9uuvv+rDDz+UZMJSnz599NZbb6lVq1ZnRqdKly4tp9Np2esAELzCw03rIl8GJp+OMB0/Lm3axPolIJD16NFDI0eO1IsvvqhmzZpp8eLFmjNnjmrWrClJysjIOKcn07hx45STk6NBgwapSpUqZ44ninG9LwB40qyZtH69787v0z5Ma9aYsLRihdSqVVGfBkCoog8TgKIaO1Z67DHpyJFLWgZkbR+mDRvM19hYXz4LAAAIdY0aSTk50pYtvjm/zwNTTIzpwAkAAOArjRqZr6cHa7zN54Hp9AsAAADwlYoVpapVpZ9+8s35CUwAACAoNG4cgIHp6FFp504CEwAA8I/GjQNwSm7TJvOVwAQAAPyhUSNp+3azj623+SwwcYUcgKJKTk5WbGys4uPjrS4FQABq0EByu01o8jaf9WHKypI2bqT/EoCiow8TgEuxf78UHS1Nny7dfXeRHmpdH6bISMISAADwnyuuMPlj61bvn9vnm+8CAAD4g8Mh1asnbdvm/XMTmAAAQNCoV48RJgAAgIuqW5fABAAAcFF160p790rHj3v3vAQmAAAQNGrVMl/T0717XgITAAAIGjVrmq+7dnn3vAQmAAAQNKpXl8LCvB+Ywr17OgAAAOuEh0sTJ0re3jDAZ52+AeBS0ekbgJ9Z1+kbAAAgWBCYAAAAPCAwAbCN5ORkxcbGKt7biw8AoJhYwwTAdljDBMDPWMMEAABQXAQmAAAADwhMAAAAHhCYAAAAPCAwAQAAeEBgAgAA8IDABAAA4AGBCQAAwAMCEwAAgAcEJgAAAA8ITAAAAB4QmAAAADwgMAGwjeTkZMXGxio+Pt7qUgDgHA63213UxxT5AQBQFFlZWXI6nXK5XIqMjLS6HADBz+HpDowwAQAAeEBgAgAA8IDABAAA4AGBCQAAwAMCEwAAgAcEJgAAAA8ITAAAAB4QmAAAADwgMAEAAHhAYAIAAPAgvCh3djgcDpfL5ataAISo7OxsZWdnn/n74cOHJZktUgDA15xOZ6Skw+6L7BdXpL3kHA5HpCQSEwAACDZOt9td4Ke0ogYmh8vlyivo37OyshQTE6Pdu3d7ZcPM+Ph4rVq1ivMUwJvvt91emzfP5Y3z8L3t23OdP8KUkZGhFi1aaOPGjapWrZrf6/H1uex0Hr63/XsuO/7c9ua57Haewr7fTqfTKQ8jTEWakrvYif4sMjLSK//jhYWFcZ5C8Mb7bcfXZsea+N7277nKlStnm+9tb57LbueR+N7297ns9HPbm+ey23lO8/R+X2xk6TRbL/oeNGgQ5/ETO742O9bkLXZ7bXb87+YtdnxtdjuPN9nttdnxv7+32PG12e083lSkKbn/U+ADsrKy5HQ65XK5vJoMkT/eb//hvfavPXv2nBlGr169utXlBDW+t/2L99u/ivB+Ozydy6sjTBEREXr++ecVERHhzdOiALzf/sN77V+n32feb9/je9u/eL/9y5vvt1dHmADAG/gUDsDP/DvCBAAAEIwITAAAAB4QmAAAADwgMAEAAHhAYAIAAPDAp4HpjjvuUI0aNVSqVClVqVJFvXv31t69e335lCFp165d6tevn2rXrq3SpUurTp06ev7553Xy5EmrSwtaL7/8shISEnT55ZerfPnyVpcDXJLFixerS5cuqlq1qhwOh2bOnGl1SUFrxIgRio+PV7ly5VS5cmV17dpVmzdvtrqsoDRmzBg1bdr0THfv1q1b65tvvin2eX0amDp06KBPP/1Umzdv1vTp07V9+3Z1797dl08Zkn7++Wfl5eVp3Lhx2rBhg958802NHTtWw4cPt7q0oHXy5Endc889GjhwoNWlAJfs6NGjuuaaa/TOO+9YXUrQW7RokQYNGqSVK1cqJSVFOTk5SkxM1NGjR60uLehUr15d//nPf5SamqrU1FR17NhRd955pzZs2FCs8/q1D9Ps2bPVtWtXZWdn67LLLrvU06AQXnvtNY0ZM0Y7duywupSgNnHiRA0ePFiHDh2yupSgkJycrOTkZOXm5mrLli30YfIjh8OhGTNmqGvXrlaXEhJ+++03Va5cWYsWLVL79u2tLifoVaxYUa+99pr69etX0F3s04fp999/1+TJk5WQkEBY8gOXy6WKFStaXQZQJIMGDdLGjRu9tgM7YFcul0uS+DntY7m5uZo6daqOHj2q1q1bF+tcPg9MTz/9tMqUKaNKlSopPT1ds2bN8vVThrzt27dr1KhRSkpKsroUAMB53G63hg4dqrZt26px48ZWlxOU1q9fr7JlyyoiIkJJSUmaMWOGYmNji3XOIgemF154QQ6H46JHamrqmfs/9dRTWrt2rebPn6+wsDD16dNHlzANGJKK+l5L0t69e3XLLbfonnvu0cMPP2xR5YHpUt5vACiqRx99VOvWrdOUKVOsLiVoNWjQQGlpaVq5cqUGDhyovn37auPGjcU6Z5HXMB04cMB94MCBi96nVq1aKlWq1AW3n96BfPny5cUeGgsFBw4cUFHe671796pDhw5q2bKlJk6cqBIl6BpRFEV9vyXWMPkKe8n5H2uY/OOxxx7TzJkztXjxYtWuXdvqckJGp06dVKdOHY0bN66gu3hcwxRe1CeNiopSVFRUUR8mSWdGlrKzsy/p8aGmKO/1r7/+qg4dOiguLk4TJkwgLF2C4nxvA8DFuN1uPfbYY5oxY4YWLlxIWPIzt9td7OxR5MBUWD/88IN++OEHtW3bVhUqVNCOHTv03HPPqU6dOowuednevXt1ww03qEaNGvp//+//6bfffjvzb1deeaWFlQWv9PR0/f7770pPT1dubq7S0tIkSXXr1lXZsmWtLQ4opCNHjmjbtm1n/r5z506lpaWpYsWKqlGjhoWVBZ9Bgwbpk08+0axZs1SuXDllZmZKkpxOp0qXLm1xdcFl+PDh6ty5s2JiYnT48GFNnTpVCxcu1Ny5c4t3YrfbXdSjUNatW+fu0KGDu2LFiu6IiAh3rVq13ElJSe49e/YU9hQopAkTJrhl2j1ccMA3+vbtm+/7/d1331ldWlBwuVxuSW6Xy2V1KUHtu+++y/f7uG/fvlaXFnQK+hk9YcIEq0sLOg899JC7Zs2a7pIlS7qvuOIK94033uieP3++p4d5zD9+7cMEAIXBGiYAfmafPkwAAACBisAEAADgAYEJAADAAwITAACABwQmALaRnJys2NhYxcfHW10KAJyDq+QA2A5XyQHwM66SAwAAKC4CEwAAgAcEJgAAAA8ITAAAAB4QmAAAADwgMAEAAHhAYAIAAPCAwAQAAOABgQkAAMADAhMAAIAHBCYAAAAPCEwAAAAeEJgA2EZycrJiY2MVHx9vdSkAcA6H2+0u6mOK/AAAKIqsrCw5nU65XC5FRkZaXQ6A4OfwdAdGmAAAADwgMAEAAHhAYAIAAPCAwAQAAOABgQkAAMADAhMAAIAHBCYAAAAPCEwAAAAeEJgAFOiPP/5Q79695XQ65XQ61bt3bx06dKjA+586dUpPP/20mjRpojJlyqhq1arq06eP9u7d67+iAcAHCEwACtSrVy+lpaVp7ty5mjt3rtLS0tS7d+8C73/s2DGtWbNG//znP7VmzRp98cUX2rJli+644w4/Vg0A3sfWKADytWnTJsXGxmrlypVq2bKlJGnlypVq3bq1fv75ZzVo0KBQ51m1apVatGihX375RTVq1CjUY9gaBYCfsTUKgEuzYsUKOZ3OM2FJklq1aiWn06nly5cX+jwul0sOh0Ply5cv8D7Z2dnKyso65wAAOyEwAchXZmamKleufMHtlStXVmZmZqHOceLECT3zzDPq1avXRUeKRowYcWadlNPpVExMzCXXDQC+QGACQswLL7wgh8Nx0SM1NVWS5HBcOErtdrvzvf18p06dUs+ePZWXl6fRo0df9L7Dhg2Ty+U6c+zevfvSXhwA+Ei41QUA8K9HH31UPXv2vOh9atWqpXXr1mnfvn0X/Ntvv/2m6Ojoiz7+1KlTuvfee7Vz507973//87gOKSIiQhEREZ6LBwCLEJiAEBMVFaWoqCiP92vdurVcLpd++OEHtWjRQpL0/fffy+VyKSEhocDHnQ5LW7du1XfffadKlSp5rXYAsApTcgDy1bBhQ91yyy3q37+/Vq5cqZUrV6p///66/fbbz7lC7uqrr9aMGTMkSTk5OerevbtSU1M1efJk5ebmKjMzU5mZmTp58qRVLwUAio3ABKBAkydPVpMmTZSYmKjExEQ1bdpUH3300Tn32bx5s1wulyRpz549mj17tvbs2aNmzZqpSpUqZ46iXFkHAHZDHyYAtkMfJgB+5vFKlksJTADgUw6HI1KSS5LT7XbTlAmA5QhMAGzHYfoWlJN02M0PKQA2QGACAADwgEXfAAAAHhCYAAAAPCAwAQAAeEBgAgAA8IDABAAA4AGBCQAAwAMCEwAAgAcEJgAAAA/+P/tusZU0EWheAAAAAElFTkSuQmCC\n",
1052 "text/plain": [
1053 "Graphics object consisting of 1 graphics primitive"
1054 ]
1055 },
1056 "metadata": {},
1057 "output_type": "display_data"
1058 },
1059 {
1060 "data": {
1061 "text/plain": [
1062 "3/2*pi"
1063 ]
1064 },
1065 "execution_count": 104,
1066 "metadata": {},
1067 "output_type": "execute_result"
1068 }
1069 ],
1070 "source": [
1071 "y = sqrt(1-(x/3)^2)\n",
1072 "show(plot(y, xmin=-3.1, xmax=3.1, ymin=-0.2, ymax=1.1))\n",
1073 "integral(y, x, -3, 3)"
1074 ]
1075 },
1076 {
1077 "cell_type": "markdown",
1078 "metadata": {},
1079 "source": [
1080 "## Differential equations\n",
1081 "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n",
1082 "\n",
1083 "A [differential equation](https://en.wikipedia.org/wiki/Differential_equation) is an equation involving an unknwon function and its derivatives. They can be of two kinds: *ordinary* differential equations ([ODE](https://en.wikipedia.org/wiki/Ordinary_differential_equation)) and *partial* differential equations ([PDE](https://en.wikipedia.org/wiki/Partial_differential_equation)). The latter involve multivariate functions and their partial derivatives.\n",
1084 "\n",
1085 "Differential equations are in general hard to solve *exactly* (or *symbolically*): even a simple equation of the form $f'(x)=g(x)$, where $g(x)$ is someknown function, requires solving the integral $\\int g(x)\\mathrm{d}x$ in order to find $f$, which as we know is not always easy!\n",
1086 "\n",
1087 "Theoretical results on differential equations usually ensure the existence and/or uniquess of a solution under certain conditions, but in general they do not give a way to solve them. There exits many methods to find approximate solutions, and some of them are implemented in Sage as well (see [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]). However we will focus on the simple ODEs that can be solved exactly.\n",
1088 "\n",
1089 "Let's start with a simple example. Let's find all functions $f(x)$ such that $f'(x)=f(x)$. In order to do so, we need to use the `function()` construct, which allows us to define an \"unknwon\" function inside Sage, like we define variables with `var()`."
1090 ]
1091 },
1092 {
1093 "cell_type": "code",
1094 "execution_count": 108,
1095 "metadata": {},
1096 "outputs": [
1097 {
1098 "data": {
1099 "text/plain": [
1100 "_C*e^x"
1101 ]
1102 },
1103 "execution_count": 108,
1104 "metadata": {},
1105 "output_type": "execute_result"
1106 }
1107 ],
1108 "source": [
1109 "var('x')\n",
1110 "function('f')\n",
1111 "equation = derivative(f(x)) == f(x)\n",
1112 "desolve(equation, f(x)) # f(x) is the unknown function"
1113 ]
1114 },
1115 {
1116 "cell_type": "markdown",
1117 "metadata": {},
1118 "source": [
1119 "As you can expect, they are all the functions $Ce^x$ for some constant $C$. The constant $C$ plays the same role as the constant in the solution of an integral, but in this case Sage writes it explicitly.\n",
1120 "\n",
1121 "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:"
1122 ]
1123 },
1124 {
1125 "cell_type": "code",
1126 "execution_count": 109,
1127 "metadata": {},
1128 "outputs": [
1129 {
1130 "data": {
1131 "text/plain": [
1132 "3*e^x"
1133 ]
1134 },
1135 "execution_count": 109,
1136 "metadata": {},
1137 "output_type": "execute_result"
1138 }
1139 ],
1140 "source": [
1141 "desolve(equation, f(x), (0,3))"
1142 ]
1143 },
1144 {
1145 "cell_type": "markdown",
1146 "metadata": {},
1147 "source": [
1148 "You can also solve *second order* equations, that is equations where the second derivative also appears. In this case if you want to specify an initial condition you should write the triple of values $(x_0, f(x_0), f'(x_0))$."
1149 ]
1150 },
1151 {
1152 "cell_type": "code",
1153 "execution_count": 112,
1154 "metadata": {},
1155 "outputs": [
1156 {
1157 "data": {
1158 "text/plain": [
1159 "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)"
1160 ]
1161 },
1162 "execution_count": 112,
1163 "metadata": {},
1164 "output_type": "execute_result"
1165 }
1166 ],
1167 "source": [
1168 "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n",
1169 "desolve(equation, f(x), (0, 0, 0))"
1170 ]
1171 },
1172 {
1173 "cell_type": "markdown",
1174 "metadata": {},
1175 "source": [
1176 "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n",
1177 "\\begin{align*}\n",
1178 " \\begin{array}{rlcrl}\n",
1179 " (A) &\n",
1180 " \\begin{cases}\n",
1181 " f(0) &= 1\\\\\n",
1182 " f'(0) &= 0\\\\\n",
1183 " f''(x) &= -f(x)\n",
1184 " \\end{cases}\n",
1185 " & \\qquad \\qquad &\n",
1186 " (B) &\n",
1187 " \\begin{cases}\n",
1188 " f(0) &= 0\\\\\n",
1189 " f'(0) &= 1\\\\\n",
1190 " f''(x) &= -f(x)\n",
1191 " \\end{cases}\n",
1192 " \\end{array}\n",
1193 "\\end{align*}"
1194 ]
1195 },
1196 {
1197 "cell_type": "code",
1198 "execution_count": 116,
1199 "metadata": {},
1200 "outputs": [
1201 {
1202 "name": "stdout",
1203 "output_type": "stream",
1204 "text": [
1205 "cos(x)\n",
1206 "sin(x)\n",
1207 "_K2*cos(x) + _K1*sin(x)\n"
1208 ]
1209 }
1210 ],
1211 "source": [
1212 "eq = derivative(f(x), x, 2) == -f(x)\n",
1213 "conditions1 = (0,1,0)\n",
1214 "conditions2 = (0,0,1)\n",
1215 "print( desolve(eq, f(x), conditions1) )\n",
1216 "print( desolve(eq, f(x), conditions2) )\n",
1217 "print( desolve(eq, f(x)) )"
1218 ]
1219 },
1220 {
1221 "cell_type": "markdown",
1222 "metadata": {},
1223 "source": [
1224 "### A real-world example\n",
1225 "\n",
1226 "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n",
1227 "\n",
1228 "Consider an object moving with constant acceleration $a$. Its velocity at time $t$ is described by the formula $v(t) = v(0) + at$. For example an object falling from the sky has acceleration $g\\sim 9.8 m/s^2$ towards the ground, so its velocity is $v(t) = -gt$.\n",
1229 "\n",
1230 "However in the real world you need to take into account the air's resistance, which depends (among other things) on the velocity of the object. In this case the acceleration $a(t)$ is not constant anymore, and it satisfies an equation of the form $a(t)=-g -kv(t)$, where $k$ is some constant that may depend on the shape and mass of the object (in practice it may be more complicated than this).\n",
1231 "\n",
1232 "Since the acceleration is the derivative of the velocity, we have a differential equation\n",
1233 "\\begin{align*}\n",
1234 " v'(t) = -g -kv(t)\n",
1235 "\\end{align*}\n",
1236 "and we can try to solve it with Sage!"
1237 ]
1238 },
1239 {
1240 "cell_type": "code",
1241 "execution_count": 120,
1242 "metadata": {},
1243 "outputs": [],
1244 "source": [
1245 "var('t')\n",
1246 "function('v')\n",
1247 "g = 9.8\n",
1248 "k = 1.5\n",
1249 "conditions = (0, 0) # Start with velocity 0\n",
1250 "sol = desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)\n",
1251 "#plot(sol, xmin=0, xmax = 100)"
1252 ]
1253 },
1254 {
1255 "cell_type": "markdown",
1256 "metadata": {},
1257 "source": [
1258 "If you want to solve this equation symbolically (that is, keeping $g$ and $k$ in symbols) you need to specify that $t$ is the *independent variable* of the equation:"
1259 ]
1260 },
1261 {
1262 "cell_type": "code",
1263 "execution_count": 121,
1264 "metadata": {},
1265 "outputs": [
1266 {
1267 "data": {
1268 "text/plain": [
1269 "-(g*e^(k*t) - g)*e^(-k*t)/k"
1270 ]
1271 },
1272 "execution_count": 121,
1273 "metadata": {},
1274 "output_type": "execute_result"
1275 }
1276 ],
1277 "source": [
1278 "var('t', 'g', 'k')\n",
1279 "function('v')\n",
1280 "conditions = (0, 0) # Start with velocity 0\n",
1281 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)"
1282 ]
1283 },
1284 {
1285 "cell_type": "markdown",
1286 "metadata": {},
1287 "source": [
1288 "# Basic data analysis and visualization\n",
1289 "\n",
1290 "## Statistics\n",
1291 "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n",
1292 "\n",
1293 "Sage includes the most basic functions for statistical analysis."
1294 ]
1295 },
1296 {
1297 "cell_type": "code",
1298 "execution_count": 122,
1299 "metadata": {},
1300 "outputs": [
1301 {
1302 "name": "stdout",
1303 "output_type": "stream",
1304 "text": [
1305 "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1306 "Mean:\t\t\t 5/13\n",
1307 "Median:\t\t\t 1\n",
1308 "Mode:\t\t\t [3]\n",
1309 "Standard deviation:\t 2*sqrt(29/13)\n",
1310 "Variance:\t\t 116/13\n",
1311 "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n"
1312 ]
1313 }
1314 ],
1315 "source": [
1316 "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1317 "\n",
1318 "print(\"Values:\\t\", L)\n",
1319 "\n",
1320 "print(\"Mean:\\t\\t\\t\", mean(L))\n",
1321 "print(\"Median:\\t\\t\\t\", median(L))\n",
1322 "print(\"Mode:\\t\\t\\t\", mode(L))\n",
1323 "\n",
1324 "print(\"Standard deviation:\\t\", std(L))\n",
1325 "print(\"Variance:\\t\\t\", variance(L))\n",
1326 "\n",
1327 "print(\"Moving average (5):\", moving_average(L,5))"
1328 ]
1329 },
1330 {
1331 "cell_type": "markdown",
1332 "metadata": {},
1333 "source": [
1334 "You can also compare your data to a probability distribution, see [this page](https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html). If you need to do more advanced statistics you should consider using [R](https://www.r-project.org/); you can also use it inside Sage."
1335 ]
1336 },
1337 {
1338 "cell_type": "markdown",
1339 "metadata": {},
1340 "source": [
1341 "## Plotting\n",
1342 "**Reference:** [[15](https://doc.sagemath.org/html/en/reference/plotting/index.html)], more specifically the subsection [[16](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html)].\n",
1343 "\n",
1344 "Some Sage objects can be plotted:"
1345 ]
1346 },
1347 {
1348 "cell_type": "code",
1349 "execution_count": 123,
1350 "metadata": {},
1351 "outputs": [
1352 {
1353 "data": {
1354 "image/png": "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iYyMdPl5hw8fZs+ePXkSavGcY8fggQfMPm2PPQbPPANl1L5WiqlcuXKEhYURHx9P9+7dc8/Hx8fTtWtXl18nNTVVPxuEiIgIPv300zznVq1aRfPmzSlbtqzrL+TqrO9CjgL98ssvVmpqqvXkk09alStXtlJTU63U1FTr2LFjudc0aNDA+uijj3K/njZtmuVwOKyPPvrI2rJli3XfffdZtWvXtjIzMwud3S6+o3379laTJk2sxMREKzEx0br++uutTp065bnmz5+LY8eOWY888oiVkJBg7d6921q9erUVERFhXX755fpc2GDbNstq2NCyqlSxrKVL3fccrXoLTO+9955VtmxZa+HChda2bdus0aNHW5UqVbJ+/vlny7Isa/z48VZ0dHTu9c8//7y1bNkya9euXdZ3331njR8/3gKspe78cIotjh07lptHANasWbOs1NRU65dffrEs6/zPxk8//WRVrFjRGjNmjLVt2zZr4cKFVtmyZa0PP/zwj0tcynPcmij179/fAs47Vq9enXsNYL3++uu5X+fk5FhTpkyxatWqZQUHB1s333yztWXLlgv86xRvdvjwYatv375WlSpVrCpVqlh9+/Y9b2nvnz8XJ0+etKKioqxLL73UKlu2rHXllVda/fv3t9LT0z0ffID74APLqlzZskJDLauQbg4lQolS4IqLi7Pq1q1rlStXzmrWrJm1du3a3D/r37+/dcstt+R+PX36dOvqq6+2ypcvb/3tb3+zWrdubX322Wc2RC3u9kcriL8e/fv3tyzr/M+GZVnWmjVrrBtvvNEqV66cVa9ePWvevHl//mOX8pwg678Tm4qh2C8gIt7t3DkYPx6ee85M3H71Vahc2T3PiouLIy4ujuzsbHbt2oXT6aRq1arueZiIBDKXZnQrURKRQh04YJKjr76CmTNh1CjwxCLUzMxMHA6HEiURcReXfpJp+qWIFCgx0TSPzMmB1auhTRu7IxIR8SyvajgpIt7BsmDOHLjlFqhfH775RkmSiAQmJUoikseJExAdbbYjGTbMVJK00lpEApWG3kQk1w8/QI8e8OOP8M47cN99dkckImIvVZREBIBPPoHmzeH0adiwQUmSiAgoURIJeNnZ8Pjj0LUr3HYbbNoEjRvbHZWIiHfQ0JtIADt0CPr0gS++gGnT4NFHPbP0X0TEVyhREglQyclw991w8iSs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\n",
1355 "text/plain": [
1356 "Graphics object consisting of 1 graphics primitive"
1357 ]
1358 },
1359 "execution_count": 123,
1360 "metadata": {},
1361 "output_type": "execute_result"
1362 }
1363 ],
1364 "source": [
1365 "f = sin(x)\n",
1366 "plot(f)"
1367 ]
1368 },
1369 {
1370 "cell_type": "markdown",
1371 "metadata": {},
1372 "source": [
1373 "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n",
1374 "\n",
1375 "You can give a number of options to adjust the aspect of your plot, see [here](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html#sage.plot.plot.plot). Let's see some of them:"
1376 ]
1377 },
1378 {
1379 "cell_type": "code",
1380 "execution_count": 129,
1381 "metadata": {},
1382 "outputs": [
1383 {
1384 "name": "stdout",
1385 "output_type": "stream",
1386 "text": [
1387 "hello\n"
1388 ]
1389 },
1390 {
1391 "data": {
1392 "image/png": "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\n",
1393 "text/plain": [
1394 "Graphics object consisting of 1 graphics primitive"
1395 ]
1396 },
1397 "metadata": {},
1398 "output_type": "display_data"
1399 }
1400 ],
1401 "source": [
1402 "f = sin(x)\n",
1403 "p = plot(f,\n",
1404 " -2*pi, 2*pi, # bounds for x\n",
1405 " ymin = -1.1, ymax = 1.1, # bounds for y\n",
1406 " color = \"red\",\n",
1407 " title = \"The sin function\",\n",
1408 " )\n",
1409 "print(\"hello\")\n",
1410 "show(p)"
1411 ]
1412 },
1413 {
1414 "cell_type": "markdown",
1415 "metadata": {},
1416 "source": [
1417 "Some of the options are not described precisely in Sage's documentation, but you can find them on [matplotlib's documentation](https://matplotlib.org/stable/contents.html). You can find many examples online for adjusting your plot as you like!"
1418 ]
1419 },
1420 {
1421 "cell_type": "markdown",
1422 "metadata": {},
1423 "source": [
1424 "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:"
1425 ]
1426 },
1427 {
1428 "cell_type": "code",
1429 "execution_count": 134,
1430 "metadata": {},
1431 "outputs": [
1432 {
1433 "data": {
1434 "image/png": "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\n",
1435 "text/plain": [
1436 "Graphics object consisting of 2 graphics primitives"
1437 ]
1438 },
1439 "metadata": {},
1440 "output_type": "display_data"
1441 }
1442 ],
1443 "source": [
1444 "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n",
1445 "exponential = plot(exp(x), (x,-2,0.5))\n",
1446 "\n",
1447 "show(cosine + exponential) # works like print()"
1448 ]
1449 },
1450 {
1451 "cell_type": "markdown",
1452 "metadata": {},
1453 "source": [
1454 "Finally, there are other types of plots that you can use, like [scatter plots](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html#sage.plot.scatter_plot.scatter_plot) and [bar charts](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html#sage.plot.bar_chart.bar_chart). You can also add [text](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html#sage.plot.text.text) to your plot:"
1455 ]
1456 },
1457 {
1458 "cell_type": "code",
1459 "execution_count": 138,
1460 "metadata": {},
1461 "outputs": [
1462 {
1463 "data": {
1464 "image/png": "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ceJETjvtNHbeeWdWrFjB9ddfz/e//32ampo48MADue+++5gyZUrncxcvXsyyZcvYf//9Afja177GIYcc0uX13/GOd6zDnkvSENlhDtSugslz4aWp5a5m5BtoikrFkZlaoJniX73f7LZuFMXAkigGmgTcUOI1FrWvm1di3X3t61YD+5VYP541o0OtwKRu6z/Zvi499thjXaLiT3/6084Ro/e85z0JSFdddVWXkaOFCxd2/kV//fXXD2lUTSmlpUuX9jky1KGtrS298cYbPZZ3PHddRo4WLFiQampqEpC22Wab9MILL/T6OqXWddQApAMOOCC1tLT02OZrX/ta5zb/9V//1WetvcmOHAHpmmuu6bFNc3NzmjJlSgJSTU1Nevjhh3ts09dn8fDDD3d+FpMnT05//etfe2zz29/+tnOb6dOn91j/zDPPdNZ4xRVXDGjfHDmStC4GP3LUlupOeXeq+Q9S3Sn/lKDNkaN+boOac5RSagXuan84s9vq6cDY9vD03fZle2TnHUXEeGCH9od3ZJ8cEdOBjklAP0op3VLi/f8KnND+sAa4KiKeiYiVEfE0sEvHtnfc0eXlmT+/OOg1c+bMzlGhP/zhDyW3qampYc899+z+9uvspZde6vx5r7326nW7iGD8+PFD/v4AF1xwAW1tbUQEc+fOZauttup1277WjRkzhiuuuKLkqNApp5zSubxjJG5dHHjggRx11FE9lm+00UZcfvnlALS1tXHppZcO6nUvueQS2traAPjhD3/Ixhtv3GObj370o/zLv/wLAPfddx/333//IKvvqb6+vuTPkrRebL6I1Zs8z6n3wOpNnoPNHyp3RSPe2lytdkf7/S4RsWFm+cz2+98DdwMrgQLF02Ed9sq853y62ifz8497e/OU0l1Ax2zfnYAvANsD/xc4CXgZeoajjsd9haOObaZMmVLyF+W62mKLLTp/LkfDwLa2Nn73u+KZ0BkzZjB16toPre677769njLaaKONeP/73w/A008/vdbv0eG4447rdd306dOZNGkSALfeeuugXrdj+4aGBnbfffdetzv++ON7PGddZL/Hb6ONNlrn15OkTps9DpOu7Xr74LfZaGUt594OG62shQ9+u+c2mz1e7spHlMHOOYLe5x3NbL+/I6X0VvsVbR+h67yjjm3eABZ3e93J7fdvAQv7qeFeioGoFvjvlNJb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\n",
1465 "text/plain": [
1466 "Graphics object consisting of 3 graphics primitives"
1467 ]
1468 },
1469 "metadata": {},
1470 "output_type": "display_data"
1471 }
1472 ],
1473 "source": [
1474 "b = bar_chart(range(1,10))\n",
1475 "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n",
1476 " marker = \"*\", # symbol\n",
1477 " markersize = 100,\n",
1478 " edgecolor = \"green\",\n",
1479 " facecolor = \"red\"\n",
1480 " )\n",
1481 "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n",
1482 "show(b + s + t)"
1483 ]
1484 },
1485 {
1486 "cell_type": "markdown",
1487 "metadata": {},
1488 "source": [
1489 "## Interpolation\n",
1490 "**References:** [[17](https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial)] and [[18](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html)].\n",
1491 "\n",
1492 "When you need to work with a discrete set of data, like measurements of real-world quantities, it can be useful to visualize a \"smoothed out\" version of this data, for example by plotting a function that approximates it.\n",
1493 "\n",
1494 "One way to do so is finding the lowest-degree polynomial that passes through all your points. This is called [Lagrange Polynomial](https://en.wikipedia.org/wiki/Lagrange_polynomial)."
1495 ]
1496 },
1497 {
1498 "cell_type": "code",
1499 "execution_count": 139,
1500 "metadata": {},
1501 "outputs": [
1502 {
1503 "data": {
1504 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkoAAAGECAYAAADJKQ/AAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAABZEklEQVR4nO3deZyNdf/H8dc1M5axzNyVLUtEi0aiNCFCkbhLou2mfRHZ0qa0oeWWypKaISoqlfuWkEqpREYbibIrdYekRDNkDDPz/f3xNfMzZsZs55zvWd7Px+M8jjlznet6nzOXmc/5Xt/FM8YgIiIiIvlFuQ4gIiIiEqxUKImIiIgUQoWSiIiISCFUKImIiIgUQoWSiIiISCFUKImIiIgUQoWSiIiISCGCrlDyrDjP8zzXWURERCSyxQT4eEXObpmamkp8fDypqamByCMiIiKRqVgNMkHXoiQiIiISLFQoiYiIiBRChZKIiIhIIVQoiYiIiBRChZKIiIhIIQI96k1ERER84MAB+PZbWLMGtmyBv/6C6GioWhVOPBGaNYOmTSFKTSJlokJJREQkRPz9N8ydC6+/Dp9+Cunp9vGaNeGYY8AYWzDt2GEfP+YYuPRSuP56OP980AyFJac6U0REJMj9+ScMHw5168I110BqKjz6KHz1FezfD7/9BuvWwfr19t9799pCasAA+Pxz6NgRWrSwRZYpckZDOZxnAvuOFXmwtLS03Akn4+LiApFJREQkKB04AGPHwhNPQHY29Otni5+GDYu/D2Ng4UL497/tfZcu8NxzcNJJ/ssdIvwz4aTnee08z5vned6vnucZz/MuO+L7nud5Iw59P93zvEWe5zUp6XFEREQiWUoKNG8ODz0Et94KP/8MY8aUrEgCe7mtY0f4+GPborRune2/9Oqr/kgdfkpz6a0ysAoYWMj3hwJ3Hfp+IvAb8JHneVVLlVBERCSCZGXBiBHQvj3Ex8OKFTBuHFSvXrb9ep7tr7RmDVx1FdxwA/TpAwcP+iR22CpxZ25jzHxgPsCR69YeWsh2CPCEMebtQ4/dAOwAepcxq4iISFjbuROuvBI++8z2SXrwQTuSzZcqV4apU6FdO+jbF7ZuhZkzoUoV3x4nXPh61NuJQC1gQc4DxpgMz/MWA+cW9ISMjAwyMjJyv05LS/NxJBERkeC3YQNcfDGkpdm+RO3b+/d4N90E9epBjx720tyCBbYFS/Ly9ai3Wofudxzx+I7DvpfHqFGjiI+Pz73Vq1fPx5FERESC22efQevWUL68Hcnm7yIpR6dOsGgRbNxoi7S//w7McUOJv6YHOHJ0m1fAYwAMGzaM1NTU3NuWLVv8FElERCT4LFgAF10EZ55ph/KfeGJgj9+iBXzwAaxaZVuX1GcpL18XSr8duj+y9agG+VuZAKhQoQJxcXF5biIiIpHggw9sB+sLLoD33oN//MNNjpYt7Yi4Tz+FO+90kyFY+bpQ+glbLF2Y84DneeWB9sDnPj6WiIhIyFqwALp3h86d4e23oWJFt3kuuACSkuxt4kS3WYJJiTtze55XBTh8mqoTPc9rDuwyxvzied544AHP8zYBm4AHgH3AG8CkMicWEREJccuWQc+ecOGF8NZbtm9SMLjtNli9GgYPhrPOsi1Nka7EM3N7ntcB+LSAb71ijLnx0BQBw4G+wDHAV8AAY8xqNDO3iIhEuE2b4Nxz4eST7SSQlSq5TpTXwYNw3nnw++920d0wHglXrJm5tYSJiIhIgOzYYUe3VawIS5bAcce5TlSwn36ys4JffLFdgDdMF9P1zxImIiIiUnIHDsDll0N6uu3EHaxFEtiRd5MmwZtv2skoI5kKJRERkQAYPNj2TXr7bTjhBNdpitarl+1HNWgQ7NrlOo07KpRERET8bNIkeOEFSE62l95CxfPPQ0YG3H236yTuqFASERHxoy++sK0yAwfCLbe4TlMyxx8PzzwD06bZjueRSJ25RURE/GT3btspuk4dWLwYypVznajkjIEOHeyCvatWQYyvV4l1R525RUREXDHGtiClpdlO0aFYJIEd8TZ+PKxbZy8hRhoVSiIiIn4wcSLMng1Tp0L9+q7TlM2ZZ8LNN8Pw4ZHXsVuFkoiIiI999x3cdZftl3TZZa7T+MYTT9jJKB991HWSwFIfJRERER86cADOOQeysux0AK7XcPOlf/8bRo60s4uHwhQHRQitPkpJSUkkJCSQmJjoOoqIiEipPf44rFkDr74aXkUS2Lmg4uJs61KkUIuSiIiIjyxfDq1awcMP2/484WjMGLj/ftiwARo2dJ2mTLTWm4iISKDs3w8tWthWpC+/DN1RbkXZtw9OOgk6d7bzK4Ww0Lr0JiIiEspGjIAffoBXXgnfIgmgUiV44AF47TXYuNF1Gv9ToSQiIlJGq1bZGawfeQROP911Gv/r0wdq1LCvOdypUBIRESmDrCzo2xcaN4Z773WdJjAqVIAhQ2zr2fbtrtP4lwolERGRMnjhBfjqK3tfvrzrNIHTt68tmJ591nUS/1KhJCIiUkq//grDhsFtt0GbNq7TBNY//gH9+tkZyNPSXKfxHxVKIiIipTRkiB3l9uSTrpO4MWQIpKfD5Mmuk/iPCiUREZFSWLAAZs6EsWPhmGNcp3Gjdm3o1QuSkmxfrXCkQklERKSEDh60rSnt20Pv3q7TuDVgAPz8M8yf7zqJf6hQEhERKaHkZDsz9fjx4BVr2sLwdc45kJgIzz/vOol/qFASEREpgT/+sMuT9OkDzZu7ThMcBg6EDz8MzwkoVSiJiIiUwCOP2PvHHnObI5hcdRVUq2ZHwIUbFUoiIiLFtGqVHeE1ciRUr+46TfCoWBFuvRWmTrVrwYUTFUoiIiLFYAzccQeccgr07+86TfDp0wdSU2HWLNdJfEuFkoiISDG8/TYsXmw7cIfzorel1bAhnH8+vPSS6yS+FTSFUlJSEgkJCSQmJrqOIiIiksfBg3YG7i5d4KKLXKcJXjffbIvJH35wncR3PGNMII9X5MHS0tKIj48nNTWVuLi4QGQSERE5qkmT7OW2b7+FZs1cpwle6elw/PF2bqUnnnCdpkjFmtghaFqUREREgtHevTBiBFx7rYqkosTG2gk4p02DzEzXaXxDhZKIiMhRjB8Pu3fDo4+6ThIabr7ZLhb80Ueuk/iGCiUREZFC/PEHPPWUvZTUoIHrNKGhRQs47TR4/XXXSXxDhZKIiEghnnjCLlHywAOuk4QOz7OX3+bMgb//dp2m7FQoiYiIFOCnn+yabvfdZ2edluLr3dsWSe+84zpJ2alQEhERKcAjj9gC6Y47XCcJPQ0bQqtW8MYbrpOUnQolERGRI6xbZ/vYPPQQVK7sOk1ouuYa+OAD2LnTdZKyUaEkIiJyhJEjoV49uOUW10lC11VX2WVf3nrLdZKyUaEkIiJymNWr4b//hQcfhAoVXKcJXTVqwIUXhv7oNxVKIiIihxk5EurXhxtvdJ0k9F19NSxdCtu3u05SeiqUREREDlm1yl4qevhhKF/edZrQd+mlEB0Ns2e7TlJ6WutNRETkkJ494bvvbGfucuVcpwkPnTtDVhZ88onrJPlorTcREZHiWrHCtnw8/LCKJF+6/HJYvDh0R7+pUBIREcEufHvyyXZYu/jOZZdBdnboTj6pQklERCLesmUwbx4MHw4xMa7ThJeaNeG882DWLNdJSidoCqWkpCQSEhJITEx0HUVERCLME0/AKafAv/7lOkl4uvxy+OgjSE11naTk1JlbREQi2vffwxlnwNSpmhLAX7ZutRN4Tp8eVJc21ZlbRESkKE8+CSecEFR/wMNO3bpwzjkwZ47rJCWnQklERCLWDz/AjBkwdKhGuvlbt27w4Ydw4IDrJCWjQklERCLWU09B9epw882uk4S/Sy6BPXtgyRLXSUpGhZKIiESkbdtg2jS46y6IjXWdJvw1awZ16sC777pOUjIqlEREJCI98wxUrgz9+rlOEhk8z7YqzZsHgR1HVjYqlEREJOL88QdMngyDB4MGWAfOJZfAjz/Cxo2ukxSfCiUREYk4zz5rWzgGD3adJLJ07Ggvc86b5zpJ8alQEhGRiJKaCs8/by+5HXec6zSRJTbWFkuh1E9JhVIA/fHHHzRu3Jjo6Ghmhepc7kFswoQJeJ7Hueeey759+1zHCUs6hyUcJCdDerrtxC2Bd8klkJICu3e7TlI8IVMovf3221x00UVUq1YNz/NYuXJlgdt98cUXXHDBBVSuXJl//OMfdOjQgfT09DzbpKenU6lSJdavX09KSgpt2rThuOOOIzY2lsaNGzNu3LgC992hQ4dS59+zZw9du3alWrVqjBgxgmuuuYaPP/74qM8ZNWoUnucxZMiQUh+3uP773//SvHlzKlWqRP369Xn66afzfH/RokV4npfvtn79+nz7GjFiBP86tA5A3759adSoEbGxsVSvXp3u3bsX+JxFixYxYsSIUud//fXXuffee5kwYQK7du3i8ssv5+DBg3m2+fPPP+nSpQu1a9emQoUK1KtXj4EDB5KWllbq4+aYOHEiZ5xxBnFxccTFxdG6dWvmz59f6PZ9+/bF8zzGjx+f7/HivF+Hn8MAGRkZPPjgg9SvX58KFSrQqFEjXn755XzPC8Q5PGrUKBITE6latSo1atTgsssuY8OGDaU+bnHs37+fG2+8kaZNmxITE8Nll11W4HZJSUmcdtppxMbGcuqpp/Lqq6/m+f6aNWu4/PLLadCgQYE/n8PdeOON3H///blfv/fee7Rs2ZLY2FiqVatGz5498z1n2rRpTJs2rTQv0ae2b99O7969OfXUU4mKigrI75hgsX8/jB9vZ+CuXdt1msj0z39CVpZd0iQU+LxQ8jwvxvO8xz3P+8nzvHTP8zZ7nveI53llOtbff/9NmzZtePLJJwvd5osvvqBLly507tyZr7/+mmXLljFw4ECiovIe+qOPPqJevXo0btyYypUrM3DgQD777DPWrVvHQw89xEMPPcTkyZMB2LhxIzNmzMjz/BUrVjCvBBdYMzIy6N69O8cccwwffvghDz/8MOPGjePyyy9n2bJlBT5n2bJlTJ48mTPOOKPYx8kxYsQIbizBPPzz58/nmmuuoV+/fqxevZrk5GTGjh3L888/n2/bDRs2sH379tzbySefnG+bd955h+7duwPQokULpk6dyrp16/jwww8xxtC5c2eysrIAmDRpEr///nvucw8cOMCYMWPyFTlH8/7779OvXz9mzpzJoEGD+Oyzz/j111+5/vrryc7Ozt0uKiqK7t27884777Bx40amTZvGxx9/TD8fDHmpW7cuTz75JMuXL2f58uVccMEFdO/enTVr1uTbds6cOXz11VfULuC3dFHvV47Dz2GAq666ik8++YSXXnqJDRs28Oabb+Z+L9Dn8OLFixkwYABffvklH330EZmZmXTu3Jm///672Mcr6TmclZVFbGwsgwcPplOnTgVuM3HiRIYNG8aIESNYs2YNI0eOZMCAAXneh3379tGwYUOefPJJatWqVejxsrOzee+993LP81mzZnHddddx0003sWrVKpYuXUrv3r1ztx83bhx79uzJ/XrPnj2MHTu22K+vKDfeeGOJPmhkZGRQvXp1HnzwQZo1a+azHKFg+nTbkfuee1wniVz16kFCAixY4DpJMRljfHoDHgR2AhcDDYArgD3AHaYYUlNTDWBSU1ML/P5PP/1kAPPtt9/m+17Lli3NQw89VOQxbr75ZnPPPfcU+v0ePXqYa6+91hhjzJ9//mluu+02c+WVV5pmzZqZRx55xHTp0sWsW7fOpKenm4SEBNOnT5/c527evNnExcWZyZMnG2OMyczMND169DDdunUz+/fvz3OcV155xdSsWdOsXbs2z+N79uwxJ598svnoo49M+/btzR133FHkazrc8OHDzQ033FDs7Xv16mWuuOKKPI+NGzfO1K1b12RnZxtjjPn0008NYHbv3n3Uff3yyy+mXLlyhW63atUqA5gffvjBGGPMu+++a1q2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\n",
1505 "text/plain": [
1506 "Graphics object consisting of 3 graphics primitives"
1507 ]
1508 },
1509 "metadata": {},
1510 "output_type": "display_data"
1511 }
1512 ],
1513 "source": [
1514 "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n",
1515 "polring.<x> = QQ[] # you need to specify a polynomial ring\n",
1516 "lp = polring.lagrange_polynomial(points)\n",
1517 "show(scatter_plot(points, facecolor=\"red\")\n",
1518 " + plot(lp, 0, 3) # slightly different notation for polynomials\n",
1519 " + text(lp, (1,8), color=\"black\")\n",
1520 " )"
1521 ]
1522 },
1523 {
1524 "cell_type": "markdown",
1525 "metadata": {},
1526 "source": [
1527 "One can compute the Lagrange Polynomial over any base ring, and it has the advantage that it is a very \"nice\" function (continuous and differentiable as much as you like, with easily computable derivatives and primitives).\n",
1528 "\n",
1529 "However, it does not always give you good approximation of your data:"
1530 ]
1531 },
1532 {
1533 "cell_type": "code",
1534 "execution_count": 142,
1535 "metadata": {},
1536 "outputs": [
1537 {
1538 "data": {
1539 "image/png": "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05/+NOLX3HfffXrooYc0a9YsFRYWqn379jrvvPNqF9OMhJcGmTVHV155pVavXq2FCxdq4cKFWr16ta655pqwrxs9erS2bdtWe3v99dfjUC2AZPHiiy9qypQp+uUvf6kPPvhAw4YN0wUXXKDi4uIGX7du3brDji2nnnpqnCqOvbPPlqqr7QLCseClwBTziSuNMeapp54yfr8/7POqq6tN+/btze9///vax8rLy43f7zePPvpoJLsyxhizcaOdNHLRoohfggRRVFRkJJkVK1bUPrZ8+XIjyXz66af1vu7HP/6xGTduXBwqRDLw+uSDaJrBgwebSZMmHfbYaaedZu644446n7948WIjyezevTsO1bmjqsoYv9+Y3/0uNtu/7jpjhgyJzbYdFFHeSagxTBs3blRJSYlGjRpV+1haWpq+/e1v65///GfE26GFKXktX75cfr9fQ4YMqX1s6NCh8vv9YT8D77zzjrKystSzZ09NnDhR27dvj3W5AJJEZWWlVq1addj5RZJGjRoV9tgyYMAAdejQQeeee64Wx3LAjwtSUqQhQ+yV3LHgpRamhApMJSUlkqR27dod9ni7du1qfxYJAlPyKikpUVZW1lGPZ2VlNfgZuOCCC/Tcc8/p7bff1oMPPqjCwkJ95zvfOWwFe3hffn6+srOzlZOT43YpSDA7duxQVVVVo84vHTp00OOPP65XXnlFr776qnr16qVzzz1X7733XjxKjpuzzrKTV0Y/j/XRmnVg8vl8030+nznkdtSAuJUrV0ZVlO+IiYmMMUc91hACU+KZPn16nYMn6/rc1PW7DvcZuPzyyzVmzBj16dNHY8eO1RtvvKHPPvtMf//732P2npB48vLyVFRUpMJYDchA0mvM+aVXr16aOHGizjzzTJ111lmaPXu2xowZowceeCAepcbNWWfZ1Sc+/9z5bSfCJNJOaco8TLMk/aXmH2vXrl175BO6du3apGLat28vybYydOjQofbx7du3H/WtoCEEpsQzefJkXXHFFQ0+p2vXrvroo49UWlp61M++/vrrRn0GOnTooC5duujzWBwBACSdtm3bKjU19ajWpMaeX4YOHapnn33W6fJcVTMCYvlyqWdPZ7cdCEh9+ji7Tbc0OjAZY3ZI2hGDWtStWze1b99eixYt0oABAyTZfud3331X9957b8TbITAlnrZt26pt27Zhn3fW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\n",
1540 "text/plain": [
1541 "Graphics object consisting of 2 graphics primitives"
1542 ]
1543 },
1544 "metadata": {},
1545 "output_type": "display_data"
1546 }
1547 ],
1548 "source": [
1549 "R = [x/10 for x in range(-10,10)]\n",
1550 "L = [1/(1+25*x^2) for x in R]\n",
1551 "points = [(R[i], L[i]) for i in range(len(L))]\n",
1552 "polring.<x> = RR[]\n",
1553 "lp = polring.lagrange_polynomial(points)\n",
1554 "\n",
1555 "show(plot(lp, -0.92, 0.82) + scatter_plot(points))"
1556 ]
1557 },
1558 {
1559 "cell_type": "markdown",
1560 "metadata": {},
1561 "source": [
1562 "This particular example is called [Runge's phenomenon](https://en.wikipedia.org/wiki/Runge%27s_phenomenon). For a better approximation you can use a [spline](https://en.wikipedia.org/wiki/Spline_(mathematics)), which is a *piecewise* polynomial function:"
1563 ]
1564 },
1565 {
1566 "cell_type": "code",
1567 "execution_count": 143,
1568 "metadata": {},
1569 "outputs": [
1570 {
1571 "data": {
1572 "image/png": "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\n",
1573 "text/plain": [
1574 "Graphics object consisting of 2 graphics primitives"
1575 ]
1576 },
1577 "metadata": {},
1578 "output_type": "display_data"
1579 }
1580 ],
1581 "source": [
1582 "show(plot(spline(points), -1, 1) + scatter_plot(points))"
1583 ]
1584 },
1585 {
1586 "cell_type": "markdown",
1587 "metadata": {},
1588 "source": [
1589 "A detailed explanation of splines is a good topic for a course of numerical analysis. For this course it is enough that you know that they exist and they can be plotted."
1590 ]
1591 }
1592 ],
1593 "metadata": {
1594 "kernelspec": {
1595 "display_name": "SageMath 9.2",
1596 "language": "sage",
1597 "name": "sagemath"
1598 },
1599 "language_info": {
1600 "codemirror_mode": {
1601 "name": "ipython",
1602 "version": 3
1603 },
1604 "file_extension": ".py",
1605 "mimetype": "text/x-python",
1606 "name": "python",
1607 "nbconvert_exporter": "python",
1608 "pygments_lexer": "ipython3",
1609 "version": "3.8.5"
1610 }
1611 },
1612 "nbformat": 4,
1613 "nbformat_minor": 4
1614}
diff --git a/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb b/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb
new file mode 100644
index 0000000..4b81998
--- /dev/null
+++ b/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb
@@ -0,0 +1,1372 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Symbolic expressions\n",
8 "\n",
9 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
10 "\n",
11 "Last time we saw the basics of symbolic expressions:\n",
12 "* How to define and manipulate symbolic expressions\n",
13 "* How to introduce new variables (in the Mathematical sense) with `var()`\n",
14 "* How to solve equations and inequalities\n",
15 "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n",
16 "\n",
17 "Here are some examples to remind you of these basic things:"
18 ]
19 },
20 {
21 "cell_type": "code",
22 "execution_count": 2,
23 "metadata": {},
24 "outputs": [
25 {
26 "name": "stdout",
27 "output_type": "stream",
28 "text": [
29 "[\n",
30 "x == -sqrt(-pi),\n",
31 "x == sqrt(-pi)\n",
32 "]\n",
33 "[\n",
34 "z == -sqrt(pi + x^2),\n",
35 "z == sqrt(pi + x^2)\n",
36 "]\n",
37 "[[y < -2], [y > 1]]\n",
38 "2*pi + e is approximately 9.00146713563863\n"
39 ]
40 }
41 ],
42 "source": [
43 "var('y', 'z') # Define new variables (x is already defined by Sage)\n",
44 "f = x^2 + pi\n",
45 "g = y^2 + y - 2 > 0\n",
46 "print( solve(f==0, x) )\n",
47 "print( solve(z^2 - f, z) )\n",
48 "print( solve(g, y) )\n",
49 "print( 2*pi + e, \"is approximately\", n(2*pi + e) )"
50 ]
51 },
52 {
53 "cell_type": "markdown",
54 "metadata": {},
55 "source": [
56 "Now we will see some more details about solving equations and manipulating their solutions."
57 ]
58 },
59 {
60 "cell_type": "markdown",
61 "metadata": {},
62 "source": [
63 "## Solving equations and inequalities\n",
64 "\n",
65 "**Reference** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)] for the details of `solve()` and `find_root()`, [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html#solving)] for examples.\n",
66 "\n",
67 "Other than equations and inequalities, we can also solve systems: it is enough to give Sage a list of expressions and a list of variables with respect to which we want to solve. For example the system\n",
68 "\n",
69 "\\begin{align*}\n",
70 " \\begin{cases}\n",
71 " x + y = 2 \\\\\n",
72 " 2x - y = 6\n",
73 " \\end{cases}\n",
74 "\\end{align*}\n",
75 "\n",
76 "Can be solved as"
77 ]
78 },
79 {
80 "cell_type": "code",
81 "execution_count": 40,
82 "metadata": {},
83 "outputs": [
84 {
85 "data": {
86 "text/plain": [
87 "[[x == (8/3), y == (-2/3)]]"
88 ]
89 },
90 "execution_count": 40,
91 "metadata": {},
92 "output_type": "execute_result"
93 }
94 ],
95 "source": [
96 "solve([x+y == 2, 2*x - y == 6], [x,y])"
97 ]
98 },
99 {
100 "cell_type": "markdown",
101 "metadata": {},
102 "source": [
103 "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x^2+1$."
104 ]
105 },
106 {
107 "cell_type": "markdown",
108 "metadata": {},
109 "source": [
110 "### The set of solutions\n",
111 "\n",
112 "One would expect the result of `solve()` to be a list of solutions, but it is actually a list of expressions (technically it is not a list but a different type of Python collection, but this is not so important)"
113 ]
114 },
115 {
116 "cell_type": "code",
117 "execution_count": 37,
118 "metadata": {},
119 "outputs": [
120 {
121 "data": {
122 "text/plain": [
123 "x == -3"
124 ]
125 },
126 "execution_count": 37,
127 "metadata": {},
128 "output_type": "execute_result"
129 }
130 ],
131 "source": [
132 "solutions = solve(x^2-9 == 0, x)\n",
133 "solutions[0] # This is the expression 'x == -3'"
134 ]
135 },
136 {
137 "cell_type": "markdown",
138 "metadata": {},
139 "source": [
140 "To read the actual solution without the `x ==` part you can use the `rhs()` or `lhs()` functions, which can be applied to any expression containing a relation operator (like `==`, `<`, `>=`...) and return the *right hand side* and *left hand side* of the expression, respectively"
141 ]
142 },
143 {
144 "cell_type": "code",
145 "execution_count": 41,
146 "metadata": {},
147 "outputs": [
148 {
149 "name": "stdout",
150 "output_type": "stream",
151 "text": [
152 "rhs: 2\n",
153 "lhs: x\n"
154 ]
155 }
156 ],
157 "source": [
158 "f = x == 2\n",
159 "print(\"rhs:\", f.rhs())\n",
160 "print(\"lhs:\", f.lhs())"
161 ]
162 },
163 {
164 "cell_type": "markdown",
165 "metadata": {},
166 "source": [
167 "When you solve an inequality or a system, the set of solutions can be more complicated to describe. In this case the result is a list containing lists of expressions that have to be `True` at the same time. It is easier to explain with an example:"
168 ]
169 },
170 {
171 "cell_type": "code",
172 "execution_count": 38,
173 "metadata": {},
174 "outputs": [
175 {
176 "name": "stdout",
177 "output_type": "stream",
178 "text": [
179 "Simple inequality: [[x < -3], [x > 3]]\n",
180 "System of inequalities:\n",
181 " [\n",
182 "[3 < x, x < 6],\n",
183 "[x < -3]\n",
184 "]\n"
185 ]
186 }
187 ],
188 "source": [
189 "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n",
190 "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))"
191 ]
192 },
193 {
194 "cell_type": "markdown",
195 "metadata": {},
196 "source": [
197 "In the last example (system of inequalities), Sage is telling us that the system\n",
198 "\\begin{align*}\n",
199 " \\begin{cases}\n",
200 " x^2-9 > 9 \\\\\n",
201 " x < 6\n",
202 " \\end{cases}\n",
203 "\\end{align*}\n",
204 "has two solutions:\n",
205 "* $x$ is between $3$ and $6$;\n",
206 "* $x$ is less than $-3$.\n",
207 "\n",
208 "Since in Sage (and in Python) expressions can have at most on relational operator like `<`, the first solution requires two expressions to be described. Hence the \"list of lists\".\n"
209 ]
210 },
211 {
212 "cell_type": "markdown",
213 "metadata": {},
214 "source": [
215 "**Exercise.** In the first exercise you were asked to solve a system of equations, but some of its solutions were complex numbers. Select only the real solutions and print them as pairs $(x,y)$."
216 ]
217 },
218 {
219 "cell_type": "markdown",
220 "metadata": {},
221 "source": [
222 "When solving a system of equations (not inequalities), you can use the option `solution_dict=True` to have the solutions arranged as a *dictionary*, which is a type of Python collection that we did not treat in this course"
223 ]
224 },
225 {
226 "cell_type": "code",
227 "execution_count": 44,
228 "metadata": {},
229 "outputs": [
230 {
231 "data": {
232 "text/plain": [
233 "[{x: 8/3, y: -2/3}]"
234 ]
235 },
236 "execution_count": 44,
237 "metadata": {},
238 "output_type": "execute_result"
239 }
240 ],
241 "source": [
242 "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)"
243 ]
244 },
245 {
246 "cell_type": "markdown",
247 "metadata": {},
248 "source": [
249 "### Alternative method for real roots: `find_root()`\n",
250 "\n",
251 "The `solve()` method is very useful when solving *symbolic* equations, for example when you have two variables and you want to solve for one of them in terms of the other. However, it does not always find explicit solutions.\n",
252 "\n",
253 "When you want to find an explicit, even if approximate, solution, it can be better to use `find_root()`. This function works *numerically*, which means that it finds an approximation of the root. It only works for real solutions and you need to specify an interval where you want the root to be searched:"
254 ]
255 },
256 {
257 "cell_type": "code",
258 "execution_count": 52,
259 "metadata": {},
260 "outputs": [
261 {
262 "name": "stdout",
263 "output_type": "stream",
264 "text": [
265 "Using solve():\n",
266 " [\n",
267 "x == -e^x + 10\n",
268 "]\n",
269 "Using find_root(): 2.070579904980303\n"
270 ]
271 }
272 ],
273 "source": [
274 "f = e^x + x - 10\n",
275 "print(\"Using solve():\\n\", solve(f, x))\n",
276 "print(\"Using find_root():\", f.find_root(0,100))"
277 ]
278 },
279 {
280 "cell_type": "markdown",
281 "metadata": {},
282 "source": [
283 "## Evaluating functions\n",
284 "\n",
285 "If an expression contains only one variable you can evaluate it easily, even if it is not a function."
286 ]
287 },
288 {
289 "cell_type": "code",
290 "execution_count": 21,
291 "metadata": {},
292 "outputs": [
293 {
294 "name": "stdout",
295 "output_type": "stream",
296 "text": [
297 "1\n",
298 "y + 3 > (y + 3)^2\n"
299 ]
300 }
301 ],
302 "source": [
303 "var('y')\n",
304 "f = x^2-3\n",
305 "g = x > x^2\n",
306 "\n",
307 "print(f(2))\n",
308 "print(g(3+y))"
309 ]
310 },
311 {
312 "cell_type": "markdown",
313 "metadata": {},
314 "source": [
315 "If an expression contains more than one variable, you can specify a value for each of them and they will be substituted in alphabetic order. You can also specify a value only for some of the variables."
316 ]
317 },
318 {
319 "cell_type": "code",
320 "execution_count": 38,
321 "metadata": {},
322 "outputs": [
323 {
324 "name": "stdout",
325 "output_type": "stream",
326 "text": [
327 "-2 == 0\n",
328 "3*y == 2\n"
329 ]
330 }
331 ],
332 "source": [
333 "var('y','z')\n",
334 "\n",
335 "f = y*z^2 - y == z\n",
336 "print(f(2, 0))\n",
337 "print(f(z=2))"
338 ]
339 },
340 {
341 "cell_type": "markdown",
342 "metadata": {},
343 "source": [
344 "## Symbolic computations\n",
345 "\n",
346 "Sage can understand and simplify symbolic expressions such as sums (finite or infinite) and products. In the following cell, we compute the following sums using the [`sum()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.sum) function:\n",
347 "\n",
348 "\\begin{align*}\n",
349 " \\begin{array}{llcc}\n",
350 " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n",
351 " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n",
352 " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n",
353 " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n",
354 " \\end{array}\n",
355 "\\end{align*}"
356 ]
357 },
358 {
359 "cell_type": "code",
360 "execution_count": 22,
361 "metadata": {},
362 "outputs": [
363 {
364 "name": "stdout",
365 "output_type": "stream",
366 "text": [
367 "(1) 1/2*n^2 + 1/2*n\n",
368 "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n",
369 "(3) 2^n\n",
370 "(4) 1/6*pi^2\n"
371 ]
372 }
373 ],
374 "source": [
375 "var('k', 'n') # Remember to declare all variables\n",
376 "\n",
377 "s = []\n",
378 "s.append( sum(k, k, 0, n) )\n",
379 "s.append( sum(k^4, k, 0, n) )\n",
380 "s.append( sum(binomial(n,k), k, 0, n) )\n",
381 "s.append( sum(1/k^2, k, 1, infinity) )\n",
382 "\n",
383 "for i in range(len(s)):\n",
384 " print(\"({}) {}\".format(i+1, s[i]))"
385 ]
386 },
387 {
388 "cell_type": "markdown",
389 "metadata": {},
390 "source": [
391 "An alternative notation is `expression.sum(k, a, b)`. There is an analogous [`prod()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.prod) for products."
392 ]
393 },
394 {
395 "cell_type": "markdown",
396 "metadata": {},
397 "source": [
398 "Sometimes Sage tries to keep an expression in its original form without expanding out sums and products. To change this behavior you can use the [`expand()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.expand) function:"
399 ]
400 },
401 {
402 "cell_type": "code",
403 "execution_count": 30,
404 "metadata": {},
405 "outputs": [
406 {
407 "name": "stdout",
408 "output_type": "stream",
409 "text": [
410 "(x + 1)^2 - (x - 1)^2\n",
411 "4*x\n"
412 ]
413 }
414 ],
415 "source": [
416 "f = (x+1)^2 - (x-1)^2\n",
417 "print(f)\n",
418 "print(f.expand())"
419 ]
420 },
421 {
422 "cell_type": "markdown",
423 "metadata": {},
424 "source": [
425 "### The Symbolic Ring\n",
426 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n",
427 "\n",
428 "The symbolic expressions that we have seen so far live in a ring called *symbolic ring* and denoted by `SR` in Sage. This ring works like the ring `ZZ` of integers or `RR` of reals numbers. In particular, you can define matrices and other objects using it as a \"basis\"."
429 ]
430 },
431 {
432 "cell_type": "code",
433 "execution_count": 45,
434 "metadata": {},
435 "outputs": [
436 {
437 "name": "stdout",
438 "output_type": "stream",
439 "text": [
440 "-b*c + a*d\n",
441 "[(-a, 2)]\n"
442 ]
443 }
444 ],
445 "source": [
446 "var('a', 'b', 'c', 'd')\n",
447 "\n",
448 "M = matrix([[a,b], [c,d]])\n",
449 "print(M.determinant())\n",
450 "\n",
451 "polring.<x> = SR[]\n",
452 "f = x^2 + 2*a*x + a^2\n",
453 "print(f.roots())"
454 ]
455 },
456 {
457 "cell_type": "markdown",
458 "metadata": {},
459 "source": [
460 "**Exercise.** Compute the eigenvalues of the matrix\n",
461 "\\begin{align*}\n",
462 "\\begin{pmatrix}\n",
463 "\\cos \\alpha & \\sin \\alpha\\\\\n",
464 "-\\sin\\alpha & \\cos \\alpha\n",
465 "\\end{pmatrix}\n",
466 "\\end{align*}"
467 ]
468 },
469 {
470 "cell_type": "markdown",
471 "metadata": {},
472 "source": [
473 "# Calculus\n",
474 "**Reference:** [[4](https://doc.sagemath.org/html/en/reference/calculus/index.html)] for an overview, but most functions are described in [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]"
475 ]
476 },
477 {
478 "cell_type": "markdown",
479 "metadata": {},
480 "source": [
481 "## Limits and series\n",
482 "\n",
483 "**References:** [[5](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html#sage.calculus.calculus.limit)] for limits, [[6](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.series)] for series\n",
484 "\n",
485 "You can compute limits"
486 ]
487 },
488 {
489 "cell_type": "code",
490 "execution_count": 54,
491 "metadata": {},
492 "outputs": [
493 {
494 "name": "stdout",
495 "output_type": "stream",
496 "text": [
497 "1\n",
498 "0\n"
499 ]
500 }
501 ],
502 "source": [
503 "f = sin(x)/x\n",
504 "# print(f(0)) # This one gives an error\n",
505 "print( f.limit(x=0) )\n",
506 "\n",
507 "print( (e^(-x)).limit(x=infinity) )"
508 ]
509 },
510 {
511 "cell_type": "markdown",
512 "metadata": {},
513 "source": [
514 "**Exercise.** Compute the constant $e$ using a limit."
515 ]
516 },
517 {
518 "cell_type": "markdown",
519 "metadata": {},
520 "source": [
521 "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit."
522 ]
523 },
524 {
525 "cell_type": "code",
526 "execution_count": 55,
527 "metadata": {},
528 "outputs": [
529 {
530 "name": "stdout",
531 "output_type": "stream",
532 "text": [
533 "und\n",
534 "1\n",
535 "-1\n"
536 ]
537 }
538 ],
539 "source": [
540 "f = abs(x)/x # 1 if x>0, -1 if x<0\n",
541 "print( f.limit(x=0) ) # undefined\n",
542 "print( f.limit(x=0, dir=\"+\") )\n",
543 "print( f.limit(x=0, dir=\"-\") )"
544 ]
545 },
546 {
547 "cell_type": "markdown",
548 "metadata": {},
549 "source": [
550 "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`."
551 ]
552 },
553 {
554 "cell_type": "markdown",
555 "metadata": {},
556 "source": [
557 "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does."
558 ]
559 },
560 {
561 "cell_type": "code",
562 "execution_count": 56,
563 "metadata": {},
564 "outputs": [
565 {
566 "name": "stdout",
567 "output_type": "stream",
568 "text": [
569 "1 + 1*x + 1/2*x^2 + Order(x^3)\n",
570 "(-2) + 1*x + 1*x^2 + (-1/6)*x^3 + (-1/12)*x^4 + 1/120*x^5 + 1/360*x^6 + Order(x^7)\n",
571 "1*(x - 1) + (-1/2)*(x - 1)^2 + Order((x - 1)^3)\n"
572 ]
573 }
574 ],
575 "source": [
576 "f = e^x\n",
577 "g = sin(x) - 2*cos(x)\n",
578 "h = log(x)\n",
579 "\n",
580 "print(f.series(x==0, 3))\n",
581 "print(g.series(x==0, 7))\n",
582 "print(h.series(x==1, 3))"
583 ]
584 },
585 {
586 "cell_type": "markdown",
587 "metadata": {},
588 "source": [
589 "## Derivatives\n",
590 "**References:** [[7](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.derivative)] and [[8](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html#sage.calculus.functional.derivative)] for derivatives, [[9](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html#sage.calculus.functions.jacobian)] for the Jacobian matrix and [[10](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.hessian)] for the Hessian."
591 ]
592 },
593 {
594 "cell_type": "markdown",
595 "metadata": {},
596 "source": [
597 "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one."
598 ]
599 },
600 {
601 "cell_type": "code",
602 "execution_count": 57,
603 "metadata": {},
604 "outputs": [
605 {
606 "name": "stdout",
607 "output_type": "stream",
608 "text": [
609 "8*y^3\n",
610 "6*x^2 - 1\n"
611 ]
612 }
613 ],
614 "source": [
615 "var('y')\n",
616 "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n",
617 "print( (2*x^3-x+2).derivative() )"
618 ]
619 },
620 {
621 "cell_type": "markdown",
622 "metadata": {},
623 "source": [
624 "You can also compute higher order derivatives:"
625 ]
626 },
627 {
628 "cell_type": "code",
629 "execution_count": 58,
630 "metadata": {},
631 "outputs": [
632 {
633 "name": "stdout",
634 "output_type": "stream",
635 "text": [
636 "6*x\n",
637 "84*x^5*y + 10*y^4 + 24*x^2*y\n",
638 "1680*x^3 + 48\n"
639 ]
640 }
641 ],
642 "source": [
643 "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n",
644 "\n",
645 "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n",
646 "print( f.derivative(x, x, y) ) # Twice in x, once in y\n",
647 "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y"
648 ]
649 },
650 {
651 "cell_type": "markdown",
652 "metadata": {},
653 "source": [
654 "Jacobian and Hessian matrices are also easy to compute:"
655 ]
656 },
657 {
658 "cell_type": "code",
659 "execution_count": 59,
660 "metadata": {},
661 "outputs": [
662 {
663 "name": "stdout",
664 "output_type": "stream",
665 "text": [
666 "[-2*x + 2*y 2*x]\n",
667 "[ 0 3*y^2]\n",
668 "[ y + 1 x + 1] \n",
669 "\n",
670 "[ 2 -4*y + 1]\n",
671 "[ -4*y + 1 -4*x + 6*y]\n"
672 ]
673 }
674 ],
675 "source": [
676 "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n",
677 "print( jacobian(f, [x,y]), \"\\n\" )\n",
678 "\n",
679 "g = x^2 + x*y + y^3 -2*x*y^2 -3\n",
680 "print( g.hessian() )"
681 ]
682 },
683 {
684 "cell_type": "markdown",
685 "metadata": {},
686 "source": [
687 "*Note:* the notation `f.jacobian([x,y])` is also valid, but only if you specify that `f` is vector by declaring it as `f = vector([...])`."
688 ]
689 },
690 {
691 "cell_type": "markdown",
692 "metadata": {},
693 "source": [
694 "## Integrals\n",
695 "**References:** [[11](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html)] for symbolic integration and [[12](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html)] for numerical methods.\n",
696 "\n",
697 "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n",
698 "When using a computer software to solve your integrals, you have two choices:\n",
699 "\n",
700 "1. You can try to compute a primitive function exactly, and then (if you are computing a definite integral) substitute the endpoints of your integration interval to get the result. We can call this *symbolic integration*.\n",
701 "2. You can get an *approximated* result with a *numerical method*. This method always gives some kind of result, but it cannot be used to compute indefinite integrals.\n",
702 "\n",
703 "Sage can do both of these things, although people that work in numerical analysis and use often the second method tend to prefer other programs, such as Matlab (or its open-source clone Octave)."
704 ]
705 },
706 {
707 "cell_type": "markdown",
708 "metadata": {},
709 "source": [
710 "### Symbolic integration\n",
711 "\n",
712 "Symbolic integrals work more or less like derivatives. You must specify an integration variable, but the endpoints of the integration interval are optional. If they are not given you get an indefinite integral."
713 ]
714 },
715 {
716 "cell_type": "code",
717 "execution_count": 60,
718 "metadata": {},
719 "outputs": [
720 {
721 "name": "stdout",
722 "output_type": "stream",
723 "text": [
724 "1/2*x^2 - cos(x)\n",
725 "0\n",
726 "-1/2*a^2 + 1/2*b^2 + cos(a) - cos(b)\n"
727 ]
728 }
729 ],
730 "source": [
731 "var('a', 'b')\n",
732 "f = x + sin(x)\n",
733 "print( f.integral(x) ) # Alternative: integral(f, x)\n",
734 "print( f.integral(x, -10, 10) )\n",
735 "print( f.integral(x, a, b) )"
736 ]
737 },
738 {
739 "cell_type": "markdown",
740 "metadata": {},
741 "source": [
742 "Your endpoints can also be $\\pm\\infty$:"
743 ]
744 },
745 {
746 "cell_type": "code",
747 "execution_count": 61,
748 "metadata": {},
749 "outputs": [
750 {
751 "name": "stdout",
752 "output_type": "stream",
753 "text": [
754 "1\n",
755 "sqrt(pi)\n"
756 ]
757 }
758 ],
759 "source": [
760 "print( integral(e^(-x), x, 0, infinity) )\n",
761 "print( integral(e^(-x^2), x, -infinity, infinity) )"
762 ]
763 },
764 {
765 "cell_type": "markdown",
766 "metadata": {},
767 "source": [
768 "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:"
769 ]
770 },
771 {
772 "cell_type": "code",
773 "execution_count": 65,
774 "metadata": {},
775 "outputs": [
776 {
777 "name": "stdout",
778 "output_type": "stream",
779 "text": [
780 "1/2*sqrt(pi)*erf(x)\n",
781 "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n"
782 ]
783 }
784 ],
785 "source": [
786 "print( integral(e^(-x^2), x) )\n",
787 "print( integral(e^(-x^2), x, 1, 2) )"
788 ]
789 },
790 {
791 "cell_type": "markdown",
792 "metadata": {},
793 "source": [
794 "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)."
795 ]
796 },
797 {
798 "cell_type": "markdown",
799 "metadata": {},
800 "source": [
801 "### Numerical integration\n",
802 "\n",
803 "In order to get an explicit value for the computations above, we can use a *numerical* method.\n",
804 "\n",
805 "The word \"numerical\" does not have much to do with numbers, but it refers to the fact that we are trying to compute explicit results rather than symbolic or algebraic ones. [Numerical analysis](https://en.wikipedia.org/wiki/Numerical_analysis) is the branch of mathematics that studies methods to approximate computations over the real or complex numbers. With these methods there is usually a trade-off between speed and precision.\n",
806 "\n",
807 "The Sage function [`numerical_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.numerical_integral) takes as a parameter a real-valued one-variable function and the integration endpoints, and it returns both an approximate value for the integral and an error estimate."
808 ]
809 },
810 {
811 "cell_type": "code",
812 "execution_count": 40,
813 "metadata": {},
814 "outputs": [
815 {
816 "data": {
817 "text/plain": [
818 "(0.13525725794999466, 1.5016572202374808e-15)"
819 ]
820 },
821 "execution_count": 40,
822 "metadata": {},
823 "output_type": "execute_result"
824 }
825 ],
826 "source": [
827 "numerical_integral(e^(-x^2), 1, 2)"
828 ]
829 },
830 {
831 "cell_type": "markdown",
832 "metadata": {},
833 "source": [
834 "The result above means, in symbols\n",
835 "\\begin{align*}\n",
836 "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n",
837 "\\end{align*}\n",
838 "\n",
839 "There is also a [`monte_carlo_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.monte_carlo_integral) method for functions with more than one variable."
840 ]
841 },
842 {
843 "cell_type": "markdown",
844 "metadata": {},
845 "source": [
846 "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$."
847 ]
848 },
849 {
850 "cell_type": "markdown",
851 "metadata": {},
852 "source": [
853 "## Differential equations\n",
854 "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n",
855 "\n",
856 "A [differential equation](https://en.wikipedia.org/wiki/Differential_equation) is an equation involving an unknwon function and its derivatives. They can be of two kinds: *ordinary* differential equations ([ODE](https://en.wikipedia.org/wiki/Ordinary_differential_equation)) and *partial* differential equations ([PDE](https://en.wikipedia.org/wiki/Partial_differential_equation)). The latter involve multivariate functions and their partial derivatives.\n",
857 "\n",
858 "Differential equations are in general hard to solve *exactly* (or *symbolically*): even a simple equation of the form $f'(x)=g(x)$, where $g(x)$ is someknown function, requires solving the integral $\\int g(x)\\mathrm{d}x$ in order to find $f$, which as we know is not always easy!\n",
859 "\n",
860 "Theoretical results on differential equations usually ensure the existence and/or uniquess of a solution under certain conditions, but in general they do not give a way to solve them. There exits many methods to find approximate solutions, and some of them are implemented in Sage as well (see [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]). However we will focus on the simple ODEs that can be solved exactly.\n",
861 "\n",
862 "Let's start with a simple example. Let's find all functions $f(x)$ such that $f'(x)=f(x)$. In order to do so, we need to use the `function()` construct, which allows us to define an \"unknwon\" function inside Sage, like we define variables with `var()`."
863 ]
864 },
865 {
866 "cell_type": "code",
867 "execution_count": 4,
868 "metadata": {},
869 "outputs": [
870 {
871 "data": {
872 "text/plain": [
873 "_C*e^x"
874 ]
875 },
876 "execution_count": 4,
877 "metadata": {},
878 "output_type": "execute_result"
879 }
880 ],
881 "source": [
882 "var('x')\n",
883 "function('f')\n",
884 "equation = derivative(f(x)) == f(x)\n",
885 "desolve(equation, f(x)) # f is the unknown function"
886 ]
887 },
888 {
889 "cell_type": "markdown",
890 "metadata": {},
891 "source": [
892 "As you can expect, they are all the functions $Ce^x$ for some constant $C$. The constant $C$ plays the same role as the constant in the solution of an integral, but in this case Sage writes it explicitly.\n",
893 "\n",
894 "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:"
895 ]
896 },
897 {
898 "cell_type": "code",
899 "execution_count": 5,
900 "metadata": {},
901 "outputs": [
902 {
903 "data": {
904 "text/plain": [
905 "3*e^x"
906 ]
907 },
908 "execution_count": 5,
909 "metadata": {},
910 "output_type": "execute_result"
911 }
912 ],
913 "source": [
914 "desolve(equation, f(x), (0,3))"
915 ]
916 },
917 {
918 "cell_type": "markdown",
919 "metadata": {},
920 "source": [
921 "You can also solve *second order* equations, that is equations where the second derivative also appears. In this case if you want to specify an initial condition you should write the triple of values $(x_0, f(x_0), f'(x_0))$."
922 ]
923 },
924 {
925 "cell_type": "code",
926 "execution_count": 6,
927 "metadata": {},
928 "outputs": [
929 {
930 "data": {
931 "text/plain": [
932 "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)"
933 ]
934 },
935 "execution_count": 6,
936 "metadata": {},
937 "output_type": "execute_result"
938 }
939 ],
940 "source": [
941 "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n",
942 "desolve(equation, f(x), (0, 0, 0))"
943 ]
944 },
945 {
946 "cell_type": "markdown",
947 "metadata": {},
948 "source": [
949 "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n",
950 "\\begin{align*}\n",
951 " \\begin{array}{rlcrl}\n",
952 " (A) &\n",
953 " \\begin{cases}\n",
954 " f(0) &= 1\\\\\n",
955 " f'(0) &= 0\\\\\n",
956 " f''(x) &= -f(x)\n",
957 " \\end{cases}\n",
958 " & \\qquad \\qquad &\n",
959 " (B) &\n",
960 " \\begin{cases}\n",
961 " f(0) &= 0\\\\\n",
962 " f'(0) &= 1\\\\\n",
963 " f''(x) &= -f(x)\n",
964 " \\end{cases}\n",
965 " \\end{array}\n",
966 "\\end{align*}"
967 ]
968 },
969 {
970 "cell_type": "code",
971 "execution_count": null,
972 "metadata": {},
973 "outputs": [],
974 "source": []
975 },
976 {
977 "cell_type": "markdown",
978 "metadata": {},
979 "source": [
980 "### A real-world example\n",
981 "\n",
982 "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n",
983 "\n",
984 "Consider an object moving with constant acceleration $a$. Its velocity at time $t$ is described by the formula $v(t) = v(0) + at$. For example an object falling from the sky has acceleration $g\\sim 9.8 m/s^2$ towards the ground, so its velocity is $v(t) = -gt$.\n",
985 "\n",
986 "However in the real world you need to take into account the air's resistance, which depends (among other things) on the velocity of the object. In this case the acceleration $a(t)$ is not constant anymore, and it satisfies an equation of the form $a(t)=-g -kv(t)$, where $k$ is some constant that may depend on the shape and mass of the object (in practice it may be more complicated than this).\n",
987 "\n",
988 "Since the acceleration is the derivative of the velocity, we have a differential equation\n",
989 "\\begin{align*}\n",
990 " v'(t) = -g -kv(t)\n",
991 "\\end{align*}\n",
992 "and we can try to solve it with Sage!"
993 ]
994 },
995 {
996 "cell_type": "code",
997 "execution_count": 7,
998 "metadata": {},
999 "outputs": [
1000 {
1001 "data": {
1002 "text/plain": [
1003 "-98/15*(e^(3/2*t) - 1)*e^(-3/2*t)"
1004 ]
1005 },
1006 "execution_count": 7,
1007 "metadata": {},
1008 "output_type": "execute_result"
1009 }
1010 ],
1011 "source": [
1012 "var('t')\n",
1013 "function('v')\n",
1014 "g = 9.8\n",
1015 "k = 1.5\n",
1016 "conditions = (0, 0) # Start with velocity 0\n",
1017 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)"
1018 ]
1019 },
1020 {
1021 "cell_type": "markdown",
1022 "metadata": {},
1023 "source": [
1024 "If you want to solve this equation symbolically (that is, keeping $g$ and $k$ in symbols) you need to specify that $t$ is the *independent variable* of the equation:"
1025 ]
1026 },
1027 {
1028 "cell_type": "code",
1029 "execution_count": 10,
1030 "metadata": {},
1031 "outputs": [
1032 {
1033 "data": {
1034 "text/plain": [
1035 "-(g*e^(k*t) - g)*e^(-k*t)/k"
1036 ]
1037 },
1038 "execution_count": 10,
1039 "metadata": {},
1040 "output_type": "execute_result"
1041 }
1042 ],
1043 "source": [
1044 "var('t', 'g', 'k')\n",
1045 "function('v')\n",
1046 "conditions = (0, 0) # Start with velocity 0\n",
1047 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)"
1048 ]
1049 },
1050 {
1051 "cell_type": "markdown",
1052 "metadata": {},
1053 "source": [
1054 "# Basic data analysis and visualization\n",
1055 "\n",
1056 "## Statistics\n",
1057 "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n",
1058 "\n",
1059 "Sage includes the most basic functions for statistical analysis."
1060 ]
1061 },
1062 {
1063 "cell_type": "code",
1064 "execution_count": 20,
1065 "metadata": {},
1066 "outputs": [
1067 {
1068 "name": "stdout",
1069 "output_type": "stream",
1070 "text": [
1071 "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1072 "Mean:\t\t\t 5/13\n",
1073 "Median:\t\t\t 1\n",
1074 "Mode:\t\t\t [3]\n",
1075 "Standard deviation:\t 2*sqrt(29/13)\n",
1076 "Variance:\t\t 116/13\n",
1077 "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n"
1078 ]
1079 }
1080 ],
1081 "source": [
1082 "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1083 "\n",
1084 "print(\"Values:\\t\", L)\n",
1085 "\n",
1086 "print(\"Mean:\\t\\t\\t\", mean(L))\n",
1087 "print(\"Median:\\t\\t\\t\", median(L))\n",
1088 "print(\"Mode:\\t\\t\\t\", mode(L))\n",
1089 "\n",
1090 "print(\"Standard deviation:\\t\", std(L))\n",
1091 "print(\"Variance:\\t\\t\", variance(L))\n",
1092 "\n",
1093 "print(\"Moving average (5):\", moving_average(L,5))"
1094 ]
1095 },
1096 {
1097 "cell_type": "markdown",
1098 "metadata": {},
1099 "source": [
1100 "You can also compare your data to a probability distribution, see [this page](https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html). If you need to do more advanced statistics you should consider using [R](https://www.r-project.org/); you can also use it inside Sage."
1101 ]
1102 },
1103 {
1104 "cell_type": "markdown",
1105 "metadata": {},
1106 "source": [
1107 "## Plotting\n",
1108 "**Reference:** [[15](https://doc.sagemath.org/html/en/reference/plotting/index.html)], more specifically the subsection [[16](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html)].\n",
1109 "\n",
1110 "Some Sage objects can be plotted:"
1111 ]
1112 },
1113 {
1114 "cell_type": "code",
1115 "execution_count": 21,
1116 "metadata": {},
1117 "outputs": [
1118 {
1119 "data": {
1120 "image/png": "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\n",
1121 "text/plain": [
1122 "Graphics object consisting of 1 graphics primitive"
1123 ]
1124 },
1125 "execution_count": 21,
1126 "metadata": {},
1127 "output_type": "execute_result"
1128 }
1129 ],
1130 "source": [
1131 "f = sin(x)\n",
1132 "plot(f)"
1133 ]
1134 },
1135 {
1136 "cell_type": "markdown",
1137 "metadata": {},
1138 "source": [
1139 "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n",
1140 "\n",
1141 "You can give a number of options to adjust the aspect of your plot, see [here](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html#sage.plot.plot.plot). Let's see some of them:"
1142 ]
1143 },
1144 {
1145 "cell_type": "code",
1146 "execution_count": 67,
1147 "metadata": {},
1148 "outputs": [
1149 {
1150 "data": {
1151 "image/png": "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\n",
1152 "text/plain": [
1153 "Graphics object consisting of 1 graphics primitive"
1154 ]
1155 },
1156 "execution_count": 67,
1157 "metadata": {},
1158 "output_type": "execute_result"
1159 }
1160 ],
1161 "source": [
1162 "f = sin(x)\n",
1163 "plot(f,\n",
1164 " -2*pi, 2*pi, # bounds for x\n",
1165 " ymin = -0.7, ymax = 0.7, # bounds for y\n",
1166 " color = \"red\",\n",
1167 " title = \"The sin function\",\n",
1168 " )"
1169 ]
1170 },
1171 {
1172 "cell_type": "markdown",
1173 "metadata": {},
1174 "source": [
1175 "Some of the options are not described precisely in Sage's documentation, but you can find them on [matplotlib's documentation](https://matplotlib.org/stable/contents.html). You can find many examples online for adjusting your plot as you like!"
1176 ]
1177 },
1178 {
1179 "cell_type": "markdown",
1180 "metadata": {},
1181 "source": [
1182 "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:"
1183 ]
1184 },
1185 {
1186 "cell_type": "code",
1187 "execution_count": 36,
1188 "metadata": {},
1189 "outputs": [
1190 {
1191 "data": {
1192 "image/png": "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\n",
1193 "text/plain": [
1194 "Graphics object consisting of 2 graphics primitives"
1195 ]
1196 },
1197 "metadata": {},
1198 "output_type": "display_data"
1199 }
1200 ],
1201 "source": [
1202 "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n",
1203 "exponential = plot(exp(x), (x,-2,0.5))\n",
1204 "\n",
1205 "show(cosine + exponential)"
1206 ]
1207 },
1208 {
1209 "cell_type": "markdown",
1210 "metadata": {},
1211 "source": [
1212 "Finally, there are other types of plots that you can use, like [scatter plots](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html#sage.plot.scatter_plot.scatter_plot) and [bar charts](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html#sage.plot.bar_chart.bar_chart). You can also add [text](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html#sage.plot.text.text) to your plot:"
1213 ]
1214 },
1215 {
1216 "cell_type": "code",
1217 "execution_count": 53,
1218 "metadata": {},
1219 "outputs": [
1220 {
1221 "data": {
1222 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkcAAAGGCAYAAABxHyV7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAtOElEQVR4nO3dfZhcdX338fd3d8MGhAyBalVYS1QUNoEQIEErJkEUFEGw0oIPuYUqtBCrctfbCLWCogYK1QisDwhEqpBETW0Rq1IoBAENEBKQBuQpIdiIIEg2xTiE7O/+Y3Y3J7sz+5DM7uyceb+u61yzM+fMzPfMCexnf+d3vhMpJSRJklTSVOsCJEmSxhLDkSRJUobhSJIkKcNwJEmSlGE4kiRJyjAcSZIkZRiOJEmSMgxHkiRJGQ0djqJkQkRErWuRJEljQ0utCxhBg7b+3rBhA4VCgQ0bNoxGPZIkqbaGNBjS0CNHkiRJfdV1OIqI3SJiQUQ8HhGbIuKOiJhe67okSVL9qvfTalcAU4A5wHrgA8CNEdHuF+pKkqTtUbfhKCJ2Bt4DHJ9SurX74fMi4gTgjJoVJkmS6lrdhiNKtTcDf+zz+Cbg8HJPKBaLFIvF3vudnZ0jVpwkSapPdTvnKKW0Efg58I8R8cqIaI6IDwCHAa8o95z58+dTKBR6l7a2ttEsWZKkHRYxekujinqemxMRrwGuAmYCW4B7gIeAg1NK+/fdvtzIUVtbGxs2bGDChAmjVLUkSdtvNENLHUeESob06dXzaTVSSo8CsyLiJcCElNJvImIJsAboF45aW1tpbW0d7TIlSVIdqdvTalkppee7g9FE4Gjg32tdkyRJqk91HY4i4uiIeHtETIqItwE3A78CFta4NEmSVKfqOhwBBaADeBD4F+A24KiU0uaaViVJkupWvc85+i7w3VrXIUmS8qPeR44kSZKqqiHDUUdHB+3t7Uyf7tewSZKkbdV1n6NBDLpjnZ2dFAoF+xxJkuqGfY52yJA+vYYcOZIkSarEcCRJkpRhOJIkScowHEmSJGUYjiRJkjIMR5IkSRkNGY7scyRJkiqxz5F9jiRJdcQ+RzvEPkeSJEnDZTiSJEnKMBxJkiRlGI4kSZIyDEeSJEkZhiNJkqSMhgxH9jmSJEmV2OfIPkeSpDpin6MdYp8jVV9EEBGcd955tS5lSGbPnk1EMHv27FqXIkmqE4YjaZSdcsopvSFz7dq1tS5HktSH4UjaAWvXru0NOt/61rdqXY4kqQoMR5IkSRmGI0mSpAzDkSRJUsawwlFE/CgiUkT8vML6w7vXp4h4LiKay2wzMSK6ureZW+F1XhoRn4+Ild2v88eIWBsR346Iwwd4Ts97/025bT784Q/3zg/ZY489yvY5WrBgARFBS0sLnZ2dA34e2+u5557jC1/4Am984xuZOHEi48aN46UvfSnt7e28+93v5mtf+xpPPfVUv+cN9UqxoV6htXbtWubNm8chhxzCnnvuyfjx45k0aRJHHHEE//zP/8y6desG3Ze77rqL9773vey99960tray1157MWfOHB544IFBnzuQ8847r3d/ofSZnXvuuUyePJldd92VPfbYg9mzZ3PNNdfs0Pv0uO2225gzZw777LMP48ePZ/fdd2fatGl8+tOf5umnny77nIhg0qRJvfdPPfXU3prr7ao+SY1gY60LqB8ppSEvwP+j1D9oM7BrmfWf7l7fsxxaZpsTMuunlFl/FLChz+v0XS4Dmso897+71y9OZbzmNa/pfY3JkyenDRs2JCBt2LChd5vjjz8+AemQQw4p9xI7bPXq1emVr3zlQPuWgHTppZf2e27PunPPPXfA95g1a1YC0qxZsypuc9FFF6Vx48YNWEO552druPTSS1NLS0vZ5+6yyy5p2bJlw/x0tjr33HN7X+uxxx7b5tj1XU488cS0efPm7fostmzZkubOnTvg51AoFNINN9xQ8bMYaCl3rD74wQ/2rl+zZs12f0aSGlOp+9Bwl3sSjOu+HfrzcmhIeadlyCmqZFn3bQtwOPCTPutnl7l/d4VtfkcpzPSKiIOAHwI7UQpgHcC/A88D04BPAZOAud2PzStTXzswq2/h//M//8Ojjz7ae3/16tX87ne/22ablBI/+9nPSkWOUF+cOXPmsH79esaNG8dpp53GO97xDl7+8pfT1dXF+vXrufPOO1m6dOmIvHeP888/n8985jMA7L777px55pkcccQR7Lnnnjz33HPcc889/OAHP+gdtSnnpz/9KcuXL+fAAw/kYx/7GAcccACbNm3iBz/4AV/5ylf4wx/+wJw5c3j44YfZaaeddqjek046iTVr1vC3f/u3nHjiiRQKBe677z4uvPBCHnroIb7//e/zile8gksuuWTYr/2pT32Kjo4OACZN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i2XLlvGJT3yCY489li1btrDTTjv1m6cG0NLS0huYrrrqKhYtWsQDDzzAI488wiOPPFKVq9skafjWsYWVFGkmcSFd3AgcTBc3kbiAIs1s4R7giVoXOjYNtZV234XSXKPsVzx8osJ2N2W2eY4yXxjbZ/vt/uLZ7PKhD32od/uISE899VS/HuKrV6/e5nX/7u/+bsCe41/96ld7t73kkksG3LachQsXDrRPvcvhhx+ennnmmbKv8aUvfani8yZOnJiWLVs2pC+e/eIXv1jxS2N7lsG+eHYgQ6lhIH2/eHbSpEkV63zPe96zQ188e+aZZw74ORQKhfTTn/60Yq3XX399ioiyz/WLZ6XRN/yv19ixZWzu3xMJjkmwvML6X3Svf2JM7dsoqP7Xh/RxJ5DtXHhLhe1uzvxcab5Rr1T62pDXAl+k9D1snUARWEepc9WbU0ofGex1siNFfecb9dhrr722uT/YfKOf/7x0JnHixImccsopA25bzvve9z5uvvlmzjnnHN785jczadIkdtllF3baaSf23ntv3vWud3HttdeybNmyildFnXXWWfzkJz/h6KOPZuLEibS2tjJp0iTmzp3LqlWrhtyG4Oyzz2b16tV8/OMfZ8qUKUyYMIHx48fz6le/miOPPJIFCxawePHiYe/jSJg0aRIrVqzgnHPOYf/992eXXXahUCgwc+ZMvvOd7/D973+flpbtm1jY1NRER0cHt956K+9///t51ate1dsL66CDDuKcc87h4Ycf5qijjqr4Gu985zu56aabOP7443nlK1/Z2zBSkmpnb+BHbL1+qa/DutdX/pqoRhapiv1bxpiKO9bR0UFHRwdbtmzhoYceYsOGDUPqObPPPvvw+OOP89nPfrb3W+01Ms4777ze0385/jcqaQSM9kWko/2/qNHcvxz+73dIn96OjBzVrblz57J69ephfYnounXrePzxxykUCnzsYx8bweokSVItNWQ42h49HbQ/+tGP9nY4liRJ+WMHqCGaM2fOmLl6S5IkjRxHjiRJkjIMR5IkSRkNebVaj87OTgqFwpCvVpMkjX1erVY9OYwIXq0mSZI0XA0Zjjo6Omhvb+/3PVmSJEmeVvO0miTliqfVqieHEcHTapIkScNlOJIkScowHEmSJGUYjiRJkjIMR5IkSRmGI0mSpIyGDEf2OZIkSZXY58g+R5KUK/Y5qp4c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\n",
1223 "text/plain": [
1224 "Graphics object consisting of 3 graphics primitives"
1225 ]
1226 },
1227 "metadata": {},
1228 "output_type": "display_data"
1229 }
1230 ],
1231 "source": [
1232 "b = bar_chart(range(1,10))\n",
1233 "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n",
1234 " marker = \"*\", # symbol\n",
1235 " markersize = 100,\n",
1236 " edgecolor = \"black\",\n",
1237 " facecolor = \"red\"\n",
1238 " )\n",
1239 "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n",
1240 "show(b + s + t)"
1241 ]
1242 },
1243 {
1244 "cell_type": "markdown",
1245 "metadata": {},
1246 "source": [
1247 "## Interpolation\n",
1248 "**References:** [[17](https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial)] and [[18](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html)].\n",
1249 "\n",
1250 "When you need to work with a discrete set of data, like measurements of real-world quantities, it can be useful to visualize a \"smoothed out\" version of this data, for example by plotting a function that approximates it.\n",
1251 "\n",
1252 "One way to do so is finding the lowest-degree polynomial that passes through all your points. This is called [Lagrange Polynomial](https://en.wikipedia.org/wiki/Lagrange_polynomial)."
1253 ]
1254 },
1255 {
1256 "cell_type": "code",
1257 "execution_count": 65,
1258 "metadata": {},
1259 "outputs": [
1260 {
1261 "data": {
1262 "image/png": "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uFx7LaSnw+LFbicpGhVKIiIS8tavt7/IH34YIiLcThNcqlWDNm3s2K9A5DeFUnx8PDExMcTGxrodRUREQsz48XYj15493U4SnK67Dj7+GBIT3U5SeBrMLSIiIW3DBjj/fHjlFejTx+00wWnXLqhd26523quX22kyaTC3iIhIfp58EurWVWuSN9WqBRdeGJjLBKhQEhGRkLV9O/zvfzBqlMYmeVvXrvDRR3DsmNtJCkeFkoiIhKz//heqVoXbbnM7SfC76io4dAhWrnQ7SeGoUBIRkZC0axe8+ircey+ULu12muDXrBlUrw7vved2ksJRoSQiIiFp0iQoVw7uvtvtJKHBceDqq+Hdd91OUjgqlEREJOT89RfMnAlDh0L58m6nCR1XXw07dtixYYFChZKIiIScadPsZq1DhridJLR07Gi7OQOpVUmFkoiIhJTERHjuORgwACpVcjtNaClTBi69VIWS5OKvv/6iYcOGhIeHMz9Q13L3Y8888wyO43DxxRdz5MgRt+MEJd3DEgymT4fkZBgxwu0koenqq+3Mt3/+cTtJwQRMobRgwQIuv/xyKleujOM4bNiwIcfj1qxZw6WXXkrZsmU57bTTaN++PcnJyVmOSU5OpkyZMmzbto1Vq1bRunVrKlWqRGRkJA0bNmTKlCk5nrt9+/ZFzn/o0CG6dOlC5cqVGTduHL169WLZsmV5vmbChAk4jsOwYcOKfN2C+t///kezZs0oU6YMderU4amnnsry+eXLl+M4TrbHtm3bsp1r3Lhx3HTTTQDcfffd1KtXj8jISE4//XTi4uJyfM3y5csZN25ckfO//vrr3H///TzzzDMcPHiQ6667juPHj2c55sCBA1xxxRVUr16dUqVKUatWLQYPHkxSUlKRr5th+vTpnHfeeURFRREVFUWrVq1YunRprsfffffdOI7D1KlTsz1fkPfr5HsYICUlhQcffJA6depQqlQp6tWrx0svvZTtdb64hydMmEBsbCzly5enSpUqXHvttfzwww9Fvm5BHD16lNtuu40mTZoQERHBtddem+Nx8fHxnHvuuURGRnLOOefw6quvZvn85s2bue6666hbt26O35+T3XbbbYwePTrz3++99x4tW7YkMjKSypUr071792yvefnll3n55ZeL8iV61J49e+jZsyfnnHMOYWFhPvkZ4y+OHoWpU6FvXzjjDLfT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hx9o06YNAMePH+eXX37J1n2W20y+t956iwULFrB8+XJuvPFGHnvsMcaPH59rhvLly1P+pH03ypcvT8WKFb3yfgWDnTth/ny7yGQuP0bFBZ07w6hR8MUX0KGD22ly541CqQy2u+1kaRRzKYKDBw/y22+/8ccffwBkFkTVqlWjWrVqOI7D/fffz9ixY2natCnNmjXjlVdeYdu2bcybNw+wP+A6depEmTJlMs8bHx9P7dq1M6dSr1q1iqeffpohBVzXPj4+njVr1vDdd99Rq1atzKn2a9euzTKupCDKly+fbRxH2bJlqVSpklfHd+zfv5958+bRvn17jh49yuzZs3n77bf5/PPPM4+ZOnUqdevWpVGjRhw7dow5c+Ywf/78zEUHU1NTWbp0aZZ1dXbu3Mlbb71F586dOf300/n999+ZOHEikZGRXHnllfnmOnToELfccgtDhgyhS5cu1K5dmxYtWnD11VfTo0ePQn+d77//Pnv37iU2NpZy5cqxZcsWRo4cSevWralbt26hz3eyBx54gC5dulCrVi0OHTrE3LlzWb58OR988AEAlSpVotIpSwCXKFGCatWqcc455wAFe79yuod79uzJY489Rt++fRk/fjz79+/n/vvv5/bbbycyMjLf7J68hwEGDRrEG2+8weLFiylfvjx//vknANHR0QXKU1Rbtmzh2LFjHDx4kEOHDmWutdasWTPAFo9fffUVLVu25O+//2by5Mls2rQpS+F97NgxtmzZkvnfv//+Oxs2bKBcuXLUr1+fffv2sW7dOhYtWpT5mqioKPr378/YsWOpVatWlnXICnKf7t69mwEDBjBx4kTatGnDyy+/zFVXXUWXLl246KKLPPPm5CDj/Tl8+DB//fUXGzZsoGTJkkUukP3Z1KlQsSLceqvbSeRk550HVarYcUr+XCh5o+vtZWA3/788QDfgL2BiQdrBcpv1Nnv27BzHMp3aXTNhwgRTs2ZNU6ZMGdOqVasszeFt2rTJNpvtmWeeMY0aNTJlypQxUVFR5vzzzzcJCQkFmpa7detWExkZmaVbJDEx0dStW9eMHDmyIF9uvnwx6+2vv/4yF110kSlbtqwpU6aM6dixo/nyyy+zHDNx4kRTr149U7p0aVOhQgXTpk0b895772V+ftmyZdmm2f/++++mS5cupkqVKqZEiRKmZs2apmfPnmbbtm0FytW3b1/TpEmTLFPSp02bZipWrGh2795d4K8vw6effmpatWploqOjTenSpU2DBg3MqFGj8l3yoCBuv/12U6dOHVOyZElz+umnm44dO2ZbsuBUp3btFOT9yukeNsbei506dTKRkZGmZs2aZsSIEdm6rXPijXs4p/9PgVy7nHJSlFlvderUyfG6GbZs2WKaNWtmIiMjTVRUlImLi8t2L2Z07Z/6yOiynDVrVo7LCRw7dszce++9pkqVKqZ8+fKmU6dO2Wa95SQ9Pd107NjRXH755ZlLcRhjzPDhw029evXMoUOHCvS1F2XWW05fZ17dwIFq/37bvVPESYHiZb16GXPBBa5dvkB1jWNOdD14iuM45YHHThRIVYA/gDeBR40xOfdvnCQpKYno6GgSExML1fWWn/3793PGGWewa9euPBeSk6IZOnQoqampJCQkuB0laOkedt8111xDmzZtGDlypNtRpICeeAIefxx+/dW2Xoh/efVV29K3bx+cfrrPL+8U5CCPd70ZYw4Bw048/MbBgweZPHmyfsF4SePGjWnVqpXbMYKa7mH3tWnThptvvtntGFJAR4/Cs8/aX8QqkvxTxtDNTz+FG290N0tuPN6ilI98L+atFiUREQktL74I/frBtm1w9tlup5HcnHMOXHqp3azYxwrUohQwm+KKiIgUlDEwZQp07aoiyd916AC5TMj1CyqUREQk6Hz6KWzeDPfc43YSyU+HDrbV78RGEH5HhZKIiASdadOgSRM/n3YuALRrZz+etCKNX1GhJCIiQeXHH+Hdd21rklOgUSjipmrV4Nxz4bPP3E6SMxVKIiISVJ591i4w2bOn20mkoNq3999xSiqUREQkaCQlwezZ0L8/eHEhePGwDh1g+3Y4sfmGX1GhJCIiQeOllyA5GQYOdDuJFEbGOCV/bFVSoSQiIkEhLc12u/XoAdWru51GCqNKFWjUyD/HKXljU1wRERGfe+892LkT3nzT7SRSFB06wIl9xP2K37QoxcfHExMTQ2xsrNtRREQkAE2dChddBBde6HYSKYp27eyMxd9/dztJVtrCREREAt5330HTprY16aab3E4jRfHnn3DGGfDWW3DDDT65pLYwERGR0PDMM1CjBlx3ndtJpKiqVYP69WHVKreTZKVCSUREAtpff8GcOTBoEJQo4XYaKY42bVQoiYiIeNTMmXYF7rvucjuJFFebNrBxo10Py1+oUBIRkYB1/DgkJEDv3lCpkttppLjatIH0dPjyS7eT/D8VSiIiErAWLbKrOQ8d6nYS8YSzz4bKlf2r+02FkoiIBKznnoNLLoEmTdxOIp7gOP43TkmFkoiIBKTvv4cVK2DwYLeTiCe1aWO73o4fdzuJpUJJREQCUkKCXXenWze3k4gntWlj9+tbv97tJJYKJRERCTiJifDaa3D33VoSINicfz5ERvpP95sKJRERCTivvAIpKVoSIBiVLAktW6pQEhERKZL0dIiPh+7dbdebBJ+LL7bjlHy7y1rOVCiJiEhA+eQT2L5dg7iDWcuWdu+3335zO4kKJRERCTDx8XY5gDZt3E4i3tKypf3oDwtPqlASEZGA8euvsGSJbU1yCrT3uwSiqlXhzDNVKGURHx9PTEwMsbGxbkcRERE/NWMGlC8PvXq5nUS87aKLYO1at1OAY3w7UirfiyUlJREdHU1iYiJRUVG+yCQiIgHg6FGoVcsWSVOnup1GvO2ZZ2DkSLsURKlSXrlEgdok/aZFSUREJC//+x/s3w8DB7qdRHzhoovsEhAbN7qbQ4WSiIgEhPh46NzZbpwqwa9ZM9uS5PY4JRVKIiLi99atg6++0pIAoaRkSbjgAhVKIiIi+YqPhzp14Mor3U4ivnTRRSqURERE8rR/P8yda8cmhYe7nUZ86aKL4OefYe9e9zKoUBIREb/20kv24+23u5tDfO+ii+xHN5cJUKEkIiJ+Kz3drp10ww1QubLbacTXatWCatXc7X6LcO/SIiIiefv4Y9v18vrrbicRNziO3c7k66/dy6AWJRER8VvTp0PTpv/fBSOhp3lzWyj5dn3s/6dCSURE/NLu3XZft/79ta9bKGvRAv7+27YsukGFkoiI+KUXXoAyZbSvW6hr3tx+dKv7TYWSiIj4nePHbaHUu7fdBFdCV5UqULu2CiUREZFM774Le/bYbjeRFi1UKImIiGSaPh1atbIDuUVatIBvvrHLRfiaCqUAYAwcPQoHD8K//7o38l9ExBd+/NEuC6DWJMnQogUkJdl7w9f8Zh2l+Ph44uPjSUtLczuK6/bssT8kPv0UNmywN8a///7/50uUgBo1ICbG/sXVsSPExkKE33w3RUSK7vnnoWJF6NHD7STiL04e0H322b69tmN82zyR78WSkpKIjo4mMTGRqKgoX2TyC2lpsGgRvPgifPihbV7MWDukfn27MmmZMrZl6e+/4bffYNMmWLXKVtmVK9uZIX37qqlaRALX0aNQsybceitMmuR2GvEn9epBXBxMnuyxUxZo0Qm1QbjMGPjf/2DsWPjhB9tCNGMGdOtWsOX6U1NthT1vHrz2GkybBpdeCg89BO3ba+0REQks8+bBgQNw991uJxF/kzFOydc0RslF27fDZZfBTTfZSnndOvjiC+jXr+B7GkVE2Fanp5+2i7O9/bZtcbr0UujUCTZv9u7XICLiSTNm2OEEvu5eEf/XvDmsX297YHxJhZILjIFZs2wX2c6dsHQpvPeerZaLo0QJuP56W3G/8w7s2mWvMWIEHDrkmewiIt7y/fewerUGcUvOWrSAw4dtI4MvqVDyseRk6NPHthr16WPHGV1xhWev4TjQtav9ofP443ZgZNOm9geQiIi/mjHDjseMi3M7ifijCy6wH329npIKJR/6+2/o3Bnmz4c5c2wBU6aM965XqhSMHm0LpurVoW1bePhh3zdbiojk5/BhO87yzjtt67jIqU47DRo0UKEUtHbvhksugS1b7LR/X+5ddNZZ8PnnMH48/Oc/cPXVtmgTEfEXb7xhl0Hp18/tJOLPmjdXoRSU9u6FDh3sOKHVq+3ga18LD7cz4T74AL76yvb1btni+xwiIqcyxna7XXWV3dNLJDfnnw/ffefbFbpVKHlZRnfbv//C8uXQsKG7eS67zFbjZcpAmzYatyQi7lu3Dr79VoO4JX/Nmtlu2p07fXdNFUpedOSI/Qtp92670vaZZ7qdyDrzTFi5Es47zy4hsGiR24lEJJRNnw5168Lll7udRPxds2b247ff+u6aKpS8xBjb175hg+3uatTI7URZnXaazdW1K1x3HbzyituJRCQU/f03zJ0Ld91lhwiI5KVKFTs5acMG311TK3N7yZQpdnDi3Ll2HzZ/VLq0zXf33XbrE2PgttvcTiUioeSVV+xM3NtvdzuJBIpmzXxbKHmlRclxnBqO48xxHOeA4zhHHMfZ4DhOc29cyx8tWwb33w+jRsGNN7qdJm9hYXaZgn797A+q2bPdTiQioSJjEHf37lC1qttpJFD4ulDyeIuS4zgVgNXAZ0AXYB9QD/jH09fyR/v2Qe/edgn+J55wO03BhIXZMQKOA3fcAeXKadduEfG+zz+3e1zOmOF2EgkkzZrBH3/Y37dVqnj/et7oehsF7DLG9D3puV9yOzglJYWUlJTMfyclJXkhkm9kjEtKS4NXXw2s/vawMEhIsEsY9O4NlSrZ/eJERLxl+nQ7E7hdO7eTSCDJGNC9caOdye1t3uh6uwb42nGctx3H2ec4zreO4+S6hNiECROIjo7OfNSqVcsLkXxj1iy7x9qsWXYZ/kATFma73jp0sFsIrF/vdiIRCVZ798KCBXZJAMdxO40Eknr1oGxZ33W/OcYYz57QcY6e+M/JwNvAhcBU4G5jTLa5VTm1KNWqVYvExESioqI8ms2bfv4ZGje2K27PnOl2muI5fNh2Hf78s11nqUEDtxOJSLD5z3/sXpS//w4VKridRgJN69Z2SYnXXy/WaQpUonujUDoGfG2Mufik554BYo0x+a5JnZSURHR0dEAVSsZAly52pevNm6F8ebcTFd/+/XZByrQ0WLsWKlZ0O5GIBIu0NNsq0KGDJpBI0QwebLcDK+YOEwUqlLzR9bYHODX6ViBoF6b/3//gww8hPj44iiSAypXh/fftGic33ADHj7udSESCxYcfwq+/woABbieRQNWsmZ0IcOSI96/ljUJpNXDOKc+dDfzqhWu57p9/YNgwO721a1e303jWWWfBvHl2Zsrw4W6nEZFg8fzzds8uf11jTvxfs2Z2v7dNm7x/LW8USlOAixzHecBxnPqO4/QE7gLivXAt140da/dxe+YZt5N4R/v2tqUsPt7OUBERKY5du+Ddd+1CtxrELUXVqJGdWe6LAd0eL5SMMeuAbsDNwCbgYWCYMaZ4Q6780Pbtdkr9gw9CjRpup/Geu+6CIUPsY+VKt9OISCCbNctuyt2zp9tJJJBFRtqlJXxRKHl8MHc+8r1YIA3mvvZa+03ats1uBxLMUlPtBrrbt9vNCLWKrogUVmoq1KkD11yjFmopvt69YedO+OKLIp/CtcHcIeHzz2HxYpgwIfiLJICICHjzTdsn3LOnnbUiIlIY775rV1Tu39/tJBIMmjWzi056+/eRCqUiSE+He++1AxH9fS83TzrjDFssLV8O48a5nUZEAs2MGdCyJTRt6nYSCQZNm9pZbzt3evc6KpSKYN48+OYbmDTJrmYdSjp0sIvEPf44LF3qdhoRCRQ7d9plAdSaJJ7SpIn96O2ZbyH2a7740tNh/Hi4/HK45BK307hj1Ci48krbP7xrl9tpRCQQzJwJp51m12UT8YSqVe2+pN9/793rqFAqpHnz7EqgY8e6ncQ9YWHw2mt25kqfPhqvJCJ5O3YMXnoJbr3V/twQ8QTHsa1KKpT8SHo6PPoodO4MrVq5ncZdFSvaYunzz+Gpp9xOIyL+bOFC+Osvu3aSiCepUPIz8+fbvdxCuTXpZO3b2264hx+GdevcTiMi/mrGDGjbFs491+0kEmyaNIEdO+DoUe9dQ4VSARkDjz1mW5Muvjj/40PF+PF2imavXnD4sNtpRMTfbNtmZ8pqELd4Q+PGtrdn61bvXUOFUgF99JFt3hszxu0k/qVkSXjjDbs2yr33up1GRPzNzJl2k+3u3d1OIsGocWP70Zvdb35TKMXHxxMTE0Osn+6S+PTT0Lw5tGvndhL/06CBfX9mzrQFpYgIQHIyvPwy9O0LpUq5nUaCUfnyULeud5cI0BYmBbBxo+1eevNNuOkmt9P4J2Nst+S2bfaGjY52O5GIuO3VV+1Mtx07oH59t9NIsLrmGjh+vEhr+2kLE0+ZPBlq14brr3c7if9yHHjxRUhMhOHD3U4jIv7g+efhsstUJIl3NW4cIl1v/ur33+0YnGHD7H5nkrvatWHKFJg9G957z+00IuKm776zm5VqSQDxtiZN7O/qv//2zvlVKOUjIcEukHbHHW4nCQy33w5dukC/fnDwoNtpRMQtzz8P1arZbhERb/L2ViYqlPJw7BjMmmX72P1kuJTfcxx44QU7iHPYMLfTiIgbDh+2C9LeeSeUKOF2Ggl2Z59te3y81f2mQikPCxbAvn1a/6OwatSw47pee81ugikioWXuXPj3X9uyLOJtJUtCw4beK5Q06y0P7drZFpLly12NEZCMgU6d7I7hmzZB2bJuJxIRX2nRwna7vfuu20kkVPTsaTdpX7myUC/TrLfi2LwZVqyAAQPcThKYHMeuq/Tnn/DII26nERFf+fpr+OYbtcSLb2Xs+eaNth8VSrl4/nmoUgW6dXM7SeCqV89ucTJ1qvaCEwkVM2ZArVp2UoeIrzRubJen2b3b8+dWoZSDf/+FV16xM91KlnQ7TWAbMQKaNrWDOo8fdzuNiHhTYqJdmPeuuyA83O00EkoyZr55Y5ySCqUczJ8PSUkaiOgJERF2FtymTXabExEJXnPmQEqKXSZExJfq1IFy5WDjxmT27t1LcnKyx86tQikHL78M7dvDmWe6nSQ4NG9uV+t+9FH4+We304iINxhju93i4qB6dbfTSKhZvXoVJSO689CD5ahWrRrly5Xj+u7dWb16dbHPrULpFL/+Cp99Brfd5naS4DJunN1BfMgQ7wy2ExF3ffGFbTnWIG7xtenTp9O2bVtOT1zCJJPOO8DT6elsXbKESy65hBkzZhTr/Foe4BSPPQYTJ9rZWuXK+fzyQW3+fLtf3qJF9q9OEQkeffrYYmn7dgjTn+DiI6tWraJt27YMMYYpZG39SQeGAc85DitXrqR169anvlzLAxSWMXa36+uvV5HkDd27wxVXwD332AHzIhIcDhyA//3PDuJWkSS+NHXyZM4ND89WJHHi31OBc8PDmTplSpGvoVv6JF98AT/+aLcsEc9zHHj2Wdta98QTbqcREU955RVIT4e+fd1OIqEkOTmZRYsX0y81NddiJgzol5rKwoULizzA228Kpfj4eGJiYoiNjXUtw8sv25Hz7dq5FiHo1a8PY8bYGXBbt7qdRkSKyxi77tz118Ppp7udRkJJUlISaenp1MvnuLOAtPR0kpKSinQdvymUBg0axJYtW1jn0sqEycm26bhPHzUde9uoUVC7NgwapIHdIoFu+XI7Lunuu91OIqEmKiqK8LAwfsrnuJ1AeFhYkcc9qyQ4YelSu3ZS795uJwl+pUvDc8/Z2YVvvOF2GhEpjhkz7Iakbdu6nURCTWRkJNfGxfFCRATpuRyTDrwQEUG3bt2IjIws0nVUKJ0wdy40awZnn+12ktBwxRVw3XVw331w6JDbaUSkKPbuhQUL7JIAToHmD4l41rARI9ialsZwyFYsZcx625qWxrDhw4t8DRVKwOHDdpfrG290O0lomTQJ/vkH/vMft5OISFG89JJdfb9PH7eTSKhq06YNCQkJPOs4NImIYCrwDna2W5OICJ5zHBISEnJaGqDAVChhi6TkZBVKvlanjh2vNHmynW0oIoEjLQ1mzrQ/NytUcDuNhLL+/fuzcuVKYuLiuC8sjDjgvrAwYuLiWLlyJf2LuQqqFpwEunWDP/6AtWt9cjk5yZEjdnzD+efD4sVupxGRgnrvPbj6avtz88IL3U4jYiUnJ5OUlERUVFRBxiRpwcmCSEy0A7nVmuSOMmXsUgHvvAMffeR2GhEpqIQEu4+jiyu6iGQTGRlJ1apVizxwOychXygtXmx3u+7Rw+0koatHD7t21bBhcPy422lEJD87d9o/MAcO1CBuCX4hXyi99Ra0bg21armdJHQ5DkybBj/8APHxbqcRkfw8/zxER8NNN7mdRMT7QrpQSkqCjz9Wa5I/aNrU7hM1bhz89ZfbaUQkN0ePwosv2u1KypRxO42I94V0obR0qe3qufZat5MIwGOP2VXRH3zQ7SQikpt58+wmuMWcSCQSMEK6UFq0yM62qlPH7SQCULkyPPoozJoF69e7nUZEcpKQAJ06aXFeCR0hWyilpNjprWpN8i/9+0OjRnDPPdoHTsTffPstrFljB3GLhIqQLZSWL7dbZ6hQ8i8REXYBylWrYOFCt9OIyMmmT4caNaBrV7eTiPhOyBZKixfDmWdCkyZuJ5FTXXYZXHkljBwJx465nUZEwG439PrrcPfd9g8akVDhN4VSfHw8MTExxPpg9bL0dFsoxcVpDRB/9dRT8MsvWi5AxF+8+qr9w+XOO91OIuJbIbmFyVdfQcuWtvutXTuvXEI8YOBAePNNuw9cpUpupxEJXcbAuefaZTzeesvtNCIeoy1McrNokf3FW4zNhMUHxo2zG28++qjbSURC22ef2QVhNYhbQlFIFkqLF9vNHNXP7t+qVLFrKiUkwPbtbqcRCV0JCRATA23bup1ExPdCrlD65RfYssUWSuL/7rnHzrIZOdLtJCKh6Y8/bCv8gAEa0ymhKeQKpaVLITzczqwS/1e6NDz5pG0FXL7c7TQioeeFF+z/h7fc4nYSEXeE3GDua66BxET4/HOPn1q8xBho1crOuPn6a7vNiYh43/HjULeuXTdpxgy304h4nAZznyolBT75xK7RI4HDcewilN9+C6+95nYakdDxzju2623AALeTiLgnpAqlFSvgyBHo0sXtJFJYF18MPXrYwd3//ut2GpHQ8OyzdnZw06ZuJxFxT0gVSkuX2oHBWo07MD35JPz1F0ya5HYSkeD3/fd2iMKQIW4nEXFXSBVK779vW5M0cyMwnXWW/aH91FOwd6/baUSC23PPQfXq0L2720lE3BUyhdLPP9sF09TtFtgeeMCuf6VFKEW8Izk5mR9+2MtrryXTvz+UKOF2IhF3hUyhtHSp/QXbqZPbSaQ4Kla0xdLzz9vCV0Q8Y9WqVVzfvTvly5WjYcNqHE0ux9o13Vm9erXb0URc5fVCyXGcMY7jGMdxpnr7Wnl5/31o0wa8tH2c+NCQIXas2QMPuJ1EJDhMnz6dtm3bsnXJEp5OT+cdYDLp/PzxEi655BJmaG0ACWFeLZQcx4kF7gK+8+Z18nPsmF2s8PLL3UwhnlK6NDz+OCxYAGvWuJ1GJLCtWrWKQYMGMcQYvk9NZRjQFRgGfJ+aymBjGDhwoFqWJGR5rVByHKcc8DrQD/jbW9cpiK++slPKtRp38OjVy05Zvv9+uyCliBTN1MmTOTc8nClk/4UQBkwFzg0PZ+qUKT7PJuIPvNmiFA+8Z4xZltdBKSkpJCUlZXl42rJldmxLs2YeP7W4JCwM/vtfWL3abm8iIoWXnJzMosWL6ZeamusvgzCgX2oqCxcuJDk52ZfxRPyCVwolx3FuAi4AxuR37IQJE4iOjs581KpVy+N5li2DSy+1e7xJ8Ojc2bYSjh4NqalupxEJPElJSaSlp1Mvn+POAtLS073yh6yIv/N4oeQ4Ti1gGtDbGHM0v+PHjBlDYmJi5mPXrl0ezZOUBF9+qdluwWriRNi+HV580e0kIoEnKiqK8LAwfsrnuJ1AeFiYV/bfFPF33mhRag5UAb5xHCfVcZxUoB0wNCIigrS0tCwHlypViqioqCwPT1qxAtLSVCgFq/PPt+OVxo6Fw4fdTiMSWCIjI7k2Lo4XIiJIz+WYdOCFiAi6detGZGSkL+OJ+AVvFEqfAE2AZic9vgZe37BhA+E+7v9atszufn3WWT69rPjQ44/D339raxORohg2YgRb09IYDtmKpXTs7LetaWkMGz7c59lE/IHHCyVjzCFjzKaTH8C/wIHGjRt7+nL5WrbMtiZp25LgVacODB1qtzb580+304gEljZt2jBkSALP4NA4PIKpwDvY2W5NIiJ4znFISEigdevWruYUcUtQr8y9Zw9s3qxut1DwwANQsqS2NhEpip9/7k+9eitpFBfHfWFhxAH3hYURExfHypUr6d+/v9sRRVzjGN8uQpPvxZKSkoiOjiYxMbHY45XmzIFbboF9++D004t1KgkATz9tZ8Bt3gznnON2GpHAsHMn1K8PM2fCnXfaJQOSkpKIiorSmCQJdgXqawrqFqVPP4XzzlORFCoGD7Zbm4zJd1EKEcmQkACnnQY9e9p/R0ZGUrVqVRVJIicEdaG0fDm0b+92CvGV0qXhiSdg4UK7EKWI5O3wYZg1y7YklSnjdhoR/xS0hdKuXfDzz9CundtJxJd69rQrsI8cqa1NRPLzyiu2WBo82O0kIv4raAulzz+3H9u2dTeH+FbG1iZffAGLFrmdRsR/pafDtGlw3XVQu7bbaUT8V1AXSo0aQeXKbicRX7vsMru9yejRcPy422lE/NN778GOHaDlkUTyFtSFkrrdQtfEifaXgLY2EcnZlClw0UX2ISK5C8pC6Y8/7C9JDeQOXc2aQe/eMG6ctjYROdWGDfDZZ2pNEimIoCyUND5JAB57TFubiORk6lSoVQu6d3c7iYj/C9pCqWFDqFrV7STiJm1tIpLdn3/Cm2/CkCEQEeF2GhH/5zeFUnx8PDExMcTGxhb7XBqfJBnGjIESJbS1iUiG6dPt/xP9+rmdRCQwBN0WJnv3QrVq8MYbcPPNRcooQUZbm4hYR4/apQBuvBGefdbtNCKuC80tTFassB/VoiQZMrY2eeABt5OIuOv112H/frjnHreTiASOoCuUVq6EevWgenW3k4i/KF0aHn8cFiywC1GKhCJj7JIAXbvaTXBFpGCCrlBavRpat3Y7hfibXr2gaVNtbSKha9ky2/2sJQFECieoCqXDh2HjRhVKkl3G1iarV8PixW6nEfG9KVPsHwsaliBSOEFVKH31FaSlqVCSnHXuDJ062YHdqalupxHxnW3bYOlS25rkFGj4qohkCKpCafVqOO00OPdct5OIv/rvf+GHH7S1iYSWadPsunI33eR2EpHAE1SF0hdfQKtWtptFJCfnn2/HK2lrEwkV+/bByy/b2Z+lSrmdRiTwBE1JkZ4Oa9ao203y9/jjcPAgTJ7sdhIR74uPt388DhzodhKRwBQ0hdKWLZCYCBdf7HYS8Xd169q/rp96yi5QKhKs/v0XnnvOrsJdsaLbaUQCU9AUSqtXQ3g4XHih20kkEDz4oN3nSlubSDB76SX7B6SWBBApuqAqlJo1g7Jl3U4igaBiRbsP3MyZsH2722lEPC811XYv33ij3SBaRIomaAqlL77Q+CQpnCFD4IwztLWJBKd58+CXX+D++91OIhLYgqJQ2rsXfvpJhZIUTmQkPPYYzJ8PX37pdhoRzzHGLoVx2WW2pV1Eii4oCqXVq+1HDeSWwurdG847z/7Vra1NJFh88gl8+63dskdEiicoCqU1a6BWLahZ0+0kEmjCw2HiRFi1CpYscTuNiGc89ZRdM6xjR7eTiAQ+vymU4uPjiYmJITY2ttCv/eoruOgiL4SSkHD55fYXyqhR2tpEAt+GDfDRR7Y1SduViBSfY3zb35DvxZKSkoiOjiYxMZGoqKh8T5iaCtHRMH483HefRzJKCPrmG2jRws6C69fP7TQiRderl53csmOHXQJDRHJVoD8l/KZFqai2bIEjR7R+khRP8+bQsyc88ohdpE8kEP36K7z1FowYoSJJxFMCvlBau9Yuz9+8udtJJNBlbG0yZYrbSUSKZsoU28J+++1uJxEJHgFfKH31FTRurIUmpfjOPBMGDbKDu/ftczuNSOEcOACzZtl7WD8PRTwn4AultWuhZUu3U0iwePBBOxPuscfcTiJSONOm2c3BhwxxO4lIcAnoQunwYdi8WeOTxHMqVbJbm8yYYQfDigSCpCR49lm4+244/XS304gEl4AulNavt39BqVASTxo6FKpV09YmEjgSEuykFs38FfG8gC6U1q61ffGNGrmdRIJJxtYm8+bZadYi/uzIEbv5bd++UKOG22lEgk9AF0pffWVnu4WHu51Egk2fPnZl4+HDbauliL+aNcvO1hw1yu0kIsEpoAslDeQWbwkLs3+lf/WVXZdGxB+lpNjNb3v2tLM2RcTzArZQ2rMHdu3S+CTxnvbt4dprYfRoSE52O41Idq++Cn/8YScgiIh3BGyh9NVX9qMKJfGm//7X/iLSIpTib1JT4cknoXt3OPdct9OIBK+ALpSqVYNatdxOIsGsQQMYPBgmTIA//3Q7jcj/e+st2LnTrv0lIt4TsIXSunUQG6vdscX7Hn4YSpSw+8CJ+IP0dPjPf+DKK+2kAxHxnoAslIyxu71rfzfxhYoVYexYePFF+O47t9OIwKJFdkNwtSaJeJ/fFErx8fHExMQQGxub77G//mqnw6pQEl8ZOBDq14d777WFuohb0tNh/Hi49FK4+GK304gEP8f49qd+vhdLSkoiOjqaxMREoqKicjxmwQK47jo7yPaMMzyeUSRH77wDcXHw7rtw1VVup5FQNX8+XH89rFwJbdq4nUYkoBVo8I7ftCgVxjff2IHcKpLEl7p2hQ4d7DYRx4+7nUZCUXo6jBsHnTqpSBLxlYAslNavV7eb+J7jwKRJ8MMP8PzzbqeRUDR/PmzaZLveRMQ3Aq5Q0kBucdP559s9tcaOhQMH3E4joSRjbFLnzhqbJOJLAVco7d4Nf/0FF1zgdhIJVf/5j13sT8sFiC/NmwebN9uuNxHxnYArlNavtx/VoiRuqVrVFkkzZmi5APGNtDTbmnT55dCqldtpREJLwBVK33wDVapAjRpuJ5FQNmSIXbX7nnu0XIB439tv23WTNDZJxPcCslC64AKtyC3uKlkSpk6F5cttl4iIt6SlwaOPQpcu0LKl22lEQk/AFUqa8Sb+4oor7JIB990HR464nUaC1ZtvwtatGpsk4paAKpT++MNuTKpCSfzF5Mn2nnzqKbeTSDA6dsyOh7v2WrjwQrfTiISmgCqUMgZya8ab+Iv69WH4cHjySbu1DkBycjJ79+4lOTnZ3XAS8F54AX75BR5/3O0kIqEroAqlb76BSpWgdm23k4j8vwcfhAoVoG/fVVzfvTvly5WjWrVqlC9Xjuu7d2f16tVuR5QA9O+/8Nhj0KcPNGrkdhqR0OXxQslxnDGO46xzHOeQ4zj7HMdZ5DjOOZ44d8ZCkxrILf6kfHno3Hk6n33Wli3vLOHp9HTeAZ5OT2frkiVccsklzJgxw+2YEmCmTbObf2tskoi7vNGi1A6IBy4CLgMigI8cxylb3BN/+61dGVnEn6xatYpXXx3EUAyb0lIZBnQFhgHfp6Yy2BgGDhyoliUpsAMHYOJEGDAA6tZ1O41IaPN4oWSMucIY87IxZrMxZiPQF6gNFGsI9sGDdlXuZs08kVLEc6ZOnsy54eFMIfv/UGHAVODc8HCmTpni82wSmCZOtMsCPPig20lEJMIH14g+8fFgTp9MSUkhJSUl899JSUk5nmTjRvuxaVOPZhMpluTkZBYtXszT6em5/tURBvRLTeW+hQtJTk4mMjLSlxElwPz+Ozz7LNx/v11cV0Tc5dXB3I7jOMBkYJUxZlNOx0yYMIHo6OjMR61atXI814YNEBkJZ5/tvbwihZWUlERaejr18jnuLCAtPT3XPwREMjz6KJQpA/fe63YSEQHvz3p7DjgPuDm3A8aMGUNiYmLmY9euXTket3EjNG4M4eFeSipSBFFRUYSHhfFTPsftBMLDwoiKivJFLAlQO3bAiy/CAw9AdHT+x4uI93mtUHIc51ngGqCDMWZ3bseVKlWKqKioLI+cbNyobjfxP5GRkVwbF8cLERGk53JMOvBCRATdunVTt5vkacwYOOMMGDjQ7SQiksEbywM4juM8B3QHLjXG/Fzccx47ZjeEVKEk/mjYiBFsTUtjOGQrltKxs9+2pqUxbPhwn2eTwLFyJcyfD//5jx1mICL+wRstSvFAb6AncMhxnGonHkX+X3/bNlssqVASf9SmTRsSEhJ41nFoEhHBVOAdTsx2I4LnHIeEhARat27tak7xX+npdkxS8+bQq5fbaUTkZN6Y9TbgxMflpzzft6gnzJjxdt55RT2DiHf179+fJk2aMHXKFO5buJC09HTCw8IoXSqO2CbDuftuFUmSu7lzYd06WL4cwgJqvwSR4OcYY3x5vXwvlpSURHR0NImJiZnjle67DxYsgJ07vZ5PpNiSk5NJSkoiKiqKjz+OJC4O3n4brr/e7WTij5KToWFDu4flwoVupxEJKQXa58MX6ygV24YN6naTwBEZGZk5aPuaa+xj2DC4/HK73YnIyaZNgz/+gI8/djuJiOTE7xt5jdGMNwls06bB339rlWXJbt8+O3h74ECtESfir/y+UNqzB/bv19YlErjq1rW7wD/3HKxZ43Ya8Sfjxtm14R55xO0kIpIbvy+UtHWJBIN77oEWLeDOO+GkHXskhH33HTz/PDz8MFSq5HYaEcmN3xdKGzZAVJR20JbAFh4Os2bB9u0wYYLbacRtxsCQIba7bfBgt9OISF78vlDauNEuC+AUaGy6iP867zwYPdqOSdm82e004qa33oIVK+CZZ6BkSbfTiEhe/H55gHPPhU6d7G7aIoEuJcWOt4uOhtWrtXdhKDp8GM45B1q2tMueiIhrCtQE49ctSsnJtqtC45MkWJQqZbvgvvoK4uPdTiNueOIJOHgQJk92O4mIFIRfF0pbt9ql/Zs0cTuJiOe0bm2ngz/wAPz6q9tpxJe2b4dJk2wXrMZdigQGvy6UNm2yH2Ni3M0h4mkTJkDFinDXXXZgrwQ/Y+zCozVqwMiRbqcRkYLym0IpPj6emJgYYmNjM5/btMn+1aXVjCXYlC8PM2fCRx/ZrjgJfosWwdKlMGUKRBZ5i3AR8TW/Hsx9441RRETAkiW+iCbie3fdBW++adfUOfNMt9OItyQl2ZbxCy6AxYs1i1fETwT+YO5NmzQ+SYLbpElQuTL07WvH40lwevhhu43Ns8+qSBIJNH5bKP3zD+zeDY0bu51ExHvKl4eXXoLPP9cSGMHq66/t9jWPPgp16ridRkQKy28LpW3b7EcVShLsOnSAoUPtTKiM+16CQ2oq3H23bRm/5x6304hIUfhtobRli12M75xz3E4i4n0TJkCtWnDrrfaXqwSHZ5+Fb7+1A/cjItxOIyJF4beF0tatdh+kUqXcTiLifWXKwCuv2G4a7QUXHH78ER580O7lduGFbqcRkaLy20JpyxZ1u0loadXKLkI5fjysWeN2GimO9HS4/XY44wwVviKBzm8Lpc2bVShJ6HnkEYiNhZ49ITHR7TRSVPHxsHIlvPgilC3rdhoRKQ6/LZT+/luFkoSeEiXgjTfsXmADBmjV7kD00092YP6gQdC+vdtpRKS4/K5QSk5OzvgvFUoSks48E2bMsAtRvvaa22mkMNLT4Y47oEoVePJJt9OIiCf4TaG0atUqru/enRrVqwPgUJ0xo7qzevVql5OJ+N7NN0OfPrZV4scf3U4jBTV9ul0T68UXoVw5t9OIiCf4xRYm06dPZ9CgQZwbHk6/1FTqAT8BL0REsDUtjYSEBPr37+/LnCKuO3TIbnlRoQKsWgUlS7qdSPLy00/QtCnccostmETE7xVonXzXC6VVq1bRtm1bhhjDFLI2caUDw4DnHIeVK1fSunVrH8UU8Q/r1sHFF9sFKSdNcjuN5Ob4cbjkEvjrL9iwQRt5iwSIwNjrberkyZwbHp6tSOLEv6cC54aHM3XKFJ9nE3FbbCw8/TRMngzz57udRnIzfrxdA+uNN1QkiQQbV1uUkpOTKV+uHE+npzMsjxdNBe4LC+PQ4cNERkZ6M5+I3zEGbroJli61v4zPPtvtRHKyFSvs7LZHH4WHHnI7jYgUgv+3KCUlJZGWnk69fI47C0hLTycpKckXsUT8iuPArFlQvTpcdx38+6/biSTD339D797Qpg2MGeN2GhHxBlcLpaioKMLDwvgpn+N2AuFhYURFRfkilojfKV/edr3t3Kn1lfyFMdC/PyQlwZw5dm9KEQk+rhZKkZGRXBsXxwsREaTnckw6dvZbt27d1O0mIa1RI7u56muvwfPPu51GZs+G//3Pfk9q13Y7jYh4i+uDuYeNGMHWtDSGQ7ZiKWPW29a0NIYNH+7zbCL+plcvu7bS0KF2iwxxx4YN9vtwxx1www1upxERb3J9eQCAGTNmMHDgwMx1lM7CdrdpHSWR7I4fh86dYdMmu3xA3bpuJwot//wDLVrY7tAvvgA1dIsErMBYRynD6tWrmTplCgsXLiQtPZ3wsDC6devGsOHDtX6SyCn274cLL7SrP3/xhVaB9hVjoHt3+OwzWL8ezjrL7UQiUgyBVShl2Lt3L9WqVePPP/+katWqvsgkEpA2b4aLLoKOHWHBAghzvSM9+D39NNx/PyxeDNdc43YaESkm/18eICcZA7Y1cFskb40a2QUO33lH6/f4wkcfwahR9qEiSSR0+F2hJCIF17Wr3aV+wgQ7+0q844cf7KDtyy+HJ55wO42I+FKE2wFEpHjuvx9+/dWur1S9Olx9tduJgsvff9uCtHp1ePNNrZckEmpUKIkEOMeBZ56BP/6AG2+0A40vvNDtVMEhNdW+pwcOwNq1EB3tdiIR8TV1vYkEgfBwO16paVPbovTjj24nCnzGwJAhtvCcNw/q13c7kYi4QYWSSJCIjIQlS6BCBbvO0u7dbicKbE88ATNm2EeHDm6nERG3qFASCSKVKsHHH0NaGnTqBHv3up0oMM2aBQ8/DI89ZlffFpHQpUJJJMjUrg2ffAKJibZl6eBBtxMFlnfftZvdDhgADz7odhoRcZsKJZEgVL8+LFsGv/8OV1xhZ25J/j77zC4DEBcHzz5rB8qLSGhToSQSpBo1st1wP/1kV+8+cMDtRP5txQo7EP6SS+D117UMgIhYflMoxcfHExMTQ2xsrNtRRILG+efDp5/agd0dOmjMUm5Wr4Yrr4RWrWDRIihd2u1EIuIv/G6vt6SkJKKjo0lMTCQqKsoXmUSC3pYttlXptNNsl1yNGm4n8h9r1tixXC1awHvvQZkybicSER8JzL3eRMTzYmJs19K//9pWk82b3U7kH5Ytg8susy1vS5aoSBKR7FQoiYSIBg1s60mFCtCmDXz+uduJ3PX227a7rW1bWLoUypVzO5GI+CMVSiIhpEYN27LUvLntbnrrLbcTuWP6dLs1SY8esHgxlC3rdiIR8VcqlERCTHQ0vP++nQZ/000wdiykp7udyjfS0mDUKBg4EAYPhtdegxIl3E4lIv5Mm+KKhKCSJeHVV6FhQ7sC9fr1tmg47TS3k3lPUhL07Gm72SZNguHDtU6SiORPLUoiIcpx7MrT770Hq1bBhRfCpk1up/KOHTvsIPaVK+3K2yNGqEgSkYJRoSQS4rp0gXXr7NpBsbF2RWrfrhriXW+8ARdcAMePw9q19usVESkoFUoiQv36toi4804YOtTOBtuzx+1UxfPvv3ZD21697JYk33xjuxpFRApDhZKIABAZaVuT3n8fvv0WmjSxW3n4W+tScnIye/fuJTk5OddjPv8cmjWDuXNh9mw7/qp8ed9lFJHgoUJJRLLo0gW+/96u5N27N3TqBD/84HYqWLVqFdd37075cuWoVq0a5cuV4/ru3Vm9enXmMYmJMGAAtG8P1arZgu+22zQeSUSKTluYiEiuPvgABg2ye8Xdcw+MHg0VK/o+x/Tp0xk0aBDnhofTLzWVesBPwAsREWxNS+O55xIoUaI/Dz0ER47AxInQvz+E6U9BEcldgf6EUqEkInlKTraFx9NPQ0QEjBxpiyZfLdK4atUq2rZtyxBjmELWZvB0YBjwLA6wkt69WzNhAtSs6ZtsIhLQVCiJiOfs3QtPPAEzZtj1lgYMsI9q1bx73eu7d2frkiV8n5qa41iBdCDGiaB6uzg+/Wyed8OISDDxr0LJcRwnMTEx2/q/KSkppKSkZP770KFDxMTEsGvXLhVKIn7o11/toO85cyA1Fa67zo5luvhiCA/37LWSk5OpUb06T6enMyyP46YC94WF8fsffxAZGenZECISlKKjo6OBQyafQsiXhVIUkOiTi4lIUHkH6JrP5+N8lEVEgkq0MSYprwN8uYXJocTE7HXSqS1Ke/bs4cILL2TLli3UqFGjWBeMjY1l3bp1xTqHp87jL1mSkpKoVauWR1rs/OVr8rcsnnqP/elryuscxtgFK+fNgwUL4K+/oEwZ28LUogWcdx40amTHDbVqlfd5Dh6EH3+Ebdvgyy/hiy+S+fWX6vxE3pvR7QTCC9miFCjvr6/PE2r3r6/Po/fXu+cpzPub0aKU3zl9Vijl17R1qvLlyxf7F3l4eLhHuu88cR5/ygIQFRUVVF+TP2XJUNz32J++pvzO0amTfcTHw4YNsGwZfPIJvPACHDhgjwkLg7CwFbRrF0VkJJQqZaftJyXZaf3798M///z/seedB1dfHcW6tXG88O0ShuYxRumFiAi6xcVRtWpVj31NvjyPP2XJEEr3r6/PA3p/vXkeKNj7m19LUoag3hR30KBBfnMef8riKf70NflTFk/xp6+poOcID4fmze1j1CjbSvT773YPuV27YOHC36hTpyopKZCSAunp0KABREdDpUpQr579d/36/z+rbtWqEbRtu4jhkOust61pacwcPtwrX5MvzuNPWTzFn74mf8riKf70NflTFm/wu1lvu3fvzmw2q6k5vh6nWYXep/fY82bMmMHAgQMz11E6C9vdlrGOUkJCAv3793c7ZlDQ/etden+9q5Dvb4FmvfndcmylSpXK8lE8q1SpUowdO1bvrxfpPfa8/v37s3LlSmLi4rgvLIw47Cy3mLg4Vq5cqSLJg3T/epfeX+/yxvvrdy1KqrZFJC/JyckkJSURFRWlpQBEpDgK1KIU1GOURCT4REZGqkASEZ/xu643EREREX+hQklEREQkF74eo5Svk1bwzne1TBERERFv8sdCyQHKU4D9V0RERES8ye+63oyVpCKp6BzHGeg4zs+O4xx1HOcbx3EuyePY9o7jmBweDX2ZOVA4jtPWcZwljuP8ceJ9urYAr2l34vtw1HGcnY7jaC57Lgr7/ur+LTjHccY4jrPOcZxDjuPscxxnkeM45xTgdbp/C6go77Hu4YJzHGeA4zjfOY6TdOKxxnGcLvm8ptj3r98VSlI8juPciN1M/QngfGAlsNRxnNr5vPQc4IyTHju8GDOQlQU2AoMLcrDjOGcC72O/D+cD/wGecRznOq8lDGyFen9Povs3f+2AeOAi4DLsrOePHMcpm9sLdP8WWqHf45PoHs7fbmA00OLE41NgseM4jXI62FP3r991vUnxOI6zFlhvjBlw0nNbgUXGmDE5HN8e+AyoYIz5x0cxg4LjOAboZoxZlMcxE4FrjDHnnvTcDKCpMaaV91MGrgK+v+3R/VskjuOcDuwD2hljVuRyjO7fYijge9we3cNF5jjOQeB+Y8yLOXzOI/evWpSCiOM4JYHmwEenfOoj4OJ8Xv6t4zh7HMf5xHGcDl4JGJpakf378SHQwnGcEi7kCVa6fwsv+sTHg3kco/u3eAryHmfQPVwIjuOEO45zE7YVek0uh3nk/lWhFFwqA+HA3lOe3wtUy+U1e4C7gOuA7sAPwCeO47T1VsgQU42cvx8R2O+XFI/u3yI4MWlmMrDKGLMpj0N1/xZRId5j3cOF4DhOE8dxDgMpwAxsq/OWXA73yP2rlbmD06n9qU4Oz9kDjfkB+z9mhjWO49QC7gNybCqWQsvp+5HT81JIun+L7DngPKBNAY7V/Vs0BXqPdQ8X2g9AM+A0bHH5iuM47fIolop9/6pFKbjsB9LI3npUhexVdV6+BBp4KlSI+5Ocvx+pwAHfxwkJun/z4DjOs8A1QAdjzO58Dtf9WwSFfI9zons4F8aYY8aYH40xX58Yd7sRuCeXwz1y/6pQCiLGmGPAN9jZFie7DPiiEKc6H9scLMW3huzfj87A18aY4y7kCQW6f3PgWM9hu3cuNcb8XICX6f4thCK+xznRPVxwDlAql8955P5V11vwmQy85jjO19ib5C6gNrYvF8dxJgA1jDF9Tvx7GPALsBkoCfTGNmdq+m8OHMcpB9Q/6akzHcdpBhw0xvx26vuLfd8HO44zGXgBO7jwDuBmH8YOGIV9f3X/Fko80BOIAw45jpPxl3aiMSYZsv98QPdvYRX6PdY9XHCO4/wHWArswi5MfRPQHrjixOe9c/8aY/QIsgcwEPs/Xgq2hantSZ97GVh+0r9HAj8CydiZGSuBK93+Gvz1ceJ/SpPD4+Wc3t8Tz7UD1p/4fvwM9Hf76/DXR2HfX92/hXpvc3pfDXDbScfo/vXxe6x7uFDv74sn/W7bBywDLsvtvT3xXLHvX62jJCIiIpILjVESERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERycX/AcX86mbC2eHsAAAAAElFTkSuQmCC\n",
1263 "text/plain": [
1264 "Graphics object consisting of 3 graphics primitives"
1265 ]
1266 },
1267 "metadata": {},
1268 "output_type": "display_data"
1269 }
1270 ],
1271 "source": [
1272 "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n",
1273 "polring.<x> = QQ[] # you need to specify a polynomial ring\n",
1274 "lp = polring.lagrange_polynomial(points)\n",
1275 "show(scatter_plot(points, facecolor=\"red\")\n",
1276 " + plot(lp, 0, 3) # slightly different notation for polynomials\n",
1277 " + text(lp, (1,8), color=\"black\")\n",
1278 " )"
1279 ]
1280 },
1281 {
1282 "cell_type": "markdown",
1283 "metadata": {},
1284 "source": [
1285 "One can compute the Lagrange Polynomial over any base ring, and it has the advantage that it is a very \"nice\" function (continuous and differentiable as much as you like, with easily computable derivatives and primitives).\n",
1286 "\n",
1287 "However, it does not always give you good approximation of your data:"
1288 ]
1289 },
1290 {
1291 "cell_type": "code",
1292 "execution_count": 2,
1293 "metadata": {},
1294 "outputs": [
1295 {
1296 "data": {
1297 "image/png": "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\n",
1298 "text/plain": [
1299 "Graphics object consisting of 2 graphics primitives"
1300 ]
1301 },
1302 "metadata": {},
1303 "output_type": "display_data"
1304 }
1305 ],
1306 "source": [
1307 "R = [x/10 for x in range(-10,10)]\n",
1308 "L = [1/(1+25*x^2) for x in R]\n",
1309 "points = [(R[i], L[i]) for i in range(len(L))]\n",
1310 "polring.<x> = RR[]\n",
1311 "lp = polring.lagrange_polynomial(points)\n",
1312 "\n",
1313 "show(plot(lp, -0.82, 0.72) + scatter_plot(points))"
1314 ]
1315 },
1316 {
1317 "cell_type": "markdown",
1318 "metadata": {},
1319 "source": [
1320 "This particular example is called [Runge's phenomenon](https://en.wikipedia.org/wiki/Runge%27s_phenomenon). For a better approximation you can use a [spline](https://en.wikipedia.org/wiki/Spline_(mathematics)), which is a *piecewise* polynomial function:"
1321 ]
1322 },
1323 {
1324 "cell_type": "code",
1325 "execution_count": 90,
1326 "metadata": {},
1327 "outputs": [
1328 {
1329 "data": {
1330 "image/png": "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\n",
1331 "text/plain": [
1332 "Graphics object consisting of 2 graphics primitives"
1333 ]
1334 },
1335 "metadata": {},
1336 "output_type": "display_data"
1337 }
1338 ],
1339 "source": [
1340 "show(plot(spline(points), -1, 1) + scatter_plot(points))"
1341 ]
1342 },
1343 {
1344 "cell_type": "markdown",
1345 "metadata": {},
1346 "source": [
1347 "A detailed explanation of splines is a good topic for a course of numerical analysis. For this course it is enough that you know that they exist and they can be plotted."
1348 ]
1349 }
1350 ],
1351 "metadata": {
1352 "kernelspec": {
1353 "display_name": "SageMath 9.2",
1354 "language": "sage",
1355 "name": "sagemath"
1356 },
1357 "language_info": {
1358 "codemirror_mode": {
1359 "name": "ipython",
1360 "version": 3
1361 },
1362 "file_extension": ".py",
1363 "mimetype": "text/x-python",
1364 "name": "python",
1365 "nbconvert_exporter": "python",
1366 "pygments_lexer": "ipython3",
1367 "version": "3.8.5"
1368 }
1369 },
1370 "nbformat": 4,
1371 "nbformat_minor": 4
1372}
diff --git a/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb b/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb
new file mode 100644
index 0000000..5933058
--- /dev/null
+++ b/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb
@@ -0,0 +1,1614 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Symbolic expressions\n",
8 "\n",
9 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
10 "\n",
11 "Last time we saw the basics of symbolic expressions:\n",
12 "* How to define and manipulate symbolic expressions\n",
13 "* How to introduce new variables (in the Mathematical sense) with `var()`\n",
14 "* How to solve equations and inequalities\n",
15 "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n",
16 "\n",
17 "Here are some examples to remind you of these basic things:"
18 ]
19 },
20 {
21 "cell_type": "code",
22 "execution_count": 1,
23 "metadata": {},
24 "outputs": [
25 {
26 "name": "stdout",
27 "output_type": "stream",
28 "text": [
29 "[\n",
30 "x == -sqrt(-pi),\n",
31 "x == sqrt(-pi)\n",
32 "]\n",
33 "[\n",
34 "z == -sqrt(pi + x^2),\n",
35 "z == sqrt(pi + x^2)\n",
36 "]\n",
37 "[[y < -2], [y > 1]]\n",
38 "2*pi + e is approximately 9.00146713563863\n"
39 ]
40 }
41 ],
42 "source": [
43 "var('y', 'z') # Define new variables (x is already defined by Sage)\n",
44 "f = x^2 + pi\n",
45 "g = y^2 + y - 2 > 0\n",
46 "print( solve(f==0, x) )\n",
47 "print( solve(z^2 - f, z) )\n",
48 "print( solve(g, y) )\n",
49 "print( 2*pi + e, \"is approximately\", n(2*pi + e) )"
50 ]
51 },
52 {
53 "cell_type": "markdown",
54 "metadata": {},
55 "source": [
56 "Now we will see some more details about solving equations and manipulating their solutions."
57 ]
58 },
59 {
60 "cell_type": "markdown",
61 "metadata": {},
62 "source": [
63 "## Solving equations and inequalities\n",
64 "\n",
65 "**Reference** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)] for the details of `solve()` and `find_root()`, [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html#solving)] for examples.\n",
66 "\n",
67 "Other than equations and inequalities, we can also solve systems: it is enough to give Sage a list of expressions and a list of variables with respect to which we want to solve. For example the system\n",
68 "\n",
69 "\\begin{align*}\n",
70 " \\begin{cases}\n",
71 " x + y = 2 \\\\\n",
72 " 2x - y = 6\n",
73 " \\end{cases}\n",
74 "\\end{align*}\n",
75 "\n",
76 "Can be solved as"
77 ]
78 },
79 {
80 "cell_type": "code",
81 "execution_count": 2,
82 "metadata": {},
83 "outputs": [
84 {
85 "data": {
86 "text/plain": [
87 "[[x == (8/3), y == (-2/3)]]"
88 ]
89 },
90 "execution_count": 2,
91 "metadata": {},
92 "output_type": "execute_result"
93 }
94 ],
95 "source": [
96 "solve([x+y == 2, 2*x - y == 6], [x,y])"
97 ]
98 },
99 {
100 "cell_type": "markdown",
101 "metadata": {},
102 "source": [
103 "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x+1$."
104 ]
105 },
106 {
107 "cell_type": "markdown",
108 "metadata": {},
109 "source": [
110 "**Solution:** the system is\n",
111 "\\begin{align*}\n",
112 " \\begin{cases}\n",
113 " y^2 = x^2 - 2x +1\\\\\n",
114 " x^2 + y^2 = 4\n",
115 " \\end{cases}\n",
116 "\\end{align*}"
117 ]
118 },
119 {
120 "cell_type": "code",
121 "execution_count": 5,
122 "metadata": {},
123 "outputs": [
124 {
125 "data": {
126 "text/plain": [
127 "[[x == -1/2*sqrt(7) + 1/2, y == 1/2*sqrt(7) + 1/2], [x == 1/2*sqrt(7) + 1/2, y == -1/2*sqrt(7) + 1/2], [x == -1/2*sqrt(7) + 1/2, y == -1/2*sqrt(7) - 1/2], [x == 1/2*sqrt(7) + 1/2, y == 1/2*sqrt(7) - 1/2]]"
128 ]
129 },
130 "execution_count": 5,
131 "metadata": {},
132 "output_type": "execute_result"
133 }
134 ],
135 "source": [
136 "var('y')\n",
137 "eq1 = y^2 == x^2-2*x+1\n",
138 "eq2 = x^2 + y^2 == 4\n",
139 "solve([eq1, eq2], [x,y])"
140 ]
141 },
142 {
143 "cell_type": "markdown",
144 "metadata": {},
145 "source": [
146 "### The set of solutions\n",
147 "\n",
148 "One would expect the result of `solve()` to be a list of solutions, but it is actually a list of expressions (technically it is not a list but a different type of Python collection, but this is not so important)"
149 ]
150 },
151 {
152 "cell_type": "code",
153 "execution_count": 11,
154 "metadata": {},
155 "outputs": [
156 {
157 "name": "stdout",
158 "output_type": "stream",
159 "text": [
160 "-3\n"
161 ]
162 }
163 ],
164 "source": [
165 "solutions = solve(x^2-9 == 0, x)\n",
166 "solutions[0] # This is the expression 'x == -3'\n",
167 "\n",
168 "# Using rhs() explained below\n",
169 "print(solutions[0].rhs())"
170 ]
171 },
172 {
173 "cell_type": "markdown",
174 "metadata": {},
175 "source": [
176 "To read the actual solution without the `x ==` part you can use the `rhs()` or `lhs()` functions, which can be applied to any expression containing a relation operator (like `==`, `<`, `>=`...) and return the *right hand side* and *left hand side* of the expression, respectively"
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": 10,
182 "metadata": {},
183 "outputs": [
184 {
185 "name": "stdout",
186 "output_type": "stream",
187 "text": [
188 "rhs: -y + 2\n",
189 "lhs: x^2 + y\n"
190 ]
191 }
192 ],
193 "source": [
194 "f = x^2+y <= 2-y\n",
195 "print(\"rhs:\", f.rhs())\n",
196 "print(\"lhs:\", f.lhs())"
197 ]
198 },
199 {
200 "cell_type": "markdown",
201 "metadata": {},
202 "source": [
203 "When you solve an inequality or a system, the set of solutions can be more complicated to describe. In this case the result is a list containing lists of expressions that have to be `True` at the same time. It is easier to explain with an example:"
204 ]
205 },
206 {
207 "cell_type": "code",
208 "execution_count": 12,
209 "metadata": {},
210 "outputs": [
211 {
212 "name": "stdout",
213 "output_type": "stream",
214 "text": [
215 "Simple inequality: [[x < -3], [x > 3]]\n",
216 "System of inequalities:\n",
217 " [\n",
218 "[3 < x, x < 6],\n",
219 "[x < -3]\n",
220 "]\n"
221 ]
222 }
223 ],
224 "source": [
225 "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n",
226 "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))"
227 ]
228 },
229 {
230 "cell_type": "markdown",
231 "metadata": {},
232 "source": [
233 "In the last example (system of inequalities), Sage is telling us that the system\n",
234 "\\begin{align*}\n",
235 " \\begin{cases}\n",
236 " x^2-9 > 9 \\\\\n",
237 " x < 6\n",
238 " \\end{cases}\n",
239 "\\end{align*}\n",
240 "has two solutions:\n",
241 "* $x$ is between $3$ and $6$;\n",
242 "* $x$ is less than $-3$.\n",
243 "\n",
244 "Since in Sage (and in Python) expressions can have at most on relational operator like `<`, the first solution requires two expressions to be described. Hence the \"list of lists\".\n"
245 ]
246 },
247 {
248 "cell_type": "markdown",
249 "metadata": {},
250 "source": [
251 "**Exercise.** In the first exercise you were asked to solve a system of equations, but some of its solutions were complex numbers. Select only the real solutions and print them as pairs $(x,y)$."
252 ]
253 },
254 {
255 "cell_type": "code",
256 "execution_count": 24,
257 "metadata": {},
258 "outputs": [
259 {
260 "name": "stdout",
261 "output_type": "stream",
262 "text": [
263 "All solutions:\n",
264 "[\n",
265 "[x == (-1/2*I + 1/2), y == -sqrt(1/2*I + 4)],\n",
266 "[x == (-1/2*I + 1/2), y == sqrt(1/2*I + 4)],\n",
267 "[x == (1/2*I + 1/2), y == -sqrt(-1/2*I + 4)],\n",
268 "[x == (1/2*I + 1/2), y == sqrt(-1/2*I + 4)]\n",
269 "]\n"
270 ]
271 }
272 ],
273 "source": [
274 "# We use a different equation because the first exercise only\n",
275 "# had real solutions.\n",
276 "var('y')\n",
277 "eq1 = y^2 == x^2-2*x+5\n",
278 "eq2 = x^2 + y^2 == 4\n",
279 "solutions = solve([eq1, eq2], [x,y])\n",
280 "\n",
281 "print(\"All solutions:\")\n",
282 "print(solutions)\n",
283 "\n",
284 "for s in solutions:\n",
285 " #print(\"One solutions is:\", s)\n",
286 " x0 = s[0].rhs()\n",
287 " y0 = s[1].rhs()\n",
288 " if x0 in RR and y0 in RR:\n",
289 " print((x0, y0))"
290 ]
291 },
292 {
293 "cell_type": "markdown",
294 "metadata": {},
295 "source": [
296 "When solving a system of equations (not inequalities), you can use the option `solution_dict=True` to have the solutions arranged as a *dictionary*, which is a type of Python collection that we did not treat in this course"
297 ]
298 },
299 {
300 "cell_type": "code",
301 "execution_count": 25,
302 "metadata": {},
303 "outputs": [
304 {
305 "data": {
306 "text/plain": [
307 "[{x: 8/3, y: -2/3}]"
308 ]
309 },
310 "execution_count": 25,
311 "metadata": {},
312 "output_type": "execute_result"
313 }
314 ],
315 "source": [
316 "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)"
317 ]
318 },
319 {
320 "cell_type": "markdown",
321 "metadata": {},
322 "source": [
323 "### Alternative method for real roots: `find_root()`\n",
324 "\n",
325 "The `solve()` method is very useful when solving *symbolic* equations, for example when you have two variables and you want to solve for one of them in terms of the other. However, it does not always find explicit solutions.\n",
326 "\n",
327 "When you want to find an explicit, even if approximate, solution, it can be better to use `find_root()`. This function works *numerically*, which means that it finds an approximation of the root. It only works for real solutions and you need to specify an interval where you want the root to be searched:"
328 ]
329 },
330 {
331 "cell_type": "code",
332 "execution_count": 28,
333 "metadata": {},
334 "outputs": [
335 {
336 "name": "stdout",
337 "output_type": "stream",
338 "text": [
339 "Using solve():\n",
340 " [\n",
341 "x == -e^x + 10\n",
342 "]\n",
343 "Using find_root(): 2.070579904980303\n"
344 ]
345 }
346 ],
347 "source": [
348 "f = e^x + x - 10\n",
349 "print(\"Using solve():\\n\", solve(f, x))\n",
350 "print(\"Using find_root():\", f.find_root(0,10))"
351 ]
352 },
353 {
354 "cell_type": "markdown",
355 "metadata": {},
356 "source": [
357 "## Evaluating functions\n",
358 "\n",
359 "If an expression contains only one variable you can evaluate it easily, even if it is not a function."
360 ]
361 },
362 {
363 "cell_type": "code",
364 "execution_count": 29,
365 "metadata": {},
366 "outputs": [
367 {
368 "name": "stdout",
369 "output_type": "stream",
370 "text": [
371 "1\n",
372 "y + 3 > (y + 3)^2\n"
373 ]
374 }
375 ],
376 "source": [
377 "var('y')\n",
378 "f = x^2-3\n",
379 "g = x > x^2\n",
380 "\n",
381 "print(f(2))\n",
382 "print(g(3+y))"
383 ]
384 },
385 {
386 "cell_type": "markdown",
387 "metadata": {},
388 "source": [
389 "If an expression contains more than one variable, you can specify a value for each of them and they will be substituted in alphabetic order. You can also specify a value only for some of the variables."
390 ]
391 },
392 {
393 "cell_type": "code",
394 "execution_count": 32,
395 "metadata": {},
396 "outputs": [
397 {
398 "name": "stdout",
399 "output_type": "stream",
400 "text": [
401 "-2 == 0\n",
402 "3*y == 2\n"
403 ]
404 }
405 ],
406 "source": [
407 "var('y','z')\n",
408 "\n",
409 "f = y*z^2 - y == z\n",
410 "print(f(2, 0))\n",
411 "print(f(z = 2))"
412 ]
413 },
414 {
415 "cell_type": "markdown",
416 "metadata": {},
417 "source": [
418 "## Symbolic computations\n",
419 "\n",
420 "Sage can understand and simplify symbolic expressions such as sums (finite or infinite) and products. In the following cell, we compute the following sums using the [`sum()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.sum) function:\n",
421 "\n",
422 "\\begin{align*}\n",
423 " \\begin{array}{llcc}\n",
424 " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n",
425 " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n",
426 " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n",
427 " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n",
428 " \\end{array}\n",
429 "\\end{align*}\n",
430 "Recall that $\\binom nk=\\frac{n!}{k!(n-k)!}$"
431 ]
432 },
433 {
434 "cell_type": "code",
435 "execution_count": 41,
436 "metadata": {},
437 "outputs": [
438 {
439 "name": "stdout",
440 "output_type": "stream",
441 "text": [
442 "(1) 1/2*n^2 + 1/2*n\n",
443 "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n",
444 "(3) 2^n\n",
445 "(4) 1/6*pi^2\n"
446 ]
447 }
448 ],
449 "source": [
450 "var('k', 'n') # Remember to declare all variables\n",
451 "\n",
452 "s = []\n",
453 "s.append( sum(k, k, 0, n) )\n",
454 "s.append( sum(k^4, k, 0, n) )\n",
455 "s.append( sum(binomial(n,k), k, 0, n) )\n",
456 "s.append( sum(1/k^2, k, 1, infinity) )\n",
457 "\n",
458 "for i in range(len(s)):\n",
459 " print(\"({}) {}\".format(i+1, s[i]))"
460 ]
461 },
462 {
463 "cell_type": "markdown",
464 "metadata": {},
465 "source": [
466 "An alternative notation is `expression.sum(k, a, b)`. There is an analogous [`prod()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.prod) for products."
467 ]
468 },
469 {
470 "cell_type": "code",
471 "execution_count": 43,
472 "metadata": {},
473 "outputs": [
474 {
475 "data": {
476 "text/plain": [
477 "factorial(n)^2"
478 ]
479 },
480 "execution_count": 43,
481 "metadata": {},
482 "output_type": "execute_result"
483 }
484 ],
485 "source": [
486 "(x^2).prod(x, 1, n)"
487 ]
488 },
489 {
490 "cell_type": "markdown",
491 "metadata": {},
492 "source": [
493 "Sometimes Sage tries to keep an expression in its original form without expanding out sums and products. To change this behavior you can use the [`expand()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.expand) function:"
494 ]
495 },
496 {
497 "cell_type": "code",
498 "execution_count": 44,
499 "metadata": {},
500 "outputs": [
501 {
502 "name": "stdout",
503 "output_type": "stream",
504 "text": [
505 "(x + 1)^2 - (x - 1)^2\n",
506 "4*x\n"
507 ]
508 }
509 ],
510 "source": [
511 "f = (x+1)^2 - (x-1)^2\n",
512 "print(f)\n",
513 "print(f.expand())"
514 ]
515 },
516 {
517 "cell_type": "markdown",
518 "metadata": {},
519 "source": [
520 "### The Symbolic Ring\n",
521 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n",
522 "\n",
523 "The symbolic expressions that we have seen so far live in a ring called *symbolic ring* and denoted by `SR` in Sage. This ring works like the ring `ZZ` of integers or `RR` of reals numbers. In particular, you can define matrices and other objects using it as a \"basis\"."
524 ]
525 },
526 {
527 "cell_type": "code",
528 "execution_count": 50,
529 "metadata": {},
530 "outputs": [
531 {
532 "name": "stdout",
533 "output_type": "stream",
534 "text": [
535 "-b*c + a*d\n",
536 "[(-a, 2)]\n"
537 ]
538 }
539 ],
540 "source": [
541 "var('a', 'b', 'c', 'd')\n",
542 "\n",
543 "M = matrix([[a,b], [c,d]])\n",
544 "print(M.determinant())\n",
545 "\n",
546 "polring.<x> = SR[]\n",
547 "f = x^2 + 2*a*x + a^2\n",
548 "print(f.roots())"
549 ]
550 },
551 {
552 "cell_type": "markdown",
553 "metadata": {},
554 "source": [
555 "**Exercise.** Compute the eigenvalues of the matrix\n",
556 "\\begin{align*}\n",
557 "\\begin{pmatrix}\n",
558 "\\cos \\alpha & \\sin \\alpha\\\\\n",
559 "-\\sin\\alpha & \\cos \\alpha\n",
560 "\\end{pmatrix}\n",
561 "\\end{align*}"
562 ]
563 },
564 {
565 "cell_type": "code",
566 "execution_count": 55,
567 "metadata": {},
568 "outputs": [
569 {
570 "name": "stdout",
571 "output_type": "stream",
572 "text": [
573 "-I\n"
574 ]
575 }
576 ],
577 "source": [
578 "var('a')\n",
579 "M = matrix([[cos(a), sin(a)], [-sin(a), cos(a)]])\n",
580 "M.eigenvalues()\n",
581 "lam = M.eigenvalues()[0]\n",
582 "print(lam(pi/2))"
583 ]
584 },
585 {
586 "cell_type": "markdown",
587 "metadata": {},
588 "source": [
589 "# Calculus\n",
590 "**Reference:** [[4](https://doc.sagemath.org/html/en/reference/calculus/index.html)] for an overview, but most functions are described in [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]"
591 ]
592 },
593 {
594 "cell_type": "markdown",
595 "metadata": {},
596 "source": [
597 "## Limits and series\n",
598 "\n",
599 "**References:** [[5](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html#sage.calculus.calculus.limit)] for limits, [[6](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.series)] for series\n",
600 "\n",
601 "You can compute limits"
602 ]
603 },
604 {
605 "cell_type": "code",
606 "execution_count": 59,
607 "metadata": {},
608 "outputs": [
609 {
610 "name": "stdout",
611 "output_type": "stream",
612 "text": [
613 "1\n",
614 "+Infinity\n"
615 ]
616 }
617 ],
618 "source": [
619 "var('x')\n",
620 "f = sin(x)/x\n",
621 "#print(f(0)) # This one gives an error\n",
622 "print( f.limit(x=0) )\n",
623 "\n",
624 "print( (e^(-x)).limit(x=-infinity) )"
625 ]
626 },
627 {
628 "cell_type": "markdown",
629 "metadata": {},
630 "source": [
631 "**Exercise.** Compute the constant $e$ using a limit."
632 ]
633 },
634 {
635 "cell_type": "code",
636 "execution_count": 62,
637 "metadata": {},
638 "outputs": [
639 {
640 "data": {
641 "text/plain": [
642 "e^x"
643 ]
644 },
645 "execution_count": 62,
646 "metadata": {},
647 "output_type": "execute_result"
648 }
649 ],
650 "source": [
651 "expression = (1+x/n)^n\n",
652 "expression.limit(n=infinity)"
653 ]
654 },
655 {
656 "cell_type": "markdown",
657 "metadata": {},
658 "source": [
659 "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit."
660 ]
661 },
662 {
663 "cell_type": "code",
664 "execution_count": 63,
665 "metadata": {},
666 "outputs": [
667 {
668 "name": "stdout",
669 "output_type": "stream",
670 "text": [
671 "und\n",
672 "1\n",
673 "-1\n"
674 ]
675 },
676 {
677 "data": {
678 "image/png": "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p6deUwKGsVKpVIyIF7Ks/3dEFg7y834VCoViRCglAOBIVMqyrN+/xmoNpUKlUnm1mrE9PT1xwgknxPbt26NYLB72Mav1oQ99KDo6Ogb9OI5VG48Lx3rdm88oXX75P2Lt2snx5JNPxjve8Y4BP96bDYf/h2+VYw3X543h+LsaymMd6uOiVCqVooozSjW99HawGz+QYrE4JA/sESNGDMlxHGtgeFw41puNHr0rIiLGjBnjseFYBzTcnjeG6+8qr4+Lg51Jet2wfTP3lVde6VhH0LGGynD9/zccjzXU6ygNx/+Hw/lYQ2mo7tdw/V0d6Y+Lml56+3+quoGenp4olUpRqVSGtCzJN48LUv71X3dFW9vxsX379njnO99Z7+mQI543OJDDeFwUqhk0ZGeUGhoa4pprromGhoahOiRHAI8LUt72thERER4b7MfzBgcyWI+LITujBHAoLr64J+6+21kDYNDk64wSAMCRRigBACQIJQCABKEE5NJQLw8AcCCDGkrf+MY3YtasWTF69Og49thjq9ony7JYtmxZjB8/Po455pg488wz44knnhjMaTLEnn/++Zg7d26USqUolUoxd+7c+Pvf/97vPvPnz49CodDnMmPGjKGZMDCkbr755pg0aVKMGjUqpk2bFg899FBy7MaNG/d7bigUCvHUU08N4YwZCg8++GDMmTMnxo8fH4VCIe69996D7rNp06aYNm1ajBo1Kt797nfHypUrD/m4gxpKe/fujQsvvDCuuOKKqvf59re/HTfccEOsWLEiOjo6oqmpKc4+++x44YUXBnGmDKVLLrkkOjs7Y926dbFu3bro7OyMuXPnHnS/c889N3bs2NF7Wbt27RDMFhhKd999dyxatCi++tWvxpYtW+L000+P2bNnR1dXV7/7bdu2rc/zw3vf+94hmjFD5cUXX4wPfOADsWLFiqrGP/PMM3HeeefF6aefHlu2bImvfOUrcfXVV0dbW9uhHTjLslovB3XbbbdlpVLpoONeffXVrKmpKfvWt77Vu+2ll17KSqVStnLlymoORc49+eSTWURkmzdv7t3W3t6eRUT21FNPJfebN29edv755w/BDMmLf/u3ShYRWaVSqfdUGEKnnnpqtnDhwj7bpkyZkn35y18+4PgNGzZkEZE9//zzQzA78iIistWrV/c75otf/GI2ZcqUPtsuv/zybMaMGb03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\n",
679 "text/plain": [
680 "Graphics object consisting of 1 graphics primitive"
681 ]
682 },
683 "execution_count": 63,
684 "metadata": {},
685 "output_type": "execute_result"
686 }
687 ],
688 "source": [
689 "f = abs(x)/x # 1 if x>0, -1 if x<0\n",
690 "print( f.limit(x=0) ) # undefined\n",
691 "print( f.limit(x=0, dir=\"+\") )\n",
692 "print( f.limit(x=0, dir=\"-\") )\n",
693 "plot(f)"
694 ]
695 },
696 {
697 "cell_type": "code",
698 "execution_count": 71,
699 "metadata": {},
700 "outputs": [
701 {
702 "name": "stdout",
703 "output_type": "stream",
704 "text": [
705 "+Infinity\n",
706 "+Infinity\n",
707 "+Infinity\n"
708 ]
709 },
710 {
711 "data": {
712 "image/png": "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HADFy8pmJypMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAPJKPB5XNBpVLBYLeigA0MmybTvXY3M+EACcJJNJRSIRJRIJhcPhoIcDoHhZ2exEhQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQlAXonH44pGo4rFYkEPBQA6WbZt53pszgcCgJNkMqlIJKJEIqFwOBz0cAAULyubnagwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAQAAOCAwAXDd2LFjZVlWl+3RRx8NelgAkLMBQQ8AQHF6/PHHtWjRos7HQ4YMCXA0ANA3BCYAnhg6dKiqqqqy3j+VSimVSnU+TiaTXgwLAHLClBwATzz55JMaMWKErr/+eq1YsULt7e097r9q1SpFIpHObfTo0T6NFACcWbZt53pszgcCKG4//vGPdeONN2r48OF6++23tXTpUn3jG9/Qs88+2+0xmSpMo0ePViKRUDgc9mPYAC5NVlY7EZgAZKO+vl7Lly/vcZ+GhgbdfPPNFz3/0ksv6Zvf/KYOHz6sESNGZNVfMplUJBIhMAHwGoEJgHsOHz6sw4cP97jP2LFjNXjw4Iue379/v0aNGqW33npLkyZNyqo/AhMAn2QVmFj0DSArFRUVqqioyOnYHTt2SJKqq6vdHBIA+IbABMBVW7Zs0VtvvaXp06crEomooaFBDz/8sObOnasxY8YEPTwAyAmBCYCrQqGQfvnLX2r58uVKpVK64oortGjRIj3yyCNBDw0AcsYaJgB5iTVMAHyS1RomzsMEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEIK/E43FFo1HFYrGghwIAnbiWHIC8xLXkAPiEa8kBAAC4gcAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEAADggMAEIK/E43FFo1HFYrGghwIAnSzbtnM9NucDAcBJMplUJBJRIpFQOBwOejgAipeVzU5UmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmAAAABwQmADklXg8rmg0qlgsFvRQAKCTZdt2rsfmfCAAOEkmk4pEIkokEgqHw0EPB0DxsrLZiQoTAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITAACAAwITgLwSj8cVjUYVi8WCHgoAdLJs28712JwPBAAnyWRSkUhEiURC4XA46OEAKF5WNjtRYQIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYALQKytWrNCUKVNUWlqqYcOGZdxn3759mjNnjsrKylRRUaGHHnpI7e3t/g4UAFw0IOgBACgs7e3tuuuuuzR58mQ999xzF73e0dGh2bNn67LLLtObb76pzz//XAsXLpRt2/rJT34SwIgBoO8s27ZzPTbnAwEUvrVr12rx4sU6evRol+dfffVVff3rX1dzc7NqamokSS+++KLuvfdeHTp0SOFwOKv2k8mkIpGIEolE1scAQA6sbHZiSg6Aq7Zs2aLx48d3hiVJmjlzplKplLZv397tcalUSslksssGAPmCwATAVS0tLaqsrOzy3PDhwzVo0CC1tLR0e9yqVasUiUQ6t9GjR3s9VADIGoEJgOrr62VZVo/btm3bsm7Psi6ucNu2nfH5tKVLlyqRSHRuzc3NOf0sAOAFFn0D0IMPPqj58+f3uM/YsWOzaquqqkpbt27t8lxra6tOnz59UeXpfKFQSKFQKKs+AMBvBCYAqqioUEVFhSttTZ48WStWrNCBAwdUXV0tSVq/fr1CoZBuuukmV/oAAL8RmAD0yr59+3TkyBHt27dPHR0d2rlzpyTpqquu0pAhQzRjxgxFo1Hdc889evrpp3XkyBEtWbJEixYt4ttuAAoWpxUA0Cv33nuv1q1bd9HzGzZs0LRp0ySZUPXAAw/o97//vUpKSrRgwQL98Ic/7NWUG6cVAOCTrE4rQGACkJcITAB84nlgAgDPWJYVlpSQFLFtm5MyAQgUgQlAXrLMOQiGSjpm80EFIGAEJgAAAAecuBIAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMABgQkAAMDB/wEYcmVlzttqbwAAAABJRU5ErkJggg==\n",
713 "text/plain": [
714 "Graphics object consisting of 1 graphics primitive"
715 ]
716 },
717 "execution_count": 71,
718 "metadata": {},
719 "output_type": "execute_result"
720 }
721 ],
722 "source": [
723 "f = 1/x^2\n",
724 "print( f.limit(x=0) )\n",
725 "print( f.limit(x=0, dir=\"+\") )\n",
726 "print( f.limit(x=0, dir=\"-\") )\n",
727 "plot(f, (x, -10, 10), ymax = 10, ymin = -10)"
728 ]
729 },
730 {
731 "cell_type": "markdown",
732 "metadata": {},
733 "source": [
734 "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`."
735 ]
736 },
737 {
738 "cell_type": "markdown",
739 "metadata": {},
740 "source": [
741 "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does."
742 ]
743 },
744 {
745 "cell_type": "code",
746 "execution_count": 81,
747 "metadata": {},
748 "outputs": [
749 {
750 "name": "stdout",
751 "output_type": "stream",
752 "text": [
753 "1*(x - 1) + (-1/2)*(x - 1)^2 + 1/3*(x - 1)^3 + Order((x - 1)^4)\n",
754 "1*x^2 + (-5/6)*x^4 + Order(x^6)\n"
755 ]
756 }
757 ],
758 "source": [
759 "f = e^x\n",
760 "g = sin(x) - 2*cos(x)\n",
761 "h = log(x)\n",
762 "\n",
763 "#print(f.series(x==0, 5))\n",
764 "#print(g.series(x==0, 7))\n",
765 "print(h.series(x==1, 4))\n",
766 "\n",
767 "print((sin(x)^2*cos(x)).series(x==0, 6))"
768 ]
769 },
770 {
771 "cell_type": "markdown",
772 "metadata": {},
773 "source": [
774 "## Derivatives\n",
775 "**References:** [[7](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.derivative)] and [[8](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html#sage.calculus.functional.derivative)] for derivatives, [[9](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html#sage.calculus.functions.jacobian)] for the Jacobian matrix and [[10](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.hessian)] for the Hessian."
776 ]
777 },
778 {
779 "cell_type": "markdown",
780 "metadata": {},
781 "source": [
782 "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one."
783 ]
784 },
785 {
786 "cell_type": "code",
787 "execution_count": 84,
788 "metadata": {},
789 "outputs": [
790 {
791 "name": "stdout",
792 "output_type": "stream",
793 "text": [
794 "8*y^3\n",
795 "6*x^2 - 1\n"
796 ]
797 }
798 ],
799 "source": [
800 "var('y')\n",
801 "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n",
802 "print( (2*x^3-x+2).derivative() )"
803 ]
804 },
805 {
806 "cell_type": "markdown",
807 "metadata": {},
808 "source": [
809 "You can also compute higher order derivatives:"
810 ]
811 },
812 {
813 "cell_type": "code",
814 "execution_count": 85,
815 "metadata": {},
816 "outputs": [
817 {
818 "name": "stdout",
819 "output_type": "stream",
820 "text": [
821 "6*x\n",
822 "84*x^5*y + 10*y^4 + 24*x^2*y\n",
823 "1680*x^3 + 48\n"
824 ]
825 }
826 ],
827 "source": [
828 "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n",
829 "\n",
830 "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n",
831 "print( f.derivative(x, x, y) ) # Twice in x, once in y\n",
832 "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y"
833 ]
834 },
835 {
836 "cell_type": "markdown",
837 "metadata": {},
838 "source": [
839 "Jacobian and Hessian matrices are also easy to compute:"
840 ]
841 },
842 {
843 "cell_type": "code",
844 "execution_count": 86,
845 "metadata": {},
846 "outputs": [
847 {
848 "name": "stdout",
849 "output_type": "stream",
850 "text": [
851 "[-2*x + 2*y 2*x]\n",
852 "[ 0 3*y^2]\n",
853 "[ y + 1 x + 1] \n",
854 "\n",
855 "[ 2 -4*y + 1]\n",
856 "[ -4*y + 1 -4*x + 6*y]\n"
857 ]
858 }
859 ],
860 "source": [
861 "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n",
862 "print( jacobian(f, [x,y]), \"\\n\" )\n",
863 "\n",
864 "g = x^2 + x*y + y^3 -2*x*y^2 -3\n",
865 "print( g.hessian() )"
866 ]
867 },
868 {
869 "cell_type": "markdown",
870 "metadata": {},
871 "source": [
872 "*Note:* the notation `f.jacobian([x,y])` is also valid, but only if you specify that `f` is vector by declaring it as `f = vector([...])`."
873 ]
874 },
875 {
876 "cell_type": "markdown",
877 "metadata": {},
878 "source": [
879 "## Integrals\n",
880 "**References:** [[11](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html)] for symbolic integration and [[12](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html)] for numerical methods.\n",
881 "\n",
882 "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n",
883 "When using a computer software to solve your integrals, you have two choices:\n",
884 "\n",
885 "1. You can try to compute a primitive function exactly, and then (if you are computing a definite integral) substitute the endpoints of your integration interval to get the result. We can call this *symbolic integration*.\n",
886 "2. You can get an *approximated* result with a *numerical method*. This method always gives some kind of result, but it cannot be used to compute indefinite integrals.\n",
887 "\n",
888 "Sage can do both of these things, although people that work in numerical analysis and use often the second method tend to prefer other programs, such as Matlab (or its open-source clone Octave)."
889 ]
890 },
891 {
892 "cell_type": "markdown",
893 "metadata": {},
894 "source": [
895 "### Symbolic integration\n",
896 "\n",
897 "Symbolic integrals work more or less like derivatives. You must specify an integration variable, but the endpoints of the integration interval are optional. If they are not given you get an indefinite integral."
898 ]
899 },
900 {
901 "cell_type": "code",
902 "execution_count": 88,
903 "metadata": {},
904 "outputs": [
905 {
906 "name": "stdout",
907 "output_type": "stream",
908 "text": [
909 "1/2*x^2 - cos(x)\n",
910 "0\n",
911 "1/2*pi^2 + 2\n"
912 ]
913 }
914 ],
915 "source": [
916 "var('a', 'b')\n",
917 "f = x + sin(x)\n",
918 "print( f.integral(x) ) # Alternative: integral(f, x)\n",
919 "print( f.integral(x, -10, 10) )\n",
920 "print( f.integral(x, 0, pi) )"
921 ]
922 },
923 {
924 "cell_type": "markdown",
925 "metadata": {},
926 "source": [
927 "Your endpoints can also be $\\pm\\infty$:"
928 ]
929 },
930 {
931 "cell_type": "code",
932 "execution_count": 89,
933 "metadata": {},
934 "outputs": [
935 {
936 "name": "stdout",
937 "output_type": "stream",
938 "text": [
939 "1\n",
940 "sqrt(pi)\n"
941 ]
942 }
943 ],
944 "source": [
945 "print( integral(e^(-x), x, 0, infinity) )\n",
946 "print( integral(e^(-x^2), x, -infinity, infinity) )"
947 ]
948 },
949 {
950 "cell_type": "markdown",
951 "metadata": {},
952 "source": [
953 "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:"
954 ]
955 },
956 {
957 "cell_type": "code",
958 "execution_count": 92,
959 "metadata": {},
960 "outputs": [
961 {
962 "name": "stdout",
963 "output_type": "stream",
964 "text": [
965 "1/2*sqrt(pi)*erf(x)\n",
966 "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n"
967 ]
968 }
969 ],
970 "source": [
971 "print( integral(e^(-x^2), x) )\n",
972 "print( integral(e^(-x^2), x, 1, 2) )"
973 ]
974 },
975 {
976 "cell_type": "markdown",
977 "metadata": {},
978 "source": [
979 "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)."
980 ]
981 },
982 {
983 "cell_type": "markdown",
984 "metadata": {},
985 "source": [
986 "### Numerical integration\n",
987 "\n",
988 "In order to get an explicit value for the computations above, we can use a *numerical* method.\n",
989 "\n",
990 "The word \"numerical\" does not have much to do with numbers, but it refers to the fact that we are trying to compute explicit results rather than symbolic or algebraic ones. [Numerical analysis](https://en.wikipedia.org/wiki/Numerical_analysis) is the branch of mathematics that studies methods to approximate computations over the real or complex numbers. With these methods there is usually a trade-off between speed and precision.\n",
991 "\n",
992 "The Sage function [`numerical_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.numerical_integral) takes as a parameter a real-valued one-variable function and the integration endpoints, and it returns both an approximate value for the integral and an error estimate."
993 ]
994 },
995 {
996 "cell_type": "code",
997 "execution_count": 93,
998 "metadata": {},
999 "outputs": [
1000 {
1001 "data": {
1002 "text/plain": [
1003 "(0.13525725794999466, 1.5016572202374808e-15)"
1004 ]
1005 },
1006 "execution_count": 93,
1007 "metadata": {},
1008 "output_type": "execute_result"
1009 }
1010 ],
1011 "source": [
1012 "numerical_integral(e^(-x^2), 1, 2)"
1013 ]
1014 },
1015 {
1016 "cell_type": "markdown",
1017 "metadata": {},
1018 "source": [
1019 "The result above means, in symbols\n",
1020 "\\begin{align*}\n",
1021 "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n",
1022 "\\end{align*}\n",
1023 "\n",
1024 "There is also a [`monte_carlo_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.monte_carlo_integral) method for functions with more than one variable."
1025 ]
1026 },
1027 {
1028 "cell_type": "markdown",
1029 "metadata": {},
1030 "source": [
1031 "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$."
1032 ]
1033 },
1034 {
1035 "cell_type": "markdown",
1036 "metadata": {},
1037 "source": [
1038 "**Solution:** First, rewrite the equation as:\n",
1039 "\\begin{align*}\n",
1040 "y = \\sqrt{1- \\left(\\frac{x}{3}\\right)^2}\n",
1041 "\\end{align*}"
1042 ]
1043 },
1044 {
1045 "cell_type": "code",
1046 "execution_count": 104,
1047 "metadata": {},
1048 "outputs": [
1049 {
1050 "data": {
1051 "image/png": "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\n",
1052 "text/plain": [
1053 "Graphics object consisting of 1 graphics primitive"
1054 ]
1055 },
1056 "metadata": {},
1057 "output_type": "display_data"
1058 },
1059 {
1060 "data": {
1061 "text/plain": [
1062 "3/2*pi"
1063 ]
1064 },
1065 "execution_count": 104,
1066 "metadata": {},
1067 "output_type": "execute_result"
1068 }
1069 ],
1070 "source": [
1071 "y = sqrt(1-(x/3)^2)\n",
1072 "show(plot(y, xmin=-3.1, xmax=3.1, ymin=-0.2, ymax=1.1))\n",
1073 "integral(y, x, -3, 3)"
1074 ]
1075 },
1076 {
1077 "cell_type": "markdown",
1078 "metadata": {},
1079 "source": [
1080 "## Differential equations\n",
1081 "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n",
1082 "\n",
1083 "A [differential equation](https://en.wikipedia.org/wiki/Differential_equation) is an equation involving an unknwon function and its derivatives. They can be of two kinds: *ordinary* differential equations ([ODE](https://en.wikipedia.org/wiki/Ordinary_differential_equation)) and *partial* differential equations ([PDE](https://en.wikipedia.org/wiki/Partial_differential_equation)). The latter involve multivariate functions and their partial derivatives.\n",
1084 "\n",
1085 "Differential equations are in general hard to solve *exactly* (or *symbolically*): even a simple equation of the form $f'(x)=g(x)$, where $g(x)$ is someknown function, requires solving the integral $\\int g(x)\\mathrm{d}x$ in order to find $f$, which as we know is not always easy!\n",
1086 "\n",
1087 "Theoretical results on differential equations usually ensure the existence and/or uniquess of a solution under certain conditions, but in general they do not give a way to solve them. There exits many methods to find approximate solutions, and some of them are implemented in Sage as well (see [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]). However we will focus on the simple ODEs that can be solved exactly.\n",
1088 "\n",
1089 "Let's start with a simple example. Let's find all functions $f(x)$ such that $f'(x)=f(x)$. In order to do so, we need to use the `function()` construct, which allows us to define an \"unknwon\" function inside Sage, like we define variables with `var()`."
1090 ]
1091 },
1092 {
1093 "cell_type": "code",
1094 "execution_count": 108,
1095 "metadata": {},
1096 "outputs": [
1097 {
1098 "data": {
1099 "text/plain": [
1100 "_C*e^x"
1101 ]
1102 },
1103 "execution_count": 108,
1104 "metadata": {},
1105 "output_type": "execute_result"
1106 }
1107 ],
1108 "source": [
1109 "var('x')\n",
1110 "function('f')\n",
1111 "equation = derivative(f(x)) == f(x)\n",
1112 "desolve(equation, f(x)) # f(x) is the unknown function"
1113 ]
1114 },
1115 {
1116 "cell_type": "markdown",
1117 "metadata": {},
1118 "source": [
1119 "As you can expect, they are all the functions $Ce^x$ for some constant $C$. The constant $C$ plays the same role as the constant in the solution of an integral, but in this case Sage writes it explicitly.\n",
1120 "\n",
1121 "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:"
1122 ]
1123 },
1124 {
1125 "cell_type": "code",
1126 "execution_count": 109,
1127 "metadata": {},
1128 "outputs": [
1129 {
1130 "data": {
1131 "text/plain": [
1132 "3*e^x"
1133 ]
1134 },
1135 "execution_count": 109,
1136 "metadata": {},
1137 "output_type": "execute_result"
1138 }
1139 ],
1140 "source": [
1141 "desolve(equation, f(x), (0,3))"
1142 ]
1143 },
1144 {
1145 "cell_type": "markdown",
1146 "metadata": {},
1147 "source": [
1148 "You can also solve *second order* equations, that is equations where the second derivative also appears. In this case if you want to specify an initial condition you should write the triple of values $(x_0, f(x_0), f'(x_0))$."
1149 ]
1150 },
1151 {
1152 "cell_type": "code",
1153 "execution_count": 112,
1154 "metadata": {},
1155 "outputs": [
1156 {
1157 "data": {
1158 "text/plain": [
1159 "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)"
1160 ]
1161 },
1162 "execution_count": 112,
1163 "metadata": {},
1164 "output_type": "execute_result"
1165 }
1166 ],
1167 "source": [
1168 "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n",
1169 "desolve(equation, f(x), (0, 0, 0))"
1170 ]
1171 },
1172 {
1173 "cell_type": "markdown",
1174 "metadata": {},
1175 "source": [
1176 "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n",
1177 "\\begin{align*}\n",
1178 " \\begin{array}{rlcrl}\n",
1179 " (A) &\n",
1180 " \\begin{cases}\n",
1181 " f(0) &= 1\\\\\n",
1182 " f'(0) &= 0\\\\\n",
1183 " f''(x) &= -f(x)\n",
1184 " \\end{cases}\n",
1185 " & \\qquad \\qquad &\n",
1186 " (B) &\n",
1187 " \\begin{cases}\n",
1188 " f(0) &= 0\\\\\n",
1189 " f'(0) &= 1\\\\\n",
1190 " f''(x) &= -f(x)\n",
1191 " \\end{cases}\n",
1192 " \\end{array}\n",
1193 "\\end{align*}"
1194 ]
1195 },
1196 {
1197 "cell_type": "code",
1198 "execution_count": 116,
1199 "metadata": {},
1200 "outputs": [
1201 {
1202 "name": "stdout",
1203 "output_type": "stream",
1204 "text": [
1205 "cos(x)\n",
1206 "sin(x)\n",
1207 "_K2*cos(x) + _K1*sin(x)\n"
1208 ]
1209 }
1210 ],
1211 "source": [
1212 "eq = derivative(f(x), x, 2) == -f(x)\n",
1213 "conditions1 = (0,1,0)\n",
1214 "conditions2 = (0,0,1)\n",
1215 "print( desolve(eq, f(x), conditions1) )\n",
1216 "print( desolve(eq, f(x), conditions2) )\n",
1217 "print( desolve(eq, f(x)) )"
1218 ]
1219 },
1220 {
1221 "cell_type": "markdown",
1222 "metadata": {},
1223 "source": [
1224 "### A real-world example\n",
1225 "\n",
1226 "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n",
1227 "\n",
1228 "Consider an object moving with constant acceleration $a$. Its velocity at time $t$ is described by the formula $v(t) = v(0) + at$. For example an object falling from the sky has acceleration $g\\sim 9.8 m/s^2$ towards the ground, so its velocity is $v(t) = -gt$.\n",
1229 "\n",
1230 "However in the real world you need to take into account the air's resistance, which depends (among other things) on the velocity of the object. In this case the acceleration $a(t)$ is not constant anymore, and it satisfies an equation of the form $a(t)=-g -kv(t)$, where $k$ is some constant that may depend on the shape and mass of the object (in practice it may be more complicated than this).\n",
1231 "\n",
1232 "Since the acceleration is the derivative of the velocity, we have a differential equation\n",
1233 "\\begin{align*}\n",
1234 " v'(t) = -g -kv(t)\n",
1235 "\\end{align*}\n",
1236 "and we can try to solve it with Sage!"
1237 ]
1238 },
1239 {
1240 "cell_type": "code",
1241 "execution_count": 120,
1242 "metadata": {},
1243 "outputs": [],
1244 "source": [
1245 "var('t')\n",
1246 "function('v')\n",
1247 "g = 9.8\n",
1248 "k = 1.5\n",
1249 "conditions = (0, 0) # Start with velocity 0\n",
1250 "sol = desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)\n",
1251 "#plot(sol, xmin=0, xmax = 100)"
1252 ]
1253 },
1254 {
1255 "cell_type": "markdown",
1256 "metadata": {},
1257 "source": [
1258 "If you want to solve this equation symbolically (that is, keeping $g$ and $k$ in symbols) you need to specify that $t$ is the *independent variable* of the equation:"
1259 ]
1260 },
1261 {
1262 "cell_type": "code",
1263 "execution_count": 121,
1264 "metadata": {},
1265 "outputs": [
1266 {
1267 "data": {
1268 "text/plain": [
1269 "-(g*e^(k*t) - g)*e^(-k*t)/k"
1270 ]
1271 },
1272 "execution_count": 121,
1273 "metadata": {},
1274 "output_type": "execute_result"
1275 }
1276 ],
1277 "source": [
1278 "var('t', 'g', 'k')\n",
1279 "function('v')\n",
1280 "conditions = (0, 0) # Start with velocity 0\n",
1281 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)"
1282 ]
1283 },
1284 {
1285 "cell_type": "markdown",
1286 "metadata": {},
1287 "source": [
1288 "# Basic data analysis and visualization\n",
1289 "\n",
1290 "## Statistics\n",
1291 "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n",
1292 "\n",
1293 "Sage includes the most basic functions for statistical analysis."
1294 ]
1295 },
1296 {
1297 "cell_type": "code",
1298 "execution_count": 122,
1299 "metadata": {},
1300 "outputs": [
1301 {
1302 "name": "stdout",
1303 "output_type": "stream",
1304 "text": [
1305 "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1306 "Mean:\t\t\t 5/13\n",
1307 "Median:\t\t\t 1\n",
1308 "Mode:\t\t\t [3]\n",
1309 "Standard deviation:\t 2*sqrt(29/13)\n",
1310 "Variance:\t\t 116/13\n",
1311 "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n"
1312 ]
1313 }
1314 ],
1315 "source": [
1316 "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1317 "\n",
1318 "print(\"Values:\\t\", L)\n",
1319 "\n",
1320 "print(\"Mean:\\t\\t\\t\", mean(L))\n",
1321 "print(\"Median:\\t\\t\\t\", median(L))\n",
1322 "print(\"Mode:\\t\\t\\t\", mode(L))\n",
1323 "\n",
1324 "print(\"Standard deviation:\\t\", std(L))\n",
1325 "print(\"Variance:\\t\\t\", variance(L))\n",
1326 "\n",
1327 "print(\"Moving average (5):\", moving_average(L,5))"
1328 ]
1329 },
1330 {
1331 "cell_type": "markdown",
1332 "metadata": {},
1333 "source": [
1334 "You can also compare your data to a probability distribution, see [this page](https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html). If you need to do more advanced statistics you should consider using [R](https://www.r-project.org/); you can also use it inside Sage."
1335 ]
1336 },
1337 {
1338 "cell_type": "markdown",
1339 "metadata": {},
1340 "source": [
1341 "## Plotting\n",
1342 "**Reference:** [[15](https://doc.sagemath.org/html/en/reference/plotting/index.html)], more specifically the subsection [[16](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html)].\n",
1343 "\n",
1344 "Some Sage objects can be plotted:"
1345 ]
1346 },
1347 {
1348 "cell_type": "code",
1349 "execution_count": 123,
1350 "metadata": {},
1351 "outputs": [
1352 {
1353 "data": {
1354 "image/png": "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iYyMdPl5hw8fZs+ePXkSavGcY8fggQfMPm2PPQbPPANl1L5WiqlcuXKEhYURHx9P9+7dc8/Hx8fTtWtXl18nNTVVPxuEiIgIPv300zznVq1aRfPmzSlbtqzrL+TqrO9CjgL98ssvVmpqqvXkk09alStXtlJTU63U1FTr2LFjudc0aNDA+uijj3K/njZtmuVwOKyPPvrI2rJli3XfffdZtWvXtjIzMwud3S6+o3379laTJk2sxMREKzEx0br++uutTp065bnmz5+LY8eOWY888oiVkJBg7d6921q9erUVERFhXX755fpc2GDbNstq2NCyqlSxrKVL3fccrXoLTO+9955VtmxZa+HChda2bdus0aNHW5UqVbJ+/vlny7Isa/z48VZ0dHTu9c8//7y1bNkya9euXdZ3331njR8/3gKspe78cIotjh07lptHANasWbOs1NRU65dffrEs6/zPxk8//WRVrFjRGjNmjLVt2zZr4cKFVtmyZa0PP/zwj0tcynPcmij179/fAs47Vq9enXsNYL3++uu5X+fk5FhTpkyxatWqZQUHB1s333yztWXLlgv86xRvdvjwYatv375WlSpVrCpVqlh9+/Y9b2nvnz8XJ0+etKKioqxLL73UKlu2rHXllVda/fv3t9LT0z0ffID74APLqlzZskJDLauQbg4lQolS4IqLi7Pq1q1rlStXzmrWrJm1du3a3D/r37+/dcstt+R+PX36dOvqq6+2ypcvb/3tb3+zWrdubX322Wc2RC3u9kcriL8e/fv3tyzr/M+GZVnWmjVrrBtvvNEqV66cVa9ePWvevHl//mOX8pwg678Tm4qh2C8gIt7t3DkYPx6ee85M3H71Vahc2T3PiouLIy4ujuzsbHbt2oXT6aRq1arueZiIBDKXZnQrURKRQh04YJKjr76CmTNh1CjwxCLUzMxMHA6HEiURcReXfpJp+qWIFCgx0TSPzMmB1auhTRu7IxIR8SyvajgpIt7BsmDOHLjlFqhfH775RkmSiAQmJUoikseJExAdbbYjGTbMVJK00lpEApWG3kQk1w8/QI8e8OOP8M47cN99dkckImIvVZREBIBPPoHmzeH0adiwQUmSiAgoURIJeNnZ8Pjj0LUr3HYbbNoEjRvbHZWIiHfQ0JtIADt0CPr0gS++gGnT4NFHPbP0X0TEVyhREglQyclw991w8iSs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\n",
1355 "text/plain": [
1356 "Graphics object consisting of 1 graphics primitive"
1357 ]
1358 },
1359 "execution_count": 123,
1360 "metadata": {},
1361 "output_type": "execute_result"
1362 }
1363 ],
1364 "source": [
1365 "f = sin(x)\n",
1366 "plot(f)"
1367 ]
1368 },
1369 {
1370 "cell_type": "markdown",
1371 "metadata": {},
1372 "source": [
1373 "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n",
1374 "\n",
1375 "You can give a number of options to adjust the aspect of your plot, see [here](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html#sage.plot.plot.plot). Let's see some of them:"
1376 ]
1377 },
1378 {
1379 "cell_type": "code",
1380 "execution_count": 129,
1381 "metadata": {},
1382 "outputs": [
1383 {
1384 "name": "stdout",
1385 "output_type": "stream",
1386 "text": [
1387 "hello\n"
1388 ]
1389 },
1390 {
1391 "data": {
1392 "image/png": "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\n",
1393 "text/plain": [
1394 "Graphics object consisting of 1 graphics primitive"
1395 ]
1396 },
1397 "metadata": {},
1398 "output_type": "display_data"
1399 }
1400 ],
1401 "source": [
1402 "f = sin(x)\n",
1403 "p = plot(f,\n",
1404 " -2*pi, 2*pi, # bounds for x\n",
1405 " ymin = -1.1, ymax = 1.1, # bounds for y\n",
1406 " color = \"red\",\n",
1407 " title = \"The sin function\",\n",
1408 " )\n",
1409 "print(\"hello\")\n",
1410 "show(p)"
1411 ]
1412 },
1413 {
1414 "cell_type": "markdown",
1415 "metadata": {},
1416 "source": [
1417 "Some of the options are not described precisely in Sage's documentation, but you can find them on [matplotlib's documentation](https://matplotlib.org/stable/contents.html). You can find many examples online for adjusting your plot as you like!"
1418 ]
1419 },
1420 {
1421 "cell_type": "markdown",
1422 "metadata": {},
1423 "source": [
1424 "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:"
1425 ]
1426 },
1427 {
1428 "cell_type": "code",
1429 "execution_count": 134,
1430 "metadata": {},
1431 "outputs": [
1432 {
1433 "data": {
1434 "image/png": "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\n",
1435 "text/plain": [
1436 "Graphics object consisting of 2 graphics primitives"
1437 ]
1438 },
1439 "metadata": {},
1440 "output_type": "display_data"
1441 }
1442 ],
1443 "source": [
1444 "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n",
1445 "exponential = plot(exp(x), (x,-2,0.5))\n",
1446 "\n",
1447 "show(cosine + exponential) # works like print()"
1448 ]
1449 },
1450 {
1451 "cell_type": "markdown",
1452 "metadata": {},
1453 "source": [
1454 "Finally, there are other types of plots that you can use, like [scatter plots](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html#sage.plot.scatter_plot.scatter_plot) and [bar charts](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html#sage.plot.bar_chart.bar_chart). You can also add [text](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html#sage.plot.text.text) to your plot:"
1455 ]
1456 },
1457 {
1458 "cell_type": "code",
1459 "execution_count": 138,
1460 "metadata": {},
1461 "outputs": [
1462 {
1463 "data": {
1464 "image/png": "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ceJETjvtNHbeeWdWrFjB9ddfz/e//32ampo48MADue+++5gyZUrncxcvXsyyZcvYf//9Afja177GIYcc0uX13/GOd6zDnkvSENlhDtSugslz4aWp5a5m5BtoikrFkZlaoJniX73f7LZuFMXAkigGmgTcUOI1FrWvm1di3X3t61YD+5VYP541o0OtwKRu6z/Zvi499thjXaLiT3/6084Ro/e85z0JSFdddVWXkaOFCxd2/kV//fXXD2lUTSmlpUuX9jky1KGtrS298cYbPZZ3PHddRo4WLFiQampqEpC22Wab9MILL/T6OqXWddQApAMOOCC1tLT02OZrX/ta5zb/9V//1WetvcmOHAHpmmuu6bFNc3NzmjJlSgJSTU1Nevjhh3ts09dn8fDDD3d+FpMnT05//etfe2zz29/+tnOb6dOn91j/zDPPdNZ4xRVXDGjfHDmStC4GP3LUlupOeXeq+Q9S3Sn/lKDNkaN+boOac5RSagXuan84s9vq6cDY9vD03fZle2TnHUXEeGCH9od3ZJ8cEdOBjklAP0op3VLi/f8KnND+sAa4KiKeiYiVEfE0sEvHtnfc0eXlmT+/OOg1c+bMzlGhP/zhDyW3qampYc899+z+9uvspZde6vx5r7326nW7iGD8+PFD/v4AF1xwAW1tbUQEc+fOZauttup1277WjRkzhiuuuKLkqNApp5zSubxjJG5dHHjggRx11FE9lm+00UZcfvnlALS1tXHppZcO6nUvueQS2traAPjhD3/Ixhtv3GObj370o/zLv/wLAPfddx/333//IKvvqb6+vuTPkrRebL6I1Zs8z6n3wOpNnoPNHyp3RSPe2lytdkf7/S4RsWFm+cz2+98DdwMrgQLF02Ed9sq853y62ifz8497e/OU0l1Ax2zfnYAvANsD/xc4CXgZeoajjsd9haOObaZMmVLyF+W62mKLLTp/LkfDwLa2Nn73u+KZ0BkzZjB16toPre677769njLaaKONeP/73w/A008/vdbv0eG4447rdd306dOZNGkSALfeeuugXrdj+4aGBnbfffdetzv++ON7PGddZL/Hb6ONNlrn15OkTps9DpOu7Xr74LfZaGUt594OG62shQ9+u+c2mz1e7spHlMHOOYLe5x3NbL+/I6X0VvsVbR+h67yjjm3eABZ3e93J7fdvAQv7qeFeioGoFvjvlNJb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\n",
1465 "text/plain": [
1466 "Graphics object consisting of 3 graphics primitives"
1467 ]
1468 },
1469 "metadata": {},
1470 "output_type": "display_data"
1471 }
1472 ],
1473 "source": [
1474 "b = bar_chart(range(1,10))\n",
1475 "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n",
1476 " marker = \"*\", # symbol\n",
1477 " markersize = 100,\n",
1478 " edgecolor = \"green\",\n",
1479 " facecolor = \"red\"\n",
1480 " )\n",
1481 "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n",
1482 "show(b + s + t)"
1483 ]
1484 },
1485 {
1486 "cell_type": "markdown",
1487 "metadata": {},
1488 "source": [
1489 "## Interpolation\n",
1490 "**References:** [[17](https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial)] and [[18](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html)].\n",
1491 "\n",
1492 "When you need to work with a discrete set of data, like measurements of real-world quantities, it can be useful to visualize a \"smoothed out\" version of this data, for example by plotting a function that approximates it.\n",
1493 "\n",
1494 "One way to do so is finding the lowest-degree polynomial that passes through all your points. This is called [Lagrange Polynomial](https://en.wikipedia.org/wiki/Lagrange_polynomial)."
1495 ]
1496 },
1497 {
1498 "cell_type": "code",
1499 "execution_count": 139,
1500 "metadata": {},
1501 "outputs": [
1502 {
1503 "data": {
1504 "image/png": "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U4mKigrI75hgsX8/jB9vZ+CuXdt1msj0z39CVpZd0iQU+LxQ8jwvxvO8xz3P+8nzvHTP8zZ7nveI53llOtbff/9NmzZtePLJJwvd5osvvqBLly507tyZr7/+mmXLljFw4ECiovIe+qOPPqJevXo0btyYypUrM3DgQD777DPWrVvHQw89xEMPPcTkyZMB2LhxIzNmzMjz/BUrVjCvBBdYMzIy6N69O8cccwwffvghDz/8MOPGjePyyy9n2bJlBT5n2bJlTJ48mTPOOKPYx8kxYsQIbizBPPzz58/nmmuuoV+/fqxevZrk5GTGjh3L888/n2/bDRs2sH379tzbySefnG+bd955h+7duwPQokULpk6dyrp16/jwww8xxtC5c2eysrIAmDRpEr///nvucw8cOMCYMWPyFTlH8/7779OvXz9mzpzJoEGD+Oyzz/j111+5/vrryc7Ozt0uKiqK7t27884777Bx40amTZvGxx9/TD8fDHmpW7cuTz75JMuXL2f58uVccMEFdO/enTVr1uTbds6cOXz11VfULuC3dFHvV47Dz2GAq666ik8++YSXXnqJDRs28Oabb+Z+L9Dn8OLFixkwYABffvklH330EZmZmXTu3Jm///672Mcr6TmclZVFbGwsgwcPplOnTgVuM3HiRIYNG8aIESNYs2YNI0eOZMCAAXneh3379tGwYUOefPJJatWqVejxsrOzee+993LP81mzZnHddddx0003sWrVKpYuXUrv3r1ztx83bhx79uzJ/XrPnj2MHTu22K+vKDfeeGOJPmhkZGRQvXp1HnzwQZo1a+azHKFg+nTbkfuee1wniVz16kFCAixY4DpJMRljfHoDHgR2AhcDDYArgD3AHaYYUlNTDWBSU1ML/P5PP/1kAPPtt9/m+17Lli3NQw89VOQxbr75ZnPPPfcU+v0ePXqYa6+91hhjzJ9//mluu+02c+WVV5pmzZqZRx55xHTp0sWsW7fOpKenm4SEBNOnT5/c527evNnExcWZyZMnG2OMyczMND169DDdunUz+/fvz3OcV155xdSsWdOsXbs2z+N79uwxJ598svnoo49M+/btzR133FHkazrc8OHDzQ033FDs7Xv16mWuuOKKPI+NGzfO1K1b12RnZxtjjPn0008NYHbv3n3Uff3yyy+mXLlyhW63atUqA5gffvjBGGPMu+++a1q2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\n",
1505 "text/plain": [
1506 "Graphics object consisting of 3 graphics primitives"
1507 ]
1508 },
1509 "metadata": {},
1510 "output_type": "display_data"
1511 }
1512 ],
1513 "source": [
1514 "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n",
1515 "polring.<x> = QQ[] # you need to specify a polynomial ring\n",
1516 "lp = polring.lagrange_polynomial(points)\n",
1517 "show(scatter_plot(points, facecolor=\"red\")\n",
1518 " + plot(lp, 0, 3) # slightly different notation for polynomials\n",
1519 " + text(lp, (1,8), color=\"black\")\n",
1520 " )"
1521 ]
1522 },
1523 {
1524 "cell_type": "markdown",
1525 "metadata": {},
1526 "source": [
1527 "One can compute the Lagrange Polynomial over any base ring, and it has the advantage that it is a very \"nice\" function (continuous and differentiable as much as you like, with easily computable derivatives and primitives).\n",
1528 "\n",
1529 "However, it does not always give you good approximation of your data:"
1530 ]
1531 },
1532 {
1533 "cell_type": "code",
1534 "execution_count": 142,
1535 "metadata": {},
1536 "outputs": [
1537 {
1538 "data": {
1539 "image/png": "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05/+NOLX3HfffXrooYc0a9YsFRYWqn379jrvvPNqF9OMhJcGmTVHV155pVavXq2FCxdq4cKFWr16ta655pqwrxs9erS2bdtWe3v99dfjUC2AZPHiiy9qypQp+uUvf6kPPvhAw4YN0wUXXKDi4uIGX7du3brDji2nnnpqnCqOvbPPlqqr7QLCseClwBTziSuNMeapp54yfr8/7POqq6tN+/btze9///vax8rLy43f7zePPvpoJLsyxhizcaOdNHLRoohfggRRVFRkJJkVK1bUPrZ8+XIjyXz66af1vu7HP/6xGTduXBwqRDLw+uSDaJrBgwebSZMmHfbYaaedZu644446n7948WIjyezevTsO1bmjqsoYv9+Y3/0uNtu/7jpjhgyJzbYdFFHeSagxTBs3blRJSYlGjRpV+1haWpq+/e1v65///GfE26GFKXktX75cfr9fQ4YMqX1s6NCh8vv9YT8D77zzjrKystSzZ09NnDhR27dvj3W5AJJEZWWlVq1addj5RZJGjRoV9tgyYMAAdejQQeeee64Wx3LAjwtSUqQhQ+yV3LHgpRamhApMJSUlkqR27dod9ni7du1qfxYJAlPyKikpUVZW1lGPZ2VlNfgZuOCCC/Tcc8/p7bff1oMPPqjCwkJ95zvfOWwFe3hffn6+srOzlZOT43YpSDA7duxQVVVVo84vHTp00OOPP65XXnlFr776qnr16qVzzz1X7733XjxKjpuzzrKTV0Y/j/XRmnVg8vl8030+nznkdtSAuJUrV0ZVlO+IiYmMMUc91hACU+KZPn16nYMn6/rc1PW7DvcZuPzyyzVmzBj16dNHY8eO1RtvvKHPPvtMf//732P2npB48vLyVFRUpMJYDchA0mvM+aVXr16aOHGizjzzTJ111lmaPXu2xowZowceeCAepcbNWWfZ1Sc+/9z5bSfCJNJOaco8TLMk/aXmH2vXrl175BO6du3apGLat28vybYydOjQofbx7du3H/WtoCEEpsQzefJkXXHFFQ0+p2vXrvroo49UWlp61M++/vrrRn0GOnTooC5duujzWBwBACSdtm3bKjU19ajWpMaeX4YOHapnn33W6fJcVTMCYvlyqWdPZ7cdCEh9+ji7Tbc0OjAZY3ZI2hGDWtStWze1b99eixYt0oABAyTZfud3331X9957b8TbITAlnrZt26pt27Zhn3fWWWcpEAjoX//6lwYPHixJev/99xUIBHT22WdHvL+dO3dq8+bNhwVvAM1Xq1atNHDgQC1atEgXX3xx7eOLFi3SuHHjIt7OBx984LnjyvHHS9nZNjD9+MfObjsQsEuCeUFMxzAVFxdr9erVKi4uVlVVlVavXq3Vq1drX02ikXTaaadp7ty5kmxT6ZQpU3TPPfdo7ty5+uSTT3TttdeqdevWuvLKKyPe7759UmqqnV0UyaV3794aPXq0Jk6cqBUrVmjFihWaOHGiLrzwQvXq1av2eYd+bvbt26dbb71Vy5cv16ZNm/TOO+9o7Nixatu27WEHRgDN2y233KI5c+boySef1Nq1azV16lQVFxdr0qRJkqRp06bpRz/6Ue3zZ86cqXnz5unzzz/XmjVrNG3aNL3yyiuaPHmyW28hZgYPtuvKOS0Y9E5giunSKL/+9a/19NNP1/67ptVo8eLFGjFihCQ7v0UgEKh9zu23365QKKQbb7xRu3fv1pAhQ/TWW28poxELw9UMMmONtuT03HPP6aabbqq9muX73/++Zs2addhzDv3cpKam6uOPP9YzzzyjPXv2qEOHDho5cqRefPHFRn1uAHjb5Zdfrp07d+q3v/2ttm3bpj59+uj1119Xly5dJEnbtm07bE6myspK3XrrrdqyZYvS09N1+umn6+9//7u+F6t1RFw0cKD03HN24menGhuMsS1MmZnObM9tPhP9sPgYjKuPzvTp0pw50ldfuV0JADcEg0H5/X4FAgFleuVoDcTQ8uV2EsuVK214csI339jGi+eekxrRSeSGiJpXEmpaAad46TJGAABirV8/OyfTqlXObTMYtPde6ZIjMAEA0My1bm0HfjsZmGpG2xCYEhiBCQCAxhk4MDaBySu94gQmAACggQOljz+WKiud2R5dckmAwAQAQOMMHGjD0iefOLM9uuSSAIEJAIDG6d/f2YHfNYHJK7O7EJgAAIBat5Z693YuMAWD9lycmurM9tzm2cB07LFuVwEAQHLp31/68ENntuWlZVEkjwamsjICEwAAjdWvnx34XV0d/bYITEmgrMw2LQJoXvLz85Wdna2cnBy3SwGSUr9+dobu9euj35aXlkWRPBiYjCEwAc1VXl6eioqKVFhY6HYpQFLq18/eO9Et56WFdyUPBqaKChuaCEwAADROu3b25kRgoksuwZWV2XsCEwAAjdevH4GpLgQmAABQy6nAtGcPgSmhEZgAAGi6fv2k4mJp9+7otrNrl9SmjTM1JQICEwAAqFUz8Pvjj5u+jepqG7hOPNGZmhIBgQkAANTq1Utq1Sq6brlAwIYmWpgSGIEJAICma9lSOv306ALTrl32nhamBEZgAgAgOtEO/CYwJQECEwAA0enXT/rkE+nAgaa9fudOe09gSmA1gSk93d06AABIVv36SeXl0uefN+31tDAlgbIyKS1NSk11uxIAAJJTtEuk7Nplz8Ve6u3xZGDy0i8IAIB4O/FE6eSTmx6Ydu602/D5nK3LTQQmAABwlGgGfu/a5a3uOInABMBD8vPzlZ2drZycHLdLAZIegelwBCYAnpGXl6eioiIVFha6XQqQ9Pr1k7ZulXbsaPxrCUxJgMAEAED0ohn4XTOGyUsITAAA4CinnGKn6GlKYNqxQ2rb1vma3ERgAgAAR0lNlfr2bVpgKi2V2rVzviY3EZgAAECdmjLwu6xM2rePwJTwCEwAADijXz+pqEiqrIz8Ndu32/usrNjU5BYCEwAAqFO/ftL+/dLatZG/prTU3tPClOAITAAAOOOMM+x9Y7rlCExJgsAEAIAzMjOlbt0aH5h8Pq6SS3gEJgAAnNPYgd/bt0tt2kgtWsSuJjcQmAAklE2bNum6665Tt27dlJ6erh49eug3v/mNKhsz6hSAY2oCkzGRPd+LUwpIkqfyX1WVVFFBYAKS2aeffqrq6mo99thjOuWUU/TJJ59o4sSJ+uabb/TAAw+4XR7Q7PTrZyei3LZNOumk8M8vLfXeFXKSxwJTKGTvCUxA8ho9erRGjx5d++/u3btr3bp1KigoIDABLjh0iZRIAtOWLXbck9d4qkuurMzeE5gAbwkEAjrRawtTAUmia1cpIyPycUxffSV16hTTklzhqRYmAhPgPevXr9cjjzyiBx98sN7nVFRUqKKiovbfwWAwHqUBzUJKip1eIJLAVFVlW5hOPjn2dcUbLUwA4mL69Ony+XwN3lauXHnYa7Zu3arRo0frsssu04QJE+rd9owZM+T3+2tvnbz49RZwUaRXypWWSgcOeLOFyWciHfZev6g34JSVK6WcHOnf/5YGDHC7GgCH2rFjh3bs2NHgc7p27apjjjlGkg1LI0eO1JAhQ/SnP/1JKSn1f7+rq4WpU6dOCgQCyszMdOYNAM3Yk09KEyZIgYDtnqvP++9LQ4dKH3wg9e8ft/Ki5YvkSZ7qkisvt/fp6e7WAeBobdu2VdsIZ7LbsmWLRo4cqYEDB+qpp55qMCxJUlpamtLS0pwoE0AdBg+20wqsWiWNGFH/8776yt57sYXJU11yNVfJEZiA5LV161aNGDFCnTp10gMPPKCvv/5aJSUlKikpcbs0oNnq3Vs67jjpX/9q+HmbN9tzsBev0fBkC9N/WvQBJKG33npLX3zxhb744gudfMTIUQeGEABogtRUadCgyAJTp052aRSv8VQLE4EJSH7XXnutjDF13gC4Z/BgO0apIV98IfXoEZ964s1TgYkuOQAAYmPwYDtGaevW+p/z+efSKafEr6Z48lRgKi+3zYAtW7pdCQAA3jJkiL2vr1uuqkpav1469dT41RRPngtM6ene7DsFAMBNHTvaCSmXLq3755s3S5WVBKakEAoxfgkAgFjw+aSRI6XFi+v++Wef2XsCUxIoLycwAQAQK9/5jp2Ucteuo3/24YfSscd6c+FdyYOBiQHfAADExsiRdgLL9947+merV9slVMLMM5u0PPW26JIDACB2unSRuneX/vGPo3/24Yc2MHmVpwITXXIAAMTWqFHS3/9uW5pqBALS2rXSmWe6V1eseS4w0SUHAEDsjB8vbdxoF7qvsXSpVF3d8Dpzyc5TgYkuOaB5y8/PV3Z2tnJyctwuBfCsESOkNm2kF188+Ng//mGnHfDqLN+SxwITXXJA85aXl6eioiIVFha6XQrgWS1aSFdeKT35pFRWZluWXnpJGjfO2/MgeiowhUJ0yQEAEGtTpki7d0t/+IM0d65dMuWaa9yuKrZauF2Ak2hhAgAg9rp3l269VfrVr6RWraQxY6ShQ92uKrY8F5hoYQIAIPbuvlvKypK+/lq64w63q4k9TwUmBn0DABAfLVpIP/+521XEj6fGMNElBwAAYsFzgYkuOQAA4DRPBSa65AAAQCx4KjDRJQcAAGLBc4GJLjkAAOA0zwSm/fulqipamAAAgPM8E5jKy+09gQkAADjNM4EpFLL3dMkBAACneSYw0cIEAABixXOBiRYmAADgNM8EppouOVqYgOYrPz9f2dnZysnJcbsUAB7jM8ZEu42oN+CE99+3KyV/9JHUt6/b1QBwUzAYlN/vVyAQUGZmptvlAEhsvkie5JkWJrrkAABArHgmMNElBwAAYsUzgYmr5AAAQKx4LjDRJQcAAJzmmcBU0yWXluZuHQAAwHs8E5jKy6UWLewNAADASZ4JTKEQ3XEAACA2PBOYyssZ8A0AAGLDU4GJFiYAABALnglMoRAtTAAAIDY8E5jokgMAALHiqcBElxwAAIgFzwQmuuQAAECseCYwlZczaSXQ3OXn5ys7O1s5OTlulwLAY3zGmGi3EfUGnDB2rJSSIs2f73YlANwWDAbl9/sVCASUmZnpdjkAEpsvkid5poWpooIWJgAAEBsEJgAAgDAITAAAAGEQmAAAAMLwTGDiKjkAABArnglMtDABAIBYITABAACEQWACAAAIw1OBiaVRAABALHgqMNHCBHhLRUWF+vfvL5/Pp9WrV7tdDoBmzBOBqbpa2r+fwAR4ze23366TTjrJ7TIAwBuBqbLS3hOYAO9444039NZbb+mBBx5wuxQAUAu3C3BCRYW9JzAB3lBaWqqJEydq3rx5at26tdvlAIA3AlN5ub0nMAHJzxija6+9VpMmTdKgQYO0adOmsK+pqKhQRc03J0nBYDCGFQJojjzRJUcLE5D4pk+fLp/P1+Bt5cqVeuSRRxQMBjVt2rSItz1jxgz5/f7aW6dOnWL4TgA0Rz5jTLTbiHoD0fr8c6lnT2nxYmnECLerAVCXHTt2aMeOHQ0+p2vXrrriiiv02muvyefz1T5eVVWl1NRUXXXVVXr66aePel1dLUydOnVSIBBQZmamc28CgBf5wj/FI4Hpk0+kvn2lf/5TOusst6sBEI3i4uLDutS2bt2q888/Xy+//LKGDBmik08+Oew2gsGg/H4/gQlAJCIKTJ4Yw0SXHOAdnTt3Puzfxx13nCSpR48eEYUlAIgFxjABAACE4akWJpZGAbyna9eucmDoAABEhRYmAACAMAhMAAAAYXgiMDFxJQAAiCVPBCZamAAAQCx5KjC1auVuHQAAwJs8E5hatZJ8EU09BQAA0DieCUx0xwEAgFghMAEAAIRBYAIAAAiDwATAM/Lz85Wdna2cnBy3SwHgMT4Hlhxwfc2CqVOlt96S1qxxuxIAiSAYDMrv9ysQCCgzM9PtcgAktoguGfNEC1N5OS1MAAAgdjwRmOiSAwAAsURgAgAACIPABAAAEAaBCQAAIAwCEwAAQBgEJgAAgDAITAAAAGEQmAAAAMLwRGAqL5eOOcbtKgAAgFd5IjDRwgQAAGKJwAQAABAGgQkAACAMAhMAAEAYBCYAnpGfn6/s7Gzl5OS4XQoAj/EZY6LdRtQbiEZ1tZSaKj3xhDRhgpuVAEgUwWBQfr9fgUBAmZmZbpcDILH5InlS0rcwVVbae1qYAABArCR9YKqosPcEJgAAECtJH5hSU6XJk6WePd2uBAAAeFXSj2ECgCMxhglAIzSPMUwAAACxRmACAAAIg8AEAAAQBoEJAAAgDAITAABAGE5cJQcACcXn82VKCkjyG2OCbtcDIPkRmAB4js/n80nKkLTXcJAD4AACEwAAQBiMYQIAAAiDwAQAABAGgQkAACAMAhMAAEAYBCYAAIAwCEwAAABhEJgAAADC+H+SrSjyT9J1kwAAAABJRU5ErkJggg==\n",
1540 "text/plain": [
1541 "Graphics object consisting of 2 graphics primitives"
1542 ]
1543 },
1544 "metadata": {},
1545 "output_type": "display_data"
1546 }
1547 ],
1548 "source": [
1549 "R = [x/10 for x in range(-10,10)]\n",
1550 "L = [1/(1+25*x^2) for x in R]\n",
1551 "points = [(R[i], L[i]) for i in range(len(L))]\n",
1552 "polring.<x> = RR[]\n",
1553 "lp = polring.lagrange_polynomial(points)\n",
1554 "\n",
1555 "show(plot(lp, -0.92, 0.82) + scatter_plot(points))"
1556 ]
1557 },
1558 {
1559 "cell_type": "markdown",
1560 "metadata": {},
1561 "source": [
1562 "This particular example is called [Runge's phenomenon](https://en.wikipedia.org/wiki/Runge%27s_phenomenon). For a better approximation you can use a [spline](https://en.wikipedia.org/wiki/Spline_(mathematics)), which is a *piecewise* polynomial function:"
1563 ]
1564 },
1565 {
1566 "cell_type": "code",
1567 "execution_count": 143,
1568 "metadata": {},
1569 "outputs": [
1570 {
1571 "data": {
1572 "image/png": "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\n",
1573 "text/plain": [
1574 "Graphics object consisting of 2 graphics primitives"
1575 ]
1576 },
1577 "metadata": {},
1578 "output_type": "display_data"
1579 }
1580 ],
1581 "source": [
1582 "show(plot(spline(points), -1, 1) + scatter_plot(points))"
1583 ]
1584 },
1585 {
1586 "cell_type": "markdown",
1587 "metadata": {},
1588 "source": [
1589 "A detailed explanation of splines is a good topic for a course of numerical analysis. For this course it is enough that you know that they exist and they can be plotted."
1590 ]
1591 }
1592 ],
1593 "metadata": {
1594 "kernelspec": {
1595 "display_name": "SageMath 9.2",
1596 "language": "sage",
1597 "name": "sagemath"
1598 },
1599 "language_info": {
1600 "codemirror_mode": {
1601 "name": "ipython",
1602 "version": 3
1603 },
1604 "file_extension": ".py",
1605 "mimetype": "text/x-python",
1606 "name": "python",
1607 "nbconvert_exporter": "python",
1608 "pygments_lexer": "ipython3",
1609 "version": "3.8.5"
1610 }
1611 },
1612 "nbformat": 4,
1613 "nbformat_minor": 4
1614}
diff --git a/src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb b/src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb
new file mode 100644
index 0000000..88cd7f5
--- /dev/null
+++ b/src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb
@@ -0,0 +1,339 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "It can happen that you need to include the results of your Sage computations and/or Sage code inside a LaTeX document. Luckily Sage provides some functions to translate its objects into LaTeX, and the listings package for LaTeX can be used to include any code (Sage, Python or any other language) in a LaTeX document.\n",
8 "\n",
9 "In this document we will describe some of these interactions between LaTeX and Sage."
10 ]
11 },
12 {
13 "cell_type": "markdown",
14 "metadata": {},
15 "source": [
16 "# The `show()` command\n",
17 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/repl/sage/repl/display/pretty_print.html)] (`show()` is just an alternative name for `pretty_print()`).\n",
18 "\n",
19 "With this command Sage will generate a picture displaying the object. The result depends on the object itself: most of them will be typeset in Latex, but for example graphics primitives (such as plots) will be displayed as pictures.\n",
20 "\n",
21 "You can see it as an alternative to `print()`."
22 ]
23 },
24 {
25 "cell_type": "code",
26 "execution_count": 4,
27 "metadata": {},
28 "outputs": [
29 {
30 "name": "stdout",
31 "output_type": "stream",
32 "text": [
33 "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)\n"
34 ]
35 },
36 {
37 "data": {
38 "text/html": [
39 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)</script></html>"
40 ],
41 "text/latex": [
42 "\\begin{math}\n",
43 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n",
44 "\\end{math}"
45 ],
46 "text/plain": [
47 "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)"
48 ]
49 },
50 "metadata": {},
51 "output_type": "display_data"
52 },
53 {
54 "name": "stdout",
55 "output_type": "stream",
56 "text": [
57 "[ 1 2 3]\n",
58 "[ 4 5 6]\n",
59 "[ 8 9 10]\n"
60 ]
61 },
62 {
63 "data": {
64 "text/html": [
65 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n",
66 "1 & 2 & 3 \\\\\n",
67 "4 & 5 & 6 \\\\\n",
68 "8 & 9 & 10\n",
69 "\\end{array}\\right)</script></html>"
70 ],
71 "text/latex": [
72 "\\begin{math}\n",
73 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n",
74 "1 & 2 & 3 \\\\\n",
75 "4 & 5 & 6 \\\\\n",
76 "8 & 9 & 10\n",
77 "\\end{array}\\right)\n",
78 "\\end{math}"
79 ],
80 "text/plain": [
81 "[ 1 2 3]\n",
82 "[ 4 5 6]\n",
83 "[ 8 9 10]"
84 ]
85 },
86 "metadata": {},
87 "output_type": "display_data"
88 },
89 {
90 "name": "stdout",
91 "output_type": "stream",
92 "text": [
93 "pi\n"
94 ]
95 },
96 {
97 "data": {
98 "text/html": [
99 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi</script></html>"
100 ],
101 "text/latex": [
102 "\\begin{math}\n",
103 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi\n",
104 "\\end{math}"
105 ],
106 "text/plain": [
107 "pi"
108 ]
109 },
110 "metadata": {},
111 "output_type": "display_data"
112 }
113 ],
114 "source": [
115 "s = (e^x).series(x==0, 4)\n",
116 "M = matrix([[1,2,3],[4,5,6],[8,9,10]])\n",
117 "print(s)\n",
118 "show(s)\n",
119 "print(M)\n",
120 "show(M)\n",
121 "print(pi)\n",
122 "show(pi)"
123 ]
124 },
125 {
126 "cell_type": "markdown",
127 "metadata": {},
128 "source": [
129 "In a Jupyter notebook, the results above are displayed using [MathJax](https://www.mathjax.org/).\n",
130 "\n",
131 "If you are running this code in an interactive console (terminal) instead of a Jupyter notebook, you will get the Latex source code for those objects. You can force this behavior by using the `latex()` command."
132 ]
133 },
134 {
135 "cell_type": "markdown",
136 "metadata": {},
137 "source": [
138 "# The `latex()` command\n",
139 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html)]\n",
140 "\n",
141 "This command is potentially very useful if you need to include the results of Sage computations in a Latex file, especially with complex objects like matrices or very large polynomials.\n",
142 "\n",
143 "Technically, this is a function that returns a string, so you need to `print()` it to see the result."
144 ]
145 },
146 {
147 "cell_type": "code",
148 "execution_count": 5,
149 "metadata": {},
150 "outputs": [
151 {
152 "name": "stdout",
153 "output_type": "stream",
154 "text": [
155 "1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n",
156 "\n",
157 "\n",
158 "\\left(\\begin{array}{rrr}\n",
159 "1 & 2 & 3 \\\\\n",
160 "4 & 5 & 6 \\\\\n",
161 "8 & 9 & 10\n",
162 "\\end{array}\\right)\n"
163 ]
164 }
165 ],
166 "source": [
167 "print(latex(s))\n",
168 "print(\"\\n\")\n",
169 "print(latex(M))"
170 ]
171 },
172 {
173 "cell_type": "markdown",
174 "metadata": {},
175 "source": [
176 "Interestingly, Sage can use matplotlib's PGF backend to generate Latex code for a plot. (PGF is the graphics language underlying TikZ, like TeX is the language underlying Latex)."
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": 15,
182 "metadata": {},
183 "outputs": [],
184 "source": [
185 "#latex(plot(x^2)) # The output is more than 20 pages long"
186 ]
187 },
188 {
189 "cell_type": "markdown",
190 "metadata": {},
191 "source": [
192 "It is probably easier to just generate the picture and include that in your Latex document with `\\includegraphics`."
193 ]
194 },
195 {
196 "cell_type": "markdown",
197 "metadata": {},
198 "source": [
199 "## A Latex name for your variables\n",
200 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html)]\n",
201 "\n",
202 "Sometimes you might want to use variables and functions that have, for example, a Greek letter as a name. You can tell Sage that you want them displayed this way when you declare them:"
203 ]
204 },
205 {
206 "cell_type": "code",
207 "execution_count": 14,
208 "metadata": {},
209 "outputs": [
210 {
211 "name": "stdout",
212 "output_type": "stream",
213 "text": [
214 "phi1(epsilon)\n"
215 ]
216 },
217 {
218 "data": {
219 "text/html": [
220 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)</script></html>"
221 ],
222 "text/latex": [
223 "\\begin{math}\n",
224 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)\n",
225 "\\end{math}"
226 ],
227 "text/plain": [
228 "e^epsilon + phi1(epsilon)"
229 ]
230 },
231 "metadata": {},
232 "output_type": "display_data"
233 },
234 {
235 "data": {
236 "text/plain": [
237 "e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)"
238 ]
239 },
240 "execution_count": 14,
241 "metadata": {},
242 "output_type": "execute_result"
243 }
244 ],
245 "source": [
246 "var('epsilon', latex_name=\"\\\\epsilon\")\n",
247 "function('phi1', latex_name=\"\\\\phi_1\")\n",
248 "\n",
249 "print(phi1(epsilon))\n",
250 "show(phi1(epsilon) + e^epsilon)\n",
251 "latex(phi1(epsilon) + e^epsilon)"
252 ]
253 },
254 {
255 "cell_type": "markdown",
256 "metadata": {},
257 "source": [
258 "**Warning:** You need to use two backspaces `\\\\`. The reason is that in Python (like in many other programming languages) the backslash symbol inside a string is used to print special characters, such as a newline `\\n`."
259 ]
260 },
261 {
262 "cell_type": "markdown",
263 "metadata": {},
264 "source": [
265 "# From Jupyter to Latex\n",
266 "**Reference:** [[4](https://nbconvert.readthedocs.io/en/latest/)]\n",
267 "\n",
268 "From the Jupyter menu `File > Download as` you can choose to download your work in many formats, among which there are also Latex and pdf. Personally I prefer downloading the .tex file, so then I can change the title, add an author name and make any other change I like before compiling it into a pdf file.\n",
269 "\n",
270 "If you choose to download the pdf file, you might need to install some extra packages. For example I had to install [`pandoc`](https://pandoc.org/), `texlive-XeTeX` and `texlive-Xdvi`, but this depends on your operating system and Latex distribution."
271 ]
272 },
273 {
274 "cell_type": "markdown",
275 "metadata": {},
276 "source": [
277 "# SageTex\n",
278 "**Reference:** [[5](https://doc.sagemath.org/html/en/tutorial/sagetex.html)]\n",
279 "\n",
280 "With SageTex it is possible to run Sage commands directly inside Latex, using the `\\sage{}` command. In this way you don't need to run your Sage code first and then copy the results in Latex. It can be useful especially for short Sage commands.\n",
281 "\n",
282 "You might need to take some extra steps to make this work on your system, see the link above."
283 ]
284 },
285 {
286 "cell_type": "markdown",
287 "metadata": {},
288 "source": [
289 "# The Latex `listings` package\n",
290 "**References:** [[6](https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings)] and [[7](https://ftp.snt.utwente.nl/pub/software/tex/macros/latex/contrib/listings/listings.pdf)]\n",
291 "\n",
292 "If you want to include some code (Sage, Python or anything else) in a Latex document you can use the listings package.\n",
293 "\n",
294 "```\n",
295 "\\usepackage{listings}\n",
296 "\n",
297 "...\n",
298 "\n",
299 "\\begin{lstlisting}[language=Python]\n",
300 "for i in range(0,100):\n",
301 " if i%5 == 0:\n",
302 " print(\"Multiple of 5!\")\n",
303 "\\end{lstlisting}\n",
304 "```\n",
305 "\n",
306 "You need to specify the language you are using with the `language=` option. This option can also be set at the beginning of the document using the `\\lstset{language=Python}` command.\n",
307 "\n",
308 "As an alternative, you can include a file directly without copying the code into the tex file, like you would do for a picture:\n",
309 "\n",
310 "```\n",
311 "\\lstinputlisting[language=Python]{file.py}\n",
312 "```\n",
313 "\n",
314 "It is technically possible to include Latex listings in a markdown cell of the Jupyter notebook using [this package](https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html), but it does not make much sense. So we will move to a Latex editor for the examples."
315 ]
316 }
317 ],
318 "metadata": {
319 "kernelspec": {
320 "display_name": "SageMath 9.2",
321 "language": "sage",
322 "name": "sagemath"
323 },
324 "language_info": {
325 "codemirror_mode": {
326 "name": "ipython",
327 "version": 3
328 },
329 "file_extension": ".py",
330 "mimetype": "text/x-python",
331 "name": "python",
332 "nbconvert_exporter": "python",
333 "pygments_lexer": "ipython3",
334 "version": "3.8.5"
335 }
336 },
337 "nbformat": 4,
338 "nbformat_minor": 4
339}
diff --git a/src/Lecture6/notebook/8-SageCalculus.aux b/src/Lecture6/notebook/8-SageCalculus.aux
new file mode 100644
index 0000000..6aa6ff2
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.aux
@@ -0,0 +1,58 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\providecommand \oddpage@label [2]{}
20\@writefile{toc}{\contentsline {section}{\numberline {1}Symbolic expressions}{1}{section.1}\protected@file@percent }
21\newlabel{symbolic-expressions}{{1}{1}{Symbolic expressions}{section.1}{}}
22\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Solving equations and inequalities}{1}{subsection.1.1}\protected@file@percent }
23\newlabel{solving-equations-and-inequalities}{{1.1}{1}{Solving equations and inequalities}{subsection.1.1}{}}
24\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}The set of solutions}{2}{subsubsection.1.1.1}\protected@file@percent }
25\newlabel{the-set-of-solutions}{{1.1.1}{2}{The set of solutions}{subsubsection.1.1.1}{}}
26\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.2}Alternative method for real roots: \texttt {find\_root()}}{3}{subsubsection.1.1.2}\protected@file@percent }
27\newlabel{alternative-method-for-real-roots-find_root}{{1.1.2}{3}{\texorpdfstring {Alternative method for real roots: \texttt {find\_root()}}{Alternative method for real roots: find\_root()}}{subsubsection.1.1.2}{}}
28\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Evaluating functions}{3}{subsection.1.2}\protected@file@percent }
29\newlabel{evaluating-functions}{{1.2}{3}{Evaluating functions}{subsection.1.2}{}}
30\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Symbolic computations}{4}{subsection.1.3}\protected@file@percent }
31\newlabel{symbolic-computations}{{1.3}{4}{Symbolic computations}{subsection.1.3}{}}
32\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.1}The Symbolic Ring}{5}{subsubsection.1.3.1}\protected@file@percent }
33\newlabel{the-symbolic-ring}{{1.3.1}{5}{The Symbolic Ring}{subsubsection.1.3.1}{}}
34\@writefile{toc}{\contentsline {section}{\numberline {2}Calculus}{5}{section.2}\protected@file@percent }
35\newlabel{calculus}{{2}{5}{Calculus}{section.2}{}}
36\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Limits and series}{5}{subsection.2.1}\protected@file@percent }
37\newlabel{limits-and-series}{{2.1}{5}{Limits and series}{subsection.2.1}{}}
38\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Derivatives}{6}{subsection.2.2}\protected@file@percent }
39\newlabel{derivatives}{{2.2}{6}{Derivatives}{subsection.2.2}{}}
40\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Integrals}{7}{subsection.2.3}\protected@file@percent }
41\newlabel{integrals}{{2.3}{7}{Integrals}{subsection.2.3}{}}
42\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.1}Symbolic integration}{7}{subsubsection.2.3.1}\protected@file@percent }
43\newlabel{symbolic-integration}{{2.3.1}{7}{Symbolic integration}{subsubsection.2.3.1}{}}
44\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.2}Numerical integration}{8}{subsubsection.2.3.2}\protected@file@percent }
45\newlabel{numerical-integration}{{2.3.2}{8}{Numerical integration}{subsubsection.2.3.2}{}}
46\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Differential equations}{9}{subsection.2.4}\protected@file@percent }
47\newlabel{differential-equations}{{2.4}{9}{Differential equations}{subsection.2.4}{}}
48\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.1}A real-world example}{10}{subsubsection.2.4.1}\protected@file@percent }
49\newlabel{a-real-world-example}{{2.4.1}{10}{A real-world example}{subsubsection.2.4.1}{}}
50\@writefile{toc}{\contentsline {section}{\numberline {3}Basic data analysis and visualization}{10}{section.3}\protected@file@percent }
51\newlabel{basic-data-analysis-and-visualization}{{3}{10}{Basic data analysis and visualization}{section.3}{}}
52\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Statistics}{10}{subsection.3.1}\protected@file@percent }
53\newlabel{statistics}{{3.1}{10}{Statistics}{subsection.3.1}{}}
54\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Plotting}{11}{subsection.3.2}\protected@file@percent }
55\newlabel{plotting}{{3.2}{11}{Plotting}{subsection.3.2}{}}
56\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Interpolation}{15}{subsection.3.3}\protected@file@percent }
57\newlabel{interpolation}{{3.3}{15}{Interpolation}{subsection.3.3}{}}
58\gdef \@abspage@last{18}
diff --git a/src/Lecture6/notebook/8-SageCalculus.ipynb b/src/Lecture6/notebook/8-SageCalculus.ipynb
new file mode 100644
index 0000000..4b81998
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.ipynb
@@ -0,0 +1,1372 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Symbolic expressions\n",
8 "\n",
9 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n",
10 "\n",
11 "Last time we saw the basics of symbolic expressions:\n",
12 "* How to define and manipulate symbolic expressions\n",
13 "* How to introduce new variables (in the Mathematical sense) with `var()`\n",
14 "* How to solve equations and inequalities\n",
15 "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n",
16 "\n",
17 "Here are some examples to remind you of these basic things:"
18 ]
19 },
20 {
21 "cell_type": "code",
22 "execution_count": 2,
23 "metadata": {},
24 "outputs": [
25 {
26 "name": "stdout",
27 "output_type": "stream",
28 "text": [
29 "[\n",
30 "x == -sqrt(-pi),\n",
31 "x == sqrt(-pi)\n",
32 "]\n",
33 "[\n",
34 "z == -sqrt(pi + x^2),\n",
35 "z == sqrt(pi + x^2)\n",
36 "]\n",
37 "[[y < -2], [y > 1]]\n",
38 "2*pi + e is approximately 9.00146713563863\n"
39 ]
40 }
41 ],
42 "source": [
43 "var('y', 'z') # Define new variables (x is already defined by Sage)\n",
44 "f = x^2 + pi\n",
45 "g = y^2 + y - 2 > 0\n",
46 "print( solve(f==0, x) )\n",
47 "print( solve(z^2 - f, z) )\n",
48 "print( solve(g, y) )\n",
49 "print( 2*pi + e, \"is approximately\", n(2*pi + e) )"
50 ]
51 },
52 {
53 "cell_type": "markdown",
54 "metadata": {},
55 "source": [
56 "Now we will see some more details about solving equations and manipulating their solutions."
57 ]
58 },
59 {
60 "cell_type": "markdown",
61 "metadata": {},
62 "source": [
63 "## Solving equations and inequalities\n",
64 "\n",
65 "**Reference** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)] for the details of `solve()` and `find_root()`, [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html#solving)] for examples.\n",
66 "\n",
67 "Other than equations and inequalities, we can also solve systems: it is enough to give Sage a list of expressions and a list of variables with respect to which we want to solve. For example the system\n",
68 "\n",
69 "\\begin{align*}\n",
70 " \\begin{cases}\n",
71 " x + y = 2 \\\\\n",
72 " 2x - y = 6\n",
73 " \\end{cases}\n",
74 "\\end{align*}\n",
75 "\n",
76 "Can be solved as"
77 ]
78 },
79 {
80 "cell_type": "code",
81 "execution_count": 40,
82 "metadata": {},
83 "outputs": [
84 {
85 "data": {
86 "text/plain": [
87 "[[x == (8/3), y == (-2/3)]]"
88 ]
89 },
90 "execution_count": 40,
91 "metadata": {},
92 "output_type": "execute_result"
93 }
94 ],
95 "source": [
96 "solve([x+y == 2, 2*x - y == 6], [x,y])"
97 ]
98 },
99 {
100 "cell_type": "markdown",
101 "metadata": {},
102 "source": [
103 "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x^2+1$."
104 ]
105 },
106 {
107 "cell_type": "markdown",
108 "metadata": {},
109 "source": [
110 "### The set of solutions\n",
111 "\n",
112 "One would expect the result of `solve()` to be a list of solutions, but it is actually a list of expressions (technically it is not a list but a different type of Python collection, but this is not so important)"
113 ]
114 },
115 {
116 "cell_type": "code",
117 "execution_count": 37,
118 "metadata": {},
119 "outputs": [
120 {
121 "data": {
122 "text/plain": [
123 "x == -3"
124 ]
125 },
126 "execution_count": 37,
127 "metadata": {},
128 "output_type": "execute_result"
129 }
130 ],
131 "source": [
132 "solutions = solve(x^2-9 == 0, x)\n",
133 "solutions[0] # This is the expression 'x == -3'"
134 ]
135 },
136 {
137 "cell_type": "markdown",
138 "metadata": {},
139 "source": [
140 "To read the actual solution without the `x ==` part you can use the `rhs()` or `lhs()` functions, which can be applied to any expression containing a relation operator (like `==`, `<`, `>=`...) and return the *right hand side* and *left hand side* of the expression, respectively"
141 ]
142 },
143 {
144 "cell_type": "code",
145 "execution_count": 41,
146 "metadata": {},
147 "outputs": [
148 {
149 "name": "stdout",
150 "output_type": "stream",
151 "text": [
152 "rhs: 2\n",
153 "lhs: x\n"
154 ]
155 }
156 ],
157 "source": [
158 "f = x == 2\n",
159 "print(\"rhs:\", f.rhs())\n",
160 "print(\"lhs:\", f.lhs())"
161 ]
162 },
163 {
164 "cell_type": "markdown",
165 "metadata": {},
166 "source": [
167 "When you solve an inequality or a system, the set of solutions can be more complicated to describe. In this case the result is a list containing lists of expressions that have to be `True` at the same time. It is easier to explain with an example:"
168 ]
169 },
170 {
171 "cell_type": "code",
172 "execution_count": 38,
173 "metadata": {},
174 "outputs": [
175 {
176 "name": "stdout",
177 "output_type": "stream",
178 "text": [
179 "Simple inequality: [[x < -3], [x > 3]]\n",
180 "System of inequalities:\n",
181 " [\n",
182 "[3 < x, x < 6],\n",
183 "[x < -3]\n",
184 "]\n"
185 ]
186 }
187 ],
188 "source": [
189 "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n",
190 "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))"
191 ]
192 },
193 {
194 "cell_type": "markdown",
195 "metadata": {},
196 "source": [
197 "In the last example (system of inequalities), Sage is telling us that the system\n",
198 "\\begin{align*}\n",
199 " \\begin{cases}\n",
200 " x^2-9 > 9 \\\\\n",
201 " x < 6\n",
202 " \\end{cases}\n",
203 "\\end{align*}\n",
204 "has two solutions:\n",
205 "* $x$ is between $3$ and $6$;\n",
206 "* $x$ is less than $-3$.\n",
207 "\n",
208 "Since in Sage (and in Python) expressions can have at most on relational operator like `<`, the first solution requires two expressions to be described. Hence the \"list of lists\".\n"
209 ]
210 },
211 {
212 "cell_type": "markdown",
213 "metadata": {},
214 "source": [
215 "**Exercise.** In the first exercise you were asked to solve a system of equations, but some of its solutions were complex numbers. Select only the real solutions and print them as pairs $(x,y)$."
216 ]
217 },
218 {
219 "cell_type": "markdown",
220 "metadata": {},
221 "source": [
222 "When solving a system of equations (not inequalities), you can use the option `solution_dict=True` to have the solutions arranged as a *dictionary*, which is a type of Python collection that we did not treat in this course"
223 ]
224 },
225 {
226 "cell_type": "code",
227 "execution_count": 44,
228 "metadata": {},
229 "outputs": [
230 {
231 "data": {
232 "text/plain": [
233 "[{x: 8/3, y: -2/3}]"
234 ]
235 },
236 "execution_count": 44,
237 "metadata": {},
238 "output_type": "execute_result"
239 }
240 ],
241 "source": [
242 "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)"
243 ]
244 },
245 {
246 "cell_type": "markdown",
247 "metadata": {},
248 "source": [
249 "### Alternative method for real roots: `find_root()`\n",
250 "\n",
251 "The `solve()` method is very useful when solving *symbolic* equations, for example when you have two variables and you want to solve for one of them in terms of the other. However, it does not always find explicit solutions.\n",
252 "\n",
253 "When you want to find an explicit, even if approximate, solution, it can be better to use `find_root()`. This function works *numerically*, which means that it finds an approximation of the root. It only works for real solutions and you need to specify an interval where you want the root to be searched:"
254 ]
255 },
256 {
257 "cell_type": "code",
258 "execution_count": 52,
259 "metadata": {},
260 "outputs": [
261 {
262 "name": "stdout",
263 "output_type": "stream",
264 "text": [
265 "Using solve():\n",
266 " [\n",
267 "x == -e^x + 10\n",
268 "]\n",
269 "Using find_root(): 2.070579904980303\n"
270 ]
271 }
272 ],
273 "source": [
274 "f = e^x + x - 10\n",
275 "print(\"Using solve():\\n\", solve(f, x))\n",
276 "print(\"Using find_root():\", f.find_root(0,100))"
277 ]
278 },
279 {
280 "cell_type": "markdown",
281 "metadata": {},
282 "source": [
283 "## Evaluating functions\n",
284 "\n",
285 "If an expression contains only one variable you can evaluate it easily, even if it is not a function."
286 ]
287 },
288 {
289 "cell_type": "code",
290 "execution_count": 21,
291 "metadata": {},
292 "outputs": [
293 {
294 "name": "stdout",
295 "output_type": "stream",
296 "text": [
297 "1\n",
298 "y + 3 > (y + 3)^2\n"
299 ]
300 }
301 ],
302 "source": [
303 "var('y')\n",
304 "f = x^2-3\n",
305 "g = x > x^2\n",
306 "\n",
307 "print(f(2))\n",
308 "print(g(3+y))"
309 ]
310 },
311 {
312 "cell_type": "markdown",
313 "metadata": {},
314 "source": [
315 "If an expression contains more than one variable, you can specify a value for each of them and they will be substituted in alphabetic order. You can also specify a value only for some of the variables."
316 ]
317 },
318 {
319 "cell_type": "code",
320 "execution_count": 38,
321 "metadata": {},
322 "outputs": [
323 {
324 "name": "stdout",
325 "output_type": "stream",
326 "text": [
327 "-2 == 0\n",
328 "3*y == 2\n"
329 ]
330 }
331 ],
332 "source": [
333 "var('y','z')\n",
334 "\n",
335 "f = y*z^2 - y == z\n",
336 "print(f(2, 0))\n",
337 "print(f(z=2))"
338 ]
339 },
340 {
341 "cell_type": "markdown",
342 "metadata": {},
343 "source": [
344 "## Symbolic computations\n",
345 "\n",
346 "Sage can understand and simplify symbolic expressions such as sums (finite or infinite) and products. In the following cell, we compute the following sums using the [`sum()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.sum) function:\n",
347 "\n",
348 "\\begin{align*}\n",
349 " \\begin{array}{llcc}\n",
350 " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n",
351 " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n",
352 " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n",
353 " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n",
354 " \\end{array}\n",
355 "\\end{align*}"
356 ]
357 },
358 {
359 "cell_type": "code",
360 "execution_count": 22,
361 "metadata": {},
362 "outputs": [
363 {
364 "name": "stdout",
365 "output_type": "stream",
366 "text": [
367 "(1) 1/2*n^2 + 1/2*n\n",
368 "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n",
369 "(3) 2^n\n",
370 "(4) 1/6*pi^2\n"
371 ]
372 }
373 ],
374 "source": [
375 "var('k', 'n') # Remember to declare all variables\n",
376 "\n",
377 "s = []\n",
378 "s.append( sum(k, k, 0, n) )\n",
379 "s.append( sum(k^4, k, 0, n) )\n",
380 "s.append( sum(binomial(n,k), k, 0, n) )\n",
381 "s.append( sum(1/k^2, k, 1, infinity) )\n",
382 "\n",
383 "for i in range(len(s)):\n",
384 " print(\"({}) {}\".format(i+1, s[i]))"
385 ]
386 },
387 {
388 "cell_type": "markdown",
389 "metadata": {},
390 "source": [
391 "An alternative notation is `expression.sum(k, a, b)`. There is an analogous [`prod()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.prod) for products."
392 ]
393 },
394 {
395 "cell_type": "markdown",
396 "metadata": {},
397 "source": [
398 "Sometimes Sage tries to keep an expression in its original form without expanding out sums and products. To change this behavior you can use the [`expand()`](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.expand) function:"
399 ]
400 },
401 {
402 "cell_type": "code",
403 "execution_count": 30,
404 "metadata": {},
405 "outputs": [
406 {
407 "name": "stdout",
408 "output_type": "stream",
409 "text": [
410 "(x + 1)^2 - (x - 1)^2\n",
411 "4*x\n"
412 ]
413 }
414 ],
415 "source": [
416 "f = (x+1)^2 - (x-1)^2\n",
417 "print(f)\n",
418 "print(f.expand())"
419 ]
420 },
421 {
422 "cell_type": "markdown",
423 "metadata": {},
424 "source": [
425 "### The Symbolic Ring\n",
426 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n",
427 "\n",
428 "The symbolic expressions that we have seen so far live in a ring called *symbolic ring* and denoted by `SR` in Sage. This ring works like the ring `ZZ` of integers or `RR` of reals numbers. In particular, you can define matrices and other objects using it as a \"basis\"."
429 ]
430 },
431 {
432 "cell_type": "code",
433 "execution_count": 45,
434 "metadata": {},
435 "outputs": [
436 {
437 "name": "stdout",
438 "output_type": "stream",
439 "text": [
440 "-b*c + a*d\n",
441 "[(-a, 2)]\n"
442 ]
443 }
444 ],
445 "source": [
446 "var('a', 'b', 'c', 'd')\n",
447 "\n",
448 "M = matrix([[a,b], [c,d]])\n",
449 "print(M.determinant())\n",
450 "\n",
451 "polring.<x> = SR[]\n",
452 "f = x^2 + 2*a*x + a^2\n",
453 "print(f.roots())"
454 ]
455 },
456 {
457 "cell_type": "markdown",
458 "metadata": {},
459 "source": [
460 "**Exercise.** Compute the eigenvalues of the matrix\n",
461 "\\begin{align*}\n",
462 "\\begin{pmatrix}\n",
463 "\\cos \\alpha & \\sin \\alpha\\\\\n",
464 "-\\sin\\alpha & \\cos \\alpha\n",
465 "\\end{pmatrix}\n",
466 "\\end{align*}"
467 ]
468 },
469 {
470 "cell_type": "markdown",
471 "metadata": {},
472 "source": [
473 "# Calculus\n",
474 "**Reference:** [[4](https://doc.sagemath.org/html/en/reference/calculus/index.html)] for an overview, but most functions are described in [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]"
475 ]
476 },
477 {
478 "cell_type": "markdown",
479 "metadata": {},
480 "source": [
481 "## Limits and series\n",
482 "\n",
483 "**References:** [[5](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html#sage.calculus.calculus.limit)] for limits, [[6](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.series)] for series\n",
484 "\n",
485 "You can compute limits"
486 ]
487 },
488 {
489 "cell_type": "code",
490 "execution_count": 54,
491 "metadata": {},
492 "outputs": [
493 {
494 "name": "stdout",
495 "output_type": "stream",
496 "text": [
497 "1\n",
498 "0\n"
499 ]
500 }
501 ],
502 "source": [
503 "f = sin(x)/x\n",
504 "# print(f(0)) # This one gives an error\n",
505 "print( f.limit(x=0) )\n",
506 "\n",
507 "print( (e^(-x)).limit(x=infinity) )"
508 ]
509 },
510 {
511 "cell_type": "markdown",
512 "metadata": {},
513 "source": [
514 "**Exercise.** Compute the constant $e$ using a limit."
515 ]
516 },
517 {
518 "cell_type": "markdown",
519 "metadata": {},
520 "source": [
521 "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit."
522 ]
523 },
524 {
525 "cell_type": "code",
526 "execution_count": 55,
527 "metadata": {},
528 "outputs": [
529 {
530 "name": "stdout",
531 "output_type": "stream",
532 "text": [
533 "und\n",
534 "1\n",
535 "-1\n"
536 ]
537 }
538 ],
539 "source": [
540 "f = abs(x)/x # 1 if x>0, -1 if x<0\n",
541 "print( f.limit(x=0) ) # undefined\n",
542 "print( f.limit(x=0, dir=\"+\") )\n",
543 "print( f.limit(x=0, dir=\"-\") )"
544 ]
545 },
546 {
547 "cell_type": "markdown",
548 "metadata": {},
549 "source": [
550 "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`."
551 ]
552 },
553 {
554 "cell_type": "markdown",
555 "metadata": {},
556 "source": [
557 "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does."
558 ]
559 },
560 {
561 "cell_type": "code",
562 "execution_count": 56,
563 "metadata": {},
564 "outputs": [
565 {
566 "name": "stdout",
567 "output_type": "stream",
568 "text": [
569 "1 + 1*x + 1/2*x^2 + Order(x^3)\n",
570 "(-2) + 1*x + 1*x^2 + (-1/6)*x^3 + (-1/12)*x^4 + 1/120*x^5 + 1/360*x^6 + Order(x^7)\n",
571 "1*(x - 1) + (-1/2)*(x - 1)^2 + Order((x - 1)^3)\n"
572 ]
573 }
574 ],
575 "source": [
576 "f = e^x\n",
577 "g = sin(x) - 2*cos(x)\n",
578 "h = log(x)\n",
579 "\n",
580 "print(f.series(x==0, 3))\n",
581 "print(g.series(x==0, 7))\n",
582 "print(h.series(x==1, 3))"
583 ]
584 },
585 {
586 "cell_type": "markdown",
587 "metadata": {},
588 "source": [
589 "## Derivatives\n",
590 "**References:** [[7](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.derivative)] and [[8](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html#sage.calculus.functional.derivative)] for derivatives, [[9](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html#sage.calculus.functions.jacobian)] for the Jacobian matrix and [[10](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html#sage.symbolic.expression.Expression.hessian)] for the Hessian."
591 ]
592 },
593 {
594 "cell_type": "markdown",
595 "metadata": {},
596 "source": [
597 "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one."
598 ]
599 },
600 {
601 "cell_type": "code",
602 "execution_count": 57,
603 "metadata": {},
604 "outputs": [
605 {
606 "name": "stdout",
607 "output_type": "stream",
608 "text": [
609 "8*y^3\n",
610 "6*x^2 - 1\n"
611 ]
612 }
613 ],
614 "source": [
615 "var('y')\n",
616 "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n",
617 "print( (2*x^3-x+2).derivative() )"
618 ]
619 },
620 {
621 "cell_type": "markdown",
622 "metadata": {},
623 "source": [
624 "You can also compute higher order derivatives:"
625 ]
626 },
627 {
628 "cell_type": "code",
629 "execution_count": 58,
630 "metadata": {},
631 "outputs": [
632 {
633 "name": "stdout",
634 "output_type": "stream",
635 "text": [
636 "6*x\n",
637 "84*x^5*y + 10*y^4 + 24*x^2*y\n",
638 "1680*x^3 + 48\n"
639 ]
640 }
641 ],
642 "source": [
643 "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n",
644 "\n",
645 "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n",
646 "print( f.derivative(x, x, y) ) # Twice in x, once in y\n",
647 "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y"
648 ]
649 },
650 {
651 "cell_type": "markdown",
652 "metadata": {},
653 "source": [
654 "Jacobian and Hessian matrices are also easy to compute:"
655 ]
656 },
657 {
658 "cell_type": "code",
659 "execution_count": 59,
660 "metadata": {},
661 "outputs": [
662 {
663 "name": "stdout",
664 "output_type": "stream",
665 "text": [
666 "[-2*x + 2*y 2*x]\n",
667 "[ 0 3*y^2]\n",
668 "[ y + 1 x + 1] \n",
669 "\n",
670 "[ 2 -4*y + 1]\n",
671 "[ -4*y + 1 -4*x + 6*y]\n"
672 ]
673 }
674 ],
675 "source": [
676 "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n",
677 "print( jacobian(f, [x,y]), \"\\n\" )\n",
678 "\n",
679 "g = x^2 + x*y + y^3 -2*x*y^2 -3\n",
680 "print( g.hessian() )"
681 ]
682 },
683 {
684 "cell_type": "markdown",
685 "metadata": {},
686 "source": [
687 "*Note:* the notation `f.jacobian([x,y])` is also valid, but only if you specify that `f` is vector by declaring it as `f = vector([...])`."
688 ]
689 },
690 {
691 "cell_type": "markdown",
692 "metadata": {},
693 "source": [
694 "## Integrals\n",
695 "**References:** [[11](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html)] for symbolic integration and [[12](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html)] for numerical methods.\n",
696 "\n",
697 "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n",
698 "When using a computer software to solve your integrals, you have two choices:\n",
699 "\n",
700 "1. You can try to compute a primitive function exactly, and then (if you are computing a definite integral) substitute the endpoints of your integration interval to get the result. We can call this *symbolic integration*.\n",
701 "2. You can get an *approximated* result with a *numerical method*. This method always gives some kind of result, but it cannot be used to compute indefinite integrals.\n",
702 "\n",
703 "Sage can do both of these things, although people that work in numerical analysis and use often the second method tend to prefer other programs, such as Matlab (or its open-source clone Octave)."
704 ]
705 },
706 {
707 "cell_type": "markdown",
708 "metadata": {},
709 "source": [
710 "### Symbolic integration\n",
711 "\n",
712 "Symbolic integrals work more or less like derivatives. You must specify an integration variable, but the endpoints of the integration interval are optional. If they are not given you get an indefinite integral."
713 ]
714 },
715 {
716 "cell_type": "code",
717 "execution_count": 60,
718 "metadata": {},
719 "outputs": [
720 {
721 "name": "stdout",
722 "output_type": "stream",
723 "text": [
724 "1/2*x^2 - cos(x)\n",
725 "0\n",
726 "-1/2*a^2 + 1/2*b^2 + cos(a) - cos(b)\n"
727 ]
728 }
729 ],
730 "source": [
731 "var('a', 'b')\n",
732 "f = x + sin(x)\n",
733 "print( f.integral(x) ) # Alternative: integral(f, x)\n",
734 "print( f.integral(x, -10, 10) )\n",
735 "print( f.integral(x, a, b) )"
736 ]
737 },
738 {
739 "cell_type": "markdown",
740 "metadata": {},
741 "source": [
742 "Your endpoints can also be $\\pm\\infty$:"
743 ]
744 },
745 {
746 "cell_type": "code",
747 "execution_count": 61,
748 "metadata": {},
749 "outputs": [
750 {
751 "name": "stdout",
752 "output_type": "stream",
753 "text": [
754 "1\n",
755 "sqrt(pi)\n"
756 ]
757 }
758 ],
759 "source": [
760 "print( integral(e^(-x), x, 0, infinity) )\n",
761 "print( integral(e^(-x^2), x, -infinity, infinity) )"
762 ]
763 },
764 {
765 "cell_type": "markdown",
766 "metadata": {},
767 "source": [
768 "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:"
769 ]
770 },
771 {
772 "cell_type": "code",
773 "execution_count": 65,
774 "metadata": {},
775 "outputs": [
776 {
777 "name": "stdout",
778 "output_type": "stream",
779 "text": [
780 "1/2*sqrt(pi)*erf(x)\n",
781 "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n"
782 ]
783 }
784 ],
785 "source": [
786 "print( integral(e^(-x^2), x) )\n",
787 "print( integral(e^(-x^2), x, 1, 2) )"
788 ]
789 },
790 {
791 "cell_type": "markdown",
792 "metadata": {},
793 "source": [
794 "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)."
795 ]
796 },
797 {
798 "cell_type": "markdown",
799 "metadata": {},
800 "source": [
801 "### Numerical integration\n",
802 "\n",
803 "In order to get an explicit value for the computations above, we can use a *numerical* method.\n",
804 "\n",
805 "The word \"numerical\" does not have much to do with numbers, but it refers to the fact that we are trying to compute explicit results rather than symbolic or algebraic ones. [Numerical analysis](https://en.wikipedia.org/wiki/Numerical_analysis) is the branch of mathematics that studies methods to approximate computations over the real or complex numbers. With these methods there is usually a trade-off between speed and precision.\n",
806 "\n",
807 "The Sage function [`numerical_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.numerical_integral) takes as a parameter a real-valued one-variable function and the integration endpoints, and it returns both an approximate value for the integral and an error estimate."
808 ]
809 },
810 {
811 "cell_type": "code",
812 "execution_count": 40,
813 "metadata": {},
814 "outputs": [
815 {
816 "data": {
817 "text/plain": [
818 "(0.13525725794999466, 1.5016572202374808e-15)"
819 ]
820 },
821 "execution_count": 40,
822 "metadata": {},
823 "output_type": "execute_result"
824 }
825 ],
826 "source": [
827 "numerical_integral(e^(-x^2), 1, 2)"
828 ]
829 },
830 {
831 "cell_type": "markdown",
832 "metadata": {},
833 "source": [
834 "The result above means, in symbols\n",
835 "\\begin{align*}\n",
836 "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n",
837 "\\end{align*}\n",
838 "\n",
839 "There is also a [`monte_carlo_integral()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html#sage.calculus.integration.monte_carlo_integral) method for functions with more than one variable."
840 ]
841 },
842 {
843 "cell_type": "markdown",
844 "metadata": {},
845 "source": [
846 "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$."
847 ]
848 },
849 {
850 "cell_type": "markdown",
851 "metadata": {},
852 "source": [
853 "## Differential equations\n",
854 "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n",
855 "\n",
856 "A [differential equation](https://en.wikipedia.org/wiki/Differential_equation) is an equation involving an unknwon function and its derivatives. They can be of two kinds: *ordinary* differential equations ([ODE](https://en.wikipedia.org/wiki/Ordinary_differential_equation)) and *partial* differential equations ([PDE](https://en.wikipedia.org/wiki/Partial_differential_equation)). The latter involve multivariate functions and their partial derivatives.\n",
857 "\n",
858 "Differential equations are in general hard to solve *exactly* (or *symbolically*): even a simple equation of the form $f'(x)=g(x)$, where $g(x)$ is someknown function, requires solving the integral $\\int g(x)\\mathrm{d}x$ in order to find $f$, which as we know is not always easy!\n",
859 "\n",
860 "Theoretical results on differential equations usually ensure the existence and/or uniquess of a solution under certain conditions, but in general they do not give a way to solve them. There exits many methods to find approximate solutions, and some of them are implemented in Sage as well (see [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]). However we will focus on the simple ODEs that can be solved exactly.\n",
861 "\n",
862 "Let's start with a simple example. Let's find all functions $f(x)$ such that $f'(x)=f(x)$. In order to do so, we need to use the `function()` construct, which allows us to define an \"unknwon\" function inside Sage, like we define variables with `var()`."
863 ]
864 },
865 {
866 "cell_type": "code",
867 "execution_count": 4,
868 "metadata": {},
869 "outputs": [
870 {
871 "data": {
872 "text/plain": [
873 "_C*e^x"
874 ]
875 },
876 "execution_count": 4,
877 "metadata": {},
878 "output_type": "execute_result"
879 }
880 ],
881 "source": [
882 "var('x')\n",
883 "function('f')\n",
884 "equation = derivative(f(x)) == f(x)\n",
885 "desolve(equation, f(x)) # f is the unknown function"
886 ]
887 },
888 {
889 "cell_type": "markdown",
890 "metadata": {},
891 "source": [
892 "As you can expect, they are all the functions $Ce^x$ for some constant $C$. The constant $C$ plays the same role as the constant in the solution of an integral, but in this case Sage writes it explicitly.\n",
893 "\n",
894 "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:"
895 ]
896 },
897 {
898 "cell_type": "code",
899 "execution_count": 5,
900 "metadata": {},
901 "outputs": [
902 {
903 "data": {
904 "text/plain": [
905 "3*e^x"
906 ]
907 },
908 "execution_count": 5,
909 "metadata": {},
910 "output_type": "execute_result"
911 }
912 ],
913 "source": [
914 "desolve(equation, f(x), (0,3))"
915 ]
916 },
917 {
918 "cell_type": "markdown",
919 "metadata": {},
920 "source": [
921 "You can also solve *second order* equations, that is equations where the second derivative also appears. In this case if you want to specify an initial condition you should write the triple of values $(x_0, f(x_0), f'(x_0))$."
922 ]
923 },
924 {
925 "cell_type": "code",
926 "execution_count": 6,
927 "metadata": {},
928 "outputs": [
929 {
930 "data": {
931 "text/plain": [
932 "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)"
933 ]
934 },
935 "execution_count": 6,
936 "metadata": {},
937 "output_type": "execute_result"
938 }
939 ],
940 "source": [
941 "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n",
942 "desolve(equation, f(x), (0, 0, 0))"
943 ]
944 },
945 {
946 "cell_type": "markdown",
947 "metadata": {},
948 "source": [
949 "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n",
950 "\\begin{align*}\n",
951 " \\begin{array}{rlcrl}\n",
952 " (A) &\n",
953 " \\begin{cases}\n",
954 " f(0) &= 1\\\\\n",
955 " f'(0) &= 0\\\\\n",
956 " f''(x) &= -f(x)\n",
957 " \\end{cases}\n",
958 " & \\qquad \\qquad &\n",
959 " (B) &\n",
960 " \\begin{cases}\n",
961 " f(0) &= 0\\\\\n",
962 " f'(0) &= 1\\\\\n",
963 " f''(x) &= -f(x)\n",
964 " \\end{cases}\n",
965 " \\end{array}\n",
966 "\\end{align*}"
967 ]
968 },
969 {
970 "cell_type": "code",
971 "execution_count": null,
972 "metadata": {},
973 "outputs": [],
974 "source": []
975 },
976 {
977 "cell_type": "markdown",
978 "metadata": {},
979 "source": [
980 "### A real-world example\n",
981 "\n",
982 "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n",
983 "\n",
984 "Consider an object moving with constant acceleration $a$. Its velocity at time $t$ is described by the formula $v(t) = v(0) + at$. For example an object falling from the sky has acceleration $g\\sim 9.8 m/s^2$ towards the ground, so its velocity is $v(t) = -gt$.\n",
985 "\n",
986 "However in the real world you need to take into account the air's resistance, which depends (among other things) on the velocity of the object. In this case the acceleration $a(t)$ is not constant anymore, and it satisfies an equation of the form $a(t)=-g -kv(t)$, where $k$ is some constant that may depend on the shape and mass of the object (in practice it may be more complicated than this).\n",
987 "\n",
988 "Since the acceleration is the derivative of the velocity, we have a differential equation\n",
989 "\\begin{align*}\n",
990 " v'(t) = -g -kv(t)\n",
991 "\\end{align*}\n",
992 "and we can try to solve it with Sage!"
993 ]
994 },
995 {
996 "cell_type": "code",
997 "execution_count": 7,
998 "metadata": {},
999 "outputs": [
1000 {
1001 "data": {
1002 "text/plain": [
1003 "-98/15*(e^(3/2*t) - 1)*e^(-3/2*t)"
1004 ]
1005 },
1006 "execution_count": 7,
1007 "metadata": {},
1008 "output_type": "execute_result"
1009 }
1010 ],
1011 "source": [
1012 "var('t')\n",
1013 "function('v')\n",
1014 "g = 9.8\n",
1015 "k = 1.5\n",
1016 "conditions = (0, 0) # Start with velocity 0\n",
1017 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)"
1018 ]
1019 },
1020 {
1021 "cell_type": "markdown",
1022 "metadata": {},
1023 "source": [
1024 "If you want to solve this equation symbolically (that is, keeping $g$ and $k$ in symbols) you need to specify that $t$ is the *independent variable* of the equation:"
1025 ]
1026 },
1027 {
1028 "cell_type": "code",
1029 "execution_count": 10,
1030 "metadata": {},
1031 "outputs": [
1032 {
1033 "data": {
1034 "text/plain": [
1035 "-(g*e^(k*t) - g)*e^(-k*t)/k"
1036 ]
1037 },
1038 "execution_count": 10,
1039 "metadata": {},
1040 "output_type": "execute_result"
1041 }
1042 ],
1043 "source": [
1044 "var('t', 'g', 'k')\n",
1045 "function('v')\n",
1046 "conditions = (0, 0) # Start with velocity 0\n",
1047 "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)"
1048 ]
1049 },
1050 {
1051 "cell_type": "markdown",
1052 "metadata": {},
1053 "source": [
1054 "# Basic data analysis and visualization\n",
1055 "\n",
1056 "## Statistics\n",
1057 "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n",
1058 "\n",
1059 "Sage includes the most basic functions for statistical analysis."
1060 ]
1061 },
1062 {
1063 "cell_type": "code",
1064 "execution_count": 20,
1065 "metadata": {},
1066 "outputs": [
1067 {
1068 "name": "stdout",
1069 "output_type": "stream",
1070 "text": [
1071 "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1072 "Mean:\t\t\t 5/13\n",
1073 "Median:\t\t\t 1\n",
1074 "Mode:\t\t\t [3]\n",
1075 "Standard deviation:\t 2*sqrt(29/13)\n",
1076 "Variance:\t\t 116/13\n",
1077 "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n"
1078 ]
1079 }
1080 ],
1081 "source": [
1082 "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n",
1083 "\n",
1084 "print(\"Values:\\t\", L)\n",
1085 "\n",
1086 "print(\"Mean:\\t\\t\\t\", mean(L))\n",
1087 "print(\"Median:\\t\\t\\t\", median(L))\n",
1088 "print(\"Mode:\\t\\t\\t\", mode(L))\n",
1089 "\n",
1090 "print(\"Standard deviation:\\t\", std(L))\n",
1091 "print(\"Variance:\\t\\t\", variance(L))\n",
1092 "\n",
1093 "print(\"Moving average (5):\", moving_average(L,5))"
1094 ]
1095 },
1096 {
1097 "cell_type": "markdown",
1098 "metadata": {},
1099 "source": [
1100 "You can also compare your data to a probability distribution, see [this page](https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html). If you need to do more advanced statistics you should consider using [R](https://www.r-project.org/); you can also use it inside Sage."
1101 ]
1102 },
1103 {
1104 "cell_type": "markdown",
1105 "metadata": {},
1106 "source": [
1107 "## Plotting\n",
1108 "**Reference:** [[15](https://doc.sagemath.org/html/en/reference/plotting/index.html)], more specifically the subsection [[16](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html)].\n",
1109 "\n",
1110 "Some Sage objects can be plotted:"
1111 ]
1112 },
1113 {
1114 "cell_type": "code",
1115 "execution_count": 21,
1116 "metadata": {},
1117 "outputs": [
1118 {
1119 "data": {
1120 "image/png": "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\n",
1121 "text/plain": [
1122 "Graphics object consisting of 1 graphics primitive"
1123 ]
1124 },
1125 "execution_count": 21,
1126 "metadata": {},
1127 "output_type": "execute_result"
1128 }
1129 ],
1130 "source": [
1131 "f = sin(x)\n",
1132 "plot(f)"
1133 ]
1134 },
1135 {
1136 "cell_type": "markdown",
1137 "metadata": {},
1138 "source": [
1139 "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n",
1140 "\n",
1141 "You can give a number of options to adjust the aspect of your plot, see [here](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html#sage.plot.plot.plot). Let's see some of them:"
1142 ]
1143 },
1144 {
1145 "cell_type": "code",
1146 "execution_count": 67,
1147 "metadata": {},
1148 "outputs": [
1149 {
1150 "data": {
1151 "image/png": "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\n",
1152 "text/plain": [
1153 "Graphics object consisting of 1 graphics primitive"
1154 ]
1155 },
1156 "execution_count": 67,
1157 "metadata": {},
1158 "output_type": "execute_result"
1159 }
1160 ],
1161 "source": [
1162 "f = sin(x)\n",
1163 "plot(f,\n",
1164 " -2*pi, 2*pi, # bounds for x\n",
1165 " ymin = -0.7, ymax = 0.7, # bounds for y\n",
1166 " color = \"red\",\n",
1167 " title = \"The sin function\",\n",
1168 " )"
1169 ]
1170 },
1171 {
1172 "cell_type": "markdown",
1173 "metadata": {},
1174 "source": [
1175 "Some of the options are not described precisely in Sage's documentation, but you can find them on [matplotlib's documentation](https://matplotlib.org/stable/contents.html). You can find many examples online for adjusting your plot as you like!"
1176 ]
1177 },
1178 {
1179 "cell_type": "markdown",
1180 "metadata": {},
1181 "source": [
1182 "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:"
1183 ]
1184 },
1185 {
1186 "cell_type": "code",
1187 "execution_count": 36,
1188 "metadata": {},
1189 "outputs": [
1190 {
1191 "data": {
1192 "image/png": "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\n",
1193 "text/plain": [
1194 "Graphics object consisting of 2 graphics primitives"
1195 ]
1196 },
1197 "metadata": {},
1198 "output_type": "display_data"
1199 }
1200 ],
1201 "source": [
1202 "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n",
1203 "exponential = plot(exp(x), (x,-2,0.5))\n",
1204 "\n",
1205 "show(cosine + exponential)"
1206 ]
1207 },
1208 {
1209 "cell_type": "markdown",
1210 "metadata": {},
1211 "source": [
1212 "Finally, there are other types of plots that you can use, like [scatter plots](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html#sage.plot.scatter_plot.scatter_plot) and [bar charts](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html#sage.plot.bar_chart.bar_chart). You can also add [text](https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html#sage.plot.text.text) to your plot:"
1213 ]
1214 },
1215 {
1216 "cell_type": "code",
1217 "execution_count": 53,
1218 "metadata": {},
1219 "outputs": [
1220 {
1221 "data": {
1222 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkcAAAGGCAYAAABxHyV7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAtOElEQVR4nO3dfZhcdX338fd3d8MGhAyBalVYS1QUNoEQIEErJkEUFEGw0oIPuYUqtBCrctfbCLWCogYK1QisDwhEqpBETW0Rq1IoBAENEBKQBuQpIdiIIEg2xTiE7O/+Y3Y3J7sz+5DM7uyceb+u61yzM+fMzPfMCexnf+d3vhMpJSRJklTSVOsCJEmSxhLDkSRJUobhSJIkKcNwJEmSlGE4kiRJyjAcSZIkZRiOJEmSMgxHkiRJGQ0djqJkQkRErWuRJEljQ0utCxhBg7b+3rBhA4VCgQ0bNoxGPZIkqbaGNBjS0CNHkiRJfdV1OIqI3SJiQUQ8HhGbIuKOiJhe67okSVL9qvfTalcAU4A5wHrgA8CNEdHuF+pKkqTtUbfhKCJ2Bt4DHJ9SurX74fMi4gTgjJoVJkmS6lrdhiNKtTcDf+zz+Cbg8HJPKBaLFIvF3vudnZ0jVpwkSapPdTvnKKW0Efg58I8R8cqIaI6IDwCHAa8o95z58+dTKBR6l7a2ttEsWZKkHRYxekujinqemxMRrwGuAmYCW4B7gIeAg1NK+/fdvtzIUVtbGxs2bGDChAmjVLUkSdtvNENLHUeESob06dXzaTVSSo8CsyLiJcCElNJvImIJsAboF45aW1tpbW0d7TIlSVIdqdvTalkppee7g9FE4Gjg32tdkyRJqk91HY4i4uiIeHtETIqItwE3A78CFta4NEmSVKfqOhwBBaADeBD4F+A24KiU0uaaViVJkupWvc85+i7w3VrXIUmS8qPeR44kSZKqqiHDUUdHB+3t7Uyf7tewSZKkbdV1n6NBDLpjnZ2dFAoF+xxJkuqGfY52yJA+vYYcOZIkSarEcCRJkpRhOJIkScowHEmSJGUYjiRJkjIMR5IkSRkNGY7scyRJkiqxz5F9jiRJdcQ+RzvEPkeSJEnDZTiSJEnKMBxJkiRlGI4kSZIyDEeSJEkZhiNJkqSMhgxH9jmSJEmV2OfIPkeSpDpin6MdYp8jVV9EEBGcd955tS5lSGbPnk1EMHv27FqXIkmqE4YjaZSdcsopvSFz7dq1tS5HktSH4UjaAWvXru0NOt/61rdqXY4kqQoMR5IkSRmGI0mSpAzDkSRJUsawwlFE/CgiUkT8vML6w7vXp4h4LiKay2wzMSK6ureZW+F1XhoRn4+Ild2v88eIWBsR346Iwwd4Ts97/025bT784Q/3zg/ZY489yvY5WrBgARFBS0sLnZ2dA34e2+u5557jC1/4Am984xuZOHEi48aN46UvfSnt7e28+93v5mtf+xpPPfVUv+cN9UqxoV6htXbtWubNm8chhxzCnnvuyfjx45k0aRJHHHEE//zP/8y6desG3Ze77rqL9773vey99960tray1157MWfOHB544IFBnzuQ8847r3d/ofSZnXvuuUyePJldd92VPfbYg9mzZ3PNNdfs0Pv0uO2225gzZw777LMP48ePZ/fdd2fatGl8+tOf5umnny77nIhg0qRJvfdPPfXU3prr7ao+SY1gY60LqB8ppSEvwP+j1D9oM7BrmfWf7l7fsxxaZpsTMuunlFl/FLChz+v0XS4Dmso897+71y9OZbzmNa/pfY3JkyenDRs2JCBt2LChd5vjjz8+AemQQw4p9xI7bPXq1emVr3zlQPuWgHTppZf2e27PunPPPXfA95g1a1YC0qxZsypuc9FFF6Vx48YNWEO552druPTSS1NLS0vZ5+6yyy5p2bJlw/x0tjr33HN7X+uxxx7b5tj1XU488cS0efPm7fostmzZkubOnTvg51AoFNINN9xQ8bMYaCl3rD74wQ/2rl+zZs12f0aSGlOp+9Bwl3sSjOu+HfrzcmhIeadlyCmqZFn3bQtwOPCTPutnl7l/d4VtfkcpzPSKiIOAHwI7UQpgHcC/A88D04BPAZOAud2PzStTXzswq2/h//M//8Ojjz7ae3/16tX87ne/22ablBI/+9nPSkWOUF+cOXPmsH79esaNG8dpp53GO97xDl7+8pfT1dXF+vXrufPOO1m6dOmIvHeP888/n8985jMA7L777px55pkcccQR7Lnnnjz33HPcc889/OAHP+gdtSnnpz/9KcuXL+fAAw/kYx/7GAcccACbNm3iBz/4AV/5ylf4wx/+wJw5c3j44YfZaaeddqjek046iTVr1vC3f/u3nHjiiRQKBe677z4uvPBCHnroIb7//e/zile8gksuuWTYr/2pT32Kjo4OACZN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i2XLlvGJT3yCY489li1btrDTTjv1m6cG0NLS0huYrrrqKhYtWsQDDzzAI488wiOPPFKVq9skafjWsYWVFGkmcSFd3AgcTBc3kbiAIs1s4R7giVoXOjYNtZV234XSXKPsVzx8osJ2N2W2eY4yXxjbZ/vt/uLZ7PKhD32od/uISE899VS/HuKrV6/e5nX/7u/+bsCe41/96ld7t73kkksG3LachQsXDrRPvcvhhx+ennnmmbKv8aUvfani8yZOnJiWLVs2pC+e/eIXv1jxS2N7lsG+eHYgQ6lhIH2/eHbSpEkV63zPe96zQ188e+aZZw74ORQKhfTTn/60Yq3XX399ioiyz/WLZ6XRN/yv19ixZWzu3xMJjkmwvML6X3Svf2JM7dsoqP7Xh/RxJ5DtXHhLhe1uzvxcab5Rr1T62pDXAl+k9D1snUARWEepc9WbU0ofGex1siNFfecb9dhrr722uT/YfKOf/7x0JnHixImccsopA25bzvve9z5uvvlmzjnnHN785jczadIkdtllF3baaSf23ntv3vWud3HttdeybNmyildFnXXWWfzkJz/h6KOPZuLEibS2tjJp0iTmzp3LqlWrhtyG4Oyzz2b16tV8/OMfZ8qUKUyYMIHx48fz6le/miOPPJIFCxawePHiYe/jSJg0aRIrVqzgnHPOYf/992eXXXahUCgwc+ZMvvOd7/D973+flpbtm1jY1NRER0cHt956K+9///t51ate1dsL66CDDuKcc87h4Ycf5qijjqr4Gu985zu56aabOP7443nlK1/Z2zBSkmpnb+BHbL1+qa/DutdX/pqoRhapiv1bxpiKO9bR0UFHRwdbtmzhoYceYsOGDUPqObPPPvvw+OOP89nPfrb3W+01Ms4777ze0385/jcqaQSM9kWko/2/qNHcvxz+73dIn96OjBzVrblz57J69ephfYnounXrePzxxykUCnzsYx8bweokSVItNWQ42h49HbQ/+tGP9nY4liRJ+WMHqCGaM2fOmLl6S5IkjRxHjiRJkjIMR5IkSRkNebVaj87OTgqFwpCvVpMkjX1erVY9OYwIXq0mSZI0XA0Zjjo6Omhvb+/3PVmSJEmeVvO0miTliqfVqieHEcHTapIkScNlOJIkScowHEmSJGUYjiRJkjIMR5IkSRmGI0mSpIyGDEf2OZIkSZXY58g+R5KUK/Y5qp4c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\n",
1223 "text/plain": [
1224 "Graphics object consisting of 3 graphics primitives"
1225 ]
1226 },
1227 "metadata": {},
1228 "output_type": "display_data"
1229 }
1230 ],
1231 "source": [
1232 "b = bar_chart(range(1,10))\n",
1233 "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n",
1234 " marker = \"*\", # symbol\n",
1235 " markersize = 100,\n",
1236 " edgecolor = \"black\",\n",
1237 " facecolor = \"red\"\n",
1238 " )\n",
1239 "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n",
1240 "show(b + s + t)"
1241 ]
1242 },
1243 {
1244 "cell_type": "markdown",
1245 "metadata": {},
1246 "source": [
1247 "## Interpolation\n",
1248 "**References:** [[17](https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial)] and [[18](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html)].\n",
1249 "\n",
1250 "When you need to work with a discrete set of data, like measurements of real-world quantities, it can be useful to visualize a \"smoothed out\" version of this data, for example by plotting a function that approximates it.\n",
1251 "\n",
1252 "One way to do so is finding the lowest-degree polynomial that passes through all your points. This is called [Lagrange Polynomial](https://en.wikipedia.org/wiki/Lagrange_polynomial)."
1253 ]
1254 },
1255 {
1256 "cell_type": "code",
1257 "execution_count": 65,
1258 "metadata": {},
1259 "outputs": [
1260 {
1261 "data": {
1262 "image/png": "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uFx7LaSnw+LFbicpGhVKIiIS8tavt7/IH34YIiLcThNcqlWDNm3s2K9A5DeFUnx8PDExMcTGxrodRUREQsz48XYj15493U4SnK67Dj7+GBIT3U5SeBrMLSIiIW3DBjj/fHjlFejTx+00wWnXLqhd26523quX22kyaTC3iIhIfp58EurWVWuSN9WqBRdeGJjLBKhQEhGRkLV9O/zvfzBqlMYmeVvXrvDRR3DsmNtJCkeFkoiIhKz//heqVoXbbnM7SfC76io4dAhWrnQ7SeGoUBIRkZC0axe8+ircey+ULu12muDXrBlUrw7vved2ksJRoSQiIiFp0iQoVw7uvtvtJKHBceDqq+Hdd91OUjgqlEREJOT89RfMnAlDh0L58m6nCR1XXw07dtixYYFChZKIiIScadPsZq1DhridJLR07Gi7OQOpVUmFkoiIhJTERHjuORgwACpVcjtNaClTBi69VIWS5OKvv/6iYcOGhIeHMz9Q13L3Y8888wyO43DxxRdz5MgRt+MEJd3DEgymT4fkZBgxwu0koenqq+3Mt3/+cTtJwQRMobRgwQIuv/xyKleujOM4bNiwIcfj1qxZw6WXXkrZsmU57bTTaN++PcnJyVmOSU5OpkyZMmzbto1Vq1bRunVrKlWqRGRkJA0bNmTKlCk5nrt9+/ZFzn/o0CG6dOlC5cqVGTduHL169WLZsmV5vmbChAk4jsOwYcOKfN2C+t///kezZs0oU6YMderU4amnnsry+eXLl+M4TrbHtm3bsp1r3Lhx3HTTTQDcfffd1KtXj8jISE4//XTi4uJyfM3y5csZN25ckfO//vrr3H///TzzzDMcPHiQ6667juPHj2c55sCBA1xxxRVUr16dUqVKUatWLQYPHkxSUlKRr5th+vTpnHfeeURFRREVFUWrVq1YunRprsfffffdOI7D1KlTsz1fkPfr5HsYICUlhQcffJA6depQqlQp6tWrx0svvZTtdb64hydMmEBsbCzly5enSpUqXHvttfzwww9Fvm5BHD16lNtuu40mTZoQERHBtddem+Nx8fHxnHvuuURGRnLOOefw6quvZvn85s2bue6666hbt26O35+T3XbbbYwePTrz3++99x4tW7YkMjKSypUr071792yvefnll3n55ZeL8iV61J49e+jZsyfnnHMOYWFhPvkZ4y+OHoWpU6FvXzjjDLfT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hx9o06YNAMePH+eXX37J1n2W20y+t956iwULFrB8+XJuvPFGHnvsMcaPH59rhvLly1P+pH03ypcvT8WKFb3yfgWDnTth/ny7yGQuP0bFBZ07w6hR8MUX0KGD22ly541CqQy2u+1kaRRzKYKDBw/y22+/8ccffwBkFkTVqlWjWrVqOI7D/fffz9ixY2natCnNmjXjlVdeYdu2bcybNw+wP+A6depEmTJlMs8bHx9P7dq1M6dSr1q1iqeffpohBVzXPj4+njVr1vDdd99Rq1atzKn2a9euzTKupCDKly+fbRxH2bJlqVSpklfHd+zfv5958+bRvn17jh49yuzZs3n77bf5/PPPM4+ZOnUqdevWpVGjRhw7dow5c+Ywf/78zEUHU1NTWbp0aZZ1dXbu3Mlbb71F586dOf300/n999+ZOHEikZGRXHnllfnmOnToELfccgtDhgyhS5cu1K5dmxYtWnD11VfTo0ePQn+d77//Pnv37iU2NpZy5cqxZcsWRo4cSevWralbt26hz3eyBx54gC5dulCrVi0OHTrE3LlzWb58OR988AEAlSpVotIpSwCXKFGCatWqcc455wAFe79yuod79uzJY489Rt++fRk/fjz79+/n/vvv5/bbbycyMjLf7J68hwEGDRrEG2+8weLFiylfvjx//vknANHR0QXKU1Rbtmzh2LFjHDx4kEOHDmWutdasWTPAFo9fffUVLVu25O+//2by5Mls2rQpS+F97NgxtmzZkvnfv//+Oxs2bKBcuXLUr1+fffv2sW7dOhYtWpT5mqioKPr378/YsWOpVatWlnXICnKf7t69mwEDBjBx4kTatGnDyy+/zFVXXUWXLl246KKLPPPm5CDj/Tl8+DB//fUXGzZsoGTJkkUukP3Z1KlQsSLceqvbSeRk550HVarYcUr+XCh5o+vtZWA3/788QDfgL2BiQdrBcpv1Nnv27BzHMp3aXTNhwgRTs2ZNU6ZMGdOqVasszeFt2rTJNpvtmWeeMY0aNTJlypQxUVFR5vzzzzcJCQkFmpa7detWExkZmaVbJDEx0dStW9eMHDmyIF9uvnwx6+2vv/4yF110kSlbtqwpU6aM6dixo/nyyy+zHDNx4kRTr149U7p0aVOhQgXTpk0b895772V+ftmyZdmm2f/++++mS5cupkqVKqZEiRKmZs2apmfPnmbbtm0FytW3b1/TpEmTLFPSp02bZipWrGh2795d4K8vw6effmpatWploqOjTenSpU2DBg3MqFGj8l3yoCBuv/12U6dOHVOyZElz+umnm44dO2ZbsuBUp3btFOT9yukeNsbei506dTKRkZGmZs2aZsSIEdm6rXPijXs4p/9PgVy7nHJSlFlvderUyfG6GbZs2WKaNWtmIiMjTVRUlImLi8t2L2Z07Z/6yOiynDVrVo7LCRw7dszce++9pkqVKqZ8+fKmU6dO2Wa95SQ9Pd107NjRXH755ZlLcRhjzPDhw029evXMoUOHCvS1F2XWW05fZ17dwIFq/37bvVPESYHiZb16GXPBBa5dvkB1jWNOdD14iuM45YHHThRIVYA/gDeBR40xOfdvnCQpKYno6GgSExML1fWWn/3793PGGWewa9euPBeSk6IZOnQoqampJCQkuB0laOkedt8111xDmzZtGDlypNtRpICeeAIefxx+/dW2Xoh/efVV29K3bx+cfrrPL+8U5CCPd70ZYw4Bw048/MbBgweZPHmyfsF4SePGjWnVqpXbMYKa7mH3tWnThptvvtntGFJAR4/Cs8/aX8QqkvxTxtDNTz+FG290N0tuPN6ilI98L+atFiUREQktL74I/frBtm1w9tlup5HcnHMOXHqp3azYxwrUohQwm+KKiIgUlDEwZQp07aoiyd916AC5TMj1CyqUREQk6Hz6KWzeDPfc43YSyU+HDrbV78RGEH5HhZKIiASdadOgSRM/n3YuALRrZz+etCKNX1GhJCIiQeXHH+Hdd21rklOgUSjipmrV4Nxz4bPP3E6SMxVKIiISVJ591i4w2bOn20mkoNq3999xSiqUREQkaCQlwezZ0L8/eHEhePGwDh1g+3Y4sfmGX1GhJCIiQeOllyA5GQYOdDuJFEbGOCV/bFVSoSQiIkEhLc12u/XoAdWru51GCqNKFWjUyD/HKXljU1wRERGfe+892LkT3nzT7SRSFB06wIl9xP2K37QoxcfHExMTQ2xsrNtRREQkAE2dChddBBde6HYSKYp27eyMxd9/dztJVtrCREREAt5330HTprY16aab3E4jRfHnn3DGGfDWW3DDDT65pLYwERGR0PDMM1CjBlx3ndtJpKiqVYP69WHVKreTZKVCSUREAtpff8GcOTBoEJQo4XYaKY42bVQoiYiIeNTMmXYF7rvucjuJFFebNrBxo10Py1+oUBIRkYB1/DgkJEDv3lCpkttppLjatIH0dPjyS7eT/D8VSiIiErAWLbKrOQ8d6nYS8YSzz4bKlf2r+02FkoiIBKznnoNLLoEmTdxOIp7gOP43TkmFkoiIBKTvv4cVK2DwYLeTiCe1aWO73o4fdzuJpUJJREQCUkKCXXenWze3k4gntWlj9+tbv97tJJYKJRERCTiJifDaa3D33VoSINicfz5ERvpP95sKJRERCTivvAIpKVoSIBiVLAktW6pQEhERKZL0dIiPh+7dbdebBJ+LL7bjlHy7y1rOVCiJiEhA+eQT2L5dg7iDWcuWdu+3335zO4kKJRERCTDx8XY5gDZt3E4i3tKypf3oDwtPqlASEZGA8euvsGSJbU1yCrT3uwSiqlXhzDNVKGURHx9PTEwMsbGxbkcRERE/NWMGlC8PvXq5nUS87aKLYO1at1OAY3w7UirfiyUlJREdHU1iYiJRUVG+yCQiIgHg6FGoVcsWSVOnup1GvO2ZZ2DkSLsURKlSXrlEgdok/aZFSUREJC//+x/s3w8DB7qdRHzhoovsEhAbN7qbQ4WSiIgEhPh46NzZbpwqwa9ZM9uS5PY4JRVKIiLi99atg6++0pIAoaRkSbjgAhVKIiIi+YqPhzp14Mor3U4ivnTRRSqURERE8rR/P8yda8cmhYe7nUZ86aKL4OefYe9e9zKoUBIREb/20kv24+23u5tDfO+ii+xHN5cJUKEkIiJ+Kz3drp10ww1QubLbacTXatWCatXc7X6LcO/SIiIiefv4Y9v18vrrbicRNziO3c7k66/dy6AWJRER8VvTp0PTpv/fBSOhp3lzWyj5dn3s/6dCSURE/NLu3XZft/79ta9bKGvRAv7+27YsukGFkoiI+KUXXoAyZbSvW6hr3tx+dKv7TYWSiIj4nePHbaHUu7fdBFdCV5UqULu2CiUREZFM774Le/bYbjeRFi1UKImIiGSaPh1atbIDuUVatIBvvrHLRfiaCqUAYAwcPQoHD8K//7o38l9ExBd+/NEuC6DWJMnQogUkJdl7w9f8Zh2l+Ph44uPjSUtLczuK6/bssT8kPv0UNmywN8a///7/50uUgBo1ICbG/sXVsSPExkKE33w3RUSK7vnnoWJF6NHD7STiL04e0H322b69tmN82zyR78WSkpKIjo4mMTGRqKgoX2TyC2lpsGgRvPgifPihbV7MWDukfn27MmmZMrZl6e+/4bffYNMmWLXKVtmVK9uZIX37qqlaRALX0aNQsybceitMmuR2GvEn9epBXBxMnuyxUxZo0Qm1QbjMGPjf/2DsWPjhB9tCNGMGdOtWsOX6U1NthT1vHrz2GkybBpdeCg89BO3ba+0REQks8+bBgQNw991uJxF/kzFOydc0RslF27fDZZfBTTfZSnndOvjiC+jXr+B7GkVE2Fanp5+2i7O9/bZtcbr0UujUCTZv9u7XICLiSTNm2OEEvu5eEf/XvDmsX297YHxJhZILjIFZs2wX2c6dsHQpvPeerZaLo0QJuP56W3G/8w7s2mWvMWIEHDrkmewiIt7y/fewerUGcUvOWrSAw4dtI4MvqVDyseRk6NPHthr16WPHGV1xhWev4TjQtav9ofP443ZgZNOm9geQiIi/mjHDjseMi3M7ifijCy6wH329npIKJR/6+2/o3Bnmz4c5c2wBU6aM965XqhSMHm0LpurVoW1bePhh3zdbiojk5/BhO87yzjtt67jIqU47DRo0UKEUtHbvhksugS1b7LR/X+5ddNZZ8PnnMH48/Oc/cPXVtmgTEfEXb7xhl0Hp18/tJOLPmjdXoRSU9u6FDh3sOKHVq+3ga18LD7cz4T74AL76yvb1btni+xwiIqcyxna7XXWV3dNLJDfnnw/ffefbFbpVKHlZRnfbv//C8uXQsKG7eS67zFbjZcpAmzYatyQi7lu3Dr79VoO4JX/Nmtlu2p07fXdNFUpedOSI/Qtp92670vaZZ7qdyDrzTFi5Es47zy4hsGiR24lEJJRNnw5168Lll7udRPxds2b247ff+u6aKpS8xBjb175hg+3uatTI7URZnXaazdW1K1x3HbzyituJRCQU/f03zJ0Ld91lhwiI5KVKFTs5acMG311TK3N7yZQpdnDi3Ll2HzZ/VLq0zXf33XbrE2PgttvcTiUioeSVV+xM3NtvdzuJBIpmzXxbKHmlRclxnBqO48xxHOeA4zhHHMfZ4DhOc29cyx8tWwb33w+jRsGNN7qdJm9hYXaZgn797A+q2bPdTiQioSJjEHf37lC1qttpJFD4ulDyeIuS4zgVgNXAZ0AXYB9QD/jH09fyR/v2Qe/edgn+J55wO03BhIXZMQKOA3fcAeXKadduEfG+zz+3e1zOmOF2EgkkzZrBH3/Y37dVqnj/et7oehsF7DLG9D3puV9yOzglJYWUlJTMfyclJXkhkm9kjEtKS4NXXw2s/vawMEhIsEsY9O4NlSrZ/eJERLxl+nQ7E7hdO7eTSCDJGNC9caOdye1t3uh6uwb42nGctx3H2ec4zreO4+S6hNiECROIjo7OfNSqVcsLkXxj1iy7x9qsWXYZ/kATFma73jp0sFsIrF/vdiIRCVZ798KCBXZJAMdxO40Eknr1oGxZ33W/OcYYz57QcY6e+M/JwNvAhcBU4G5jTLa5VTm1KNWqVYvExESioqI8ms2bfv4ZGje2K27PnOl2muI5fNh2Hf78s11nqUEDtxOJSLD5z3/sXpS//w4VKridRgJN69Z2SYnXXy/WaQpUonujUDoGfG2Mufik554BYo0x+a5JnZSURHR0dEAVSsZAly52pevNm6F8ebcTFd/+/XZByrQ0WLsWKlZ0O5GIBIu0NNsq0KGDJpBI0QwebLcDK+YOEwUqlLzR9bYHODX6ViBoF6b/3//gww8hPj44iiSAypXh/fftGic33ADHj7udSESCxYcfwq+/woABbieRQNWsmZ0IcOSI96/ljUJpNXDOKc+dDfzqhWu57p9/YNgwO721a1e303jWWWfBvHl2Zsrw4W6nEZFg8fzzds8uf11jTvxfs2Z2v7dNm7x/LW8USlOAixzHecBxnPqO4/QE7gLivXAt140da/dxe+YZt5N4R/v2tqUsPt7OUBERKY5du+Ddd+1CtxrELUXVqJGdWe6LAd0eL5SMMeuAbsDNwCbgYWCYMaZ4Q6780Pbtdkr9gw9CjRpup/Geu+6CIUPsY+VKt9OISCCbNctuyt2zp9tJJJBFRtqlJXxRKHl8MHc+8r1YIA3mvvZa+03ats1uBxLMUlPtBrrbt9vNCLWKrogUVmoq1KkD11yjFmopvt69YedO+OKLIp/CtcHcIeHzz2HxYpgwIfiLJICICHjzTdsn3LOnnbUiIlIY775rV1Tu39/tJBIMmjWzi056+/eRCqUiSE+He++1AxH9fS83TzrjDFssLV8O48a5nUZEAs2MGdCyJTRt6nYSCQZNm9pZbzt3evc6KpSKYN48+OYbmDTJrmYdSjp0sIvEPf44LF3qdhoRCRQ7d9plAdSaJJ7SpIn96O2ZbyH2a7740tNh/Hi4/HK45BK307hj1Ci48krbP7xrl9tpRCQQzJwJp51m12UT8YSqVe2+pN9/793rqFAqpHnz7EqgY8e6ncQ9YWHw2mt25kqfPhqvJCJ5O3YMXnoJbr3V/twQ8QTHsa1KKpT8SHo6PPoodO4MrVq5ncZdFSvaYunzz+Gpp9xOIyL+bOFC+Osvu3aSiCepUPIz8+fbvdxCuTXpZO3b2264hx+GdevcTiMi/mrGDGjbFs491+0kEmyaNIEdO+DoUe9dQ4VSARkDjz1mW5Muvjj/40PF+PF2imavXnD4sNtpRMTfbNtmZ8pqELd4Q+PGtrdn61bvXUOFUgF99JFt3hszxu0k/qVkSXjjDbs2yr33up1GRPzNzJl2k+3u3d1OIsGocWP70Zvdb35TKMXHxxMTE0Osn+6S+PTT0Lw5tGvndhL/06CBfX9mzrQFpYgIQHIyvPwy9O0LpUq5nUaCUfnyULeud5cI0BYmBbBxo+1eevNNuOkmt9P4J2Nst+S2bfaGjY52O5GIuO3VV+1Mtx07oH59t9NIsLrmGjh+vEhr+2kLE0+ZPBlq14brr3c7if9yHHjxRUhMhOHD3U4jIv7g+efhsstUJIl3NW4cIl1v/ur33+0YnGHD7H5nkrvatWHKFJg9G957z+00IuKm776zm5VqSQDxtiZN7O/qv//2zvlVKOUjIcEukHbHHW4nCQy33w5dukC/fnDwoNtpRMQtzz8P1arZbhERb/L2ViYqlPJw7BjMmmX72P1kuJTfcxx44QU7iHPYMLfTiIgbDh+2C9LeeSeUKOF2Ggl2Z59te3y81f2mQikPCxbAvn1a/6OwatSw47pee81ugikioWXuXPj3X9uyLOJtJUtCw4beK5Q06y0P7drZFpLly12NEZCMgU6d7I7hmzZB2bJuJxIRX2nRwna7vfuu20kkVPTsaTdpX7myUC/TrLfi2LwZVqyAAQPcThKYHMeuq/Tnn/DII26nERFf+fpr+OYbtcSLb2Xs+eaNth8VSrl4/nmoUgW6dXM7SeCqV89ucTJ1qvaCEwkVM2ZArVp2UoeIrzRubJen2b3b8+dWoZSDf/+FV16xM91KlnQ7TWAbMQKaNrWDOo8fdzuNiHhTYqJdmPeuuyA83O00EkoyZr55Y5ySCqUczJ8PSUkaiOgJERF2FtymTXabExEJXnPmQEqKXSZExJfq1IFy5WDjxmT27t1LcnKyx86tQikHL78M7dvDmWe6nSQ4NG9uV+t+9FH4+We304iINxhju93i4qB6dbfTSKhZvXoVJSO689CD5ahWrRrly5Xj+u7dWb16dbHPrULpFL/+Cp99Brfd5naS4DJunN1BfMgQ7wy2ExF3ffGFbTnWIG7xtenTp9O2bVtOT1zCJJPOO8DT6elsXbKESy65hBkzZhTr/Foe4BSPPQYTJ9rZWuXK+fzyQW3+fLtf3qJF9q9OEQkeffrYYmn7dgjTn+DiI6tWraJt27YMMYYpZG39SQeGAc85DitXrqR169anvlzLAxSWMXa36+uvV5HkDd27wxVXwD332AHzIhIcDhyA//3PDuJWkSS+NHXyZM4ND89WJHHi31OBc8PDmTplSpGvoVv6JF98AT/+aLcsEc9zHHj2Wdta98QTbqcREU955RVIT4e+fd1OIqEkOTmZRYsX0y81NddiJgzol5rKwoULizzA228Kpfj4eGJiYoiNjXUtw8sv25Hz7dq5FiHo1a8PY8bYGXBbt7qdRkSKyxi77tz118Ppp7udRkJJUlISaenp1MvnuLOAtPR0kpKSinQdvymUBg0axJYtW1jn0sqEycm26bhPHzUde9uoUVC7NgwapIHdIoFu+XI7Lunuu91OIqEmKiqK8LAwfsrnuJ1AeFhYkcc9qyQ4YelSu3ZS795uJwl+pUvDc8/Z2YVvvOF2GhEpjhkz7Iakbdu6nURCTWRkJNfGxfFCRATpuRyTDrwQEUG3bt2IjIws0nVUKJ0wdy40awZnn+12ktBwxRVw3XVw331w6JDbaUSkKPbuhQUL7JIAToHmD4l41rARI9ialsZwyFYsZcx625qWxrDhw4t8DRVKwOHDdpfrG290O0lomTQJ/vkH/vMft5OISFG89JJdfb9PH7eTSKhq06YNCQkJPOs4NImIYCrwDna2W5OICJ5zHBISEnJaGqDAVChhi6TkZBVKvlanjh2vNHmynW0oIoEjLQ1mzrQ/NytUcDuNhLL+/fuzcuVKYuLiuC8sjDjgvrAwYuLiWLlyJf2LuQqqFpwEunWDP/6AtWt9cjk5yZEjdnzD+efD4sVupxGRgnrvPbj6avtz88IL3U4jYiUnJ5OUlERUVFRBxiRpwcmCSEy0A7nVmuSOMmXsUgHvvAMffeR2GhEpqIQEu4+jiyu6iGQTGRlJ1apVizxwOychXygtXmx3u+7Rw+0koatHD7t21bBhcPy422lEJD87d9o/MAcO1CBuCX4hXyi99Ra0bg21armdJHQ5DkybBj/8APHxbqcRkfw8/zxER8NNN7mdRMT7QrpQSkqCjz9Wa5I/aNrU7hM1bhz89ZfbaUQkN0ePwosv2u1KypRxO42I94V0obR0qe3qufZat5MIwGOP2VXRH3zQ7SQikpt58+wmuMWcSCQSMEK6UFq0yM62qlPH7SQCULkyPPoozJoF69e7nUZEcpKQAJ06aXFeCR0hWyilpNjprWpN8i/9+0OjRnDPPdoHTsTffPstrFljB3GLhIqQLZSWL7dbZ6hQ8i8REXYBylWrYOFCt9OIyMmmT4caNaBrV7eTiPhOyBZKixfDmWdCkyZuJ5FTXXYZXHkljBwJx465nUZEwG439PrrcPfd9g8akVDhN4VSfHw8MTExxPpg9bL0dFsoxcVpDRB/9dRT8MsvWi5AxF+8+qr9w+XOO91OIuJbIbmFyVdfQcuWtvutXTuvXEI8YOBAePNNuw9cpUpupxEJXcbAuefaZTzeesvtNCIeoy1McrNokf3FW4zNhMUHxo2zG28++qjbSURC22ef2QVhNYhbQlFIFkqLF9vNHNXP7t+qVLFrKiUkwPbtbqcRCV0JCRATA23bup1ExPdCrlD65RfYssUWSuL/7rnHzrIZOdLtJCKh6Y8/bCv8gAEa0ymhKeQKpaVLITzczqwS/1e6NDz5pG0FXL7c7TQioeeFF+z/h7fc4nYSEXeE3GDua66BxET4/HOPn1q8xBho1crOuPn6a7vNiYh43/HjULeuXTdpxgy304h4nAZznyolBT75xK7RI4HDcewilN9+C6+95nYakdDxzju2623AALeTiLgnpAqlFSvgyBHo0sXtJFJYF18MPXrYwd3//ut2GpHQ8OyzdnZw06ZuJxFxT0gVSkuX2oHBWo07MD35JPz1F0ya5HYSkeD3/fd2iMKQIW4nEXFXSBVK779vW5M0cyMwnXWW/aH91FOwd6/baUSC23PPQfXq0L2720lE3BUyhdLPP9sF09TtFtgeeMCuf6VFKEW8Izk5mR9+2MtrryXTvz+UKOF2IhF3hUyhtHSp/QXbqZPbSaQ4Kla0xdLzz9vCV0Q8Y9WqVVzfvTvly5WjYcNqHE0ux9o13Vm9erXb0URc5fVCyXGcMY7jGMdxpnr7Wnl5/31o0wa8tH2c+NCQIXas2QMPuJ1EJDhMnz6dtm3bsnXJEp5OT+cdYDLp/PzxEi655BJmaG0ACWFeLZQcx4kF7gK+8+Z18nPsmF2s8PLL3UwhnlK6NDz+OCxYAGvWuJ1GJLCtWrWKQYMGMcQYvk9NZRjQFRgGfJ+aymBjGDhwoFqWJGR5rVByHKcc8DrQD/jbW9cpiK++slPKtRp38OjVy05Zvv9+uyCliBTN1MmTOTc8nClk/4UQBkwFzg0PZ+qUKT7PJuIPvNmiFA+8Z4xZltdBKSkpJCUlZXl42rJldmxLs2YeP7W4JCwM/vtfWL3abm8iIoWXnJzMosWL6ZeamusvgzCgX2oqCxcuJDk52ZfxRPyCVwolx3FuAi4AxuR37IQJE4iOjs581KpVy+N5li2DSy+1e7xJ8Ojc2bYSjh4NqalupxEJPElJSaSlp1Mvn+POAtLS073yh6yIv/N4oeQ4Ti1gGtDbGHM0v+PHjBlDYmJi5mPXrl0ezZOUBF9+qdluwWriRNi+HV580e0kIoEnKiqK8LAwfsrnuJ1AeFiYV/bfFPF33mhRag5UAb5xHCfVcZxUoB0wNCIigrS0tCwHlypViqioqCwPT1qxAtLSVCgFq/PPt+OVxo6Fw4fdTiMSWCIjI7k2Lo4XIiJIz+WYdOCFiAi6detGZGSkL+OJ+AVvFEqfAE2AZic9vgZe37BhA+E+7v9atszufn3WWT69rPjQ44/D339raxORohg2YgRb09IYDtmKpXTs7LetaWkMGz7c59lE/IHHCyVjzCFjzKaTH8C/wIHGjRt7+nL5WrbMtiZp25LgVacODB1qtzb580+304gEljZt2jBkSALP4NA4PIKpwDvY2W5NIiJ4znFISEigdevWruYUcUtQr8y9Zw9s3qxut1DwwANQsqS2NhEpip9/7k+9eitpFBfHfWFhxAH3hYURExfHypUr6d+/v9sRRVzjGN8uQpPvxZKSkoiOjiYxMbHY45XmzIFbboF9++D004t1KgkATz9tZ8Bt3gznnON2GpHAsHMn1K8PM2fCnXfaJQOSkpKIiorSmCQJdgXqawrqFqVPP4XzzlORFCoGD7Zbm4zJd1EKEcmQkACnnQY9e9p/R0ZGUrVqVRVJIicEdaG0fDm0b+92CvGV0qXhiSdg4UK7EKWI5O3wYZg1y7YklSnjdhoR/xS0hdKuXfDzz9CundtJxJd69rQrsI8cqa1NRPLzyiu2WBo82O0kIv4raAulzz+3H9u2dTeH+FbG1iZffAGLFrmdRsR/pafDtGlw3XVQu7bbaUT8V1AXSo0aQeXKbicRX7vsMru9yejRcPy422lE/NN778GOHaDlkUTyFtSFkrrdQtfEifaXgLY2EcnZlClw0UX2ISK5C8pC6Y8/7C9JDeQOXc2aQe/eMG6ctjYROdWGDfDZZ2pNEimIoCyUND5JAB57TFubiORk6lSoVQu6d3c7iYj/C9pCqWFDqFrV7STiJm1tIpLdn3/Cm2/CkCEQEeF2GhH/5zeFUnx8PDExMcTGxhb7XBqfJBnGjIESJbS1iUiG6dPt/xP9+rmdRCQwBN0WJnv3QrVq8MYbcPPNRcooQUZbm4hYR4/apQBuvBGefdbtNCKuC80tTFassB/VoiQZMrY2eeABt5OIuOv112H/frjnHreTiASOoCuUVq6EevWgenW3k4i/KF0aHn8cFiywC1GKhCJj7JIAXbvaTXBFpGCCrlBavRpat3Y7hfibXr2gaVNtbSKha9ky2/2sJQFECieoCqXDh2HjRhVKkl3G1iarV8PixW6nEfG9KVPsHwsaliBSOEFVKH31FaSlqVCSnHXuDJ062YHdqalupxHxnW3bYOlS25rkFGj4qohkCKpCafVqOO00OPdct5OIv/rvf+GHH7S1iYSWadPsunI33eR2EpHAE1SF0hdfQKtWtptFJCfnn2/HK2lrEwkV+/bByy/b2Z+lSrmdRiTwBE1JkZ4Oa9ao203y9/jjcPAgTJ7sdhIR74uPt388DhzodhKRwBQ0hdKWLZCYCBdf7HYS8Xd169q/rp96yi5QKhKs/v0XnnvOrsJdsaLbaUQCU9AUSqtXQ3g4XHih20kkEDz4oN3nSlubSDB76SX7B6SWBBApuqAqlJo1g7Jl3U4igaBiRbsP3MyZsH2722lEPC811XYv33ij3SBaRIomaAqlL77Q+CQpnCFD4IwztLWJBKd58+CXX+D++91OIhLYgqJQ2rsXfvpJhZIUTmQkPPYYzJ8PX37pdhoRzzHGLoVx2WW2pV1Eii4oCqXVq+1HDeSWwurdG847z/7Vra1NJFh88gl8+63dskdEiicoCqU1a6BWLahZ0+0kEmjCw2HiRFi1CpYscTuNiGc89ZRdM6xjR7eTiAQ+vymU4uPjiYmJITY2ttCv/eoruOgiL4SSkHD55fYXyqhR2tpEAt+GDfDRR7Y1SduViBSfY3zb35DvxZKSkoiOjiYxMZGoqKh8T5iaCtHRMH483HefRzJKCPrmG2jRws6C69fP7TQiRderl53csmOHXQJDRHJVoD8l/KZFqai2bIEjR7R+khRP8+bQsyc88ohdpE8kEP36K7z1FowYoSJJxFMCvlBau9Yuz9+8udtJJNBlbG0yZYrbSUSKZsoU28J+++1uJxEJHgFfKH31FTRurIUmpfjOPBMGDbKDu/ftczuNSOEcOACzZtl7WD8PRTwn4AultWuhZUu3U0iwePBBOxPuscfcTiJSONOm2c3BhwxxO4lIcAnoQunwYdi8WeOTxHMqVbJbm8yYYQfDigSCpCR49lm4+244/XS304gEl4AulNavt39BqVASTxo6FKpV09YmEjgSEuykFs38FfG8gC6U1q61ffGNGrmdRIJJxtYm8+bZadYi/uzIEbv5bd++UKOG22lEgk9AF0pffWVnu4WHu51Egk2fPnZl4+HDbauliL+aNcvO1hw1yu0kIsEpoAslDeQWbwkLs3+lf/WVXZdGxB+lpNjNb3v2tLM2RcTzArZQ2rMHdu3S+CTxnvbt4dprYfRoSE52O41Idq++Cn/8YScgiIh3BGyh9NVX9qMKJfGm//7X/iLSIpTib1JT4cknoXt3OPdct9OIBK+ALpSqVYNatdxOIsGsQQMYPBgmTIA//3Q7jcj/e+st2LnTrv0lIt4TsIXSunUQG6vdscX7Hn4YSpSw+8CJ+IP0dPjPf+DKK+2kAxHxnoAslIyxu71rfzfxhYoVYexYePFF+O47t9OIwKJFdkNwtSaJeJ/fFErx8fHExMQQGxub77G//mqnw6pQEl8ZOBDq14d777WFuohb0tNh/Hi49FK4+GK304gEP8f49qd+vhdLSkoiOjqaxMREoqKicjxmwQK47jo7yPaMMzyeUSRH77wDcXHw7rtw1VVup5FQNX8+XH89rFwJbdq4nUYkoBVo8I7ftCgVxjff2IHcKpLEl7p2hQ4d7DYRx4+7nUZCUXo6jBsHnTqpSBLxlYAslNavV7eb+J7jwKRJ8MMP8PzzbqeRUDR/PmzaZLveRMQ3Aq5Q0kBucdP559s9tcaOhQMH3E4joSRjbFLnzhqbJOJLAVco7d4Nf/0FF1zgdhIJVf/5j13sT8sFiC/NmwebN9uuNxHxnYArlNavtx/VoiRuqVrVFkkzZmi5APGNtDTbmnT55dCqldtpREJLwBVK33wDVapAjRpuJ5FQNmSIXbX7nnu0XIB439tv23WTNDZJxPcCslC64AKtyC3uKlkSpk6F5cttl4iIt6SlwaOPQpcu0LKl22lEQk/AFUqa8Sb+4oor7JIB990HR464nUaC1ZtvwtatGpsk4paAKpT++MNuTKpCSfzF5Mn2nnzqKbeTSDA6dsyOh7v2WrjwQrfTiISmgCqUMgZya8ab+Iv69WH4cHjySbu1DkBycjJ79+4lOTnZ3XAS8F54AX75BR5/3O0kIqEroAqlb76BSpWgdm23k4j8vwcfhAoVoG/fVVzfvTvly5WjWrVqlC9Xjuu7d2f16tVuR5QA9O+/8Nhj0KcPNGrkdhqR0OXxQslxnDGO46xzHOeQ4zj7HMdZ5DjOOZ44d8ZCkxrILf6kfHno3Hk6n33Wli3vLOHp9HTeAZ5OT2frkiVccsklzJgxw+2YEmCmTbObf2tskoi7vNGi1A6IBy4CLgMigI8cxylb3BN/+61dGVnEn6xatYpXXx3EUAyb0lIZBnQFhgHfp6Yy2BgGDhyoliUpsAMHYOJEGDAA6tZ1O41IaPN4oWSMucIY87IxZrMxZiPQF6gNFGsI9sGDdlXuZs08kVLEc6ZOnsy54eFMIfv/UGHAVODc8HCmTpni82wSmCZOtMsCPPig20lEJMIH14g+8fFgTp9MSUkhJSUl899JSUk5nmTjRvuxaVOPZhMpluTkZBYtXszT6em5/tURBvRLTeW+hQtJTk4mMjLSlxElwPz+Ozz7LNx/v11cV0Tc5dXB3I7jOMBkYJUxZlNOx0yYMIHo6OjMR61atXI814YNEBkJZ5/tvbwihZWUlERaejr18jnuLCAtPT3XPwREMjz6KJQpA/fe63YSEQHvz3p7DjgPuDm3A8aMGUNiYmLmY9euXTket3EjNG4M4eFeSipSBFFRUYSHhfFTPsftBMLDwoiKivJFLAlQO3bAiy/CAw9AdHT+x4uI93mtUHIc51ngGqCDMWZ3bseVKlWKqKioLI+cbNyobjfxP5GRkVwbF8cLERGk53JMOvBCRATdunVTt5vkacwYOOMMGDjQ7SQiksEbywM4juM8B3QHLjXG/Fzccx47ZjeEVKEk/mjYiBFsTUtjOGQrltKxs9+2pqUxbPhwn2eTwLFyJcyfD//5jx1mICL+wRstSvFAb6AncMhxnGonHkX+X3/bNlssqVASf9SmTRsSEhJ41nFoEhHBVOAdTsx2I4LnHIeEhARat27tak7xX+npdkxS8+bQq5fbaUTkZN6Y9TbgxMflpzzft6gnzJjxdt55RT2DiHf179+fJk2aMHXKFO5buJC09HTCw8IoXSqO2CbDuftuFUmSu7lzYd06WL4cwgJqvwSR4OcYY3x5vXwvlpSURHR0NImJiZnjle67DxYsgJ07vZ5PpNiSk5NJSkoiKiqKjz+OJC4O3n4brr/e7WTij5KToWFDu4flwoVupxEJKQXa58MX6ygV24YN6naTwBEZGZk5aPuaa+xj2DC4/HK73YnIyaZNgz/+gI8/djuJiOTE7xt5jdGMNwls06bB339rlWXJbt8+O3h74ECtESfir/y+UNqzB/bv19YlErjq1rW7wD/3HKxZ43Ya8Sfjxtm14R55xO0kIpIbvy+UtHWJBIN77oEWLeDOO+GkHXskhH33HTz/PDz8MFSq5HYaEcmN3xdKGzZAVJR20JbAFh4Os2bB9u0wYYLbacRtxsCQIba7bfBgt9OISF78vlDauNEuC+AUaGy6iP867zwYPdqOSdm82e004qa33oIVK+CZZ6BkSbfTiEhe/H55gHPPhU6d7G7aIoEuJcWOt4uOhtWrtXdhKDp8GM45B1q2tMueiIhrCtQE49ctSsnJtqtC45MkWJQqZbvgvvoK4uPdTiNueOIJOHgQJk92O4mIFIRfF0pbt9ql/Zs0cTuJiOe0bm2ngz/wAPz6q9tpxJe2b4dJk2wXrMZdigQGvy6UNm2yH2Ni3M0h4mkTJkDFinDXXXZgrwQ/Y+zCozVqwMiRbqcRkYLym0IpPj6emJgYYmNjM5/btMn+1aXVjCXYlC8PM2fCRx/ZrjgJfosWwdKlMGUKRBZ5i3AR8TW/Hsx9441RRETAkiW+iCbie3fdBW++adfUOfNMt9OItyQl2ZbxCy6AxYs1i1fETwT+YO5NmzQ+SYLbpElQuTL07WvH40lwevhhu43Ns8+qSBIJNH5bKP3zD+zeDY0bu51ExHvKl4eXXoLPP9cSGMHq66/t9jWPPgp16ridRkQKy28LpW3b7EcVShLsOnSAoUPtTKiM+16CQ2oq3H23bRm/5x6304hIUfhtobRli12M75xz3E4i4n0TJkCtWnDrrfaXqwSHZ5+Fb7+1A/cjItxOIyJF4beF0tatdh+kUqXcTiLifWXKwCuv2G4a7QUXHH78ER580O7lduGFbqcRkaLy20JpyxZ1u0loadXKLkI5fjysWeN2GimO9HS4/XY44wwVviKBzm8Lpc2bVShJ6HnkEYiNhZ49ITHR7TRSVPHxsHIlvPgilC3rdhoRKQ6/LZT+/luFkoSeEiXgjTfsXmADBmjV7kD00092YP6gQdC+vdtpRKS4/K5QSk5OzvgvFUoSks48E2bMsAtRvvaa22mkMNLT4Y47oEoVePJJt9OIiCf4TaG0atUqru/enRrVqwPgUJ0xo7qzevVql5OJ+N7NN0OfPrZV4scf3U4jBTV9ul0T68UXoVw5t9OIiCf4xRYm06dPZ9CgQZwbHk6/1FTqAT8BL0REsDUtjYSEBPr37+/LnCKuO3TIbnlRoQKsWgUlS7qdSPLy00/QtCnccostmETE7xVonXzXC6VVq1bRtm1bhhjDFLI2caUDw4DnHIeVK1fSunVrH8UU8Q/r1sHFF9sFKSdNcjuN5Ob4cbjkEvjrL9iwQRt5iwSIwNjrberkyZwbHp6tSOLEv6cC54aHM3XKFJ9nE3FbbCw8/TRMngzz57udRnIzfrxdA+uNN1QkiQQbV1uUkpOTKV+uHE+npzMsjxdNBe4LC+PQ4cNERkZ6M5+I3zEGbroJli61v4zPPtvtRHKyFSvs7LZHH4WHHnI7jYgUgv+3KCUlJZGWnk69fI47C0hLTycpKckXsUT8iuPArFlQvTpcdx38+6/biSTD339D797Qpg2MGeN2GhHxBlcLpaioKMLDwvgpn+N2AuFhYURFRfkilojfKV/edr3t3Kn1lfyFMdC/PyQlwZw5dm9KEQk+rhZKkZGRXBsXxwsREaTnckw6dvZbt27d1O0mIa1RI7u56muvwfPPu51GZs+G//3Pfk9q13Y7jYh4i+uDuYeNGMHWtDSGQ7ZiKWPW29a0NIYNH+7zbCL+plcvu7bS0KF2iwxxx4YN9vtwxx1www1upxERb3J9eQCAGTNmMHDgwMx1lM7CdrdpHSWR7I4fh86dYdMmu3xA3bpuJwot//wDLVrY7tAvvgA1dIsErMBYRynD6tWrmTplCgsXLiQtPZ3wsDC6devGsOHDtX6SyCn274cLL7SrP3/xhVaB9hVjoHt3+OwzWL8ezjrL7UQiUgyBVShl2Lt3L9WqVePPP/+katWqvsgkEpA2b4aLLoKOHWHBAghzvSM9+D39NNx/PyxeDNdc43YaESkm/18eICcZA7Y1cFskb40a2QUO33lH6/f4wkcfwahR9qEiSSR0+F2hJCIF17Wr3aV+wgQ7+0q844cf7KDtyy+HJ55wO42I+FKE2wFEpHjuvx9+/dWur1S9Olx9tduJgsvff9uCtHp1ePNNrZckEmpUKIkEOMeBZ56BP/6AG2+0A40vvNDtVMEhNdW+pwcOwNq1EB3tdiIR8TV1vYkEgfBwO16paVPbovTjj24nCnzGwJAhtvCcNw/q13c7kYi4QYWSSJCIjIQlS6BCBbvO0u7dbicKbE88ATNm2EeHDm6nERG3qFASCSKVKsHHH0NaGnTqBHv3up0oMM2aBQ8/DI89ZlffFpHQpUJJJMjUrg2ffAKJibZl6eBBtxMFlnfftZvdDhgADz7odhoRcZsKJZEgVL8+LFsGv/8OV1xhZ25J/j77zC4DEBcHzz5rB8qLSGhToSQSpBo1st1wP/1kV+8+cMDtRP5txQo7EP6SS+D117UMgIhYflMoxcfHExMTQ2xsrNtRRILG+efDp5/agd0dOmjMUm5Wr4Yrr4RWrWDRIihd2u1EIuIv/G6vt6SkJKKjo0lMTCQqKsoXmUSC3pYttlXptNNsl1yNGm4n8h9r1tixXC1awHvvQZkybicSER8JzL3eRMTzYmJs19K//9pWk82b3U7kH5Ytg8susy1vS5aoSBKR7FQoiYSIBg1s60mFCtCmDXz+uduJ3PX227a7rW1bWLoUypVzO5GI+CMVSiIhpEYN27LUvLntbnrrLbcTuWP6dLs1SY8esHgxlC3rdiIR8VcqlERCTHQ0vP++nQZ/000wdiykp7udyjfS0mDUKBg4EAYPhtdegxIl3E4lIv5Mm+KKhKCSJeHVV6FhQ7sC9fr1tmg47TS3k3lPUhL07Gm72SZNguHDtU6SiORPLUoiIcpx7MrT770Hq1bBhRfCpk1up/KOHTvsIPaVK+3K2yNGqEgSkYJRoSQS4rp0gXXr7NpBsbF2RWrfrhriXW+8ARdcAMePw9q19usVESkoFUoiQv36toi4804YOtTOBtuzx+1UxfPvv3ZD21697JYk33xjuxpFRApDhZKIABAZaVuT3n8fvv0WmjSxW3n4W+tScnIye/fuJTk5OddjPv8cmjWDuXNh9mw7/qp8ed9lFJHgoUJJRLLo0gW+/96u5N27N3TqBD/84HYqWLVqFdd37075cuWoVq0a5cuV4/ru3Vm9enXmMYmJMGAAtG8P1arZgu+22zQeSUSKTluYiEiuPvgABg2ye8Xdcw+MHg0VK/o+x/Tp0xk0aBDnhofTLzWVesBPwAsREWxNS+O55xIoUaI/Dz0ER47AxInQvz+E6U9BEcldgf6EUqEkInlKTraFx9NPQ0QEjBxpiyZfLdK4atUq2rZtyxBjmELWZvB0YBjwLA6wkt69WzNhAtSs6ZtsIhLQVCiJiOfs3QtPPAEzZtj1lgYMsI9q1bx73eu7d2frkiV8n5qa41iBdCDGiaB6uzg+/Wyed8OISDDxr0LJcRwnMTEx2/q/KSkppKSkZP770KFDxMTEsGvXLhVKIn7o11/toO85cyA1Fa67zo5luvhiCA/37LWSk5OpUb06T6enMyyP46YC94WF8fsffxAZGenZECISlKKjo6OBQyafQsiXhVIUkOiTi4lIUHkH6JrP5+N8lEVEgkq0MSYprwN8uYXJocTE7HXSqS1Ke/bs4cILL2TLli3UqFGjWBeMjY1l3bp1xTqHp87jL1mSkpKoVauWR1rs/OVr8rcsnnqP/elryuscxtgFK+fNgwUL4K+/oEwZ28LUogWcdx40amTHDbVqlfd5Dh6EH3+Ebdvgyy/hiy+S+fWX6vxE3pvR7QTCC9miFCjvr6/PE2r3r6/Po/fXu+cpzPub0aKU3zl9Vijl17R1qvLlyxf7F3l4eLhHuu88cR5/ygIQFRUVVF+TP2XJUNz32J++pvzO0amTfcTHw4YNsGwZfPIJvPACHDhgjwkLg7CwFbRrF0VkJJQqZaftJyXZaf3798M///z/seedB1dfHcW6tXG88O0ShuYxRumFiAi6xcVRtWpVj31NvjyPP2XJEEr3r6/PA3p/vXkeKNj7m19LUoag3hR30KBBfnMef8riKf70NflTFk/xp6+poOcID4fmze1j1CjbSvT773YPuV27YOHC36hTpyopKZCSAunp0KABREdDpUpQr579d/36/z+rbtWqEbRtu4jhkOust61pacwcPtwrX5MvzuNPWTzFn74mf8riKf70NflTFm/wu1lvu3fvzmw2q6k5vh6nWYXep/fY82bMmMHAgQMz11E6C9vdlrGOUkJCAv3793c7ZlDQ/etden+9q5Dvb4FmvfndcmylSpXK8lE8q1SpUowdO1bvrxfpPfa8/v37s3LlSmLi4rgvLIw47Cy3mLg4Vq5cqSLJg3T/epfeX+/yxvvrdy1KqrZFJC/JyckkJSURFRWlpQBEpDgK1KIU1GOURCT4REZGqkASEZ/xu643EREREX+hQklEREQkF74eo5Svk1bwzne1TBERERFv8sdCyQHKU4D9V0RERES8ye+63oyVpCKp6BzHGeg4zs+O4xx1HOcbx3EuyePY9o7jmBweDX2ZOVA4jtPWcZwljuP8ceJ9urYAr2l34vtw1HGcnY7jaC57Lgr7/ur+LTjHccY4jrPOcZxDjuPscxxnkeM45xTgdbp/C6go77Hu4YJzHGeA4zjfOY6TdOKxxnGcLvm8ptj3r98VSlI8juPciN1M/QngfGAlsNRxnNr5vPQc4IyTHju8GDOQlQU2AoMLcrDjOGcC72O/D+cD/wGecRznOq8lDGyFen9Povs3f+2AeOAi4DLsrOePHMcpm9sLdP8WWqHf45PoHs7fbmA00OLE41NgseM4jXI62FP3r991vUnxOI6zFlhvjBlw0nNbgUXGmDE5HN8e+AyoYIz5x0cxg4LjOAboZoxZlMcxE4FrjDHnnvTcDKCpMaaV91MGrgK+v+3R/VskjuOcDuwD2hljVuRyjO7fYijge9we3cNF5jjOQeB+Y8yLOXzOI/evWpSCiOM4JYHmwEenfOoj4OJ8Xv6t4zh7HMf5xHGcDl4JGJpakf378SHQwnGcEi7kCVa6fwsv+sTHg3kco/u3eAryHmfQPVwIjuOEO45zE7YVek0uh3nk/lWhFFwqA+HA3lOe3wtUy+U1e4C7gOuA7sAPwCeO47T1VsgQU42cvx8R2O+XFI/u3yI4MWlmMrDKGLMpj0N1/xZRId5j3cOF4DhOE8dxDgMpwAxsq/OWXA73yP2rlbmD06n9qU4Oz9kDjfkB+z9mhjWO49QC7gNybCqWQsvp+5HT81JIun+L7DngPKBNAY7V/Vs0BXqPdQ8X2g9AM+A0bHH5iuM47fIolop9/6pFKbjsB9LI3npUhexVdV6+BBp4KlSI+5Ocvx+pwAHfxwkJun/z4DjOs8A1QAdjzO58Dtf9WwSFfI9zons4F8aYY8aYH40xX58Yd7sRuCeXwz1y/6pQCiLGmGPAN9jZFie7DPiiEKc6H9scLMW3huzfj87A18aY4y7kCQW6f3PgWM9hu3cuNcb8XICX6f4thCK+xznRPVxwDlAql8955P5V11vwmQy85jjO19ib5C6gNrYvF8dxJgA1jDF9Tvx7GPALsBkoCfTGNmdq+m8OHMcpB9Q/6akzHcdpBhw0xvx26vuLfd8HO44zGXgBO7jwDuBmH8YOGIV9f3X/Fko80BOIAw45jpPxl3aiMSYZsv98QPdvYRX6PdY9XHCO4/wHWArswi5MfRPQHrjixOe9c/8aY/QIsgcwEPs/Xgq2hantSZ97GVh+0r9HAj8CydiZGSuBK93+Gvz1ceJ/SpPD4+Wc3t8Tz7UD1p/4fvwM9Hf76/DXR2HfX92/hXpvc3pfDXDbScfo/vXxe6x7uFDv74sn/W7bBywDLsvtvT3xXLHvX62jJCIiIpILjVESERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERyYUKJREREZFcqFASERERycX/AcX86mbC2eHsAAAAAElFTkSuQmCC\n",
1263 "text/plain": [
1264 "Graphics object consisting of 3 graphics primitives"
1265 ]
1266 },
1267 "metadata": {},
1268 "output_type": "display_data"
1269 }
1270 ],
1271 "source": [
1272 "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n",
1273 "polring.<x> = QQ[] # you need to specify a polynomial ring\n",
1274 "lp = polring.lagrange_polynomial(points)\n",
1275 "show(scatter_plot(points, facecolor=\"red\")\n",
1276 " + plot(lp, 0, 3) # slightly different notation for polynomials\n",
1277 " + text(lp, (1,8), color=\"black\")\n",
1278 " )"
1279 ]
1280 },
1281 {
1282 "cell_type": "markdown",
1283 "metadata": {},
1284 "source": [
1285 "One can compute the Lagrange Polynomial over any base ring, and it has the advantage that it is a very \"nice\" function (continuous and differentiable as much as you like, with easily computable derivatives and primitives).\n",
1286 "\n",
1287 "However, it does not always give you good approximation of your data:"
1288 ]
1289 },
1290 {
1291 "cell_type": "code",
1292 "execution_count": 2,
1293 "metadata": {},
1294 "outputs": [
1295 {
1296 "data": {
1297 "image/png": "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\n",
1298 "text/plain": [
1299 "Graphics object consisting of 2 graphics primitives"
1300 ]
1301 },
1302 "metadata": {},
1303 "output_type": "display_data"
1304 }
1305 ],
1306 "source": [
1307 "R = [x/10 for x in range(-10,10)]\n",
1308 "L = [1/(1+25*x^2) for x in R]\n",
1309 "points = [(R[i], L[i]) for i in range(len(L))]\n",
1310 "polring.<x> = RR[]\n",
1311 "lp = polring.lagrange_polynomial(points)\n",
1312 "\n",
1313 "show(plot(lp, -0.82, 0.72) + scatter_plot(points))"
1314 ]
1315 },
1316 {
1317 "cell_type": "markdown",
1318 "metadata": {},
1319 "source": [
1320 "This particular example is called [Runge's phenomenon](https://en.wikipedia.org/wiki/Runge%27s_phenomenon). For a better approximation you can use a [spline](https://en.wikipedia.org/wiki/Spline_(mathematics)), which is a *piecewise* polynomial function:"
1321 ]
1322 },
1323 {
1324 "cell_type": "code",
1325 "execution_count": 90,
1326 "metadata": {},
1327 "outputs": [
1328 {
1329 "data": {
1330 "image/png": "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\n",
1331 "text/plain": [
1332 "Graphics object consisting of 2 graphics primitives"
1333 ]
1334 },
1335 "metadata": {},
1336 "output_type": "display_data"
1337 }
1338 ],
1339 "source": [
1340 "show(plot(spline(points), -1, 1) + scatter_plot(points))"
1341 ]
1342 },
1343 {
1344 "cell_type": "markdown",
1345 "metadata": {},
1346 "source": [
1347 "A detailed explanation of splines is a good topic for a course of numerical analysis. For this course it is enough that you know that they exist and they can be plotted."
1348 ]
1349 }
1350 ],
1351 "metadata": {
1352 "kernelspec": {
1353 "display_name": "SageMath 9.2",
1354 "language": "sage",
1355 "name": "sagemath"
1356 },
1357 "language_info": {
1358 "codemirror_mode": {
1359 "name": "ipython",
1360 "version": 3
1361 },
1362 "file_extension": ".py",
1363 "mimetype": "text/x-python",
1364 "name": "python",
1365 "nbconvert_exporter": "python",
1366 "pygments_lexer": "ipython3",
1367 "version": "3.8.5"
1368 }
1369 },
1370 "nbformat": 4,
1371 "nbformat_minor": 4
1372}
diff --git a/src/Lecture6/notebook/8-SageCalculus.log b/src/Lecture6/notebook/8-SageCalculus.log
new file mode 100644
index 0000000..0614274
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.log
@@ -0,0 +1,1106 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.4.20) 7 MAY 2021 18:13
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**8-SageCalculus.tex
6(./8-SageCalculus.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size11.clo
12File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty
27Package: tcolorbox 2020/10/09 version 4.42 text color boxes
28
29(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
30(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
31(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
32\pgfutil@everybye=\toks15
33\pgfutil@tempdima=\dimen139
34\pgfutil@tempdimb=\dimen140
35
36(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
37(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
38\pgfutil@abb=\box47
39)
40(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
41(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
42Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
43))
44Package: pgf 2020/12/01 v3.1.7a (3.1.7a)
45
46(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
47(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
48Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
49
50(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
51Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
52\KV@toks@=\toks16
53)
54(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
55Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
56
57(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
58Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
59)
60(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
61File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
62)
63Package graphics Info: Driver file: pdftex.def on input line 105.
64
65(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
66File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
67))
68\Gin@req@height=\dimen141
69\Gin@req@width=\dimen142
70)
71(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
72(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
73Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
74
75(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
76\pgfkeys@pathtoks=\toks17
77\pgfkeys@temptoks=\toks18
78
79(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
80\pgfkeys@tmptoks=\toks19
81))
82\pgf@x=\dimen143
83\pgf@y=\dimen144
84\pgf@xa=\dimen145
85\pgf@ya=\dimen146
86\pgf@xb=\dimen147
87\pgf@yb=\dimen148
88\pgf@xc=\dimen149
89\pgf@yc=\dimen150
90\pgf@xd=\dimen151
91\pgf@yd=\dimen152
92\w@pgf@writea=\write3
93\r@pgf@reada=\read2
94\c@pgf@counta=\count185
95\c@pgf@countb=\count186
96\c@pgf@countc=\count187
97\c@pgf@countd=\count188
98\t@pgf@toka=\toks20
99\t@pgf@tokb=\toks21
100\t@pgf@tokc=\toks22
101\pgf@sys@id@count=\count189
102
103(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
104File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
105)
106Driver file for pgf: pgfsys-pdftex.def
107
108(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
109File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
110
111(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
112File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
113)))
114(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
115File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
116\pgfsyssoftpath@smallbuffer@items=\count190
117\pgfsyssoftpath@bigbuffer@items=\count191
118)
119(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
120File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
121))
122(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
123Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
124
125(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
126File: color.cfg 2016/01/02 v1.6 sample color configuration
127)
128Package xcolor Info: Driver file: pdftex.def on input line 225.
129Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
130Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
131Package xcolor Info: Model `RGB' extended on input line 1364.
132Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
133Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
134Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
135Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
136Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
137Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
138)
139(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
140Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
141
142(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
143(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
144(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
145(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
146\pgfmath@dimen=\dimen153
147\pgfmath@count=\count192
148\pgfmath@box=\box48
149\pgfmath@toks=\toks23
150\pgfmath@stack@operand=\toks24
151\pgfmath@stack@operation=\toks25
152)
153(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
154(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
155(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
156.tex)
157(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
158(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
159x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
160(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
161(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
162(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
163.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
164\c@pgfmathroundto@lastzeros=\count193
165)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
166(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
167File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
168\pgf@picminx=\dimen154
169\pgf@picmaxx=\dimen155
170\pgf@picminy=\dimen156
171\pgf@picmaxy=\dimen157
172\pgf@pathminx=\dimen158
173\pgf@pathmaxx=\dimen159
174\pgf@pathminy=\dimen160
175\pgf@pathmaxy=\dimen161
176\pgf@xx=\dimen162
177\pgf@xy=\dimen163
178\pgf@yx=\dimen164
179\pgf@yy=\dimen165
180\pgf@zx=\dimen166
181\pgf@zy=\dimen167
182)
183(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
184File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
185\pgf@path@lastx=\dimen168
186\pgf@path@lasty=\dimen169
187) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
188File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
189\pgf@shorten@end@additional=\dimen170
190\pgf@shorten@start@additional=\dimen171
191)
192(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
193File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
194\pgfpic=\box49
195\pgf@hbox=\box50
196\pgf@layerbox@main=\box51
197\pgf@picture@serial@count=\count194
198)
199(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
200File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
201\pgflinewidth=\dimen172
202)
203(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
204ex
205File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
206\pgf@pt@x=\dimen173
207\pgf@pt@y=\dimen174
208\pgf@pt@temp=\dimen175
209) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
210File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
211)
212(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
213File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
214)
215(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
216x
217File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
218) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
219File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
220\pgfarrowsep=\dimen176
221)
222(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
223File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
224\pgf@max=\dimen177
225\pgf@sys@shading@range@num=\count195
226\pgf@shadingcount=\count196
227)
228(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
229File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
230
231(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
232File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
233\pgfexternal@startupbox=\box52
234))
235(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
236File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
237)
238(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
239File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
240) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
241File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
242)
243(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
244File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
245)))
246(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
247File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
248\pgfnodeparttextbox=\box53
249)
250(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
251File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a)
252)
253(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
254Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a)
255\pgf@nodesepstart=\dimen178
256\pgf@nodesepend=\dimen179
257)
258(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
259Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a)
260))
261(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty
262Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements
263\every@verbatim=\toks26
264\verbatim@line=\toks27
265\verbatim@in@stream=\read3
266)
267(/usr/share/texmf-dist/tex/latex/environ/environ.sty
268Package: environ 2014/05/04 v0.3 A new way to define environments
269
270(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty
271Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
272)
273\@envbody=\toks28
274)
275(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
276Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
277\etb@tempcnta=\count197
278)
279\tcb@titlebox=\box54
280\tcb@upperbox=\box55
281\tcb@lowerbox=\box56
282\tcb@phantombox=\box57
283\c@tcbbreakpart=\count198
284\c@tcblayer=\count199
285\c@tcolorbox@number=\count266
286\tcb@temp=\box58
287\tcb@temp=\box59
288\tcb@temp=\box60
289\tcb@temp=\box61
290\tcb@out=\write4
291\tcb@record@out=\write5
292
293(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex
294Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42'
295(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty
296Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO)
297
298(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
299Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO)
300)
301(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
302Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
303)
304(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
305Package: iftex 2020/03/06 v1.0d TeX engine tests
306))
307Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23.
308\tcb@testbox=\box62
309\tcb@totalupperbox=\box63
310\tcb@totallowerbox=\box64
311))
312(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty
313Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments
314
315(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
316Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)
317
318(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
319Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
320)))
321(/usr/share/texmf-dist/tex/latex/base/fontenc.sty
322Package: fontenc 2020/08/10 v2.0s Standard LaTeX package
323)
324(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
325Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS)
326\symupright=\mathgroup4
327)
328(/usr/share/texmf-dist/tex/latex/caption/caption.sty
329Package: caption 2020/10/26 v3.5g Customizing captions (AR)
330
331(/usr/share/texmf-dist/tex/latex/caption/caption3.sty
332Package: caption3 2020/10/21 v2.2e caption3 kernel (AR)
333\captionmargin=\dimen180
334\captionmargin@=\dimen181
335\captionwidth=\dimen182
336\caption@tempdima=\dimen183
337\caption@indent=\dimen184
338\caption@parindent=\dimen185
339\caption@hangindent=\dimen186
340Package caption Info: Standard document class detected.
341)
342\c@caption@flags=\count267
343\c@continuedfloat=\count268
344)
345(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty
346Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...)
347
348(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty
349Package: xkeyval 2020/11/20 v2.8 package option processing (HA)
350
351(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex
352(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex
353\XKV@toks=\toks29
354\XKV@tempa@toks=\toks30
355)
356\XKV@depth=\count269
357File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
358))
359(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty
360Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back
361-ends (calc, etex, pgfmath)
362)
363(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty
364Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material
365
366(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty
367Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes
368\collectedbox=\box65
369)
370\tc@llx=\dimen187
371\tc@lly=\dimen188
372\tc@urx=\dimen189
373\tc@ury=\dimen190
374Package trimclip Info: Using driver 'tc-pdftex.def'.
375
376(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def
377File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex
378))
379\adjbox@Width=\dimen191
380\adjbox@Height=\dimen192
381\adjbox@Depth=\dimen193
382\adjbox@Totalheight=\dimen194
383\adjbox@pwidth=\dimen195
384\adjbox@pheight=\dimen196
385\adjbox@pdepth=\dimen197
386\adjbox@ptotalheight=\dimen198
387
388(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty
389Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection
390\c@checkoddpage=\count270
391)
392(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty
393Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages
394\@vwid@box=\box66
395\sift@deathcycles=\count271
396\@vwid@loff=\dimen199
397\@vwid@roff=\dimen256
398))
399(/usr/share/texmf-dist/tex/latex/float/float.sty
400Package: float 2001/11/08 v1.3d Float enhancements (AL)
401\c@float@type=\count272
402\float@exts=\toks31
403\float@box=\box67
404\@float@everytoks=\toks32
405\@floatcapt=\box68
406)
407(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty
408Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
409\@enLab=\toks33
410)
411(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
412Package: geometry 2020/01/02 v5.9 Page Geometry
413
414(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
415Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
416)
417\Gm@cnth=\count273
418\Gm@cntv=\count274
419\c@Gm@tempcnt=\count275
420\Gm@bindingoffset=\dimen257
421\Gm@wd@mp=\dimen258
422\Gm@odd@mp=\dimen259
423\Gm@even@mp=\dimen260
424\Gm@layoutwidth=\dimen261
425\Gm@layoutheight=\dimen262
426\Gm@layouthoffset=\dimen263
427\Gm@layoutvoffset=\dimen264
428\Gm@dimlist=\toks34
429)
430(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
431Package: amsmath 2020/09/23 v2.17i AMS math features
432\@mathmargin=\skip49
433
434For additional information on amsmath, use the `?' option.
435(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
436Package: amstext 2000/06/29 v2.01 AMS text
437
438(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
439File: amsgen.sty 1999/11/30 v2.0 generic functions
440\@emptytoks=\toks35
441\ex@=\dimen265
442))
443(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
444Package: amsbsy 1999/11/29 v1.2d Bold Symbols
445\pmbraise@=\dimen266
446)
447(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
448Package: amsopn 2016/03/08 v2.02 operator names
449)
450\inf@bad=\count276
451LaTeX Info: Redefining \frac on input line 234.
452\uproot@=\count277
453\leftroot@=\count278
454LaTeX Info: Redefining \overline on input line 399.
455\classnum@=\count279
456\DOTSCASE@=\count280
457LaTeX Info: Redefining \ldots on input line 496.
458LaTeX Info: Redefining \dots on input line 499.
459LaTeX Info: Redefining \cdots on input line 620.
460\Mathstrutbox@=\box69
461\strutbox@=\box70
462\big@size=\dimen267
463LaTeX Font Info: Redeclaring font encoding OML on input line 743.
464LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
465\macc@depth=\count281
466\c@MaxMatrixCols=\count282
467\dotsspace@=\muskip16
468\c@parentequation=\count283
469\dspbrk@lvl=\count284
470\tag@help=\toks36
471\row@=\count285
472\column@=\count286
473\maxfields@=\count287
474\andhelp@=\toks37
475\eqnshift@=\dimen268
476\alignsep@=\dimen269
477\tagshift@=\dimen270
478\tagwidth@=\dimen271
479\totwidth@=\dimen272
480\lineht@=\dimen273
481\@envbody=\toks38
482\multlinegap=\skip50
483\multlinetaggap=\skip51
484\mathdisplay@stack=\toks39
485LaTeX Info: Redefining \[ on input line 2923.
486LaTeX Info: Redefining \] on input line 2924.
487)
488(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
489Package: amssymb 2013/01/14 v3.01 AMS font symbols
490
491(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
492Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
493\symAMSa=\mathgroup5
494\symAMSb=\mathgroup6
495LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
496LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
497(Font) U/euf/m/n --> U/euf/b/n on input line 106.
498))
499(/usr/share/texmf-dist/tex/latex/base/textcomp.sty
500Package: textcomp 2020/02/02 v2.0n Standard LaTeX package
501)
502(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty
503Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba
504tim
505)
506(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty
507Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro''
508\@eurobox=\box71
509)
510(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty
511Package: ucs 2013/05/11 v2.2 UCS: Unicode input support
512
513(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def
514File: uni-global.def 2013/05/13 UCS: Unicode global data
515)
516\uc@secondtry=\count288
517\uc@combtoks=\toks40
518\uc@combtoksb=\toks41
519\uc@temptokena=\toks42
520)
521(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
522Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv)
523\FV@CodeLineNo=\count289
524\FV@InFile=\read4
525\FV@TabBox=\box72
526\c@FancyVerbLine=\count290
527\FV@StepNumber=\count291
528\FV@OutFile=\write6
529)
530(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty
531Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac
532y)
533Package grffile Info: This package is an empty stub for compatibility on input
534line 40.
535)
536(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
537Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX
538
539(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
540Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO
541)
542Package pdftexcmds Info: \pdf@primitive is available.
543Package pdftexcmds Info: \pdf@ifprimitive is available.
544Package pdftexcmds Info: \pdfdraftmode found.
545)
546(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
547Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
548)
549(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
550Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
551)
552(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
553Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
554)
555(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
556Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
557)
558(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
559Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
560)
561\@linkdim=\dimen274
562\Hy@linkcounter=\count292
563\Hy@pagecounter=\count293
564
565(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
566File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO)
567Now handling font encoding PD1 ...
568... no UTF-8 mapping file for font encoding PD1
569)
570(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
571Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
572)
573(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty
574Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
575)
576\Hy@SavedSpaceFactor=\count294
577Package hyperref Info: Hyper figures OFF on input line 4464.
578Package hyperref Info: Link nesting OFF on input line 4469.
579Package hyperref Info: Hyper index ON on input line 4472.
580Package hyperref Info: Plain pages OFF on input line 4479.
581Package hyperref Info: Backreferencing OFF on input line 4484.
582Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
583Package hyperref Info: Bookmarks ON on input line 4717.
584\c@Hy@tempcnt=\count295
585
586(/usr/share/texmf-dist/tex/latex/url/url.sty
587\Urlmuskip=\muskip17
588Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
589)
590LaTeX Info: Redefining \url on input line 5076.
591\XeTeXLinkMargin=\dimen275
592
593(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty
594Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
595
596(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
597Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
598)
599))
600\Fld@menulength=\count296
601\Field@Width=\dimen276
602\Fld@charsize=\dimen277
603Package hyperref Info: Hyper figures OFF on input line 6347.
604Package hyperref Info: Link nesting OFF on input line 6352.
605Package hyperref Info: Hyper index ON on input line 6355.
606Package hyperref Info: backreferencing OFF on input line 6362.
607Package hyperref Info: Link coloring OFF on input line 6367.
608Package hyperref Info: Link coloring with OCG OFF on input line 6372.
609Package hyperref Info: PDF/A mode OFF on input line 6377.
610LaTeX Info: Redefining \ref on input line 6417.
611LaTeX Info: Redefining \pageref on input line 6421.
612
613(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty
614Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa
615ge
616with kernel methods
617)
618\Hy@abspage=\count297
619\c@Item=\count298
620\c@Hfootnote=\count299
621)
622Package hyperref Info: Driver (autodetected): hpdftex.
623
624(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
625File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX
626
627(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty
628Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag
629e
630with kernel methods
631)
632\Fld@listcount=\count300
633\c@bookmark@seq@number=\count301
634
635(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
636Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
637
638(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
639Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
640)
641Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
64286.
643)
644\Hy@SectionHShift=\skip52
645)
646(/usr/share/texmf-dist/tex/latex/titling/titling.sty
647Package: titling 2009/09/04 v2.1d maketitle typesetting
648\thanksmarkwidth=\skip53
649\thanksmargin=\skip54
650\droptitle=\skip55
651)
652(/usr/share/texmf-dist/tex/latex/tools/longtable.sty
653Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC)
654\LTleft=\skip56
655\LTright=\skip57
656\LTpre=\skip58
657\LTpost=\skip59
658\LTchunksize=\count302
659\LTcapwidth=\dimen278
660\LT@head=\box73
661\LT@firsthead=\box74
662\LT@foot=\box75
663\LT@lastfoot=\box76
664\LT@cols=\count303
665\LT@rows=\count304
666\c@LT@tables=\count305
667\c@LT@chunks=\count306
668\LT@p@ftn=\toks43
669)
670(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty
671Package: booktabs 2020/01/12 v1.61803398 Publication quality tables
672\heavyrulewidth=\dimen279
673\lightrulewidth=\dimen280
674\cmidrulewidth=\dimen281
675\belowrulesep=\dimen282
676\belowbottomsep=\dimen283
677\aboverulesep=\dimen284
678\abovetopsep=\dimen285
679\cmidrulesep=\dimen286
680\cmidrulekern=\dimen287
681\defaultaddspace=\dimen288
682\@cmidla=\count307
683\@cmidlb=\count308
684\@aboverulesep=\dimen289
685\@belowrulesep=\dimen290
686\@thisruleclass=\count309
687\@lastruleclass=\count310
688\@thisrulewidth=\dimen291
689)
690(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty
691Package: enumitem 2019/06/20 v3.9 Customized lists
692\labelindent=\skip60
693\enit@outerparindent=\dimen292
694\enit@toks=\toks44
695\enit@inbox=\box77
696\enit@count@id=\count311
697\enitdp@description=\count312
698)
699(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty
700\UL@box=\box78
701\UL@hyphenbox=\box79
702\UL@skip=\skip61
703\UL@hook=\toks45
704\UL@height=\dimen293
705\UL@pe=\count313
706\UL@pixel=\dimen294
707\ULC@box=\box80
708Package: ulem 2019/11/18
709\ULdepth=\dimen295
710)
711(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty
712Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk)
713\symrsfs=\mathgroup7
714)
715\Wrappedcontinuationbox=\box81
716\Wrappedvisiblespacebox=\box82
717Package hyperref Info: Option `breaklinks' set `true' on input line 361.
718Package hyperref Info: Option `colorlinks' set `true' on input line 361.
719LaTeX Font Info: Trying to load font information for T1+ppl on input line 36
7208.
721
722(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
723File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
724)
725(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
726File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
727\l__kernel_color_stack_int=\count314
728\l__pdf_internal_box=\box83
729)
730(./8-SageCalculus.aux)
731\openout1 = `8-SageCalculus.aux'.
732
733LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 368.
734LaTeX Font Info: ... okay on input line 368.
735LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 368.
736LaTeX Font Info: ... okay on input line 368.
737LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 368.
738LaTeX Font Info: ... okay on input line 368.
739LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 368.
740LaTeX Font Info: ... okay on input line 368.
741LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 368.
742LaTeX Font Info: ... okay on input line 368.
743LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 368.
744LaTeX Font Info: ... okay on input line 368.
745LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 368.
746LaTeX Font Info: ... okay on input line 368.
747LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 368.
748LaTeX Font Info: ... okay on input line 368.
749
750(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
751[Loading MPS to PDF converter (version 2006.09.02).]
752\scratchcounter=\count315
753\scratchdimen=\dimen296
754\scratchbox=\box84
755\nofMPsegments=\count316
756\nofMParguments=\count317
757\everyMPshowfont=\toks46
758\MPscratchCnt=\count318
759\MPscratchDim=\dimen297
760\MPnumerator=\count319
761\makeMPintoPDFobject=\count320
762\everyMPtoPDFconversion=\toks47
763) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
764Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
765Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
76685.
767
768(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
769File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
770e
771))
772Package caption Info: Begin \AtBeginDocument code.
773Package caption Info: float package is loaded.
774Package caption Info: hyperref package is loaded.
775Package caption Info: longtable package is loaded.
776
777(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty
778Package: ltcaption 2020/05/30 v1.4b longtable captions (AR)
779)
780Package caption Info: End \AtBeginDocument code.
781
782*geometry* driver: auto-detecting
783*geometry* detected driver: pdftex
784*geometry* verbose mode - [ preamble ] result:
785* driver: pdftex
786* paper: <default>
787* layout: <same size as paper>
788* layoutoffset:(h,v)=(0.0pt,0.0pt)
789* modes:
790* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)
791* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)
792* \paperwidth=614.295pt
793* \paperheight=794.96999pt
794* \textwidth=469.75502pt
795* \textheight=650.43001pt
796* \oddsidemargin=0.0pt
797* \evensidemargin=0.0pt
798* \topmargin=-37.0pt
799* \headheight=12.0pt
800* \headsep=25.0pt
801* \topskip=11.0pt
802* \footskip=30.0pt
803* \marginparwidth=59.0pt
804* \marginparsep=10.0pt
805* \columnsep=10.0pt
806* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
807* \hoffset=0.0pt
808* \voffset=0.0pt
809* \mag=1000
810* \@twocolumnfalse
811* \@twosidefalse
812* \@mparswitchfalse
813* \@reversemarginfalse
814* (1in=72.27pt=25.4mm, 1cm=28.453pt)
815
816(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def
817File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3
818)
819Package hyperref Info: Link coloring ON on input line 368.
820
821(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
822Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
823
824(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty
825Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
826)
827(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
828Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
829)
830\c@section@level=\count321
831)
832LaTeX Info: Redefining \ref on input line 368.
833LaTeX Info: Redefining \pageref on input line 368.
834LaTeX Info: Redefining \nameref on input line 368.
835
836(./8-SageCalculus.out) (./8-SageCalculus.out)
837\@outlinefile=\write7
838\openout7 = `8-SageCalculus.out'.
839
840LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3
84170.
842
843(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
844File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
845)
846LaTeX Font Info: Trying to load font information for OML+zplm on input line
847370.
848
849(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
850File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
851)
852LaTeX Font Info: Trying to load font information for OMS+zplm on input line
853370.
854
855(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd
856File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
857)
858LaTeX Font Info: Trying to load font information for OMX+zplm on input line
859370.
860
861(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
862File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
863)
864LaTeX Font Info: Trying to load font information for OT1+zplm on input line
865370.
866
867(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
868File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
869)
870LaTeX Font Info: Font shape `U/msa/m/n' will be
871(Font) scaled to size 12.50409pt on input line 370.
872LaTeX Font Info: Font shape `U/msa/m/n' will be
873(Font) scaled to size 9.37807pt on input line 370.
874LaTeX Font Info: Font shape `U/msa/m/n' will be
875(Font) scaled to size 7.29405pt on input line 370.
876LaTeX Font Info: Font shape `U/msb/m/n' will be
877(Font) scaled to size 12.50409pt on input line 370.
878LaTeX Font Info: Font shape `U/msb/m/n' will be
879(Font) scaled to size 9.37807pt on input line 370.
880LaTeX Font Info: Font shape `U/msb/m/n' will be
881(Font) scaled to size 7.29405pt on input line 370.
882LaTeX Font Info: Trying to load font information for U+rsfs on input line 37
8830.
884
885(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd
886File: ursfs.fd 1998/03/24 rsfs font definition file (jk)
887)
888LaTeX Font Info: Trying to load font information for T1+cmtt on input line 3
88970.
890
891(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd
892File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
893)
894LaTeX Font Info: Font shape `U/msa/m/n' will be
895(Font) scaled to size 6.25204pt on input line 391.
896LaTeX Font Info: Font shape `U/msa/m/n' will be
897(Font) scaled to size 5.21004pt on input line 391.
898LaTeX Font Info: Font shape `U/msb/m/n' will be
899(Font) scaled to size 6.25204pt on input line 391.
900LaTeX Font Info: Font shape `U/msb/m/n' will be
901(Font) scaled to size 5.21004pt on input line 391.
902LaTeX Font Info: Trying to load font information for TS1+cmtt on input line
903392.
904
905(/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd
906File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
907)
908LaTeX Font Info: Font shape `U/msa/m/n' will be
909(Font) scaled to size 11.40997pt on input line 432.
910LaTeX Font Info: Font shape `U/msa/m/n' will be
911(Font) scaled to size 8.33606pt on input line 432.
912LaTeX Font Info: Font shape `U/msb/m/n' will be
913(Font) scaled to size 11.40997pt on input line 432.
914LaTeX Font Info: Font shape `U/msb/m/n' will be
915(Font) scaled to size 8.33606pt on input line 432.
916 [1
917
918{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
919LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available
920(Font) Font shape `T1/cmtt/m/n' tried instead on input line 511.
921 [2]
922Underfull \hbox (badness 10000) in paragraph at lines 541--545
923[]\T1/ppl/m/n/10.95 When solv-ing a sys-tem of equa-tions (not in-equal-i-ties)
924, you can use the op-tion
925 []
926
927[3] [4] [5] [6] [7] [8] [9] [10]
928<output_75_0.png, id=190, 423.5022pt x 281.853pt>
929File: output_75_0.png Graphic file (type png)
930<use output_75_0.png>
931Package pdftex.def Info: output_75_0.png used on input line 1282.
932(pdftex.def) Requested size: 423.50114pt x 281.85231pt.
933 [11]
934Underfull \hbox (badness 10000) in paragraph at lines 1284--1285
935
936 []
937
938
939Underfull \hbox (badness 10000) in paragraph at lines 1290--1293
940[]\T1/cmtt/m/n/10.95 You can give a number of options to adjust the aspect of y
941our plot, see [][]here[][].
942 []
943
944<output_77_0.png, id=199, 426.393pt x 281.1303pt>
945File: output_77_0.png Graphic file (type png)
946<use output_77_0.png>
947Package pdftex.def Info: output_77_0.png used on input line 1311.
948(pdftex.def) Requested size: 426.39195pt x 281.12961pt.
949[12 <./output_75_0.png>]
950Underfull \hbox (badness 10000) in paragraph at lines 1313--1314
951
952 []
953
954
955Underfull \hbox (badness 10000) in paragraph at lines 1316--1321
956[]\T1/cmtt/m/n/10.95 Some of the options are not described precisely in Sage's
957documentation, but you
958 []
959
960
961Underfull \hbox (badness 10000) in paragraph at lines 1316--1321
962\T1/cmtt/m/n/10.95 can find them on [][]matplotlib's documentation[][]. You can
963 find many examples online for
964 []
965
966
967Underfull \hbox (badness 10000) in paragraph at lines 1322--1324
968[]\T1/cmtt/m/n/10.95 If you need to plot more than one object at the time, you
969can sum two plots and
970 []
971
972<output_80_0.png, id=206, 424.9476pt x 281.1303pt>
973File: output_80_0.png Graphic file (type png)
974<use output_80_0.png>
975Package pdftex.def Info: output_80_0.png used on input line 1336.
976(pdftex.def) Requested size: 424.94655pt x 281.12961pt.
977[13 <./output_77_0.png>]
978Underfull \hbox (badness 10000) in paragraph at lines 1338--1339
979
980 []
981
982
983Underfull \hbox (badness 10000) in paragraph at lines 1340--1347
984[]\T1/cmtt/m/n/10.95 Finally, there are other types of plots that you can use,
985like [][]scatter plots[][] and
986 []
987
988<output_82_0.png, id=216, 421.3341pt x 281.853pt>
989File: output_82_0.png Graphic file (type png)
990<use output_82_0.png>
991Package pdftex.def Info: output_82_0.png used on input line 1364.
992(pdftex.def) Requested size: 421.33307pt x 281.85231pt.
993[14 <./output_80_0.png>]
994Underfull \hbox (badness 10000) in paragraph at lines 1366--1367
995
996 []
997
998
999Underfull \hbox (badness 10000) in paragraph at lines 1376--1380
1000[]\T1/cmtt/m/n/10.95 When you need to work with a discrete set of data, like me
1001asurements of real-world
1002 []
1003
1004
1005Underfull \hbox (badness 10000) in paragraph at lines 1376--1380
1006\T1/cmtt/m/n/10.95 quantities, it can be useful to visualize a ``smoothed out''
1007 version of this data,
1008 []
1009
1010
1011Underfull \hbox (badness 10000) in paragraph at lines 1381--1385
1012[]\T1/cmtt/m/n/10.95 One way to do so is finding the lowest-degree polynomial t
1013hat passes through all
1014 []
1015
1016<output_84_0.png, id=225, 423.5022pt x 280.4076pt>
1017File: output_84_0.png Graphic file (type png)
1018<use output_84_0.png>
1019Package pdftex.def Info: output_84_0.png used on input line 1400.
1020(pdftex.def) Requested size: 423.50114pt x 280.4069pt.
1021[15 <./output_82_0.png>]
1022Underfull \hbox (badness 10000) in paragraph at lines 1402--1403
1023
1024 []
1025
1026
1027Underfull \hbox (badness 10000) in paragraph at lines 1404--1408
1028[]\T1/cmtt/m/n/10.95 One can compute the Lagrange Polynomial over any base ring
1029, and it has the
1030 []
1031
1032
1033Underfull \hbox (badness 10000) in paragraph at lines 1404--1408
1034\T1/cmtt/m/n/10.95 advantage that it is a very ``nice'' function (continuous an
1035d differentiable as much
1036 []
1037
1038<output_86_0.png, id=232, 424.9476pt x 281.853pt>
1039File: output_86_0.png Graphic file (type png)
1040<use output_86_0.png>
1041Package pdftex.def Info: output_86_0.png used on input line 1425.
1042(pdftex.def) Requested size: 424.94655pt x 281.85231pt.
1043[16 <./output_84_0.png>]
1044Underfull \hbox (badness 10000) in paragraph at lines 1427--1428
1045
1046 []
1047
1048
1049Underfull \hbox (badness 10000) in paragraph at lines 1429--1434
1050[]\T1/cmtt/m/n/10.95 This particular example is called [][]Runge's phenomenon[]
1051[]. For a better approximation
1052 []
1053
1054<output_88_0.png, id=240, 424.9476pt x 281.853pt>
1055File: output_88_0.png Graphic file (type png)
1056<use output_88_0.png>
1057Package pdftex.def Info: output_88_0.png used on input line 1443.
1058(pdftex.def) Requested size: 424.94655pt x 281.85231pt.
1059[17 <./output_86_0.png>]
1060Underfull \hbox (badness 10000) in paragraph at lines 1445--1446
1061
1062 []
1063
1064
1065Underfull \hbox (badness 10000) in paragraph at lines 1447--1450
1066[]\T1/cmtt/m/n/10.95 A detailed explanation of splines is a good topic for a co
1067urse of numerical
1068 []
1069
1070
1071Underfull \hbox (badness 10000) in paragraph at lines 1447--1450
1072\T1/cmtt/m/n/10.95 analysis. For this course it is enough that you know that th
1073ey exist and they
1074 []
1075
1076[18 <./output_88_0.png>] (./8-SageCalculus.aux)
1077Package rerunfilecheck Info: File `8-SageCalculus.out' has not changed.
1078(rerunfilecheck) Checksum: 07C494ECBA08A2F1E2EF17E2726357A6;1338.
1079 )
1080Here is how much of TeX's memory you used:
1081 21395 strings out of 479383
1082 389927 string characters out of 5875798
1083 723366 words of memory out of 5000000
1084 37972 multiletter control sequences out of 15000+600000
1085 442051 words of font info for 125 fonts, out of 8000000 for 9000
1086 1141 hyphenation exceptions out of 8191
1087 107i,19n,111p,507b,620s stack positions out of 5000i,500n,10000p,200000b,80000s
1088{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/
1089texmf-dist/fonts/enc/dvips/base/8r.enc}{/usr/share/texmf-dist/fonts/enc/dvips/c
1090m-super/cm-super-t1.enc}</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c
1091mex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></us
1092r/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-d
1093ist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type
10941/public/mathpazo/fplmr.pfb></usr/share/texmf-dist/fonts/type1/public/mathpazo/
1095fplmri.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sfit1095.pfb></us
1096r/share/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb></usr/share/texmf-d
1097ist/fonts/type1/public/cm-super/sftt1200.pfb></usr/share/texmf-dist/fonts/type1
1098/urw/palatino/uplb8a.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplr8a
1099.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplri8a.pfb>
1100Output written on 8-SageCalculus.pdf (18 pages, 323733 bytes).
1101PDF statistics:
1102 311 PDF objects out of 1000 (max. 8388607)
1103 262 compressed objects within 3 object streams
1104 59 named destinations out of 1000 (max. 500000)
1105 200 words of extra memory for PDF output out of 10000 (max. 10000000)
1106
diff --git a/src/Lecture6/notebook/8-SageCalculus.out b/src/Lecture6/notebook/8-SageCalculus.out
new file mode 100644
index 0000000..8608c4d
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.out
@@ -0,0 +1,19 @@
1\BOOKMARK [1][-]{section.1}{Symbolic expressions}{}% 1
2\BOOKMARK [2][-]{subsection.1.1}{Solving equations and inequalities}{section.1}% 2
3\BOOKMARK [3][-]{subsubsection.1.1.1}{The set of solutions}{subsection.1.1}% 3
4\BOOKMARK [3][-]{subsubsection.1.1.2}{Alternative method for real roots: find\137root\(\)}{subsection.1.1}% 4
5\BOOKMARK [2][-]{subsection.1.2}{Evaluating functions}{section.1}% 5
6\BOOKMARK [2][-]{subsection.1.3}{Symbolic computations}{section.1}% 6
7\BOOKMARK [3][-]{subsubsection.1.3.1}{The Symbolic Ring}{subsection.1.3}% 7
8\BOOKMARK [1][-]{section.2}{Calculus}{}% 8
9\BOOKMARK [2][-]{subsection.2.1}{Limits and series}{section.2}% 9
10\BOOKMARK [2][-]{subsection.2.2}{Derivatives}{section.2}% 10
11\BOOKMARK [2][-]{subsection.2.3}{Integrals}{section.2}% 11
12\BOOKMARK [3][-]{subsubsection.2.3.1}{Symbolic integration}{subsection.2.3}% 12
13\BOOKMARK [3][-]{subsubsection.2.3.2}{Numerical integration}{subsection.2.3}% 13
14\BOOKMARK [2][-]{subsection.2.4}{Differential equations}{section.2}% 14
15\BOOKMARK [3][-]{subsubsection.2.4.1}{A real-world example}{subsection.2.4}% 15
16\BOOKMARK [1][-]{section.3}{Basic data analysis and visualization}{}% 16
17\BOOKMARK [2][-]{subsection.3.1}{Statistics}{section.3}% 17
18\BOOKMARK [2][-]{subsection.3.2}{Plotting}{section.3}% 18
19\BOOKMARK [2][-]{subsection.3.3}{Interpolation}{section.3}% 19
diff --git a/src/Lecture6/notebook/8-SageCalculus.pdf b/src/Lecture6/notebook/8-SageCalculus.pdf
new file mode 100644
index 0000000..5b533b6
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.pdf
Binary files differ
diff --git a/src/Lecture6/notebook/8-SageCalculus.tex b/src/Lecture6/notebook/8-SageCalculus.tex
new file mode 100644
index 0000000..c1defa2
--- /dev/null
+++ b/src/Lecture6/notebook/8-SageCalculus.tex
@@ -0,0 +1,1456 @@
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{Calculus and more with SageMath}
150 \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}}
151 \date{2021-05-07}
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 \hypertarget{symbolic-expressions}{%
376\section{Symbolic expressions}\label{symbolic-expressions}}
377
378\textbf{Reference:}
379{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]}
380
381Last time we saw the basics of symbolic expressions: * How to define and
382manipulate symbolic expressions * How to introduce new variables (in the
383Mathematical sense) with \texttt{var()} * How to solve equations and
384inequalities * Some of the Mathematical constants that are included in
385Sage, and how to approximate them using \texttt{n()}
386
387Here are some examples to remind you of these basic things:
388
389 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
390\prompt{In}{incolor}{2}{\boxspacing}
391\begin{Verbatim}[commandchars=\\\{\}]
392\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{z}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} \PY{c+c1}{\PYZsh{} Define new variables (x is already defined by Sage)}
393\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{pi}
394\PY{n}{g} \PY{o}{=} \PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{y} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2} \PY{o}{\PYZgt{}} \PY{l+m+mi}{0}
395\PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{f}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x}\PY{p}{)} \PY{p}{)}
396\PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{z}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{n}{f}\PY{p}{,} \PY{n}{z}\PY{p}{)} \PY{p}{)}
397\PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{g}\PY{p}{,} \PY{n}{y}\PY{p}{)} \PY{p}{)}
398\PY{n+nb}{print}\PY{p}{(} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi} \PY{o}{+} \PY{n}{e}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{is approximately}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{n}\PY{p}{(}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi} \PY{o}{+} \PY{n}{e}\PY{p}{)} \PY{p}{)}
399\end{Verbatim}
400\end{tcolorbox}
401
402 \begin{Verbatim}[commandchars=\\\{\}]
403[
404x == -sqrt(-pi),
405x == sqrt(-pi)
406]
407[
408z == -sqrt(pi + x\^{}2),
409z == sqrt(pi + x\^{}2)
410]
411[[y < -2], [y > 1]]
4122*pi + e is approximately 9.00146713563863
413 \end{Verbatim}
414
415 Now we will see some more details about solving equations and
416manipulating their solutions.
417
418 \hypertarget{solving-equations-and-inequalities}{%
419\subsection{Solving equations and
420inequalities}\label{solving-equations-and-inequalities}}
421
422\textbf{Reference}
423{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]}
424for the details of \texttt{solve()} and \texttt{find\_root()},
425{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html\#solving}{2}{]}
426for examples.
427
428Other than equations and inequalities, we can also solve systems: it is
429enough to give Sage a list of expressions and a list of variables with
430respect to which we want to solve. For example the system
431
432\begin{align*}
433 \begin{cases}
434 x + y = 2 \\
435 2x - y = 6
436 \end{cases}
437\end{align*}
438
439Can be solved as
440
441 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
442\prompt{In}{incolor}{40}{\boxspacing}
443\begin{Verbatim}[commandchars=\\\{\}]
444\PY{n}{solve}\PY{p}{(}\PY{p}{[}\PY{n}{x}\PY{o}{+}\PY{n}{y} \PY{o}{==} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x} \PY{o}{\PYZhy{}} \PY{n}{y} \PY{o}{==} \PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{]}\PY{p}{)}
445\end{Verbatim}
446\end{tcolorbox}
447
448 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
449\prompt{Out}{outcolor}{40}{\boxspacing}
450\begin{Verbatim}[commandchars=\\\{\}]
451[[x == (8/3), y == (-2/3)]]
452\end{Verbatim}
453\end{tcolorbox}
454
455 \textbf{Exercise.} Find the intersection of the circle of radius \(2\)
456centered in the origin and the parabula of equation \(y=x^2-2x^2+1\).
457
458 \hypertarget{the-set-of-solutions}{%
459\subsubsection{The set of solutions}\label{the-set-of-solutions}}
460
461One would expect the result of \texttt{solve()} to be a list of
462solutions, but it is actually a list of expressions (technically it is
463not a list but a different type of Python collection, but this is not so
464important)
465
466 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
467\prompt{In}{incolor}{37}{\boxspacing}
468\begin{Verbatim}[commandchars=\\\{\}]
469\PY{n}{solutions} \PY{o}{=} \PY{n}{solve}\PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{9} \PY{o}{==} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x}\PY{p}{)}
470\PY{n}{solutions}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{]} \PY{c+c1}{\PYZsh{} This is the expression \PYZsq{}x == \PYZhy{}3\PYZsq{}}
471\end{Verbatim}
472\end{tcolorbox}
473
474 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
475\prompt{Out}{outcolor}{37}{\boxspacing}
476\begin{Verbatim}[commandchars=\\\{\}]
477x == -3
478\end{Verbatim}
479\end{tcolorbox}
480
481 To read the actual solution without the \texttt{x\ ==} part you can use
482the \texttt{rhs()} or \texttt{lhs()} functions, which can be applied to
483any expression containing a relation operator (like \texttt{==},
484\texttt{\textless{}}, \texttt{\textgreater{}=}\ldots) and return the
485\emph{right hand side} and \emph{left hand side} of the expression,
486respectively
487
488 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
489\prompt{In}{incolor}{41}{\boxspacing}
490\begin{Verbatim}[commandchars=\\\{\}]
491\PY{n}{f} \PY{o}{=} \PY{n}{x} \PY{o}{==} \PY{l+m+mi}{2}
492\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{rhs:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{f}\PY{o}{.}\PY{n}{rhs}\PY{p}{(}\PY{p}{)}\PY{p}{)}
493\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{lhs:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{f}\PY{o}{.}\PY{n}{lhs}\PY{p}{(}\PY{p}{)}\PY{p}{)}
494\end{Verbatim}
495\end{tcolorbox}
496
497 \begin{Verbatim}[commandchars=\\\{\}]
498rhs: 2
499lhs: x
500 \end{Verbatim}
501
502 When you solve an inequality or a system, the set of solutions can be
503more complicated to describe. In this case the result is a list
504containing lists of expressions that have to be \texttt{True} at the
505same time. It is easier to explain with an example:
506
507 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
508\prompt{In}{incolor}{38}{\boxspacing}
509\begin{Verbatim}[commandchars=\\\{\}]
510\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Simple inequality:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{solve}\PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{9} \PY{o}{\PYZgt{}} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x}\PY{p}{)}\PY{p}{)}
511\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{System of inequalities:}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{solve}\PY{p}{(}\PY{p}{[}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{9} \PY{o}{\PYZgt{}} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x} \PY{o}{\PYZlt{}} \PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,} \PY{n}{x}\PY{p}{)}\PY{p}{)}
512\end{Verbatim}
513\end{tcolorbox}
514
515 \begin{Verbatim}[commandchars=\\\{\}]
516Simple inequality: [[x < -3], [x > 3]]
517System of inequalities:
518 [
519[3 < x, x < 6],
520[x < -3]
521]
522 \end{Verbatim}
523
524 In the last example (system of inequalities), Sage is telling us that
525the system \begin{align*}
526 \begin{cases}
527 x^2-9 > 9 \\
528 x < 6
529 \end{cases}
530\end{align*} has two solutions: * \(x\) is between \(3\) and \(6\); *
531\(x\) is less than \(-3\).
532
533Since in Sage (and in Python) expressions can have at most on relational
534operator like \texttt{\textless{}}, the first solution requires two
535expressions to be described. Hence the ``list of lists''.
536
537 \textbf{Exercise.} In the first exercise you were asked to solve a
538system of equations, but some of its solutions were complex numbers.
539Select only the real solutions and print them as pairs \((x,y)\).
540
541 When solving a system of equations (not inequalities), you can use the
542option \texttt{solution\_dict=True} to have the solutions arranged as a
543\emph{dictionary}, which is a type of Python collection that we did not
544treat in this course
545
546 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
547\prompt{In}{incolor}{44}{\boxspacing}
548\begin{Verbatim}[commandchars=\\\{\}]
549\PY{n}{solve}\PY{p}{(}\PY{p}{[}\PY{n}{x}\PY{o}{+}\PY{n}{y} \PY{o}{==} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x} \PY{o}{\PYZhy{}} \PY{n}{y} \PY{o}{==} \PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{]}\PY{p}{,} \PY{n}{solution\PYZus{}dict}\PY{o}{=}\PY{k+kc}{True}\PY{p}{)}
550\end{Verbatim}
551\end{tcolorbox}
552
553 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
554\prompt{Out}{outcolor}{44}{\boxspacing}
555\begin{Verbatim}[commandchars=\\\{\}]
556[\{x: 8/3, y: -2/3\}]
557\end{Verbatim}
558\end{tcolorbox}
559
560 \hypertarget{alternative-method-for-real-roots-find_root}{%
561\subsubsection{\texorpdfstring{Alternative method for real roots:
562\texttt{find\_root()}}{Alternative method for real roots: find\_root()}}\label{alternative-method-for-real-roots-find_root}}
563
564The \texttt{solve()} method is very useful when solving \emph{symbolic}
565equations, for example when you have two variables and you want to solve
566for one of them in terms of the other. However, it does not always find
567explicit solutions.
568
569When you want to find an explicit, even if approximate, solution, it can
570be better to use \texttt{find\_root()}. This function works
571\emph{numerically}, which means that it finds an approximation of the
572root. It only works for real solutions and you need to specify an
573interval where you want the root to be searched:
574
575 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
576\prompt{In}{incolor}{52}{\boxspacing}
577\begin{Verbatim}[commandchars=\\\{\}]
578\PY{n}{f} \PY{o}{=} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{x} \PY{o}{+} \PY{n}{x} \PY{o}{\PYZhy{}} \PY{l+m+mi}{10}
579\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Using solve():}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{solve}\PY{p}{(}\PY{n}{f}\PY{p}{,} \PY{n}{x}\PY{p}{)}\PY{p}{)}
580\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Using find\PYZus{}root():}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{f}\PY{o}{.}\PY{n}{find\PYZus{}root}\PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{100}\PY{p}{)}\PY{p}{)}
581\end{Verbatim}
582\end{tcolorbox}
583
584 \begin{Verbatim}[commandchars=\\\{\}]
585Using solve():
586 [
587x == -e\^{}x + 10
588]
589Using find\_root(): 2.070579904980303
590 \end{Verbatim}
591
592 \hypertarget{evaluating-functions}{%
593\subsection{Evaluating functions}\label{evaluating-functions}}
594
595If an expression contains only one variable you can evaluate it easily,
596even if it is not a function.
597
598 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
599\prompt{In}{incolor}{21}{\boxspacing}
600\begin{Verbatim}[commandchars=\\\{\}]
601\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
602\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{3}
603\PY{n}{g} \PY{o}{=} \PY{n}{x} \PY{o}{\PYZgt{}} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}
604
605\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)}
606\PY{n+nb}{print}\PY{p}{(}\PY{n}{g}\PY{p}{(}\PY{l+m+mi}{3}\PY{o}{+}\PY{n}{y}\PY{p}{)}\PY{p}{)}
607\end{Verbatim}
608\end{tcolorbox}
609
610 \begin{Verbatim}[commandchars=\\\{\}]
6111
612y + 3 > (y + 3)\^{}2
613 \end{Verbatim}
614
615 If an expression contains more than one variable, you can specify a
616value for each of them and they will be substituted in alphabetic order.
617You can also specify a value only for some of the variables.
618
619 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
620\prompt{In}{incolor}{38}{\boxspacing}
621\begin{Verbatim}[commandchars=\\\{\}]
622\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{z}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
623
624\PY{n}{f} \PY{o}{=} \PY{n}{y}\PY{o}{*}\PY{n}{z}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{n}{y} \PY{o}{==} \PY{n}{z}
625\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)}\PY{p}{)}
626\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{z}\PY{o}{=}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)}
627\end{Verbatim}
628\end{tcolorbox}
629
630 \begin{Verbatim}[commandchars=\\\{\}]
631-2 == 0
6323*y == 2
633 \end{Verbatim}
634
635 \hypertarget{symbolic-computations}{%
636\subsection{Symbolic computations}\label{symbolic-computations}}
637
638Sage can understand and simplify symbolic expressions such as sums
639(finite or infinite) and products. In the following cell, we compute the
640following sums using the
641\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.sum}{\texttt{sum()}}
642function:
643
644\begin{align*}
645 \begin{array}{llcc}
646 (1) & \sum_{k=0}^nk &=&\frac{n^2+n}{2}\\
647 (2) & \sum_{k=0}^nk^4 &=&\frac{6n^5+15n^4+10n^3-n}{30}\\
648 (3) & \sum_{k=0}^n\binom nk &=& 2^n\\
649 (4) & \sum_{k=0}^\infty \frac1{k^2} &=& \frac{\pi^2}{6}
650 \end{array}
651\end{align*}
652
653 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
654\prompt{In}{incolor}{22}{\boxspacing}
655\begin{Verbatim}[commandchars=\\\{\}]
656\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{k}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{n}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} \PY{c+c1}{\PYZsh{} Remember to declare all variables}
657
658\PY{n}{s} \PY{o}{=} \PY{p}{[}\PY{p}{]}
659\PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{n}{k}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{n}\PY{p}{)} \PY{p}{)}
660\PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{n}{k}\PY{o}{\PYZca{}}\PY{l+m+mi}{4}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{n}\PY{p}{)} \PY{p}{)}
661\PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{n}{binomial}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{n}{k}\PY{p}{)}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{n}\PY{p}{)} \PY{p}{)}
662\PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{l+m+mi}{1}\PY{o}{/}\PY{n}{k}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{,} \PY{n}{infinity}\PY{p}{)} \PY{p}{)}
663
664\PY{k}{for} \PY{n}{i} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{n+nb}{len}\PY{p}{(}\PY{n}{s}\PY{p}{)}\PY{p}{)}\PY{p}{:}
665 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{(}\PY{l+s+si}{\PYZob{}\PYZcb{}}\PY{l+s+s2}{) }\PY{l+s+si}{\PYZob{}\PYZcb{}}\PY{l+s+s2}{\PYZdq{}}\PY{o}{.}\PY{n}{format}\PY{p}{(}\PY{n}{i}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{,} \PY{n}{s}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{)}\PY{p}{)}
666\end{Verbatim}
667\end{tcolorbox}
668
669 \begin{Verbatim}[commandchars=\\\{\}]
670(1) 1/2*n\^{}2 + 1/2*n
671(2) 1/5*n\^{}5 + 1/2*n\^{}4 + 1/3*n\^{}3 - 1/30*n
672(3) 2\^{}n
673(4) 1/6*pi\^{}2
674 \end{Verbatim}
675
676 An alternative notation is \texttt{expression.sum(k,\ a,\ b)}. There is
677an analogous
678\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.prod}{\texttt{prod()}}
679for products.
680
681 Sometimes Sage tries to keep an expression in its original form without
682expanding out sums and products. To change this behavior you can use the
683\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.expand}{\texttt{expand()}}
684function:
685
686 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
687\prompt{In}{incolor}{30}{\boxspacing}
688\begin{Verbatim}[commandchars=\\\{\}]
689\PY{n}{f} \PY{o}{=} \PY{p}{(}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{p}{(}\PY{n}{x}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}
690\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{)}
691\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{expand}\PY{p}{(}\PY{p}{)}\PY{p}{)}
692\end{Verbatim}
693\end{tcolorbox}
694
695 \begin{Verbatim}[commandchars=\\\{\}]
696(x + 1)\^{}2 - (x - 1)\^{}2
6974*x
698 \end{Verbatim}
699
700 \hypertarget{the-symbolic-ring}{%
701\subsubsection{The Symbolic Ring}\label{the-symbolic-ring}}
702
703\textbf{Reference:}
704{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html}{3}{]}
705
706The symbolic expressions that we have seen so far live in a ring called
707\emph{symbolic ring} and denoted by \texttt{SR} in Sage. This ring works
708like the ring \texttt{ZZ} of integers or \texttt{RR} of reals numbers.
709In particular, you can define matrices and other objects using it as a
710``basis''.
711
712 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
713\prompt{In}{incolor}{45}{\boxspacing}
714\begin{Verbatim}[commandchars=\\\{\}]
715\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}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{c}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{d}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
716
717\PY{n}{M} \PY{o}{=} \PY{n}{matrix}\PY{p}{(}\PY{p}{[}\PY{p}{[}\PY{n}{a}\PY{p}{,}\PY{n}{b}\PY{p}{]}\PY{p}{,} \PY{p}{[}\PY{n}{c}\PY{p}{,}\PY{n}{d}\PY{p}{]}\PY{p}{]}\PY{p}{)}
718\PY{n+nb}{print}\PY{p}{(}\PY{n}{M}\PY{o}{.}\PY{n}{determinant}\PY{p}{(}\PY{p}{)}\PY{p}{)}
719
720\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{SR}\PY{p}{[}\PY{p}{]}
721\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}{a}\PY{o}{*}\PY{n}{x} \PY{o}{+} \PY{n}{a}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}
722\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{roots}\PY{p}{(}\PY{p}{)}\PY{p}{)}
723\end{Verbatim}
724\end{tcolorbox}
725
726 \begin{Verbatim}[commandchars=\\\{\}]
727-b*c + a*d
728[(-a, 2)]
729 \end{Verbatim}
730
731 \textbf{Exercise.} Compute the eigenvalues of the matrix \begin{align*}
732\begin{pmatrix}
733\cos \alpha & \sin \alpha\\
734-\sin\alpha & \cos \alpha
735\end{pmatrix}
736\end{align*}
737
738 \hypertarget{calculus}{%
739\section{Calculus}\label{calculus}}
740
741\textbf{Reference:}
742{[}\href{https://doc.sagemath.org/html/en/reference/calculus/index.html}{4}{]}
743for an overview, but most functions are described in
744{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]}
745
746 \hypertarget{limits-and-series}{%
747\subsection{Limits and series}\label{limits-and-series}}
748
749\textbf{References:}
750{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html\#sage.calculus.calculus.limit}{5}{]}
751for limits,
752{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.series}{6}{]}
753for series
754
755You can compute limits
756
757 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
758\prompt{In}{incolor}{54}{\boxspacing}
759\begin{Verbatim}[commandchars=\\\{\}]
760\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{o}{/}\PY{n}{x}
761\PY{c+c1}{\PYZsh{} print(f(0)) \PYZsh{} This one gives an error}
762\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{)} \PY{p}{)}
763
764\PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{p}{)}\PY{p}{)}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{n}{infinity}\PY{p}{)} \PY{p}{)}
765\end{Verbatim}
766\end{tcolorbox}
767
768 \begin{Verbatim}[commandchars=\\\{\}]
7691
7700
771 \end{Verbatim}
772
773 \textbf{Exercise.} Compute the constant \(e\) using a limit.
774
775 You can also specify a direction for the limit. If you don't, Sage
776assumes that you want to take a two-sided limit.
777
778 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
779\prompt{In}{incolor}{55}{\boxspacing}
780\begin{Verbatim}[commandchars=\\\{\}]
781\PY{n}{f} \PY{o}{=} \PY{n+nb}{abs}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{o}{/}\PY{n}{x} \PY{c+c1}{\PYZsh{} 1 if x\PYZgt{}0, \PYZhy{}1 if x\PYZlt{}0}
782\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} undefined}
783\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{,} \PY{n+nb}{dir}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{+}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} \PY{p}{)}
784\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{,} \PY{n+nb}{dir}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{\PYZhy{}}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} \PY{p}{)}
785\end{Verbatim}
786\end{tcolorbox}
787
788 \begin{Verbatim}[commandchars=\\\{\}]
789und
7901
791-1
792 \end{Verbatim}
793
794 There is also the alternative notation \texttt{limit(f,\ x,\ dir)} which
795does the same as \texttt{f.limit(x,\ dir)}.
796
797 You can also compute series expansions up to any order. \textbf{Watch
798out:} the notation uses \texttt{==} instead of \texttt{=} as
799\texttt{limit()} does.
800
801 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
802\prompt{In}{incolor}{56}{\boxspacing}
803\begin{Verbatim}[commandchars=\\\{\}]
804\PY{n}{f} \PY{o}{=} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{x}
805\PY{n}{g} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{cos}\PY{p}{(}\PY{n}{x}\PY{p}{)}
806\PY{n}{h} \PY{o}{=} \PY{n}{log}\PY{p}{(}\PY{n}{x}\PY{p}{)}
807
808\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}
809\PY{n+nb}{print}\PY{p}{(}\PY{n}{g}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{7}\PY{p}{)}\PY{p}{)}
810\PY{n+nb}{print}\PY{p}{(}\PY{n}{h}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}
811\end{Verbatim}
812\end{tcolorbox}
813
814 \begin{Verbatim}[commandchars=\\\{\}]
8151 + 1*x + 1/2*x\^{}2 + Order(x\^{}3)
816(-2) + 1*x + 1*x\^{}2 + (-1/6)*x\^{}3 + (-1/12)*x\^{}4 + 1/120*x\^{}5 + 1/360*x\^{}6 +
817Order(x\^{}7)
8181*(x - 1) + (-1/2)*(x - 1)\^{}2 + Order((x - 1)\^{}3)
819 \end{Verbatim}
820
821 \hypertarget{derivatives}{%
822\subsection{Derivatives}\label{derivatives}}
823
824\textbf{References:}
825{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.derivative}{7}{]}
826and
827{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html\#sage.calculus.functional.derivative}{8}{]}
828for derivatives,
829{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html\#sage.calculus.functions.jacobian}{9}{]}
830for the Jacobian matrix and
831{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.hessian}{10}{]}
832for the Hessian.
833
834 When computing derivatives, you need to specify with respect to which
835variables you want to derive, except in case there is only one.
836
837 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
838\prompt{In}{incolor}{57}{\boxspacing}
839\begin{Verbatim}[commandchars=\\\{\}]
840\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
841\PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{+}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{4}\PY{p}{)}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{y}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Alternative: derivative(f, y)}
842\PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{3}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{p}{)} \PY{p}{)}
843\end{Verbatim}
844\end{tcolorbox}
845
846 \begin{Verbatim}[commandchars=\\\{\}]
8478*y\^{}3
8486*x\^{}2 - 1
849 \end{Verbatim}
850
851 You can also compute higher order derivatives:
852
853 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
854\prompt{In}{incolor}{58}{\boxspacing}
855\begin{Verbatim}[commandchars=\\\{\}]
856\PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{x}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Same as (x\PYZca{}3).derivative(x, 2)}
857
858\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{7}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{4}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{3} \PY{o}{+} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{5} \PY{o}{+} \PY{n}{y} \PY{o}{+} \PY{l+m+mi}{2}
859\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{n}{y}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Twice in x, once in y}
860\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{l+m+mi}{4}\PY{p}{,} \PY{n}{y}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} 4 times in x, twice in y}
861\end{Verbatim}
862\end{tcolorbox}
863
864 \begin{Verbatim}[commandchars=\\\{\}]
8656*x
86684*x\^{}5*y + 10*y\^{}4 + 24*x\^{}2*y
8671680*x\^{}3 + 48
868 \end{Verbatim}
869
870 Jacobian and Hessian matrices are also easy to compute:
871
872 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
873\prompt{In}{incolor}{59}{\boxspacing}
874\begin{Verbatim}[commandchars=\\\{\}]
875\PY{n}{f} \PY{o}{=} \PY{p}{(}\PY{o}{\PYZhy{}}\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}{*}\PY{n}{y}\PY{p}{,} \PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{3}\PY{p}{,} \PY{n}{x}\PY{o}{+}\PY{n}{y}\PY{o}{+}\PY{n}{x}\PY{o}{*}\PY{n}{y}\PY{p}{)}
876\PY{n+nb}{print}\PY{p}{(} \PY{n}{jacobian}\PY{p}{(}\PY{n}{f}\PY{p}{,} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{]}\PY{p}{)}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}} \PY{p}{)}
877
878\PY{n}{g} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{x}\PY{o}{*}\PY{n}{y} \PY{o}{+} \PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{3} \PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}}\PY{l+m+mi}{3}
879\PY{n+nb}{print}\PY{p}{(} \PY{n}{g}\PY{o}{.}\PY{n}{hessian}\PY{p}{(}\PY{p}{)} \PY{p}{)}
880\end{Verbatim}
881\end{tcolorbox}
882
883 \begin{Verbatim}[commandchars=\\\{\}]
884[-2*x + 2*y 2*x]
885[ 0 3*y\^{}2]
886[ y + 1 x + 1]
887
888[ 2 -4*y + 1]
889[ -4*y + 1 -4*x + 6*y]
890 \end{Verbatim}
891
892 \emph{Note:} the notation \texttt{f.jacobian({[}x,y{]})} is also valid,
893but only if you specify that \texttt{f} is vector by declaring it as
894\texttt{f\ =\ vector({[}...{]})}.
895
896 \hypertarget{integrals}{%
897\subsection{Integrals}\label{integrals}}
898
899\textbf{References:}
900{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html}{11}{]}
901for symbolic integration and
902{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html}{12}{]}
903for numerical methods.
904
905You should remember from high school or from your first
906calculus/analysis course that derivatives are easy, but integrals are
907hard. When using a computer software to solve your integrals, you have
908two choices:
909
910\begin{enumerate}
911\def\labelenumi{\arabic{enumi}.}
912\tightlist
913\item
914 You can try to compute a primitive function exactly, and then (if you
915 are computing a definite integral) substitute the endpoints of your
916 integration interval to get the result. We can call this
917 \emph{symbolic integration}.
918\item
919 You can get an \emph{approximated} result with a \emph{numerical
920 method}. This method always gives some kind of result, but it cannot
921 be used to compute indefinite integrals.
922\end{enumerate}
923
924Sage can do both of these things, although people that work in numerical
925analysis and use often the second method tend to prefer other programs,
926such as Matlab (or its open-source clone Octave).
927
928 \hypertarget{symbolic-integration}{%
929\subsubsection{Symbolic integration}\label{symbolic-integration}}
930
931Symbolic integrals work more or less like derivatives. You must specify
932an integration variable, but the endpoints of the integration interval
933are optional. If they are not given you get an indefinite integral.
934
935 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
936\prompt{In}{incolor}{60}{\boxspacing}
937\begin{Verbatim}[commandchars=\\\{\}]
938\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}{)}
939\PY{n}{f} \PY{o}{=} \PY{n}{x} \PY{o}{+} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}
940\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{integral}\PY{p}{(}\PY{n}{x}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Alternative: integral(f, x)}
941\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{integral}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{10}\PY{p}{,} \PY{l+m+mi}{10}\PY{p}{)} \PY{p}{)}
942\PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{integral}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{a}\PY{p}{,} \PY{n}{b}\PY{p}{)} \PY{p}{)}
943\end{Verbatim}
944\end{tcolorbox}
945
946 \begin{Verbatim}[commandchars=\\\{\}]
9471/2*x\^{}2 - cos(x)
9480
949-1/2*a\^{}2 + 1/2*b\^{}2 + cos(a) - cos(b)
950 \end{Verbatim}
951
952 Your endpoints can also be \(\pm\infty\):
953
954 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
955\prompt{In}{incolor}{61}{\boxspacing}
956\begin{Verbatim}[commandchars=\\\{\}]
957\PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{infinity}\PY{p}{)} \PY{p}{)}
958\PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{n}{infinity}\PY{p}{,} \PY{n}{infinity}\PY{p}{)} \PY{p}{)}
959\end{Verbatim}
960\end{tcolorbox}
961
962 \begin{Verbatim}[commandchars=\\\{\}]
9631
964sqrt(pi)
965 \end{Verbatim}
966
967 The last function is also an example of an integral that perhaps you
968might want to compute numerically. In fact:
969
970 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
971\prompt{In}{incolor}{65}{\boxspacing}
972\begin{Verbatim}[commandchars=\\\{\}]
973\PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{)} \PY{p}{)}
974\PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)} \PY{p}{)}
975\end{Verbatim}
976\end{tcolorbox}
977
978 \begin{Verbatim}[commandchars=\\\{\}]
9791/2*sqrt(pi)*erf(x)
9801/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)
981 \end{Verbatim}
982
983 Here \texttt{erf(x)} denotes the
984\href{https://en.wikipedia.org/wiki/Error_function}{error function}.
985
986 \hypertarget{numerical-integration}{%
987\subsubsection{Numerical integration}\label{numerical-integration}}
988
989In order to get an explicit value for the computations above, we can use
990a \emph{numerical} method.
991
992The word ``numerical'' does not have much to do with numbers, but it
993refers to the fact that we are trying to compute explicit results rather
994than symbolic or algebraic ones.
995\href{https://en.wikipedia.org/wiki/Numerical_analysis}{Numerical
996analysis} is the branch of mathematics that studies methods to
997approximate computations over the real or complex numbers. With these
998methods there is usually a trade-off between speed and precision.
999
1000The Sage function
1001\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html\#sage.calculus.integration.numerical_integral}{\texttt{numerical\_integral()}}
1002takes as a parameter a real-valued one-variable function and the
1003integration endpoints, and it returns both an approximate value for the
1004integral and an error estimate.
1005
1006 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1007\prompt{In}{incolor}{40}{\boxspacing}
1008\begin{Verbatim}[commandchars=\\\{\}]
1009\PY{n}{numerical\PYZus{}integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)}
1010\end{Verbatim}
1011\end{tcolorbox}
1012
1013 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1014\prompt{Out}{outcolor}{40}{\boxspacing}
1015\begin{Verbatim}[commandchars=\\\{\}]
1016(0.13525725794999466, 1.5016572202374808e-15)
1017\end{Verbatim}
1018\end{tcolorbox}
1019
1020 The result above means, in symbols \begin{align*}
1021\int_1^2 e^{-x^2}\mathrm dx = 0.13525725794999466 \pm 1.5016572202374808\times 10^{-15}
1022\end{align*}
1023
1024There is also a
1025\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html\#sage.calculus.integration.monte_carlo_integral}{\texttt{monte\_carlo\_integral()}}
1026method for functions with more than one variable.
1027
1028 \textbf{Exercise.} Compute the area of the ellipse of equation
1029\(y^2+\left(\frac x3\right)^2=1\).
1030
1031 \hypertarget{differential-equations}{%
1032\subsection{Differential equations}\label{differential-equations}}
1033
1034\textbf{Reference:}
1035{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html}{13}{]}
1036
1037A
1038\href{https://en.wikipedia.org/wiki/Differential_equation}{differential
1039equation} is an equation involving an unknwon function and its
1040derivatives. They can be of two kinds: \emph{ordinary} differential
1041equations
1042(\href{https://en.wikipedia.org/wiki/Ordinary_differential_equation}{ODE})
1043and \emph{partial} differential equations
1044(\href{https://en.wikipedia.org/wiki/Partial_differential_equation}{PDE}).
1045The latter involve multivariate functions and their partial derivatives.
1046
1047Differential equations are in general hard to solve \emph{exactly} (or
1048\emph{symbolically}): even a simple equation of the form \(f'(x)=g(x)\),
1049where \(g(x)\) is someknown function, requires solving the integral
1050\(\int g(x)\mathrm{d}x\) in order to find \(f\), which as we know is not
1051always easy!
1052
1053Theoretical results on differential equations usually ensure the
1054existence and/or uniquess of a solution under certain conditions, but in
1055general they do not give a way to solve them. There exits many methods
1056to find approximate solutions, and some of them are implemented in Sage
1057as well (see
1058{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html}{13}{]}).
1059However we will focus on the simple ODEs that can be solved exactly.
1060
1061Let's start with a simple example. Let's find all functions \(f(x)\)
1062such that \(f'(x)=f(x)\). In order to do so, we need to use the
1063\texttt{function()} construct, which allows us to define an ``unknwon''
1064function inside Sage, like we define variables with \texttt{var()}.
1065
1066 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1067\prompt{In}{incolor}{4}{\boxspacing}
1068\begin{Verbatim}[commandchars=\\\{\}]
1069\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{x}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1070\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{f}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1071\PY{n}{equation} \PY{o}{=} \PY{n}{derivative}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}
1072\PY{n}{desolve}\PY{p}{(}\PY{n}{equation}\PY{p}{,} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{)} \PY{c+c1}{\PYZsh{} f is the unknown function}
1073\end{Verbatim}
1074\end{tcolorbox}
1075
1076 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1077\prompt{Out}{outcolor}{4}{\boxspacing}
1078\begin{Verbatim}[commandchars=\\\{\}]
1079\_C*e\^{}x
1080\end{Verbatim}
1081\end{tcolorbox}
1082
1083 As you can expect, they are all the functions \(Ce^x\) for some constant
1084\(C\). The constant \(C\) plays the same role as the constant in the
1085solution of an integral, but in this case Sage writes it explicitly.
1086
1087We can also specify \emph{initial conditions} for our function. For
1088example we can impose that \(f(0)=3\) as follows:
1089
1090 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1091\prompt{In}{incolor}{5}{\boxspacing}
1092\begin{Verbatim}[commandchars=\\\{\}]
1093\PY{n}{desolve}\PY{p}{(}\PY{n}{equation}\PY{p}{,} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)}
1094\end{Verbatim}
1095\end{tcolorbox}
1096
1097 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1098\prompt{Out}{outcolor}{5}{\boxspacing}
1099\begin{Verbatim}[commandchars=\\\{\}]
11003*e\^{}x
1101\end{Verbatim}
1102\end{tcolorbox}
1103
1104 You can also solve \emph{second order} equations, that is equations
1105where the second derivative also appears. In this case if you want to
1106specify an initial condition you should write the triple of values
1107\((x_0, f(x_0), f'(x_0))\).
1108
1109 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1110\prompt{In}{incolor}{6}{\boxspacing}
1111\begin{Verbatim}[commandchars=\\\{\}]
1112\PY{n}{equation} \PY{o}{=} \PY{n}{derivative}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)} \PY{o}{+} \PY{n}{x}\PY{o}{*}\PY{n}{derivative}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{l+m+mi}{1}
1113\PY{n}{desolve}\PY{p}{(}\PY{n}{equation}\PY{p}{,} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)}\PY{p}{)}
1114\end{Verbatim}
1115\end{tcolorbox}
1116
1117 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1118\prompt{Out}{outcolor}{6}{\boxspacing}
1119\begin{Verbatim}[commandchars=\\\{\}]
1120-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e\^{}(-1/2*x\^{}2), x)
1121\end{Verbatim}
1122\end{tcolorbox}
1123
1124 \textbf{Exercise.} Use Sage to find out the functions \(f(x)\) that
1125satisfy \begin{align*}
1126 \begin{array}{rlcrl}
1127 (A) &
1128 \begin{cases}
1129 f(0) &= 1\\
1130 f'(0) &= 0\\
1131 f''(x) &= -f(x)
1132 \end{cases}
1133 & \qquad \qquad &
1134 (B) &
1135 \begin{cases}
1136 f(0) &= 0\\
1137 f'(0) &= 1\\
1138 f''(x) &= -f(x)
1139 \end{cases}
1140 \end{array}
1141\end{align*}
1142
1143 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1144\prompt{In}{incolor}{ }{\boxspacing}
1145\begin{Verbatim}[commandchars=\\\{\}]
1146
1147\end{Verbatim}
1148\end{tcolorbox}
1149
1150 \hypertarget{a-real-world-example}{%
1151\subsubsection{A real-world example}\label{a-real-world-example}}
1152
1153Differential equations have countless applications in Science, so it
1154would be a shame not to see at least a simple one.
1155
1156Consider an object moving with constant acceleration \(a\). Its velocity
1157at time \(t\) is described by the formula \(v(t) = v(0) + at\). For
1158example an object falling from the sky has acceleration
1159\(g\sim 9.8 m/s^2\) towards the ground, so its velocity is
1160\(v(t) = -gt\).
1161
1162However in the real world you need to take into account the air's
1163resistance, which depends (among other things) on the velocity of the
1164object. In this case the acceleration \(a(t)\) is not constant anymore,
1165and it satisfies an equation of the form \(a(t)=-g -kv(t)\), where \(k\)
1166is some constant that may depend on the shape and mass of the object (in
1167practice it may be more complicated than this).
1168
1169Since the acceleration is the derivative of the velocity, we have a
1170differential equation \begin{align*}
1171 v'(t) = -g -kv(t)
1172\end{align*} and we can try to solve it with Sage!
1173
1174 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1175\prompt{In}{incolor}{7}{\boxspacing}
1176\begin{Verbatim}[commandchars=\\\{\}]
1177\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{t}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1178\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{v}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1179\PY{n}{g} \PY{o}{=} \PY{l+m+mf}{9.8}
1180\PY{n}{k} \PY{o}{=} \PY{l+m+mf}{1.5}
1181\PY{n}{conditions} \PY{o}{=} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)} \PY{c+c1}{\PYZsh{} Start with velocity 0}
1182\PY{n}{desolve}\PY{p}{(}\PY{n}{derivative}\PY{p}{(}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{o}{\PYZhy{}}\PY{n}{g} \PY{o}{\PYZhy{}}\PY{n}{k}\PY{o}{*}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{conditions}\PY{p}{)}
1183\end{Verbatim}
1184\end{tcolorbox}
1185
1186 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1187\prompt{Out}{outcolor}{7}{\boxspacing}
1188\begin{Verbatim}[commandchars=\\\{\}]
1189-98/15*(e\^{}(3/2*t) - 1)*e\^{}(-3/2*t)
1190\end{Verbatim}
1191\end{tcolorbox}
1192
1193 If you want to solve this equation symbolically (that is, keeping \(g\)
1194and \(k\) in symbols) you need to specify that \(t\) is the
1195\emph{independent variable} of the equation:
1196
1197 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1198\prompt{In}{incolor}{10}{\boxspacing}
1199\begin{Verbatim}[commandchars=\\\{\}]
1200\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{t}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{g}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{k}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1201\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{v}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)}
1202\PY{n}{conditions} \PY{o}{=} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)} \PY{c+c1}{\PYZsh{} Start with velocity 0}
1203\PY{n}{desolve}\PY{p}{(}\PY{n}{derivative}\PY{p}{(}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{o}{\PYZhy{}}\PY{n}{g} \PY{o}{\PYZhy{}}\PY{n}{k}\PY{o}{*}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{conditions}\PY{p}{,} \PY{n}{ivar}\PY{o}{=}\PY{n}{t}\PY{p}{)}
1204\end{Verbatim}
1205\end{tcolorbox}
1206
1207 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
1208\prompt{Out}{outcolor}{10}{\boxspacing}
1209\begin{Verbatim}[commandchars=\\\{\}]
1210-(g*e\^{}(k*t) - g)*e\^{}(-k*t)/k
1211\end{Verbatim}
1212\end{tcolorbox}
1213
1214 \hypertarget{basic-data-analysis-and-visualization}{%
1215\section{Basic data analysis and
1216visualization}\label{basic-data-analysis-and-visualization}}
1217
1218\hypertarget{statistics}{%
1219\subsection{Statistics}\label{statistics}}
1220
1221\textbf{References:}
1222{[}\href{https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html}{14}{]}
1223
1224Sage includes the most basic functions for statistical analysis.
1225
1226 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1227\prompt{In}{incolor}{20}{\boxspacing}
1228\begin{Verbatim}[commandchars=\\\{\}]
1229\PY{n}{L} \PY{o}{=} \PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{6}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{4}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{4}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{]}
1230
1231\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Values:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{L}\PY{p}{)}
1232
1233\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Mean:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{mean}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}
1234\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Median:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{median}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}
1235\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Mode:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{mode}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}
1236
1237\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Standard deviation:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{std}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}
1238\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Variance:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{variance}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}
1239
1240\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Moving average (5):}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{moving\PYZus{}average}\PY{p}{(}\PY{n}{L}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{)}\PY{p}{)}
1241\end{Verbatim}
1242\end{tcolorbox}
1243
1244 \begin{Verbatim}[commandchars=\\\{\}]
1245Values: [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]
1246Mean: 5/13
1247Median: 1
1248Mode: [3]
1249Standard deviation: 2*sqrt(29/13)
1250Variance: 116/13
1251Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]
1252 \end{Verbatim}
1253
1254 You can also compare your data to a probability distribution, see
1255\href{https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html}{this
1256page}. If you need to do more advanced statistics you should consider
1257using \href{https://www.r-project.org/}{R}; you can also use it inside
1258Sage.
1259
1260 \hypertarget{plotting}{%
1261\subsection{Plotting}\label{plotting}}
1262
1263\textbf{Reference:}
1264{[}\href{https://doc.sagemath.org/html/en/reference/plotting/index.html}{15}{]},
1265more specifically the subsection
1266{[}\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html}{16}{]}.
1267
1268Some Sage objects can be plotted:
1269
1270 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1271\prompt{In}{incolor}{21}{\boxspacing}
1272\begin{Verbatim}[commandchars=\\\{\}]
1273\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}
1274\PY{n}{plot}\PY{p}{(}\PY{n}{f}\PY{p}{)}
1275\end{Verbatim}
1276\end{tcolorbox}
1277
1278
1279\prompt{Out}{outcolor}{21}{}
1280
1281 \begin{center}
1282 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_75_0.png}
1283 \end{center}
1284 { \hspace*{\fill} \\}
1285
1286
1287 Sage's plotting functions are based on Python's
1288\href{https://matplotlib.org/}{matplotlib}.
1289
1290You can give a number of options to adjust the aspect of your plot, see
1291\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html\#sage.plot.plot.plot}{here}.
1292Let's see some of them:
1293
1294 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1295\prompt{In}{incolor}{67}{\boxspacing}
1296\begin{Verbatim}[commandchars=\\\{\}]
1297\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}
1298\PY{n}{plot}\PY{p}{(}\PY{n}{f}\PY{p}{,}
1299 \PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi}\PY{p}{,} \PY{c+c1}{\PYZsh{} bounds for x}
1300 \PY{n}{ymin} \PY{o}{=} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.7}\PY{p}{,} \PY{n}{ymax} \PY{o}{=} \PY{l+m+mf}{0.7}\PY{p}{,} \PY{c+c1}{\PYZsh{} bounds for y}
1301 \PY{n}{color} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,}
1302 \PY{n}{title} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{The sin function}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,}
1303 \PY{p}{)}
1304\end{Verbatim}
1305\end{tcolorbox}
1306
1307
1308\prompt{Out}{outcolor}{67}{}
1309
1310 \begin{center}
1311 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_77_0.png}
1312 \end{center}
1313 { \hspace*{\fill} \\}
1314
1315
1316 Some of the options are not described precisely in Sage's documentation,
1317but you can find them on
1318\href{https://matplotlib.org/stable/contents.html}{matplotlib's
1319documentation}. You can find many examples online for adjusting your
1320plot as you like!
1321
1322 If you need to plot more than one object at the time, you can sum two
1323plots and show them together with \texttt{show()}:
1324
1325 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1326\prompt{In}{incolor}{36}{\boxspacing}
1327\begin{Verbatim}[commandchars=\\\{\}]
1328\PY{n}{cosine} \PY{o}{=} \PY{n}{plot}\PY{p}{(}\PY{n}{cos}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{n}{x}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{n}{pi}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{n}{pi}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{color}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
1329\PY{n}{exponential} \PY{o}{=} \PY{n}{plot}\PY{p}{(}\PY{n}{exp}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{n}{x}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mf}{0.5}\PY{p}{)}\PY{p}{)}
1330
1331\PY{n}{show}\PY{p}{(}\PY{n}{cosine} \PY{o}{+} \PY{n}{exponential}\PY{p}{)}
1332\end{Verbatim}
1333\end{tcolorbox}
1334
1335 \begin{center}
1336 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_80_0.png}
1337 \end{center}
1338 { \hspace*{\fill} \\}
1339
1340 Finally, there are other types of plots that you can use, like
1341\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html\#sage.plot.scatter_plot.scatter_plot}{scatter
1342plots} and
1343\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html\#sage.plot.bar_chart.bar_chart}{bar
1344charts}. You can also add
1345\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html\#sage.plot.text.text}{text}
1346to your plot:
1347
1348 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1349\prompt{In}{incolor}{53}{\boxspacing}
1350\begin{Verbatim}[commandchars=\\\{\}]
1351\PY{n}{b} \PY{o}{=} \PY{n}{bar\PYZus{}chart}\PY{p}{(}\PY{n+nb}{range}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{10}\PY{p}{)}\PY{p}{)}
1352\PY{n}{s} \PY{o}{=} \PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{p}{[}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{8}\PY{p}{,}\PY{l+m+mi}{8}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{7}\PY{p}{)}\PY{p}{]}\PY{p}{,}
1353 \PY{n}{marker} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{*}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{c+c1}{\PYZsh{} symbol}
1354 \PY{n}{markersize} \PY{o}{=} \PY{l+m+mi}{100}\PY{p}{,}
1355 \PY{n}{edgecolor} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,}
1356 \PY{n}{facecolor} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}
1357 \PY{p}{)}
1358\PY{n}{t} \PY{o}{=} \PY{n}{text}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{wow, such plot!}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{8}\PY{p}{)}\PY{p}{,} \PY{n}{color}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{fontsize}\PY{o}{=}\PY{l+m+mi}{20}\PY{p}{)}
1359\PY{n}{show}\PY{p}{(}\PY{n}{b} \PY{o}{+} \PY{n}{s} \PY{o}{+} \PY{n}{t}\PY{p}{)}
1360\end{Verbatim}
1361\end{tcolorbox}
1362
1363 \begin{center}
1364 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_82_0.png}
1365 \end{center}
1366 { \hspace*{\fill} \\}
1367
1368 \hypertarget{interpolation}{%
1369\subsection{Interpolation}\label{interpolation}}
1370
1371\textbf{References:}
1372{[}\href{https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html\#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial}{17}{]}
1373and
1374{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html}{18}{]}.
1375
1376When you need to work with a discrete set of data, like measurements of
1377real-world quantities, it can be useful to visualize a ``smoothed out''
1378version of this data, for example by plotting a function that
1379approximates it.
1380
1381One way to do so is finding the lowest-degree polynomial that passes
1382through all your points. This is called
1383\href{https://en.wikipedia.org/wiki/Lagrange_polynomial}{Lagrange
1384Polynomial}.
1385
1386 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1387\prompt{In}{incolor}{65}{\boxspacing}
1388\begin{Verbatim}[commandchars=\\\{\}]
1389\PY{n}{points} \PY{o}{=} \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}{2}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mf}{1.5}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{)} \PY{p}{]}
1390\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{QQ}\PY{p}{[}\PY{p}{]} \PY{c+c1}{\PYZsh{} you need to specify a polynomial ring}
1391\PY{n}{lp} \PY{o}{=} \PY{n}{polring}\PY{o}{.}\PY{n}{lagrange\PYZus{}polynomial}\PY{p}{(}\PY{n}{points}\PY{p}{)}
1392\PY{n}{show}\PY{p}{(}\PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{n}{points}\PY{p}{,} \PY{n}{facecolor}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
1393 \PY{o}{+} \PY{n}{plot}\PY{p}{(}\PY{n}{lp}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{)} \PY{c+c1}{\PYZsh{} slightly different notation for polynomials}
1394 \PY{o}{+} \PY{n}{text}\PY{p}{(}\PY{n}{lp}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{8}\PY{p}{)}\PY{p}{,} \PY{n}{color}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
1395 \PY{p}{)}
1396\end{Verbatim}
1397\end{tcolorbox}
1398
1399 \begin{center}
1400 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_84_0.png}
1401 \end{center}
1402 { \hspace*{\fill} \\}
1403
1404 One can compute the Lagrange Polynomial over any base ring, and it has
1405the advantage that it is a very ``nice'' function (continuous and
1406differentiable as much as you like, with easily computable derivatives
1407and primitives).
1408
1409However, it does not always give you good approximation of your data:
1410
1411 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1412\prompt{In}{incolor}{2}{\boxspacing}
1413\begin{Verbatim}[commandchars=\\\{\}]
1414\PY{n}{R} \PY{o}{=} \PY{p}{[}\PY{n}{x}\PY{o}{/}\PY{l+m+mi}{10} \PY{k}{for} \PY{n}{x} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{l+m+mi}{10}\PY{p}{,}\PY{l+m+mi}{10}\PY{p}{)}\PY{p}{]}
1415\PY{n}{L} \PY{o}{=} \PY{p}{[}\PY{l+m+mi}{1}\PY{o}{/}\PY{p}{(}\PY{l+m+mi}{1}\PY{o}{+}\PY{l+m+mi}{25}\PY{o}{*}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)} \PY{k}{for} \PY{n}{x} \PY{o+ow}{in} \PY{n}{R}\PY{p}{]}
1416\PY{n}{points} \PY{o}{=} \PY{p}{[}\PY{p}{(}\PY{n}{R}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{,} \PY{n}{L}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{)} \PY{k}{for} \PY{n}{i} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{n+nb}{len}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}\PY{p}{]}
1417\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{RR}\PY{p}{[}\PY{p}{]}
1418\PY{n}{lp} \PY{o}{=} \PY{n}{polring}\PY{o}{.}\PY{n}{lagrange\PYZus{}polynomial}\PY{p}{(}\PY{n}{points}\PY{p}{)}
1419
1420\PY{n}{show}\PY{p}{(}\PY{n}{plot}\PY{p}{(}\PY{n}{lp}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.82}\PY{p}{,} \PY{l+m+mf}{0.72}\PY{p}{)} \PY{o}{+} \PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{n}{points}\PY{p}{)}\PY{p}{)}
1421\end{Verbatim}
1422\end{tcolorbox}
1423
1424 \begin{center}
1425 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_86_0.png}
1426 \end{center}
1427 { \hspace*{\fill} \\}
1428
1429 This particular example is called
1430\href{https://en.wikipedia.org/wiki/Runge\%27s_phenomenon}{Runge's
1431phenomenon}. For a better approximation you can use a
1432\href{https://en.wikipedia.org/wiki/Spline_(mathematics)}{spline}, which
1433is a \emph{piecewise} polynomial function:
1434
1435 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
1436\prompt{In}{incolor}{90}{\boxspacing}
1437\begin{Verbatim}[commandchars=\\\{\}]
1438\PY{n}{show}\PY{p}{(}\PY{n}{plot}\PY{p}{(}\PY{n}{spline}\PY{p}{(}\PY{n}{points}\PY{p}{)}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{)} \PY{o}{+} \PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{n}{points}\PY{p}{)}\PY{p}{)}
1439\end{Verbatim}
1440\end{tcolorbox}
1441
1442 \begin{center}
1443 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_88_0.png}
1444 \end{center}
1445 { \hspace*{\fill} \\}
1446
1447 A detailed explanation of splines is a good topic for a course of
1448numerical analysis. For this course it is enough that you know that they
1449exist and they can be plotted.
1450
1451
1452 % Add a bibliography block to the postdoc
1453
1454
1455
1456\end{document}
diff --git a/src/Lecture6/notebook/9-SageLatex.aux b/src/Lecture6/notebook/9-SageLatex.aux
new file mode 100644
index 0000000..1220a33
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.aux
@@ -0,0 +1,32 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\providecommand \oddpage@label [2]{}
20\@writefile{toc}{\contentsline {section}{\numberline {1}The \texttt {show()} command}{1}{section.1}\protected@file@percent }
21\newlabel{the-show-command}{{1}{1}{\texorpdfstring {The \texttt {show()} command}{The show() command}}{section.1}{}}
22\@writefile{toc}{\contentsline {section}{\numberline {2}The \texttt {latex()} command}{2}{section.2}\protected@file@percent }
23\newlabel{the-latex-command}{{2}{2}{\texorpdfstring {The \texttt {latex()} command}{The latex() command}}{section.2}{}}
24\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}A Latex name for your variables}{2}{subsection.2.1}\protected@file@percent }
25\newlabel{a-latex-name-for-your-variables}{{2.1}{2}{A Latex name for your variables}{subsection.2.1}{}}
26\@writefile{toc}{\contentsline {section}{\numberline {3}From Jupyter to Latex}{3}{section.3}\protected@file@percent }
27\newlabel{from-jupyter-to-latex}{{3}{3}{From Jupyter to Latex}{section.3}{}}
28\@writefile{toc}{\contentsline {section}{\numberline {4}SageTex}{3}{section.4}\protected@file@percent }
29\newlabel{sagetex}{{4}{3}{SageTex}{section.4}{}}
30\@writefile{toc}{\contentsline {section}{\numberline {5}The Latex \texttt {listings} package}{3}{section.5}\protected@file@percent }
31\newlabel{the-latex-listings-package}{{5}{3}{\texorpdfstring {The Latex \texttt {listings} package}{The Latex listings package}}{section.5}{}}
32\gdef \@abspage@last{4}
diff --git a/src/Lecture6/notebook/9-SageLatex.ipynb b/src/Lecture6/notebook/9-SageLatex.ipynb
new file mode 100644
index 0000000..63ea8c6
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.ipynb
@@ -0,0 +1,346 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "It can happen that you need to include the results of your Sage computations and/or Sage code inside a LaTeX document. Luckily Sage provides some functions to translate its objects into LaTeX, and the listings package for LaTeX can be used to include any code (Sage, Python or any other language) in a LaTeX document.\n",
8 "\n",
9 "In this document we will describe some of these interactions between LaTeX and Sage."
10 ]
11 },
12 {
13 "cell_type": "markdown",
14 "metadata": {},
15 "source": [
16 "# The `show()` command\n",
17 "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/repl/sage/repl/display/pretty_print.html)] (`show()` is just an alternative name for `pretty_print()`).\n",
18 "\n",
19 "With this command Sage will generate a picture displaying the object. The result depends on the object itself: most of them will be typeset in Latex, but for example graphics primitives (such as plots) will be displayed as pictures.\n",
20 "\n",
21 "You can see it as an alternative to `print()`."
22 ]
23 },
24 {
25 "cell_type": "code",
26 "execution_count": 4,
27 "metadata": {},
28 "outputs": [
29 {
30 "name": "stdout",
31 "output_type": "stream",
32 "text": [
33 "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)\n"
34 ]
35 },
36 {
37 "data": {
38 "text/html": [
39 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)</script></html>"
40 ],
41 "text/latex": [
42 "\\begin{math}\n",
43 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n",
44 "\\end{math}"
45 ],
46 "text/plain": [
47 "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)"
48 ]
49 },
50 "metadata": {},
51 "output_type": "display_data"
52 },
53 {
54 "name": "stdout",
55 "output_type": "stream",
56 "text": [
57 "[ 1 2 3]\n",
58 "[ 4 5 6]\n",
59 "[ 8 9 10]\n"
60 ]
61 },
62 {
63 "data": {
64 "text/html": [
65 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n",
66 "1 & 2 & 3 \\\\\n",
67 "4 & 5 & 6 \\\\\n",
68 "8 & 9 & 10\n",
69 "\\end{array}\\right)</script></html>"
70 ],
71 "text/latex": [
72 "\\begin{math}\n",
73 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n",
74 "1 & 2 & 3 \\\\\n",
75 "4 & 5 & 6 \\\\\n",
76 "8 & 9 & 10\n",
77 "\\end{array}\\right)\n",
78 "\\end{math}"
79 ],
80 "text/plain": [
81 "[ 1 2 3]\n",
82 "[ 4 5 6]\n",
83 "[ 8 9 10]"
84 ]
85 },
86 "metadata": {},
87 "output_type": "display_data"
88 },
89 {
90 "name": "stdout",
91 "output_type": "stream",
92 "text": [
93 "pi\n"
94 ]
95 },
96 {
97 "data": {
98 "text/html": [
99 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi</script></html>"
100 ],
101 "text/latex": [
102 "\\begin{math}\n",
103 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi\n",
104 "\\end{math}"
105 ],
106 "text/plain": [
107 "pi"
108 ]
109 },
110 "metadata": {},
111 "output_type": "display_data"
112 }
113 ],
114 "source": [
115 "s = (e^x).series(x==0, 4)\n",
116 "M = matrix([[1,2,3],[4,5,6],[8,9,10]])\n",
117 "print(s)\n",
118 "show(s)\n",
119 "print(M)\n",
120 "show(M)\n",
121 "print(pi)\n",
122 "show(pi)"
123 ]
124 },
125 {
126 "cell_type": "markdown",
127 "metadata": {},
128 "source": [
129 "In a Jupyter notebook, the results above are displayed using [MathJax](https://www.mathjax.org/).\n",
130 "\n",
131 "If you are running this code in an interactive console (terminal) instead of a Jupyter notebook, you will get the Latex source code for those objects. You can force this behavior by using the `latex()` command."
132 ]
133 },
134 {
135 "cell_type": "markdown",
136 "metadata": {},
137 "source": [
138 "# The `latex()` command\n",
139 "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html)]\n",
140 "\n",
141 "This command is potentially very useful if you need to include the results of Sage computations in a Latex file, especially with complex objects like matrices or very large polynomials.\n",
142 "\n",
143 "Technically, this is a function that returns a string, so you need to `print()` it to see the result."
144 ]
145 },
146 {
147 "cell_type": "code",
148 "execution_count": 5,
149 "metadata": {},
150 "outputs": [
151 {
152 "name": "stdout",
153 "output_type": "stream",
154 "text": [
155 "1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n",
156 "\n",
157 "\n",
158 "\\left(\\begin{array}{rrr}\n",
159 "1 & 2 & 3 \\\\\n",
160 "4 & 5 & 6 \\\\\n",
161 "8 & 9 & 10\n",
162 "\\end{array}\\right)\n"
163 ]
164 }
165 ],
166 "source": [
167 "print(latex(s))\n",
168 "print(\"\\n\")\n",
169 "print(latex(M))"
170 ]
171 },
172 {
173 "cell_type": "markdown",
174 "metadata": {},
175 "source": [
176 "Interestingly, Sage can use matplotlib's PGF backend to generate Latex code for a plot. (PGF is the graphics language underlying TikZ, like TeX is the language underlying Latex)."
177 ]
178 },
179 {
180 "cell_type": "code",
181 "execution_count": 15,
182 "metadata": {},
183 "outputs": [],
184 "source": [
185 "#latex(plot(x^2)) # The output is more than 20 pages long"
186 ]
187 },
188 {
189 "cell_type": "markdown",
190 "metadata": {},
191 "source": [
192 "It is probably easier to just generate the picture and include that in your Latex document with `\\includegraphics`."
193 ]
194 },
195 {
196 "cell_type": "markdown",
197 "metadata": {},
198 "source": [
199 "## A Latex name for your variables\n",
200 "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html)]\n",
201 "\n",
202 "Sometimes you might want to use variables and functions that have, for example, a Greek letter as a name. You can tell Sage that you want them displayed this way when you declare them:"
203 ]
204 },
205 {
206 "cell_type": "code",
207 "execution_count": 16,
208 "metadata": {},
209 "outputs": [
210 {
211 "name": "stdout",
212 "output_type": "stream",
213 "text": [
214 "phi1(epsilon)\n"
215 ]
216 },
217 {
218 "data": {
219 "text/html": [
220 "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)</script></html>"
221 ],
222 "text/latex": [
223 "\\begin{math}\n",
224 "\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)\n",
225 "\\end{math}"
226 ],
227 "text/plain": [
228 "e^epsilon + phi1(epsilon)"
229 ]
230 },
231 "metadata": {},
232 "output_type": "display_data"
233 },
234 {
235 "data": {
236 "text/plain": [
237 "e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)"
238 ]
239 },
240 "execution_count": 16,
241 "metadata": {},
242 "output_type": "execute_result"
243 }
244 ],
245 "source": [
246 "var('epsilon', latex_name=\"\\\\varepsilon\")\n",
247 "function('phi1', latex_name=\"\\\\phi_1\")\n",
248 "\n",
249 "print(phi1(epsilon))\n",
250 "show(phi1(epsilon) + e^epsilon)\n",
251 "latex(phi1(epsilon) + e^epsilon)"
252 ]
253 },
254 {
255 "cell_type": "markdown",
256 "metadata": {},
257 "source": [
258 "**Warning:** You need to use two backspaces `\\\\`. The reason is that in Python (like in many other programming languages) the backslash symbol inside a string is used to print special characters, such as a newline `\\n`."
259 ]
260 },
261 {
262 "cell_type": "markdown",
263 "metadata": {},
264 "source": [
265 "# From Jupyter to Latex\n",
266 "**Reference:** [[4](https://nbconvert.readthedocs.io/en/latest/)]\n",
267 "\n",
268 "From the Jupyter menu `File > Download as` you can choose to download your work in many formats, among which there are also Latex and pdf. Personally I prefer downloading the .tex file, so then I can change the title, add an author name and make any other change I like before compiling it into a pdf file.\n",
269 "\n",
270 "If you choose to download the pdf file, you might need to install some extra packages. For example I had to install [`pandoc`](https://pandoc.org/), `texlive-XeTeX` and `texlive-Xdvi`, but this depends on your operating system and Latex distribution."
271 ]
272 },
273 {
274 "cell_type": "markdown",
275 "metadata": {},
276 "source": [
277 "# SageTex\n",
278 "**Reference:** [[5](https://doc.sagemath.org/html/en/tutorial/sagetex.html)]\n",
279 "\n",
280 "With SageTex it is possible to run Sage commands directly inside Latex, using the `\\sage{}` command. In this way you don't need to run your Sage code first and then copy the results in Latex. It can be useful especially for short Sage commands.\n",
281 "\n",
282 "You might need to take some extra steps to make this work on your system, see the link above."
283 ]
284 },
285 {
286 "cell_type": "markdown",
287 "metadata": {},
288 "source": [
289 "# The Latex `listings` package\n",
290 "**References:** [[6](https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings)] and [[7](https://ftp.snt.utwente.nl/pub/software/tex/macros/latex/contrib/listings/listings.pdf)]\n",
291 "\n",
292 "If you want to include some code (Sage, Python or anything else) in a Latex document you can use the listings package.\n",
293 "\n",
294 "```\n",
295 "\\usepackage{listings}\n",
296 "\n",
297 "...\n",
298 "\n",
299 "\\begin{lstlisting}[language=Python]\n",
300 "for i in range(0,100):\n",
301 " if i%5 == 0:\n",
302 " print(\"Multiple of 5!\")\n",
303 "\\end{lstlisting}\n",
304 "```\n",
305 "\n",
306 "You need to specify the language you are using with the `language=` option. This option can also be set at the beginning of the document using the `\\lstset{language=Python}` command.\n",
307 "\n",
308 "As an alternative, you can include a file directly without copying the code into the tex file, like you would do for a picture:\n",
309 "\n",
310 "```\n",
311 "\\lstinputlisting[language=Python]{file.py}\n",
312 "```\n",
313 "\n",
314 "It is technically possible to include Latex listings in a markdown cell of the Jupyter notebook using [this package](https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html), but it does not make much sense. So we will move to a Latex editor for the examples."
315 ]
316 },
317 {
318 "cell_type": "code",
319 "execution_count": null,
320 "metadata": {},
321 "outputs": [],
322 "source": []
323 }
324 ],
325 "metadata": {
326 "kernelspec": {
327 "display_name": "SageMath 9.2",
328 "language": "sage",
329 "name": "sagemath"
330 },
331 "language_info": {
332 "codemirror_mode": {
333 "name": "ipython",
334 "version": 3
335 },
336 "file_extension": ".py",
337 "mimetype": "text/x-python",
338 "name": "python",
339 "nbconvert_exporter": "python",
340 "pygments_lexer": "ipython3",
341 "version": "3.8.5"
342 }
343 },
344 "nbformat": 4,
345 "nbformat_minor": 4
346}
diff --git a/src/Lecture6/notebook/9-SageLatex.log b/src/Lecture6/notebook/9-SageLatex.log
new file mode 100644
index 0000000..ebe95af
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.log
@@ -0,0 +1,954 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/VoidLinux) (preloaded format=pdflatex 2021.4.20) 7 MAY 2021 18:09
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**9-SageLatex.tex
6(./9-SageLatex.tex
7LaTeX2e <2020-10-01> patch level 2
8L3 programming layer <2020-12-03> xparse <2020-03-03>
9(/usr/share/texmf-dist/tex/latex/base/article.cls
10Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
11(/usr/share/texmf-dist/tex/latex/base/size11.clo
12File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
13)
14\c@part=\count177
15\c@section=\count178
16\c@subsection=\count179
17\c@subsubsection=\count180
18\c@paragraph=\count181
19\c@subparagraph=\count182
20\c@figure=\count183
21\c@table=\count184
22\abovecaptionskip=\skip47
23\belowcaptionskip=\skip48
24\bibindent=\dimen138
25)
26(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty
27Package: tcolorbox 2020/10/09 version 4.42 text color boxes
28
29(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
30(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
31(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
32\pgfutil@everybye=\toks15
33\pgfutil@tempdima=\dimen139
34\pgfutil@tempdimb=\dimen140
35
36(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex))
37(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
38\pgfutil@abb=\box47
39)
40(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
41(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
42Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a)
43))
44Package: pgf 2020/12/01 v3.1.7a (3.1.7a)
45
46(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
47(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
48Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)
49
50(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
51Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
52\KV@toks@=\toks16
53)
54(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty
55Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)
56
57(/usr/share/texmf-dist/tex/latex/graphics/trig.sty
58Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
59)
60(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
61File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
62)
63Package graphics Info: Driver file: pdftex.def on input line 105.
64
65(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
66File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex
67))
68\Gin@req@height=\dimen141
69\Gin@req@width=\dimen142
70)
71(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
72(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
73Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a)
74
75(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
76\pgfkeys@pathtoks=\toks17
77\pgfkeys@temptoks=\toks18
78
79(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
80\pgfkeys@tmptoks=\toks19
81))
82\pgf@x=\dimen143
83\pgf@y=\dimen144
84\pgf@xa=\dimen145
85\pgf@ya=\dimen146
86\pgf@xb=\dimen147
87\pgf@yb=\dimen148
88\pgf@xc=\dimen149
89\pgf@yc=\dimen150
90\pgf@xd=\dimen151
91\pgf@yd=\dimen152
92\w@pgf@writea=\write3
93\r@pgf@reada=\read2
94\c@pgf@counta=\count185
95\c@pgf@countb=\count186
96\c@pgf@countc=\count187
97\c@pgf@countd=\count188
98\t@pgf@toka=\toks20
99\t@pgf@tokb=\toks21
100\t@pgf@tokc=\toks22
101\pgf@sys@id@count=\count189
102
103(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
104File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a)
105)
106Driver file for pgf: pgfsys-pdftex.def
107
108(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
109File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a)
110
111(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
112File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a)
113)))
114(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
115File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a)
116\pgfsyssoftpath@smallbuffer@items=\count190
117\pgfsyssoftpath@bigbuffer@items=\count191
118)
119(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
120File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a)
121))
122(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
123Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
124
125(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
126File: color.cfg 2016/01/02 v1.6 sample color configuration
127)
128Package xcolor Info: Driver file: pdftex.def on input line 225.
129Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
130Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
131Package xcolor Info: Model `RGB' extended on input line 1364.
132Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
133Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
134Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
135Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
136Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
137Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
138)
139(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
140Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a)
141
142(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
143(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
144(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
145(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
146\pgfmath@dimen=\dimen153
147\pgfmath@count=\count192
148\pgfmath@box=\box48
149\pgfmath@toks=\toks23
150\pgfmath@stack@operand=\toks24
151\pgfmath@stack@operation=\toks25
152)
153(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
154(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex)
155(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code
156.tex)
157(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex)
158(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te
159x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex)
160(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex)
161(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex)
162(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics
163.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
164\c@pgfmathroundto@lastzeros=\count193
165)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
166(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
167File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a)
168\pgf@picminx=\dimen154
169\pgf@picmaxx=\dimen155
170\pgf@picminy=\dimen156
171\pgf@picmaxy=\dimen157
172\pgf@pathminx=\dimen158
173\pgf@pathmaxx=\dimen159
174\pgf@pathminy=\dimen160
175\pgf@pathmaxy=\dimen161
176\pgf@xx=\dimen162
177\pgf@xy=\dimen163
178\pgf@yx=\dimen164
179\pgf@yy=\dimen165
180\pgf@zx=\dimen166
181\pgf@zy=\dimen167
182)
183(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
184File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a)
185\pgf@path@lastx=\dimen168
186\pgf@path@lasty=\dimen169
187) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
188File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
189\pgf@shorten@end@additional=\dimen170
190\pgf@shorten@start@additional=\dimen171
191)
192(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
193File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
194\pgfpic=\box49
195\pgf@hbox=\box50
196\pgf@layerbox@main=\box51
197\pgf@picture@serial@count=\count194
198)
199(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
200File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a)
201\pgflinewidth=\dimen172
202)
203(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t
204ex
205File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a)
206\pgf@pt@x=\dimen173
207\pgf@pt@y=\dimen174
208\pgf@pt@temp=\dimen175
209) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
210File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a)
211)
212(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
213File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a)
214)
215(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te
216x
217File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a)
218) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
219File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a)
220\pgfarrowsep=\dimen176
221)
222(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
223File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a)
224\pgf@max=\dimen177
225\pgf@sys@shading@range@num=\count195
226\pgf@shadingcount=\count196
227)
228(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
229File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a)
230
231(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
232File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a)
233\pgfexternal@startupbox=\box52
234))
235(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
236File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a)
237)
238(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
239File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a)
240) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
241File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a)
242)
243(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
244File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a)
245)))
246(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
247File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a)
248\pgfnodeparttextbox=\box53
249)
250(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
251File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a)
252)
253(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
254Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a)
255\pgf@nodesepstart=\dimen178
256\pgf@nodesepend=\dimen179
257)
258(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
259Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a)
260))
261(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty
262Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements
263\every@verbatim=\toks26
264\verbatim@line=\toks27
265\verbatim@in@stream=\read3
266)
267(/usr/share/texmf-dist/tex/latex/environ/environ.sty
268Package: environ 2014/05/04 v0.3 A new way to define environments
269
270(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty
271Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
272)
273\@envbody=\toks28
274)
275(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
276Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
277\etb@tempcnta=\count197
278)
279\tcb@titlebox=\box54
280\tcb@upperbox=\box55
281\tcb@lowerbox=\box56
282\tcb@phantombox=\box57
283\c@tcbbreakpart=\count198
284\c@tcblayer=\count199
285\c@tcolorbox@number=\count266
286\tcb@temp=\box58
287\tcb@temp=\box59
288\tcb@temp=\box60
289\tcb@temp=\box61
290\tcb@out=\write4
291\tcb@record@out=\write5
292
293(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex
294Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42'
295(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty
296Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO)
297
298(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
299Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO)
300)
301(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
302Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
303)
304(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty
305Package: iftex 2020/03/06 v1.0d TeX engine tests
306))
307Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23.
308\tcb@testbox=\box62
309\tcb@totalupperbox=\box63
310\tcb@totallowerbox=\box64
311))
312(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty
313Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments
314
315(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
316Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)
317
318(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
319Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
320)))
321(/usr/share/texmf-dist/tex/latex/base/fontenc.sty
322Package: fontenc 2020/08/10 v2.0s Standard LaTeX package
323)
324(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
325Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS)
326\symupright=\mathgroup4
327)
328(/usr/share/texmf-dist/tex/latex/caption/caption.sty
329Package: caption 2020/10/26 v3.5g Customizing captions (AR)
330
331(/usr/share/texmf-dist/tex/latex/caption/caption3.sty
332Package: caption3 2020/10/21 v2.2e caption3 kernel (AR)
333\captionmargin=\dimen180
334\captionmargin@=\dimen181
335\captionwidth=\dimen182
336\caption@tempdima=\dimen183
337\caption@indent=\dimen184
338\caption@parindent=\dimen185
339\caption@hangindent=\dimen186
340Package caption Info: Standard document class detected.
341)
342\c@caption@flags=\count267
343\c@continuedfloat=\count268
344)
345(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty
346Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...)
347
348(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty
349Package: xkeyval 2020/11/20 v2.8 package option processing (HA)
350
351(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex
352(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex
353\XKV@toks=\toks29
354\XKV@tempa@toks=\toks30
355)
356\XKV@depth=\count269
357File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
358))
359(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty
360Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back
361-ends (calc, etex, pgfmath)
362)
363(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty
364Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material
365
366(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty
367Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes
368\collectedbox=\box65
369)
370\tc@llx=\dimen187
371\tc@lly=\dimen188
372\tc@urx=\dimen189
373\tc@ury=\dimen190
374Package trimclip Info: Using driver 'tc-pdftex.def'.
375
376(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def
377File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex
378))
379\adjbox@Width=\dimen191
380\adjbox@Height=\dimen192
381\adjbox@Depth=\dimen193
382\adjbox@Totalheight=\dimen194
383\adjbox@pwidth=\dimen195
384\adjbox@pheight=\dimen196
385\adjbox@pdepth=\dimen197
386\adjbox@ptotalheight=\dimen198
387
388(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty
389Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection
390\c@checkoddpage=\count270
391)
392(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty
393Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages
394\@vwid@box=\box66
395\sift@deathcycles=\count271
396\@vwid@loff=\dimen199
397\@vwid@roff=\dimen256
398))
399(/usr/share/texmf-dist/tex/latex/float/float.sty
400Package: float 2001/11/08 v1.3d Float enhancements (AL)
401\c@float@type=\count272
402\float@exts=\toks31
403\float@box=\box67
404\@float@everytoks=\toks32
405\@floatcapt=\box68
406)
407(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty
408Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
409\@enLab=\toks33
410)
411(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
412Package: geometry 2020/01/02 v5.9 Page Geometry
413
414(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
415Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
416)
417\Gm@cnth=\count273
418\Gm@cntv=\count274
419\c@Gm@tempcnt=\count275
420\Gm@bindingoffset=\dimen257
421\Gm@wd@mp=\dimen258
422\Gm@odd@mp=\dimen259
423\Gm@even@mp=\dimen260
424\Gm@layoutwidth=\dimen261
425\Gm@layoutheight=\dimen262
426\Gm@layouthoffset=\dimen263
427\Gm@layoutvoffset=\dimen264
428\Gm@dimlist=\toks34
429)
430(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
431Package: amsmath 2020/09/23 v2.17i AMS math features
432\@mathmargin=\skip49
433
434For additional information on amsmath, use the `?' option.
435(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
436Package: amstext 2000/06/29 v2.01 AMS text
437
438(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
439File: amsgen.sty 1999/11/30 v2.0 generic functions
440\@emptytoks=\toks35
441\ex@=\dimen265
442))
443(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
444Package: amsbsy 1999/11/29 v1.2d Bold Symbols
445\pmbraise@=\dimen266
446)
447(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
448Package: amsopn 2016/03/08 v2.02 operator names
449)
450\inf@bad=\count276
451LaTeX Info: Redefining \frac on input line 234.
452\uproot@=\count277
453\leftroot@=\count278
454LaTeX Info: Redefining \overline on input line 399.
455\classnum@=\count279
456\DOTSCASE@=\count280
457LaTeX Info: Redefining \ldots on input line 496.
458LaTeX Info: Redefining \dots on input line 499.
459LaTeX Info: Redefining \cdots on input line 620.
460\Mathstrutbox@=\box69
461\strutbox@=\box70
462\big@size=\dimen267
463LaTeX Font Info: Redeclaring font encoding OML on input line 743.
464LaTeX Font Info: Redeclaring font encoding OMS on input line 744.
465\macc@depth=\count281
466\c@MaxMatrixCols=\count282
467\dotsspace@=\muskip16
468\c@parentequation=\count283
469\dspbrk@lvl=\count284
470\tag@help=\toks36
471\row@=\count285
472\column@=\count286
473\maxfields@=\count287
474\andhelp@=\toks37
475\eqnshift@=\dimen268
476\alignsep@=\dimen269
477\tagshift@=\dimen270
478\tagwidth@=\dimen271
479\totwidth@=\dimen272
480\lineht@=\dimen273
481\@envbody=\toks38
482\multlinegap=\skip50
483\multlinetaggap=\skip51
484\mathdisplay@stack=\toks39
485LaTeX Info: Redefining \[ on input line 2923.
486LaTeX Info: Redefining \] on input line 2924.
487)
488(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
489Package: amssymb 2013/01/14 v3.01 AMS font symbols
490
491(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
492Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
493\symAMSa=\mathgroup5
494\symAMSb=\mathgroup6
495LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
496LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
497(Font) U/euf/m/n --> U/euf/b/n on input line 106.
498))
499(/usr/share/texmf-dist/tex/latex/base/textcomp.sty
500Package: textcomp 2020/02/02 v2.0n Standard LaTeX package
501)
502(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty
503Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba
504tim
505)
506(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty
507Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro''
508\@eurobox=\box71
509)
510(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty
511Package: ucs 2013/05/11 v2.2 UCS: Unicode input support
512
513(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def
514File: uni-global.def 2013/05/13 UCS: Unicode global data
515)
516\uc@secondtry=\count288
517\uc@combtoks=\toks40
518\uc@combtoksb=\toks41
519\uc@temptokena=\toks42
520)
521(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
522Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv)
523\FV@CodeLineNo=\count289
524\FV@InFile=\read4
525\FV@TabBox=\box72
526\c@FancyVerbLine=\count290
527\FV@StepNumber=\count291
528\FV@OutFile=\write6
529)
530(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty
531Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac
532y)
533Package grffile Info: This package is an empty stub for compatibility on input
534line 40.
535)
536(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
537Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX
538
539(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
540Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO
541)
542Package pdftexcmds Info: \pdf@primitive is available.
543Package pdftexcmds Info: \pdf@ifprimitive is available.
544Package pdftexcmds Info: \pdfdraftmode found.
545)
546(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
547Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
548)
549(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
550Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
551)
552(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
553Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
554)
555(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
556Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
557)
558(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
559Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
560)
561\@linkdim=\dimen274
562\Hy@linkcounter=\count292
563\Hy@pagecounter=\count293
564
565(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
566File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO)
567Now handling font encoding PD1 ...
568... no UTF-8 mapping file for font encoding PD1
569)
570(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
571Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
572)
573(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty
574Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
575)
576\Hy@SavedSpaceFactor=\count294
577Package hyperref Info: Hyper figures OFF on input line 4464.
578Package hyperref Info: Link nesting OFF on input line 4469.
579Package hyperref Info: Hyper index ON on input line 4472.
580Package hyperref Info: Plain pages OFF on input line 4479.
581Package hyperref Info: Backreferencing OFF on input line 4484.
582Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
583Package hyperref Info: Bookmarks ON on input line 4717.
584\c@Hy@tempcnt=\count295
585
586(/usr/share/texmf-dist/tex/latex/url/url.sty
587\Urlmuskip=\muskip17
588Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
589)
590LaTeX Info: Redefining \url on input line 5076.
591\XeTeXLinkMargin=\dimen275
592
593(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty
594Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
595
596(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
597Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
598)
599))
600\Fld@menulength=\count296
601\Field@Width=\dimen276
602\Fld@charsize=\dimen277
603Package hyperref Info: Hyper figures OFF on input line 6347.
604Package hyperref Info: Link nesting OFF on input line 6352.
605Package hyperref Info: Hyper index ON on input line 6355.
606Package hyperref Info: backreferencing OFF on input line 6362.
607Package hyperref Info: Link coloring OFF on input line 6367.
608Package hyperref Info: Link coloring with OCG OFF on input line 6372.
609Package hyperref Info: PDF/A mode OFF on input line 6377.
610LaTeX Info: Redefining \ref on input line 6417.
611LaTeX Info: Redefining \pageref on input line 6421.
612
613(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty
614Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa
615ge
616with kernel methods
617)
618\Hy@abspage=\count297
619\c@Item=\count298
620\c@Hfootnote=\count299
621)
622Package hyperref Info: Driver (autodetected): hpdftex.
623
624(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
625File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX
626
627(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty
628Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag
629e
630with kernel methods
631)
632\Fld@listcount=\count300
633\c@bookmark@seq@number=\count301
634
635(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
636Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
637
638(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
639Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
640)
641Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
64286.
643)
644\Hy@SectionHShift=\skip52
645)
646(/usr/share/texmf-dist/tex/latex/titling/titling.sty
647Package: titling 2009/09/04 v2.1d maketitle typesetting
648\thanksmarkwidth=\skip53
649\thanksmargin=\skip54
650\droptitle=\skip55
651)
652(/usr/share/texmf-dist/tex/latex/tools/longtable.sty
653Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC)
654\LTleft=\skip56
655\LTright=\skip57
656\LTpre=\skip58
657\LTpost=\skip59
658\LTchunksize=\count302
659\LTcapwidth=\dimen278
660\LT@head=\box73
661\LT@firsthead=\box74
662\LT@foot=\box75
663\LT@lastfoot=\box76
664\LT@cols=\count303
665\LT@rows=\count304
666\c@LT@tables=\count305
667\c@LT@chunks=\count306
668\LT@p@ftn=\toks43
669)
670(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty
671Package: booktabs 2020/01/12 v1.61803398 Publication quality tables
672\heavyrulewidth=\dimen279
673\lightrulewidth=\dimen280
674\cmidrulewidth=\dimen281
675\belowrulesep=\dimen282
676\belowbottomsep=\dimen283
677\aboverulesep=\dimen284
678\abovetopsep=\dimen285
679\cmidrulesep=\dimen286
680\cmidrulekern=\dimen287
681\defaultaddspace=\dimen288
682\@cmidla=\count307
683\@cmidlb=\count308
684\@aboverulesep=\dimen289
685\@belowrulesep=\dimen290
686\@thisruleclass=\count309
687\@lastruleclass=\count310
688\@thisrulewidth=\dimen291
689)
690(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty
691Package: enumitem 2019/06/20 v3.9 Customized lists
692\labelindent=\skip60
693\enit@outerparindent=\dimen292
694\enit@toks=\toks44
695\enit@inbox=\box77
696\enit@count@id=\count311
697\enitdp@description=\count312
698)
699(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty
700\UL@box=\box78
701\UL@hyphenbox=\box79
702\UL@skip=\skip61
703\UL@hook=\toks45
704\UL@height=\dimen293
705\UL@pe=\count313
706\UL@pixel=\dimen294
707\ULC@box=\box80
708Package: ulem 2019/11/18
709\ULdepth=\dimen295
710)
711(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty
712Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk)
713\symrsfs=\mathgroup7
714)
715\Wrappedcontinuationbox=\box81
716\Wrappedvisiblespacebox=\box82
717Package hyperref Info: Option `breaklinks' set `true' on input line 361.
718Package hyperref Info: Option `colorlinks' set `true' on input line 361.
719LaTeX Font Info: Trying to load font information for T1+ppl on input line 36
7208.
721
722(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
723File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
724)
725(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
726File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX)
727\l__kernel_color_stack_int=\count314
728\l__pdf_internal_box=\box83
729)
730(./9-SageLatex.aux)
731\openout1 = `9-SageLatex.aux'.
732
733LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 368.
734LaTeX Font Info: ... okay on input line 368.
735LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 368.
736LaTeX Font Info: ... okay on input line 368.
737LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 368.
738LaTeX Font Info: ... okay on input line 368.
739LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 368.
740LaTeX Font Info: ... okay on input line 368.
741LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 368.
742LaTeX Font Info: ... okay on input line 368.
743LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 368.
744LaTeX Font Info: ... okay on input line 368.
745LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 368.
746LaTeX Font Info: ... okay on input line 368.
747LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 368.
748LaTeX Font Info: ... okay on input line 368.
749 (/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
750[Loading MPS to PDF converter (version 2006.09.02).]
751\scratchcounter=\count315
752\scratchdimen=\dimen296
753\scratchbox=\box84
754\nofMPsegments=\count316
755\nofMParguments=\count317
756\everyMPshowfont=\toks46
757\MPscratchCnt=\count318
758\MPscratchDim=\dimen297
759\MPnumerator=\count319
760\makeMPintoPDFobject=\count320
761\everyMPtoPDFconversion=\toks47
762) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
763Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
764Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
76585.
766
767(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
768File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
769e
770))
771Package caption Info: Begin \AtBeginDocument code.
772Package caption Info: float package is loaded.
773Package caption Info: hyperref package is loaded.
774Package caption Info: longtable package is loaded.
775
776(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty
777Package: ltcaption 2020/05/30 v1.4b longtable captions (AR)
778)
779Package caption Info: End \AtBeginDocument code.
780
781*geometry* driver: auto-detecting
782*geometry* detected driver: pdftex
783*geometry* verbose mode - [ preamble ] result:
784* driver: pdftex
785* paper: <default>
786* layout: <same size as paper>
787* layoutoffset:(h,v)=(0.0pt,0.0pt)
788* modes:
789* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)
790* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)
791* \paperwidth=614.295pt
792* \paperheight=794.96999pt
793* \textwidth=469.75502pt
794* \textheight=650.43001pt
795* \oddsidemargin=0.0pt
796* \evensidemargin=0.0pt
797* \topmargin=-37.0pt
798* \headheight=12.0pt
799* \headsep=25.0pt
800* \topskip=11.0pt
801* \footskip=30.0pt
802* \marginparwidth=59.0pt
803* \marginparsep=10.0pt
804* \columnsep=10.0pt
805* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
806* \hoffset=0.0pt
807* \voffset=0.0pt
808* \mag=1000
809* \@twocolumnfalse
810* \@twosidefalse
811* \@mparswitchfalse
812* \@reversemarginfalse
813* (1in=72.27pt=25.4mm, 1cm=28.453pt)
814
815(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def
816File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3
817)
818Package hyperref Info: Link coloring ON on input line 368.
819
820(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
821Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
822
823(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty
824Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
825)
826(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
827Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
828)
829\c@section@level=\count321
830)
831LaTeX Info: Redefining \ref on input line 368.
832LaTeX Info: Redefining \pageref on input line 368.
833LaTeX Info: Redefining \nameref on input line 368.
834
835(./9-SageLatex.out) (./9-SageLatex.out)
836\@outlinefile=\write7
837\openout7 = `9-SageLatex.out'.
838
839LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3
84070.
841
842(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
843File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
844)
845LaTeX Font Info: Trying to load font information for OML+zplm on input line
846370.
847
848(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
849File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
850)
851LaTeX Font Info: Trying to load font information for OMS+zplm on input line
852370.
853
854(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd
855File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
856)
857LaTeX Font Info: Trying to load font information for OMX+zplm on input line
858370.
859
860(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
861File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
862)
863LaTeX Font Info: Trying to load font information for OT1+zplm on input line
864370.
865
866(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
867File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
868)
869LaTeX Font Info: Font shape `U/msa/m/n' will be
870(Font) scaled to size 12.50409pt on input line 370.
871LaTeX Font Info: Font shape `U/msa/m/n' will be
872(Font) scaled to size 9.37807pt on input line 370.
873LaTeX Font Info: Font shape `U/msa/m/n' will be
874(Font) scaled to size 7.29405pt on input line 370.
875LaTeX Font Info: Font shape `U/msb/m/n' will be
876(Font) scaled to size 12.50409pt on input line 370.
877LaTeX Font Info: Font shape `U/msb/m/n' will be
878(Font) scaled to size 9.37807pt on input line 370.
879LaTeX Font Info: Font shape `U/msb/m/n' will be
880(Font) scaled to size 7.29405pt on input line 370.
881LaTeX Font Info: Trying to load font information for U+rsfs on input line 37
8820.
883
884(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd
885File: ursfs.fd 1998/03/24 rsfs font definition file (jk)
886)
887LaTeX Font Info: Trying to load font information for T1+cmtt on input line 3
88870.
889
890(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd
891File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
892)
893LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <14.4> not available
894(Font) Font shape `T1/cmtt/m/n' tried instead on input line 386.
895LaTeX Font Info: Font shape `U/msa/m/n' will be
896(Font) scaled to size 6.25204pt on input line 402.
897LaTeX Font Info: Font shape `U/msa/m/n' will be
898(Font) scaled to size 5.21004pt on input line 402.
899LaTeX Font Info: Font shape `U/msb/m/n' will be
900(Font) scaled to size 6.25204pt on input line 402.
901LaTeX Font Info: Font shape `U/msb/m/n' will be
902(Font) scaled to size 5.21004pt on input line 402.
903LaTeX Font Info: Font shape `U/msa/m/n' will be
904(Font) scaled to size 11.40997pt on input line 418.
905LaTeX Font Info: Font shape `U/msa/m/n' will be
906(Font) scaled to size 8.33606pt on input line 418.
907LaTeX Font Info: Font shape `U/msb/m/n' will be
908(Font) scaled to size 11.40997pt on input line 418.
909LaTeX Font Info: Font shape `U/msb/m/n' will be
910(Font) scaled to size 8.33606pt on input line 418.
911 [1
912
913{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
914LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available
915(Font) Font shape `T1/cmtt/m/n' tried instead on input line 473.
916LaTeX Font Info: Trying to load font information for TS1+cmtt on input line
917517.
918 (/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd
919File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions
920) [2] [3] [4] (./9-SageLatex.aux)
921Package rerunfilecheck Info: File `9-SageLatex.out' has not changed.
922(rerunfilecheck) Checksum: A41656EED8025F02B8135E03FFA75587;350.
923
924
925LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
926
927 )
928Here is how much of TeX's memory you used:
929 21220 strings out of 479383
930 386846 string characters out of 5875798
931 697645 words of memory out of 5000000
932 37852 multiletter control sequences out of 15000+600000
933 439695 words of font info for 120 fonts, out of 8000000 for 9000
934 1141 hyphenation exceptions out of 8191
935 107i,8n,111p,504b,595s stack positions out of 5000i,500n,10000p,200000b,80000s
936{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/
937texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/usr/share/texmf-dist/font
938s/enc/dvips/base/8r.enc}</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c
939mex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr
940/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-d
941ist/fonts/type1/public/mathpazo/fplmri.pfb></usr/share/texmf-dist/fonts/type1/p
942ublic/cm-super/sfit1095.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/
943sftt1095.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sftt1200.pfb></
944usr/share/texmf-dist/fonts/type1/public/cm-super/sftt1440.pfb></usr/share/texmf
945-dist/fonts/type1/urw/palatino/uplb8a.pfb></usr/share/texmf-dist/fonts/type1/ur
946w/palatino/uplr8a.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplri8a.p
947fb>
948Output written on 9-SageLatex.pdf (4 pages, 183997 bytes).
949PDF statistics:
950 122 PDF objects out of 1000 (max. 8388607)
951 103 compressed objects within 2 object streams
952 17 named destinations out of 1000 (max. 500000)
953 61 words of extra memory for PDF output out of 10000 (max. 10000000)
954
diff --git a/src/Lecture6/notebook/9-SageLatex.out b/src/Lecture6/notebook/9-SageLatex.out
new file mode 100644
index 0000000..34ef397
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.out
@@ -0,0 +1,6 @@
1\BOOKMARK [1][-]{section.1}{The show\(\) command}{}% 1
2\BOOKMARK [1][-]{section.2}{The latex\(\) command}{}% 2
3\BOOKMARK [2][-]{subsection.2.1}{A Latex name for your variables}{section.2}% 3
4\BOOKMARK [1][-]{section.3}{From Jupyter to Latex}{}% 4
5\BOOKMARK [1][-]{section.4}{SageTex}{}% 5
6\BOOKMARK [1][-]{section.5}{The Latex listings package}{}% 6
diff --git a/src/Lecture6/notebook/9-SageLatex.pdf b/src/Lecture6/notebook/9-SageLatex.pdf
new file mode 100644
index 0000000..3f81775
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.pdf
Binary files differ
diff --git a/src/Lecture6/notebook/9-SageLatex.tex b/src/Lecture6/notebook/9-SageLatex.tex
new file mode 100644
index 0000000..ad59b25
--- /dev/null
+++ b/src/Lecture6/notebook/9-SageLatex.tex
@@ -0,0 +1,634 @@
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{Sage and Latex interaction}
150 \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}}
151 \date{2021-05-07}
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 It can happen that you need to include the results of your Sage
376computations and/or Sage code inside a LaTeX document. Luckily Sage
377provides some functions to translate its objects into LaTeX, and the
378listings package for LaTeX can be used to include any code (Sage, Python
379or any other language) in a LaTeX document.
380
381In this document we will describe some of these interactions between
382LaTeX and Sage.
383
384 \hypertarget{the-show-command}{%
385\section{\texorpdfstring{The \texttt{show()}
386command}{The show() command}}\label{the-show-command}}
387
388\textbf{Reference:}
389{[}\href{https://doc.sagemath.org/html/en/reference/repl/sage/repl/display/pretty_print.html}{1}{]}
390(\texttt{show()} is just an alternative name for
391\texttt{pretty\_print()}).
392
393With this command Sage will generate a picture displaying the object.
394The result depends on the object itself: most of them will be typeset in
395Latex, but for example graphics primitives (such as plots) will be
396displayed as pictures.
397
398You can see it as an alternative to \texttt{print()}.
399
400 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
401\prompt{In}{incolor}{4}{\boxspacing}
402\begin{Verbatim}[commandchars=\\\{\}]
403\PY{n}{s} \PY{o}{=} \PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{x}\PY{p}{)}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{4}\PY{p}{)}
404\PY{n}{M} \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}{4}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{,}\PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,}\PY{p}{[}\PY{l+m+mi}{8}\PY{p}{,}\PY{l+m+mi}{9}\PY{p}{,}\PY{l+m+mi}{10}\PY{p}{]}\PY{p}{]}\PY{p}{)}
405\PY{n+nb}{print}\PY{p}{(}\PY{n}{s}\PY{p}{)}
406\PY{n}{show}\PY{p}{(}\PY{n}{s}\PY{p}{)}
407\PY{n+nb}{print}\PY{p}{(}\PY{n}{M}\PY{p}{)}
408\PY{n}{show}\PY{p}{(}\PY{n}{M}\PY{p}{)}
409\PY{n+nb}{print}\PY{p}{(}\PY{n}{pi}\PY{p}{)}
410\PY{n}{show}\PY{p}{(}\PY{n}{pi}\PY{p}{)}
411\end{Verbatim}
412\end{tcolorbox}
413
414 \begin{Verbatim}[commandchars=\\\{\}]
4151 + 1*x + 1/2*x\^{}2 + 1/6*x\^{}3 + Order(x\^{}4)
416 \end{Verbatim}
417
418 \begin{math}
419\newcommand{\Bold}[1]{\mathbf{#1}}1 + 1 x + \frac{1}{2} x^{2} + \frac{1}{6} x^{3} + \mathcal{O}\left(x^{4}\right)
420\end{math}
421
422
423 \begin{Verbatim}[commandchars=\\\{\}]
424[ 1 2 3]
425[ 4 5 6]
426[ 8 9 10]
427 \end{Verbatim}
428
429 \begin{math}
430\newcommand{\Bold}[1]{\mathbf{#1}}\left(\begin{array}{rrr}
4311 & 2 & 3 \\
4324 & 5 & 6 \\
4338 & 9 & 10
434\end{array}\right)
435\end{math}
436
437
438 \begin{Verbatim}[commandchars=\\\{\}]
439pi
440 \end{Verbatim}
441
442 \begin{math}
443\newcommand{\Bold}[1]{\mathbf{#1}}\pi
444\end{math}
445
446
447 In a Jupyter notebook, the results above are displayed using
448\href{https://www.mathjax.org/}{MathJax}.
449
450If you are running this code in an interactive console (terminal)
451instead of a Jupyter notebook, you will get the Latex source code for
452those objects. You can force this behavior by using the \texttt{latex()}
453command.
454
455 \hypertarget{the-latex-command}{%
456\section{\texorpdfstring{The \texttt{latex()}
457command}{The latex() command}}\label{the-latex-command}}
458
459\textbf{Reference:}
460{[}\href{https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html}{2}{]}
461
462This command is potentially very useful if you need to include the
463results of Sage computations in a Latex file, especially with complex
464objects like matrices or very large polynomials.
465
466Technically, this is a function that returns a string, so you need to
467\texttt{print()} it to see the result.
468
469 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
470\prompt{In}{incolor}{5}{\boxspacing}
471\begin{Verbatim}[commandchars=\\\{\}]
472\PY{n+nb}{print}\PY{p}{(}\PY{n}{latex}\PY{p}{(}\PY{n}{s}\PY{p}{)}\PY{p}{)}
473\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
474\PY{n+nb}{print}\PY{p}{(}\PY{n}{latex}\PY{p}{(}\PY{n}{M}\PY{p}{)}\PY{p}{)}
475\end{Verbatim}
476\end{tcolorbox}
477
478 \begin{Verbatim}[commandchars=\\\{\}]
4791 + 1 x + \textbackslash{}frac\{1\}\{2\} x\^{}\{2\} + \textbackslash{}frac\{1\}\{6\} x\^{}\{3\} + \textbackslash{}mathcal\{O\}\textbackslash{}left(x\^{}\{4\}\textbackslash{}right)
480
481
482\textbackslash{}left(\textbackslash{}begin\{array\}\{rrr\}
4831 \& 2 \& 3 \textbackslash{}\textbackslash{}
4844 \& 5 \& 6 \textbackslash{}\textbackslash{}
4858 \& 9 \& 10
486\textbackslash{}end\{array\}\textbackslash{}right)
487 \end{Verbatim}
488
489 Interestingly, Sage can use matplotlib's PGF backend to generate Latex
490code for a plot. (PGF is the graphics language underlying TikZ, like TeX
491is the language underlying Latex).
492
493 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
494\prompt{In}{incolor}{15}{\boxspacing}
495\begin{Verbatim}[commandchars=\\\{\}]
496\PY{c+c1}{\PYZsh{}latex(plot(x\PYZca{}2)) \PYZsh{} The output is more than 20 pages long}
497\end{Verbatim}
498\end{tcolorbox}
499
500 It is probably easier to just generate the picture and include that in
501your Latex document with \texttt{\textbackslash{}includegraphics}.
502
503 \hypertarget{a-latex-name-for-your-variables}{%
504\subsection{A Latex name for your
505variables}\label{a-latex-name-for-your-variables}}
506
507\textbf{Reference:}
508{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html}{3}{]}
509
510Sometimes you might want to use variables and functions that have, for
511example, a Greek letter as a name. You can tell Sage that you want them
512displayed this way when you declare them:
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}{epsilon}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{n}{latex\PYZus{}name}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}\PYZbs{}}\PY{l+s+s2}{varepsilon}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
518\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{phi1}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{n}{latex\PYZus{}name}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}\PYZbs{}}\PY{l+s+s2}{phi\PYZus{}1}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)}
519
520\PY{n+nb}{print}\PY{p}{(}\PY{n}{phi1}\PY{p}{(}\PY{n}{epsilon}\PY{p}{)}\PY{p}{)}
521\PY{n}{show}\PY{p}{(}\PY{n}{phi1}\PY{p}{(}\PY{n}{epsilon}\PY{p}{)} \PY{o}{+} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{epsilon}\PY{p}{)}
522\PY{n}{latex}\PY{p}{(}\PY{n}{phi1}\PY{p}{(}\PY{n}{epsilon}\PY{p}{)} \PY{o}{+} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{epsilon}\PY{p}{)}
523\end{Verbatim}
524\end{tcolorbox}
525
526 \begin{Verbatim}[commandchars=\\\{\}]
527phi1(epsilon)
528 \end{Verbatim}
529
530 \begin{math}
531\newcommand{\Bold}[1]{\mathbf{#1}}e^{{\varepsilon}} + \phi_1\left({\varepsilon}\right)
532\end{math}
533
534
535 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0]
536\prompt{Out}{outcolor}{16}{\boxspacing}
537\begin{Verbatim}[commandchars=\\\{\}]
538e\^{}\{\{\textbackslash{}varepsilon\}\} + \textbackslash{}phi\_1\textbackslash{}left(\{\textbackslash{}varepsilon\}\textbackslash{}right)
539\end{Verbatim}
540\end{tcolorbox}
541
542 \textbf{Warning:} You need to use two backspaces
543\texttt{\textbackslash{}\textbackslash{}}. The reason is that in Python
544(like in many other programming languages) the backslash symbol inside a
545string is used to print special characters, such as a newline
546\texttt{\textbackslash{}n}.
547
548 \hypertarget{from-jupyter-to-latex}{%
549\section{From Jupyter to Latex}\label{from-jupyter-to-latex}}
550
551\textbf{Reference:}
552{[}\href{https://nbconvert.readthedocs.io/en/latest/}{4}{]}
553
554From the Jupyter menu \texttt{File\ \textgreater{}\ Download\ as} you
555can choose to download your work in many formats, among which there are
556also Latex and pdf. Personally I prefer downloading the .tex file, so
557then I can change the title, add an author name and make any other
558change I like before compiling it into a pdf file.
559
560If you choose to download the pdf file, you might need to install some
561extra packages. For example I had to install
562\href{https://pandoc.org/}{\texttt{pandoc}}, \texttt{texlive-XeTeX} and
563\texttt{texlive-Xdvi}, but this depends on your operating system and
564Latex distribution.
565
566 \hypertarget{sagetex}{%
567\section{SageTex}\label{sagetex}}
568
569\textbf{Reference:}
570{[}\href{https://doc.sagemath.org/html/en/tutorial/sagetex.html}{5}{]}
571
572With SageTex it is possible to run Sage commands directly inside Latex,
573using the \texttt{\textbackslash{}sage\{\}} command. In this way you
574don't need to run your Sage code first and then copy the results in
575Latex. It can be useful especially for short Sage commands.
576
577You might need to take some extra steps to make this work on your
578system, see the link above.
579
580 \hypertarget{the-latex-listings-package}{%
581\section{\texorpdfstring{The Latex \texttt{listings}
582package}{The Latex listings package}}\label{the-latex-listings-package}}
583
584\textbf{References:}
585{[}\href{https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings}{6}{]}
586and
587{[}\href{https://ftp.snt.utwente.nl/pub/software/tex/macros/latex/contrib/listings/listings.pdf}{7}{]}
588
589If you want to include some code (Sage, Python or anything else) in a
590Latex document you can use the listings package.
591
592\begin{verbatim}
593\usepackage{listings}
594
595...
596
597\begin{lstlisting}[language=Python]
598for i in range(0,100):
599 if i%5 == 0:
600 print("Multiple of 5!")
601\end{lstlisting}
602\end{verbatim}
603
604You need to specify the language you are using with the
605\texttt{language=} option. This option can also be set at the beginning
606of the document using the
607\texttt{\textbackslash{}lstset\{language=Python\}} command.
608
609As an alternative, you can include a file directly without copying the
610code into the tex file, like you would do for a picture:
611
612\begin{verbatim}
613\lstinputlisting[language=Python]{file.py}
614\end{verbatim}
615
616It is technically possible to include Latex listings in a markdown cell
617of the Jupyter notebook using
618\href{https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html}{this
619package}, but it does not make much sense. So we will move to a Latex
620editor for the examples.
621
622 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder]
623\prompt{In}{incolor}{ }{\boxspacing}
624\begin{Verbatim}[commandchars=\\\{\}]
625
626\end{Verbatim}
627\end{tcolorbox}
628
629
630 % Add a bibliography block to the postdoc
631
632
633
634\end{document}
diff --git a/src/Lecture6/notebook/output_75_0.png b/src/Lecture6/notebook/output_75_0.png
new file mode 100644
index 0000000..72089d8
--- /dev/null
+++ b/src/Lecture6/notebook/output_75_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_77_0.png b/src/Lecture6/notebook/output_77_0.png
new file mode 100644
index 0000000..28dbdee
--- /dev/null
+++ b/src/Lecture6/notebook/output_77_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_80_0.png b/src/Lecture6/notebook/output_80_0.png
new file mode 100644
index 0000000..7009f70
--- /dev/null
+++ b/src/Lecture6/notebook/output_80_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_82_0.png b/src/Lecture6/notebook/output_82_0.png
new file mode 100644
index 0000000..d20de74
--- /dev/null
+++ b/src/Lecture6/notebook/output_82_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_84_0.png b/src/Lecture6/notebook/output_84_0.png
new file mode 100644
index 0000000..e0508ae
--- /dev/null
+++ b/src/Lecture6/notebook/output_84_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_86_0.png b/src/Lecture6/notebook/output_86_0.png
new file mode 100644
index 0000000..a8ddcc5
--- /dev/null
+++ b/src/Lecture6/notebook/output_86_0.png
Binary files differ
diff --git a/src/Lecture6/notebook/output_88_0.png b/src/Lecture6/notebook/output_88_0.png
new file mode 100644
index 0000000..259045d
--- /dev/null
+++ b/src/Lecture6/notebook/output_88_0.png
Binary files differ
diff --git a/src/Lecture7/notebook/X1-ComputationalComplexity-notebook.ipynb b/src/Lecture7/notebook/X1-ComputationalComplexity-notebook.ipynb
new file mode 100644
index 0000000..18be171
--- /dev/null
+++ b/src/Lecture7/notebook/X1-ComputationalComplexity-notebook.ipynb
@@ -0,0 +1,412 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Nested loops\n",
8 "\n",
9 "The following two functions compute sum and product of matrices, respectively.\n",
10 "\n",
11 "By counting the nested loops it is easy to see that `add()` is $O(n^2)$ while `prod()` is $O(n^3)$."
12 ]
13 },
14 {
15 "cell_type": "code",
16 "execution_count": 3,
17 "metadata": {},
18 "outputs": [
19 {
20 "name": "stdout",
21 "output_type": "stream",
22 "text": [
23 "Time for add: 0.01961983600000039\n",
24 "Time for prod: 11.278560734\n"
25 ]
26 }
27 ],
28 "source": [
29 "from random import randint\n",
30 "import time\n",
31 "\n",
32 "def add(A, B):\n",
33 " S = [[0] * len(A) for i in range(len(A))]\n",
34 " for i in range(len(A)):\n",
35 " for j in range(len(A)):\n",
36 " S[i][j] = A[i][j] + B[i][j]\n",
37 " return S\n",
38 "\n",
39 "def prod(A, B):\n",
40 " S = [[0] * len(A) for i in range(len(A))]\n",
41 " for i in range(len(A)):\n",
42 " for j in range(len(A)):\n",
43 " for k in range(len(A)):\n",
44 " S[i][j] = S[i][j] + A[i][k] * B[k][j]\n",
45 " return S\n",
46 "\n",
47 "N = 400\n",
48 "A = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n",
49 "B = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n",
50 "\n",
51 "t0 = time.process_time()\n",
52 "add(A,B)\n",
53 "t1 = time.process_time()\n",
54 "prod(A,B)\n",
55 "t2 = time.process_time()\n",
56 "\n",
57 "print(\"Time for add: \", t1-t0)\n",
58 "print(\"Time for prod:\", t2-t1)"
59 ]
60 },
61 {
62 "cell_type": "markdown",
63 "metadata": {},
64 "source": [
65 "# Sorting a list, slow version\n",
66 "\n",
67 "The following code implements a slow version of the so-called *insertion sort* alogithm\n",
68 "\n",
69 "Complexity: $O(n^2)$."
70 ]
71 },
72 {
73 "cell_type": "code",
74 "execution_count": 7,
75 "metadata": {},
76 "outputs": [
77 {
78 "name": "stdout",
79 "output_type": "stream",
80 "text": [
81 "Running time: 1.2679741750000009\n"
82 ]
83 }
84 ],
85 "source": [
86 "from random import randint\n",
87 "import time\n",
88 "\n",
89 "def correct_position(e, S):\n",
90 " for i in range(len(S)):\n",
91 " if S[i] > e:\n",
92 " return i\n",
93 " return len(S)\n",
94 "\n",
95 "def sort_list(L):\n",
96 " S = []\n",
97 " for e in L:\n",
98 " cp = correct_position(e, S)\n",
99 " S.insert(cp, e)\n",
100 " return S\n",
101 "\n",
102 "N = 10000\n",
103 "L = [randint(0,10**9) for i in range(N)]\n",
104 "\n",
105 "t0 = time.process_time()\n",
106 "sort_list(L)\n",
107 "#L.sort()\n",
108 "t1 = time.process_time()\n",
109 "\n",
110 "print(\"Running time:\", t1-t0)"
111 ]
112 },
113 {
114 "cell_type": "markdown",
115 "metadata": {},
116 "source": [
117 "# Binary search\n",
118 "\n",
119 "The following code implements a binary search.\n",
120 "\n",
121 "Complexity: $O(\\log_2(n))$"
122 ]
123 },
124 {
125 "cell_type": "code",
126 "execution_count": 8,
127 "metadata": {},
128 "outputs": [
129 {
130 "name": "stdout",
131 "output_type": "stream",
132 "text": [
133 "The correct position of e = 36132116 in L is:\n",
134 "... 36130178 36131096 e 36132160 36132386 ...\n",
135 "\n",
136 "Time for sorting: 0.4964379069999971\n",
137 "Time for searching: 0.00012017000000241751\n"
138 ]
139 }
140 ],
141 "source": [
142 "from random import randint\n",
143 "import time\n",
144 "\n",
145 "def binary_search(e, S, start, end):\n",
146 " if start == end:\n",
147 " return start\n",
148 " midpoint = (start+end) // 2\n",
149 " if e < S[midpoint]:\n",
150 " return binary_search(e, S, start, midpoint)\n",
151 " else:\n",
152 " return binary_search(e, S, midpoint+1, end)\n",
153 " \n",
154 "N = 1000000\n",
155 "L = [randint(0,10**9) for i in range(N)]\n",
156 "e = randint(0,10**9)\n",
157 "\n",
158 "t0 = time.process_time()\n",
159 "L.sort() # Using Python's sort()\n",
160 "t1 = time.process_time()\n",
161 "i = binary_search(e, L, 0, len(L))\n",
162 "t2 = time.process_time()\n",
163 "print(\"The correct position of e =\", e, \"in L is:\")\n",
164 "print(\"...\", L[i-2], L[i-1], \"e\", L[i], L[i+1], \"...\")\n",
165 "print(\"\")\n",
166 "print(\"Time for sorting: \", t1-t0)\n",
167 "print(\"Time for searching:\", t2-t1)\n"
168 ]
169 },
170 {
171 "cell_type": "markdown",
172 "metadata": {},
173 "source": [
174 "# Sorting a list, fast version (with binary_search)\n",
175 "\n",
176 "The following code uses the function `binary_search()` above instead of `correct_position()` in our insertion sort algorithm.\n",
177 "\n",
178 "Complexity: $O(n\\log_2(n))$"
179 ]
180 },
181 {
182 "cell_type": "code",
183 "execution_count": 11,
184 "metadata": {},
185 "outputs": [
186 {
187 "name": "stdout",
188 "output_type": "stream",
189 "text": [
190 "Running time: 1.5683504970000008\n"
191 ]
192 }
193 ],
194 "source": [
195 "from random import randint\n",
196 "import time\n",
197 "\n",
198 "def binary_search(e, S, start, end):\n",
199 " if start == end:\n",
200 " return start\n",
201 " midpoint = (start+end) // 2\n",
202 " if e < S[midpoint]:\n",
203 " return binary_search(e, S, start, midpoint)\n",
204 " else:\n",
205 " return binary_search(e, S, midpoint+1, end)\n",
206 " \n",
207 "def sort_list(L):\n",
208 " S = []\n",
209 " for e in L:\n",
210 " cp = binary_search(e, S, 0, len(S)) # Changed here\n",
211 " S.insert(cp, e)\n",
212 " return S\n",
213 " \n",
214 "N = 100000\n",
215 "L = [randint(0,10**9) for i in range(N)]\n",
216 "\n",
217 "t0 = time.process_time()\n",
218 "sort_list(L)\n",
219 "t1 = time.process_time()\n",
220 "\n",
221 "print(\"Running time:\", t1-t0)"
222 ]
223 },
224 {
225 "cell_type": "markdown",
226 "metadata": {},
227 "source": [
228 "# Fast exponentiation\n",
229 "\n",
230 "The following cell contains two functions for computing $a^n$ ($n$ non-negative integer): a slow one that runs in $O(n)$ and a fast one that runs in $O(\\log_2(n))$. We compare these two also with Python's built-in operator `**`.\n",
231 "\n",
232 "Complexity: $O(n)$ for the slow algorithm, $O(\\log_2(n))$ for the other two."
233 ]
234 },
235 {
236 "cell_type": "code",
237 "execution_count": 14,
238 "metadata": {},
239 "outputs": [
240 {
241 "name": "stdout",
242 "output_type": "stream",
243 "text": [
244 "2.71828179834636\n",
245 "2.7182817863957984\n",
246 "2.7182817983473577\n",
247 "Time for slow_power(): 3.5567659670000005\n",
248 "Time for fast_power(): 0.00014241699999928414\n",
249 "Time for Python's **: 9.477100000054861e-05\n"
250 ]
251 }
252 ],
253 "source": [
254 "import time\n",
255 "\n",
256 "def slow_power(a, n):\n",
257 " r = 1\n",
258 " for i in range(n):\n",
259 " r = r * a\n",
260 " return r\n",
261 "\n",
262 "def fast_power(a, n):\n",
263 " if n == 0:\n",
264 " return 1\n",
265 " if n%2 == 0:\n",
266 " return fast_power(a*a, n//2)\n",
267 " else:\n",
268 " return a * fast_power(a, n-1)\n",
269 "\n",
270 "a = 1.00000001\n",
271 "n = 100000000\n",
272 "\n",
273 "t0 = time.process_time()\n",
274 "print(slow_power(a, n))\n",
275 "t1 = time.process_time()\n",
276 "print(fast_power(a, n))\n",
277 "t2 = time.process_time()\n",
278 "print(a**n)\n",
279 "t3 = time.process_time()\n",
280 "\n",
281 "print(\"Time for slow_power():\", t1-t0)\n",
282 "print(\"Time for fast_power():\", t2-t1)\n",
283 "print(\"Time for Python's **: \", t3-t2)"
284 ]
285 },
286 {
287 "cell_type": "markdown",
288 "metadata": {},
289 "source": [
290 "# Fast gcd\n",
291 "\n",
292 "Complexity: $O(\\log_2(n))$"
293 ]
294 },
295 {
296 "cell_type": "code",
297 "execution_count": 15,
298 "metadata": {},
299 "outputs": [
300 {
301 "name": "stdout",
302 "output_type": "stream",
303 "text": [
304 "126\n",
305 "Running time: 0.0002987290000007192\n"
306 ]
307 }
308 ],
309 "source": [
310 "import time\n",
311 "\n",
312 "def gcd(a, b):\n",
313 " if b == 0:\n",
314 " return a\n",
315 " else:\n",
316 " return gcd(b, a%b)\n",
317 "\n",
318 "t0 = time.process_time()\n",
319 "print(gcd(155275387236018, 572335397352432))\n",
320 "t1 = time.process_time()\n",
321 "\n",
322 "print(\"Running time:\", t1-t0)"
323 ]
324 },
325 {
326 "cell_type": "markdown",
327 "metadata": {},
328 "source": [
329 "# Fibonacci numbers\n",
330 "\n",
331 "In the following cell there are two functions that compute the $n$-th Fibonacci number. They are almost the same, but the second one memorizes the results in a list to avoid computing them multiple times, and it is much much faster.\n",
332 "\n",
333 "Complexity: $O\\left(\\left(\\frac{1+\\sqrt 5}{2}\\right)^n\\right)\\sim O(1.6^n)$ for the slow version, $O(n)$ for the fast version."
334 ]
335 },
336 {
337 "cell_type": "code",
338 "execution_count": 24,
339 "metadata": {},
340 "outputs": [
341 {
342 "name": "stdout",
343 "output_type": "stream",
344 "text": [
345 "222232244629420445529739893461909967206666939096499764990979600\n",
346 "Time for F_slow: 3.0404000000316955e-05\n",
347 "Time for F_fast: 0.0003859389999973928\n"
348 ]
349 }
350 ],
351 "source": [
352 "import time\n",
353 "\n",
354 "F_memorized = [-1] * (10**6)\n",
355 "\n",
356 "def F_slow(n):\n",
357 " if n <= 1:\n",
358 " return n\n",
359 " else:\n",
360 " return F_slow(n-1) + F_slow(n-2)\n",
361 " \n",
362 "def F_fast(n):\n",
363 " if F_memorized[n] == -1:\n",
364 " if n <= 1:\n",
365 " F_memorized[n] = n\n",
366 " else:\n",
367 " F_memorized[n] = F_fast(n-1) + F_fast(n-2)\n",
368 " \n",
369 " return F_memorized[n]\n",
370 "\n",
371 "n = 300\n",
372 "\n",
373 "t0 = time.process_time()\n",
374 "#print(F_slow(n))\n",
375 "t1 = time.process_time()\n",
376 "print(F_fast(n))\n",
377 "t2 = time.process_time()\n",
378 "\n",
379 "print(\"Time for F_slow:\", t1-t0)\n",
380 "print(\"Time for F_fast:\", t2-t1)"
381 ]
382 },
383 {
384 "cell_type": "code",
385 "execution_count": null,
386 "metadata": {},
387 "outputs": [],
388 "source": []
389 }
390 ],
391 "metadata": {
392 "kernelspec": {
393 "display_name": "Python 3",
394 "language": "python",
395 "name": "python3"
396 },
397 "language_info": {
398 "codemirror_mode": {
399 "name": "ipython",
400 "version": 3
401 },
402 "file_extension": ".py",
403 "mimetype": "text/x-python",
404 "name": "python",
405 "nbconvert_exporter": "python",
406 "pygments_lexer": "ipython3",
407 "version": "3.8.5"
408 }
409 },
410 "nbformat": 4,
411 "nbformat_minor": 4
412}
diff --git a/src/Lecture7/notebook/X2-StudentsRequests-notebook.ipynb b/src/Lecture7/notebook/X2-StudentsRequests-notebook.ipynb
new file mode 100644
index 0000000..89cdd0b
--- /dev/null
+++ b/src/Lecture7/notebook/X2-StudentsRequests-notebook.ipynb
@@ -0,0 +1,516 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Diffie-Hellman key exchange\n",
8 "\n",
9 "The following is a simple implementation of the classic [Diffie-Hellman key exchange](https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange) cryptographic protocol."
10 ]
11 },
12 {
13 "cell_type": "code",
14 "execution_count": 1,
15 "metadata": {},
16 "outputs": [
17 {
18 "name": "stdout",
19 "output_type": "stream",
20 "text": [
21 "Public key: p = 97021 and g = 66271 \n",
22 "\n",
23 "[[ Alice's secret key: a = 19234 ]]\n",
24 "[[ Bob's secret key: b = 76267 ]] \n",
25 "\n",
26 "Alice sends h1 = 17104 to Bob\n",
27 "Bob sends h2 = 28787 to Alice \n",
28 "\n",
29 "Alice computed 62444 using h2 and her secret a\n",
30 "Bob computed 62444 using h1 and his secret b\n"
31 ]
32 }
33 ],
34 "source": [
35 "# Public information:\n",
36 "p = Primes()[10^3 + randint(1,10000)] # random prime\n",
37 "g = randint(2, p-1) # random integer\n",
38 "\n",
39 "print(\"Public key: p =\", p, \"and g =\", g, \"\\n\")\n",
40 "\n",
41 "a = randint(2, p-1) # Only Alice knows this\n",
42 "b = randint(2, p-1) # Only Bob knows this\n",
43 "\n",
44 "print(\"[[ Alice's secret key: a =\", a, \"]]\")\n",
45 "print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n",
46 "\n",
47 "h1 = (g^a) % p # Alice sends this to Bob\n",
48 "h2 = (g^b) % p # Bob sends this to Alice\n",
49 "\n",
50 "print(\"Alice sends h1 =\", h1, \"to Bob\")\n",
51 "print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n",
52 "\n",
53 "secret_a = (h2^a) % p # Alice can compute this because she knows a\n",
54 "secret_b = (h1^b) % p # Bob can compute this because he knows b\n",
55 "\n",
56 "print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n",
57 "print(\"Bob computed\", secret_b, \"using h1 and his secret b\")"
58 ]
59 },
60 {
61 "cell_type": "markdown",
62 "metadata": {},
63 "source": [
64 "## General Diffie-Hellman\n",
65 "\n",
66 "The following code is an implementation of a generic Diffie-Hellman key exchange protocol that uses a group $G$ instead of $(\\mathbb Z/p \\mathbb Z)^\\times$."
67 ]
68 },
69 {
70 "cell_type": "code",
71 "execution_count": 2,
72 "metadata": {},
73 "outputs": [
74 {
75 "name": "stdout",
76 "output_type": "stream",
77 "text": [
78 "Public key:\n",
79 "G = Additive abelian group isomorphic to Z/171 embedded in Abelian group of points on Elliptic Curve defined by y^2 = x^3 + x + 156 over Finite Field of size 157 \n",
80 "g = (35 : 131 : 1) \n",
81 "\n",
82 "[[ Alice's secret key: a = 140 ]]\n",
83 "[[ Bob's secret key: b = 73 ]] \n",
84 "\n",
85 "Alice sends h1 = (150 : 80 : 1) to Bob\n",
86 "Bob sends h2 = (18 : 121 : 1) to Alice \n",
87 "\n",
88 "Alice computed (154 : 35 : 1) using h2 and her secret a\n",
89 "Bob computed (154 : 35 : 1) using h1 and his secret b\n"
90 ]
91 }
92 ],
93 "source": [
94 "def genericDH(G):\n",
95 " if G.cardinality() == 1:\n",
96 " print(\"Group is trivial, can't do anything\")\n",
97 " return\n",
98 " g = G.random_element()\n",
99 " while g == G.identity(): # Make sure g is not trivial\n",
100 " g = G.random_element()\n",
101 " \n",
102 " print(\"Public key:\\nG =\", G, \"\\ng =\", g, \"\\n\")\n",
103 " \n",
104 " a = randint(2, G.exponent()-1) # Only Alice knows this\n",
105 " b = randint(2, G.exponent()-1) # Only Bob knows this\n",
106 "\n",
107 " print(\"[[ Alice's secret key: a =\", a, \"]]\")\n",
108 " print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n",
109 " \n",
110 " # \"Ternary operator\", I did not explain this\n",
111 " # https://docs.python.org/3/reference/expressions.html#conditional-expressions\n",
112 " h1 = g^a if G.is_multiplicative() else a*g # Alice sends this to Bob\n",
113 " h2 = g^b if G.is_multiplicative() else b*g # Bob sends this to Alice\n",
114 "\n",
115 " print(\"Alice sends h1 =\", h1, \"to Bob\")\n",
116 " print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n",
117 " \n",
118 " secret_a = h2^a if G.is_multiplicative() else a*h2 # Alice can compute this because she knows a\n",
119 " secret_b = h1^b if G.is_multiplicative() else b*h1 # Bob can compute this because he knows b\n",
120 "\n",
121 " print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n",
122 " print(\"Bob computed\", secret_b, \"using h1 and his secret b\")\n",
123 " \n",
124 "E = EllipticCurve(GF(157), [1,-1])\n",
125 "G = E.abelian_group()\n",
126 "genericDH(G)"
127 ]
128 },
129 {
130 "cell_type": "markdown",
131 "metadata": {},
132 "source": [
133 "# Numerical methods for differential equations\n",
134 "\n",
135 "## Euler's method (ODE)\n",
136 "\n",
137 "In sage you can use [`ode_solver()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/ode.html) to solve any ordinary differential equation by hand, but Euler's method is very simple to implement by hand:"
138 ]
139 },
140 {
141 "cell_type": "code",
142 "execution_count": 8,
143 "metadata": {},
144 "outputs": [
145 {
146 "data": {
147 "image/png": "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\n",
148 "text/plain": [
149 "Graphics object consisting of 2 graphics primitives"
150 ]
151 },
152 "execution_count": 8,
153 "metadata": {},
154 "output_type": "execute_result"
155 }
156 ],
157 "source": [
158 "var('y')\n",
159 "\n",
160 "def euler_desolve(f, x0, y0, x1):\n",
161 " n = 10000\n",
162 " h = (x1-x0)/n\n",
163 " S = []\n",
164 " Y = [y0]\n",
165 " for i in range(n+1):\n",
166 " S.append(x0 + i*h)\n",
167 " Y.append(N( Y[i] + h*f(S[i], Y[i]) ))\n",
168 " return S, Y\n",
169 "\n",
170 "f(x,y) = y\n",
171 "x0 = -1\n",
172 "x1 = 2\n",
173 "y0 = e^(-1)\n",
174 "\n",
175 "S, Y = euler_desolve(f, x0, y0, x1)\n",
176 "plot(e^x, -1, 2) + line([(S[i], Y[i]) for i in range(len(S))], color='red', marker='o', markersize=2)"
177 ]
178 },
179 {
180 "cell_type": "markdown",
181 "metadata": {},
182 "source": [
183 "Sage also has an `eulers_method()` function \"for pedagogical purposes only\":"
184 ]
185 },
186 {
187 "cell_type": "code",
188 "execution_count": 5,
189 "metadata": {},
190 "outputs": [
191 {
192 "name": "stdout",
193 "output_type": "stream",
194 "text": [
195 " x y h*f(x,y)\n",
196 " -1 0.367879441171442 0.0367879441171442\n",
197 "-0.900000000000000 0.404667385288587 0.0404667385288587\n",
198 "-0.800000000000000 0.445134123817445 0.0445134123817445\n",
199 "-0.700000000000000 0.489647536199190 0.0489647536199190\n",
200 "-0.600000000000000 0.538612289819109 0.0538612289819109\n",
201 "-0.500000000000000 0.592473518801020 0.0592473518801020\n",
202 "-0.400000000000000 0.651720870681122 0.0651720870681122\n",
203 "-0.300000000000000 0.716892957749234 0.0716892957749234\n",
204 "-0.200000000000000 0.788582253524157 0.0788582253524157\n",
205 "-0.100000000000000 0.867440478876573 0.0867440478876573\n",
206 "-1.38777878078145e-16 0.954184526764230 0.0954184526764230\n",
207 "0.0999999999999999 1.04960297944065 0.104960297944065\n",
208 "0.200000000000000 1.15456327738472 0.115456327738472\n",
209 "0.300000000000000 1.27001960512319 0.127001960512319\n",
210 "0.400000000000000 1.39702156563551 0.139702156563551\n",
211 "0.500000000000000 1.53672372219906 0.153672372219906\n",
212 "0.600000000000000 1.69039609441897 0.169039609441897\n",
213 "0.700000000000000 1.85943570386086 0.185943570386086\n",
214 "0.800000000000000 2.04537927424695 0.204537927424695\n",
215 "0.900000000000000 2.24991720167165 0.224991720167165\n",
216 "1.00000000000000 2.47490892183881 0.247490892183881\n",
217 "1.10000000000000 2.72239981402269 0.272239981402269\n",
218 "1.20000000000000 2.99463979542496 0.299463979542496\n",
219 "1.30000000000000 3.29410377496746 0.329410377496746\n",
220 "1.40000000000000 3.62351415246420 0.362351415246420\n",
221 "1.50000000000000 3.98586556771062 0.398586556771062\n",
222 "1.60000000000000 4.38445212448168 0.438445212448168\n",
223 "1.70000000000000 4.82289733692985 0.482289733692985\n",
224 "1.80000000000000 5.30518707062284 0.530518707062284\n",
225 "1.90000000000000 5.83570577768512 0.583570577768512\n",
226 "2.00000000000000 6.41927635545363 0.641927635545363\n"
227 ]
228 }
229 ],
230 "source": [
231 "# Usage: eulers_method(f, x0, y0, h, x1)\n",
232 "eulers_method(f, -1, N(e^(-1)), 0.1, 2)"
233 ]
234 },
235 {
236 "cell_type": "markdown",
237 "metadata": {},
238 "source": [
239 "## Solving the heat equation with a finite difference method"
240 ]
241 },
242 {
243 "cell_type": "code",
244 "execution_count": 9,
245 "metadata": {},
246 "outputs": [
247 {
248 "data": {
249 "image/png": "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eustqlWrxt57713GCQWlv07FxcVcffXV7LbbbtSsWZOmTZvy8MMPpylt5Vbaa/X444/Tpk0b6tSpQ4MGDTjrrLP49ttv05RWvzR16lS6detGw4YNSSQSjB8/PmU/28Kk3zR27Fj69+/P1VdfzezZsznooIM4+uijWbZs2W9+/dSpU+ncuTMTJ05k5syZHHbYYXTr1o3Zs2enOXnlUtrr9LOCggLOPPNMjjjiiDQlrdy25Dr16NGDV199lYceeoiPP/6YMWPG0KpVqzSmrpxKe62mTZvGmWeeSZ8+fZg3bx5PPfUUM2bM4Oyzz05zcgGsXLmSNm3aMGLEiNT/8GTMFBQUJIFkQUFB1FEqtfbt2yf79u270edatWqVHDhw4Gb/jOzs7OQNN9yQ6mj6hS29TieffHLymmuuSV5//fXJNm3alGVEJUt/nV588cVkZmZm8ttvv01HPP1Caa/V7bffnmzSpMlGn7vrrruSjRo1KrOM2jxActy4cSn7ebFZYcrLyyM7O5ucnJyoo1R6a9asYebMmXTp0mWjz3fp0oW33357s37G+vXrKSoqYvvtty+LiGLLr9MjjzzCkiVLuP7668s6otiy6/T888/Trl07brvtNnbddVdatGjB5Zdfzo8//piOyJXWllyrDh068NlnnzFx4kSSySRff/01Tz/9NF27dk1HZKVR2s6SK0m/fv3o16/fhjlMis4333zDunXrqF+//kafr1+/Pl999dVm/Yxhw4axcuVKevToURYRxZZdp0WLFjFw4EDefPNNqlWLzR//Cm1LrtPSpUuZNm0atWrVYty4cXzzzTecf/75fPfdd+5jKkNbcq06dOjA448/zsknn8zq1atZu3Ytxx13HHfffXc6IiuNYrPCpPj535Obk8lkiac5A4wZM4bBgwczduxYdt5557KKp/+zuddp3bp19OzZkxtuuIEWLVqkK57+T2n+PK1fv55EIsHjjz9O+/btOeaYYxg+fDiPPvqoq0xpUJprNX/+fC666CKuu+46Zs6cyUsvvUR+fj59+/ZNR1Slkf/E1K/suOOOVK1a9Vf/olq+fPmv/uX1v8aOHUufPn146qmn6NSpU1nGrPRKe52Kiop47733mD17NhdccAEQ/mJOJpNUq1aNl19+mcMPPzwt2SuTLfnz1KBBA3bdddeNVtt33313kskkn332Gc2bNy/TzJXVllyr3NxcOnbsyBVXXAHAXnvtRd26dTnooIO46aabaNCgQZnnVnq4wqRfqVGjBm3btmXy5MkbfX7y5Ml06NBhk983ZswYevfuzejRo71/nwalvU4ZGRl88MEHzJkzZ8Orb9++tGzZkjlz5rDffvulK3qlsiV/njp27MgXX3zBihUrNnxu4cKFVKlSxUPJy9CWXKtVq1ZRpcrGf5VWrVoVCCtTqkBStn08RXxKLh6eeOKJZPXq1ZMPPfRQcv78+cn+/fsn69atm/zkk0+SyWQyOXDgwOQZZ5yx4etHjx6drFatWjIvLy/55Zdfbnj98MMPUf0WKoXSXqf/5VNy6VHa61RUVJRs1KhR8qSTTkrOmzcvOWXKlGTz5s2TZ599dlS/hUqjtNfqkUceSVarVi15zz33JJcsWZKcNm1asl27dsn27dtH9Vuo1IqKipKzZ89Ozp49Owkkhw8fnpw9e3byP//5z1b/bAuTNikvLy+52267JWvUqJHcd999k1OmTNnwa7169UoecsghGz4+5JBDksCvXr169Up/8EqmNNfpf1mY0qe01+mjjz5KdurUKVm7du1ko0aNkpdeemly1apVaU5dOZX2Wt11113J7OzsZO3atZMNGjRInnbaacnPPvsszamVTCaTr7/+epn9XZRIJuO1ZvjzU3IFBQVkZGREHUeSJMk9TJIkSSWxMEmSJJXAwiRJklQCC5MkSVIJLEySJEklsDBJkiSVIDaFKS8vj+zsbHJycqKOIkmStBHnMEmSJJUgNitMkiRJcWVhkiRJKoGFSZIkqQQWJkmSpBJYmCRJkkpgYZIkSSpB7MYKJJNJioqKqFevHolEIuo4kiRJ8StMkiRJceMtOUmSpBJYmCRJkkpgYZIkSSqBhUmSJKkEFiZJkqQSWJgkSZJKYGGSJEkqwf8D9CD7JUAN8TsAAAAASUVORK5CYII=\n",
250 "text/plain": [
251 "Graphics object consisting of 1 graphics primitive"
252 ]
253 },
254 "metadata": {},
255 "output_type": "display_data"
256 },
257 {
258 "data": {
259 "image/png": "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\n",
260 "text/plain": [
261 "Graphics object consisting of 1 graphics primitive"
262 ]
263 },
264 "metadata": {},
265 "output_type": "display_data"
266 },
267 {
268 "data": {
269 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGGCAYAAACJ/96MAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3deXxU1f3/8ddkIWxJkC1kAG3YxBGJCkEFUZTFuuBWigqKWKRSgxatC9R9I18XKFWCVn6KKIKoFbXUDTfQukUWi0TZFWQEBDQJW9jm98fpoGDCJDP3zr135v18POYRk0zmfpgbvG/OPedzfKFQKISIiIiIVCvF6QJERERE3E6BSURERCQCBSYRERGRCBSYRERERCJQYBIRERGJQIFJREREJAIFJhEREZEIFJhEREREInBdYAqFQpSXl6N+miIiIuIWrgtMFRUVZGdnU1FR4XQpIiIiIoALA5OIiIiI2ygwiYiIiERQ68A0b948+vfvj9/vx+fz8fLLL+//3u7du7n55ps55phjaNCgAX6/nyFDhhAMBi0tWkRERCSeah2Ytm3bRn5+PhMnTvzV97Zv386CBQu47bbbWLBgAS+99BLLli3j3HPPtaRYERERESf4QjEsR/P5fMyaNYvzzz+/2ueUlJTQrVs3vv32Ww4//PCIr1leXk52djZlZWVkZWVFW5qIiIiIZdLsPkBZWRk+n49GjRpV+f3KykoqKyv3f15eXm53SSIiIiK1Yuuk7507dzJ69GgGDRpU7WhRUVER2dnZ+x+tW7e2syQRERGRWrMtMO3evZuLL76Yffv2MWnSpGqfN2bMGMrKyvY/1q5da1dJIiIiIlGx5Zbc7t27GThwIKtXr+bdd9895FykjIwMMjIy7ChDRERExBKWB6ZwWFq+fDnvvfceTZo0sfoQIiIiInFV68C0detWVqxYsf/z1atXs2jRIho3bozf72fAgAEsWLCA2bNns3fvXtavXw9A48aNqVOnjnWVi4iIiMRJrdsKvP/++5x22mm/+vrll1/OnXfeSV5eXpU/995779GrV6+Ir6+2AiIiIuI2MfVhsoMCk4iIiLiN9pITERERiUCBSURERCQCBSYRERGRCBSYRERERCJQYBIRERGJQIFJREREJAIFJhEREZEIXBOYiouLCQQCFBQUOF2KiIiIyAHUuFJEREQkAteMMImIiIi4lQKTiIiISAQKTCIiIiIRKDCJiIiIRKDAJCIiIhKBApOIiIhIBApMIiIiIhEoMImIiIhEoMAkIiIiEoECk4iIiEgECkwiIiIiEbgmMGnzXREREXErbb4rIiIiEoFrRphERERE3EqBSURERCQCBSYRERGRCBSYRERERCJQYBIRERGJQIFJREREJAIFJhEREZEIFJhEREREIlBgEhEREYlAgUlEREQkAgUmERERkQgUmERERMR2wSC8+KLTVUTPNYGpuLiYQCBAQUGB06WIiIiIxZ56Ci65BPbtc7qS6PhCoVDI6SJ+qby8nOzsbMrKysjKynK6HBEREbHAyJFQXAzr10NOjtPV1J5rRphEREQkcQWDB370GgUmERERsZ0Ck4iIiEgE69Yd+NFrFJhERETEVvv2wfffm//WCJOIiIhIFX74AfbuNf+twCQiIiJShXBIatFCgUlERESkSuGQ1LVrEgWmefPm0b9/f/x+Pz6fj5dffvmA74dCIe688078fj/16tWjV69eLFmyxLKCRURExFuCQUhJgeOOS6LAtG3bNvLz85k4cWKV33/ggQcYP348EydOpKSkhBYtWtC3b18qKipiLlZERES8Jxg0zSqPOAI2boTdu52uqPbSavsDZ555JmeeeWaV3wuFQkyYMIFbbrmFCy+8EICpU6eSk5PD9OnTueqqq2KrVkRERDwnGAS/3zxCIdiwAVq1crqq2rF0DtPq1atZv349/fr12/+1jIwMTj31VD766CMrDyUiIiIe8cvAFP7ca2o9wnQo69evByDnoE1icnJy+Pbbb6v8mcrKSiorK/d/Xl5ebmVJIiIi4rB166Bbt58DkxebV9qySs7n8x3weSgU+tXXwoqKisjOzt7/aN26tR0liYiIiEPCI0xNmkB6ujdHmCwNTC1atAB+HmkK27hx469GncLGjBlDWVnZ/sfatWutLElEREQctHu3mejt95uVcrm5Ckzk5eXRokUL5syZs/9ru3btYu7cuXTv3r3Kn8nIyCArK+uAh4iIiCSGDRvMRO/w7Ti/35uBqdZzmLZu3cqKFSv2f7569WoWLVpE48aNOfzwwxk1ahRjx46lffv2tG/fnrFjx1K/fn0GDRpkaeEiIiLifuFwlHSB6fPPP+e0007b//n1118PwOWXX85TTz3FTTfdxI4dO7j6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abdmERGJTUoKDBgAixeb9gNffgn5+XDxxfD1105XFx9eDUyZmdCggccC08HKysoAaOzQlPtoZ8579ZdGRERik5oKl14KX30FkyfDRx/B0UfD0KFmC5ZEtX27WSTlxako8ej2bWtgCoVCXH/99Zx88sl06tSpyudUVlZSXl5+wMNK0fZm8Op9XBERsUZ6Olx5JSxfDn//O7z5JnToACNGwHffOV2d9cITpr167bO727etgWnkyJH897//ZcaMGdU+p6ioiOzs7P2P1q1bW1qDRphERCQWGRkwcqTZp27sWHjxRWjXDq67DjZscLo663h9dbjdzSttC0zXXHMNr776Ku+99x6tWrWq9nljxoyhrKxs/2Pt2rWW1qHAJCIiVqhfH268EVatMpv7PvkktGkDY8bAli1OVxe7RAhMnhphCoVCjBw5kpdeeol3332XvLy8Qz4/IyODrKysAx5W8vvNMGNtWuDv3g0bN3r3l0ZEROyTlQW33WbmM40aBY88Yvauu/tu05rAq4JBM3E6M9PpSqITy+4eNWF5YCosLGTatGlMnz6dzMxM1q9fz/r169mxY4fVh6oRvx/27IFNm2r+M+HdmhWYRESkOo0bw333mRGnYcPM7bq8PLj/fns7TtvFq12+w/x+M3HdrtBqeWB69NFHKSsro1evXuTm5u5/zJw50+pD1Ug0vRnUtFJERGqqeXMYP97McbroIjP61LYtPPyw2Z7LK7y+2MnuXky23JKr6jF06FCrD1Uj4dATTWDy8i+OiIjEV8uWMGkSLF0KZ51lJoW3bw+PP26merid1+fuei4wuU1OjhlerG1gSk83TS9FRERqIy/PTAgvLYWePU0bgo4d4emnzabubuX1wJSbaz4qMEUpLc2EptoGJi/fxxUREecdeSRMnw5ffAGdO8Pll0OnTvD887VbiBQPoZC59nl5Kkr9+tCokQJTTGrbm8Hr93FFRMQ9jjkGZs0yG/rm5Zl5TscfD//6l30rumqrosJMVPf6tc/O5pVJE5iiGWESERGxSteu8Npr8OGHcNhhcO65cOKJMGeO88EpUebu2tm8UoGpCgpMIiJilx494N134e23zYa//fpBr17wwQfO1ZRIgUkjTDFQYBIRETfx+aB3b7Ox7+zZpnfQKafAGWfAZ5/Fv57wNTI8cdqrFJhi5Peb/X727In83B074McfFZhE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\n",
270 "text/plain": [
271 "Graphics object consisting of 1 graphics primitive"
272 ]
273 },
274 "metadata": {},
275 "output_type": "display_data"
276 },
277 {
278 "data": {
279 "image/png": "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RT1MtpgLTGFPsCIiImCvhynszAamIE0QhTwREfGbtfUw7GuducCUYGWClCcodYqISLBYCUyuj29F0oFp/vz5nH322TRq1IhIJMIzzzyz15/H43FGjx5No0aNqFmzJp07d2b58uUV/v5BTLBBrFlERGyz0sOUEPa1Lulh2Lp1K/n5+dx77737/POxY8cyfvx47r33XoqLi2nQoAHdunVj8+bNFfr+QRsQJW8REUkF7TDZkpXsX+jRowc9evTY55/F43EmTJjAqFGjOP/88wF49NFHqV+/PtOnT+eKK66o8HGCNEBBC3kiImKftabvsK91vm70rVu3js8//5zu3bvv+b3s7GxOO+003njjjQp9j6ANiJWJLCIimUU7TLYkvcO0P59//jkA9evX3+v369evz8cff7zPv1NWVkZZWdmeXycu3WmAREQkzKz1MIVdSoYh8oO0E4/Hf/R7CYWFheTm5u55nXzySf/9HqmoLDWCtismIiL2WdlhSgj7WudrYGrQoAHw/U5TwsaNG3+065QwcuRISktL97zefPMtP0tKOSsTWUREMouVHibXx7fC18CUl5dHgwYNmDNnzp7f++6775g3bx4dOnTY59/Jzs4mJydnz6t27bpAsAYo7KlbRET8px0mW5LuYdqyZQurV6/e8+t169axdOlS6tWrxxFHHMHw4cMZM2YMzZs3p3nz5owZM4ZatWrRt2/fpI5jZYKUJyh1iohIsFjpYdI650k6ML3zzjucfvrpe359zTXXAHDppZfyyCOPcP3117N9+3auvPJKvv76a0466SRefvll6tatW6HvH8QEG8SaRUTENu0w2ZJ0YOrcuTPx/fxfi0QijB49mtGjRx9QQdYmSHmCUqeIiASLephsMfvDikEaoLCnbhER8Z+1DYSwr3XmAlPQBsTKRBYRkcyiHiZbzAYmDZCIiISZ1kNbzAWmhCBNkKDtiomIiH1WepgSwr7WmQ1MQWFlIouISGaxssPk+vhWmAtMViZIMsKeukVExH/W1hZr9aSbucCUEJTAFJQ6RUQkWOJx9w3foHUuwcBQ7C2ICTaINYuIiG27d9sKK2Ff65K+cWWqFBUVUVRUxPbtjQFbk2R/glKniIgESzxuY42xUIMFZnaYYrEYJSUlPPnkXwENkIiIhJuVwCQeM4EpIYhbfkGsWUREbLPSw5QQ9rXO0FB4gvZT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t48PGTJkr99r2bJlfMSIERX+HtFoNH7rrbf6U5Ds04GO04UXXhi/6aab4rfccks8Pz8/lSVKPPlxeuGFF+K5ubnx//znP+koT/5HsmN19913x5s2bbrX702cODHeuHHjlNXowpAh8Xjbtq6rqJivvvLWZTg//vTTT/v2fc3sMBUVFRGNRikoKHBdygGxkLz96mH67rvvWLRoEd27d9/r97t3784bb7xRoe+xe/duNm/eTL169SpfkOzTgY7TlClTWLNmDbfcckuqSxQObJyee+452rVrx9ixYzn88MNp0aIF1157LdsTj2GXlDiQserQoQOffPIJzz//PPF4nC+++IK//vWv9OrVKx0lp5WFda4iUlVn2p4lV55YLEYsFttzH6agsNQI51cP05dffsmuXbuoX7/+Xr9fv359Pv/88wp9j3vuuYetW7fSp0+fyhck+3Qg47Rq1SpGjBjBggULyMoyc/pntAMZp7Vr1/L6669To0YNnn76ab788kuuvPJKvvrqK/UxpdCBjFWHDh2YNm0aF154Id9++y07d+7knHPOYdKkSekoOW0srXXl+T4w+ZuczOwwBZ2F5O33bQV++OTmeDxe7tOcAWbMmMHo0aOZNWsWhx12mH8FyT5VdJx27dpF3759ufXWW2nRokW6ypP/SuZ82r17N5FIhGnTptG+fXt69uzJ+PHjeeSRR7TLlAbJjFVJSQnDhg3j5ptvZtGiRbz44ousW7eOIUOGpKPUtLKwziXH34L1EbOSLKVuvwLToYceStWqVX/0iWrjxo0/+uT1Q7NmzWLQoEE8+eSTdO3atfLFyE9Kdpw2b97MO++8w5IlSxg6dCjgLczxeJysrCxefvllzjjjjLTUHiYHcj41bNiQww8/fK/d9latWhGPx/nkk09o3rx5SmsOqwMZq8LCQjp27Mh1110HQJs2bahduzannHIKd9xxBw0bNkx53elgaa0rj25caZyF5O1XD1P16tVp27Ytc+bM2ev358yZQ4cOHX7y782YMYOBAwcyffr0jLx+b02y45STk8OyZctYunTpnteQIUM45phjWLp0KSeddFK6Sg+VAzmfOnbsyKeffsqWLVv2/N7KlSupUqVKIB5KHlQHMlbbtm2jyg/eeKtWrQp4O1OZJCj/Oam6JKefkqukrVu9bvxp01xXEo83aBCP33abP99r5syZ8WrVqsUfeuiheElJSXz48OHx2rVrxz/66KN4PB6PjxgxIn7JJZfs+frp06fHs7Ky4kVFRfHPPvtsz+ubb77xpyDZp2TH6Yf0U3Lpkew4bd68Od64ceN4796948uXL4/Pmzcv3rx58/hll13m6j8hNJIdqylTpsSzsrLi9913X3zNmjXx119/Pd6uXbt4+/btXf0npEQsFo8ff7zrKsq3efPm+CuvvPffn5I7Jz5+/Pj4kiVL4h9//HGlv7cCUyVZCkz168fjt9/u3/crKiqKH3nkkfHq1avHTzzxxPi8efP2/Nmll14aP+200/b8+rTTTov/N87v9br00kv9K0j2KZlx+iEFpvRJdpw++OCDeNeuXeM1a9aMN27cOH7NNdfEt23bluaqwynZsZo4cWI8Go3Ga9asGW/YsGG8X79+8U8++STNVadWUALT3Llz4/CzPYHJz7UoEo/b2mRL/JRcaWkpOTk5rssp17ZtULs2TJ0K/fq5raV+fRg2DEaNcluHiIhklqFD4fXXYelS15WU74svoEEDePZZOOcc/76vepgqyVIjnJ4lJyIiqWBprasoPUvOKAv7dH4/S05ERCTBwjpXEfopOaMsBRS/78MkIiICwVpbEoFJO0xGWUjeCkwiIpIqFta5ZCgwGWMpoKiHSUREUsHSWlceXZKTcqmHSUREwi7jL8kVFRURjUYpKChwXcoBsbBVqUtyIiKSKhbWuWRkbGCKxWKUlJRQXFzsupSkWAooCkwiIpIKQVpbdEnOOAvJWz1MIiKSKhbWuYrI+EtyQWUpdauHSUREUiGIa4sCk1EWkrcuyYmISKpYWOcqQpfkjLIUUBSYREQkFYK0tuiSnHEWkrcCk4iIpIqFdS4Zfq+HkXjc1v+CTZs2kZubS2lpKTk5Oa7LEREREbEXmOLxOJs3b6Zu3bpEtF0iIiIiBpgLTCIiIiLWqIdJREREpBwKTCIiIiLlUGASERERKYcCk4iIiEg5FJhEREREyqHAJCIiIlIOBSYRERGRcvx/Srlz5IK3q3YAAAAASUVORK5CYII=\n",
280 "text/plain": [
281 "Graphics object consisting of 1 graphics primitive"
282 ]
283 },
284 "metadata": {},
285 "output_type": "display_data"
286 },
287 {
288 "data": {
289 "image/png": "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\n",
290 "text/plain": [
291 "Graphics object consisting of 1 graphics primitive"
292 ]
293 },
294 "metadata": {},
295 "output_type": "display_data"
296 },
297 {
298 "data": {
299 "image/png": "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qXJwnioH56lySCQS9OrVO63zlLVrmHaWhanyyMnJYdSoUVHHUAjnqXJwniqH78/T9z6vpNhJ0KdPH9JZJWJ3hEmSJCluLEySJEkhLEySJEkhLEzarnvvvZfWrVtTp04d+vTps8PXPvnkk/Tp04f//M//JDc3l8MPP5yZM2dmKWn19v156tq1K6+99tpOfd0bb7xBrVq1OOiggzKcUFDxeSotLeW6665j3333JScnh7Zt2zJx4sQspa3eKjpXr732Gl26dKFevXo0a9aMCy64gK+++ipLafV9s2fPpl+/fnz99deMGHEt06dPT9t7W5i0TdOmTWP48OFcd911LFiwgEMPPRSAf/1r1TZfP3v2bPr06cOzzz7LvHnz6NGjB/369WNBXD9zWkX8cJ6OPvpo+vbty8cff7zDryspKWHgwIH06tUrS0mrt12Zp/79+/Piiy/y0EMP8cEHHzB16lQ6dOiQxdTV067MVWFhIYMGDWLx4sU88cQTFBUVcdFFF2UxtbZav349Xbp0oUGDDKy1kIqZkpKSFJAqKSmJOso2DRuWSnXqFN34XbumUpdckvlxunfvnrrkewOtXJlKQSp1+umTd/o98vPzU6NHj97tLGedlUr17Lnbb1Ml/XCeUqlUqkOHDqkRI0bs8OvOOOOM1PXXX5+66aabUl26dMlkRKUqPk/PPfdcKi8vL/XVV19lI56+pyJzVVIS/Fzce+8h5R6/6667Ui1atMhozilTgrHXrcvoMNuVTKZSBx0Uzdg7o3HjVAquST311FNpe8/YHGEqLCwkPz+fgoLs7Bem7fvuu++YN28exx9//I+e+/vf/75T77FlyxbWrl1Lo0aN0h1P/2t783T88cfz5ptvbvfrJk2axIcffshNN92U6Yhi1+ZpxowZdOvWjd/85jfss88+tG/fnquuuopvtu5RpIzY1X9TX331Fc8++yypVIovvviCP/3pT5x00kmZjqssi806TMlkkmQyWbaKqqLz5ZdfsnnzZpo0afKj51avXr1T7zFu3DjWr19P/2wvf1uNbG+emjRpwsqVK7f5NUuXLmXEiBG89tpr1KoVm3/+VdquzNPy5ct5/fXXqVOnDk899RRffvkll156KV9//bXXMWXQrswVwLBhwzjjjD58++23bNq0iVNOOYW7774703GVZbE5wqT42dbOzWG7OQNMnTqVUaNGMW3aNPbee+9MRNP3/HBOUqnUNudp8+bNDBgwgNGjR9O+fftsxdP/2tl5guAIbSKR4LHHHqN79+6ceOKJ3HnnnUyePNmjTFlQkbmC4KjtjTfeyLx583j++edZsWIFl1xySaZjKsv8T0z9yF577UXNmjW3+V9Ue+655w6/dtq0aQwaNIgnnniC3r17Zyqi2P48rVq1aptHB9euXcvcuXNZsGABQ4YMAYJfzKlUilq1avHCCy/Qs2fPrGSvTio6TwDNmjVjn332KXe0vWPHjqRSKf75z3/Srl27jGaurnZlrgD2339/rr76CgAOPPBA6tevz9FHH82tt95Ks2bNMppZ2eMRJv1I7dq16dq1K7NmzfrRcx07dtzu102dOpXzzz+fKVOmeP4+C7Y3T7NmzeKII4740etzc3NZtGgRCxcuLLtdcskl7L///ixcuLDsk5BKr4rOE8CRRx7JZ599xrp168oeW7JkCTVq1IjlpuRVxa7MFUCNGuWPPtWsWRMIjkyp6vAIk7bpiiuu4Nxzz6Vbt24cfvjh/O53U4Bb6Nu3LwAjR47k008/5ZFHHgGCsjRw4EB+//vfc9hhh5X9F1rdunW9Ji2DfjhPDzzwAB9//HHZ6YDvz1ONGjXo1KlTua/fe++9qVOnzo8eV3pVZJ4ABgwYwC233MIFF1zA6NGj+fLLL7n66qu58MILqVu3bpTfSpVX0bkCePvtd5gwYQInnHACn3/+OcOHD6d79+40b948qm+j2lq3bh3Lli1j8+bgZ9qKFStYuHAhjRo1olWrVrv13hYmbdMZZ5zBV199xc0338znn3/O/vsfA1B2TdLnn39ebl2S+++/n02bNpVdvL/Veeedx+TJk7OavTr54Tx16tSJZ599ln333Rf48TwpGhWdpwYNGjBr1iyGDh1Kt27daNy4Mf379+fWW2+N6luoNnbl39TAgQO5556ruPLKK9lzzz3p2bMnt99+exTxq725c+fSo0cP4F9AUIAhPb+LEqmYHTPc+im5kpIScnNzo47zI5ddBi+9BIsWRTN+t25QUAATJmR33C++gKZN4S9/gZNPzu7YAwYE47/4YnbHlaQdWbMG8vJg2jTI9geCp04NfjauWwf1M7BGY5ghQ+CNNyCuaxPvtRdcfTVce2363tNrmCRJkkJYmCRJkkJYmCRJkkJYmCRJkkJYmCRJkkJYmCRJkkLEpjAVFhaSn59PQUFB1FEkSZLKiU1hSiaTFBcXU1RUFHUUSZKkcmJTmCRJkuLKwiRJkhTCwiRJkhTCwiRJkhTCwqQKiddWzZIkZUcilYrXr8A1a9aQl5dHSUkJubm5UceRJEmKX2FKpVKsXbuWhg0bkkgkoo4jSZIUv8IkSZIUN17DJEmSFMLCJEmSFMLCJEmSFMLCJEmSFMLCJEmSFMLCJEmSFMLCJEmSFOL/AyUVxk7Gco4cAAAAAElFTkSuQmCC\n",
300 "text/plain": [
301 "Graphics object consisting of 1 graphics primitive"
302 ]
303 },
304 "metadata": {},
305 "output_type": "display_data"
306 },
307 {
308 "data": {
309 "image/png": "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AWUPhQkAyrHGjaWlS6V9+8yNfUeONNdxWr5c+tFOVQB+gmsKk9/vl9frVUpKitNRAKDcad5cWrVK+vRTqWVL6f77pZtvll57zdzwF8BPc01h8vl8CgQCysjIcDoKAJRbrVpJa9ZIn3wiNWpkXufUpo301luSYTidDnAv1xQmAED4JCdL77wjbdliLk3Qt690223SX/5CcQIuh8IEABXY7bdL778vbdhgFqXu3aXOnaWtW51OBrgLhQkAKjiPxyxK27ZJa9dK331nFqlevaTt251OB7gDhQkAIMksTn37Sjt3Sn/6k/T551JSkvSb30h79jidDnAWhQkAUExEhHkx+N690iuvSH/7m5SQIP3ud+a6TkBFRGECAFxWpUrm8gOffSa99JJ5XZPXK6WkmEefgIqEwgQA+EmVK5sLXh48aG67sm6d1KyZ9NBD0pdfOp0OCA8KEwDgqlStKo0dKx0+LM2YIWVlmfvUTZggnTzpdDogtChMAIASiY6WHn9cyskxN/d9+WUpPt7873/9y+l0QGhQmAAApRITIz31lFmcHnlEev55szg9/bSUl+d0OsBeFCYAwDWpVUuaOVM6csS8IHzmTOmXv3Q6FWAv1xQmNt8FgLKtbl3zovBDh6QBA6TISKlePadTAfZwTWFi810AKB8aNJAWLJDOnJF69nQ6DSqiTz+V/uu/7H3NSHtfDgAAU+XKTidARXXDDfa/pmuOMAEAALgVhQkAAMAChQkAAMAChQkAAMAChQkAAMAChQkAAMAChQkAAMAChQkAAMAChQkAAMAChQkAAMAChQkAAMCCa/aS8/v98vv9On3a63QUAACAYlxzhMnn8ykQCCgjI8PpKAAAAMW4pjABAAC4FYUJAADAAoUJAADAAoUJAADAAoUJAADAAoUJAADAAoUJAADAgu2FKS0tTUlJSapZs6bq1Kmjfv36af/+/XYPAwAAEDa2F6bNmzfL5/Np27Zt2rhxo86fP68ePXqooKDA7qEAAADCwvatUd55551i95csWaI6depox44duuOOO+weDgAAIORCfg1Tbm6uJKlWrVqhHgoAACAkQrr5rmEYmjBhgjp06KCWLVte9jnBYFDBYLDoPqfuAACA24S0MD388MP629/+pq1bt17xOWlpaZo2bdp/PJIYykgAAAAlFrJTcmPGjNHatWv13nvvqUGDBld8Xmpq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\n",
310 "text/plain": [
311 "Graphics object consisting of 1 graphics primitive"
312 ]
313 },
314 "metadata": {},
315 "output_type": "display_data"
316 },
317 {
318 "data": {
319 "image/png": "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\n",
320 "text/plain": [
321 "Graphics object consisting of 1 graphics primitive"
322 ]
323 },
324 "metadata": {},
325 "output_type": "display_data"
326 },
327 {
328 "data": {
329 "image/png": "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\n",
330 "text/plain": [
331 "Graphics object consisting of 1 graphics primitive"
332 ]
333 },
334 "metadata": {},
335 "output_type": "display_data"
336 },
337 {
338 "data": {
339 "image/png": "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\n",
340 "text/plain": [
341 "Graphics object consisting of 1 graphics primitive"
342 ]
343 },
344 "metadata": {},
345 "output_type": "display_data"
346 },
347 {
348 "data": {
349 "image/png": "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wXTzzTfH6NGj46677uq+bL/99iv3MgAAVVP2H8k9+OCDceSRR8bnPve5GDFiRBx++OFx5513bvX2XV1d0dHRUXICAMiSsgfTn//857j99tvjwAMPjF/84hdx8cUXx6WXXho/+tGPerx9a2trNDU1dZ9Gjx5d7pEAAPqk7MG0efPm+OAHPxgzZ86Mww8/PC666KK48MIL4/bbb+/x9tOnT4/29vbu09q1a8s9EgBAn5Q9mPbee+9obm4uueyggw6K5557rsfb19fXR2NjY8kJACBLyh5Mxx9/fDz99NMll61evTr23Xffci8FAFAVZQ+myy+/PB5//PGYOXNmPPPMMzF//vy44447IpfLlXspAICqKHswtbS0xKJFi2LBggUxbty4uOGGG2LWrFlx5plnlnspAICqKPvrMEVEnHLKKXHKKadU4qEBAKrOe8kBACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJmQmmfD4fzc3N0dLSUutRAABKZCaYcrlcFAqFaGtrq/UoAAAlMhNMAABZJZgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQELmgmnjxtKPAAC1lplgyufz0dzcHEcffVZERKxeXeOBAAD+KzPBlMvlolAoxNy582o9CgCwExs7NmLFijc+lsuA8j0UAEDtDR4c8cEPlvcxM3OECQAgqwQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAQmbeGiWfz0c+n4/OzgNqPQoAQInMHGHy5rsAQFZlJpgAALJKMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAkVD6bW1taoq6uLyy67rNJLAQBUREWDqa2tLe6444449NBDK7kMAEBFVSyYNmzYEGeeeWbceeed8a53vatSywAAVFzFgimXy8XJJ58cJ5544jZv19XVFR0dHd2nzs4NlRoJAGCHDKjEg/74xz+OlStXRltbW/K2ra2tcf3117/lEj++AwCypexHmNauXRtf+tKXYt68ebHHHnskbz99+vRob2/vPi1e/LNyjwQA0CdlP8K0YsWKePHFF+OII47ovmzTpk2xbNmymD17dnR1dUX//v27r6uvr4/6+vru80OGlHsiAIC+KXswffSjH40nn3yy5LLzzjsvxo4dG1deeWVJLAEA7AzKHkwNDQ0xbty4ksuGDBkSw4cP3+JyAICdgVf6BgBIqMj/knu7Rx55pBrLAABUhCNMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAQlVeh2l75PP5yOfz0dl5QK1HAQAokZkjTLlcLgqFQsydO6/WowAAlMhMMAEAZJVgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJ3nwXACAhM0eYvPkuAJBVmQkmAICsEkwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkDKj1AG/K5/ORz+ejs/OAWo8CAFAiM0eYcrlcFAqFmDt3Xq1HAQAokZlgAgDIKsEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIKHswdTa2hotLS3R0NAQI0aMiE9/+tPx9NNPl3sZAICqKXswLV26NHK5XDz++OOxZMmSeP3112PSpEnR2dlZ7qUAAKqi7G+N8vOf/7zk/F133RUjRoyIFStWxP/93/+VezkAgIqr+O8wtbe3R0TEsGHDKr0UAEBFVPTNd4vFYkybNi1OOOGEGDduXI+36erqiq6uru7znZ0bKjkSAECvVTSYvvjFL8Yf/vCHePTRR7d6m9bW1rj++uvfcsmhlRwJAKDXKvYjuUsuuSQefPDBePjhh2OfffbZ6u2mT58e7e3t3afFi39WqZEAAHZI2Y8wFYvFuOSSS2LRokXxyCOPxP7777/N29fX10d9fX33+SFDyj0RAEDflD2YcrlczJ8/P37yk59EQ0NDrFu3LiIimpqaYtCgQeVeDgCg4sr+I7nbb7892tvbY8KECbH33nt3nxYuXFjupQAAqqIiP5IDANiVeC85AIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgoaJvvtsb+Xw+8vl8dHYeUOtRAABKZOYIUy6Xi0KhEHPnzqv1KAAAJTITTAAAWSWYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBhQ6wHelM/nI5/PR2fnAbUeBQCgRGaOMOVyuSgUCjF37rxajwIAUCIzwQQAkFWCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgIQBtR7gTfl8PvL5fHR2HlDrUQAASmTmCFMul4tCoRBz586r9SgAACUyE0wAAFklmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAQtXefLdYLMb69eu3uLyrqyu6urq6z//jH50REdHZ2REdHdWaLm3Dhv99rOZc1V63Fp/nrv457urr1WJN61kvy+tZc+fT0NAQdXV127xNXbFYLFZjmI6OjmhqaqrGUgAA2629vT0aGxu3eZuqBdP2HmF6+OF/xNSpH4z77vt/cdJJe1d8rpaWlmhra0vebtWqiA9/OGLp0ojDDqvsWn1dd0fW2ZH1Ojo6YvTo0bF27drkX7S+rtmXz6m365VzrW2tV+51trZeufZpe9YcM+asePLJeRVZo6f1+vJ83F4tLS1x551tFV/vrfv05z83VnS9t//dq+SfZ09/zyux3raeT+Vcb3ufT7X4ntGXNXf061Fv16zU17236+3Xve05wlS1H8nV1dVt19B77vnGr1UNHtxQsS/ub9W/f//tWued7/zfxx0da3vX6uu6O7JOX9ZrbGzs015tz5p9+Zx6u14519rWeuVeJ7VeX/dpe9bs1+8dVXneluP5uL369+8f73xnY9XWa2xsrPh6b/+7V8k/z57+nldivW09nyqxXur5VIvvGX1Zc0e/HvV2zUp93duacn7d2+1/6TuXy+1ya1Xzc6oW+7RzOO20U2s9Qtntivvk+bRzsE/ZIpj8hdwp2Kedw6mnnlbrEcpuV9wnz6edg33KlswF08CBA0s+kl319fVx3XXXRX19fa1HYRvs087BPu0c7NPOoRL7VLXfYdpe73jHwJKPZFd9fX3MmDGj1mOQYJ92DvZp52Cfdg6V2KfMHWECAMgawQQAkCCYAAASBBNbddttt8X+++8fe+yxRxxxxBHx61//equ3vf/+++Okk06Kd7/73dHY2BjHHnts/OIXv6jitLuvt+/TypUrt+t+v/nNb2LAgAFxWKVf+ZGI6N3z6U35fD723XffqK+vj/e9733xwx/+sAqT0tu9uueee2L8+PExePDg2HvvveO8886Lf//731WalrdatmxZTJkyJUaNGhV1dXXxwAMPlO2xBRM9euihh+Kyyy6Lq6++Op544on40Ic+FJMnT47nnnuux9svW7YsTjrppFi8eHGsWLEiJk6cGFOmTIknnniiypPvXhYuXLjFPl1yySXJ+7W3t8fUqVPjox/9aBWmpKd92tbz6U2/+93v4gc/+EE8/fTTsWDBghg7dmyVJt599XavHn300Zg6dWpccMEF8dRTT8W9994bbW1tccMNN1R5ciIiOjs7Y/z48TF79uzyP3gxY5YubS9GRHHp0vZaj1JixYpiMeKNj7vyum+ud/DBZxcvvvjikuvGjh1bvOqqq7b7sZqbm4vXX3/9dq9Z7c9xV1jvqKOO2mKf9tvvM8n1TjvttOI111xTvO6664rjx4/v8xy70p9pJdbraZ+29Xy69dbfFCOKxV/96t87tmAv7Wx/npVcr7d79c1vfrP43ve+t+Sy7373u8URIz5e9e8Ztfg+VavvjdsjIoqLFi0q2+Nl5ghTPp+P5ubmOPvss2o9ChHxxz/+MSZNmlRy2aRJk+Kxxx7brvtv3rw51q9fH8OGDavEeETEq6++GitWrNhin4455pht3u+uu+6KZ599Nq677rpKjsd/bW2ftvV8Wrp0aUREzJkzJ97znvfE+9///vjKV74Sr7zySsXn3Z3tyF4dd9xx8de//jUWL14cxWIx/v73v8d9990XJ5xwQjVGpooyE0y5XC4KhULMnVv5N+4kbfPmTTFy5MiSy0aOHBnr1q3brvt/+9vfjs7Ozjj11F3vrTKy4qWXXopNm7bcp21F6p/+9Ke46qqr4p577okBAzL3Mmy7pK3t07aeT88//3xERDz77LOxaNGimDVrVtx333079ask7wx2ZK+OO+64uOeee+K0006LgQMHxl577RVDhw6NK6/8ajVGpooyE0xkz9vfublYLCbfzTkiYsGCBTFjxoxYuHBhjBgxolLj8V/bsycREZs2bYozzjgjrr/++nj/+99f4al4u948nzZv3hwRETfeeGMcddRR8YlPfCJuueWWuPvuux1lqoLe7FWhUIhLL700rr322lixYkX8/Oc/jzVr1sRNN82sxqhUkX9i0qN+/fpv8S+qF198cYt/eb3dwoUL44ILLoh77703TjzxxEqOuNvbc889o3//LffpX//6V4+3X79+fSxfvjyeeOKJ+OIXvxgRb3xjLhaLMWDAgHjooYfiIx/5SMXn3t1sbZ+29Xzac889IyKioaGh+7KDDjooisVi/PWvf40DDzywcgPvxnZkr1pbW+P444+PK664IiIiDj300BgyZEh86EOXRoQfe+9KHGGiRwcddFAsWbKk5LIlS5bEcccdt9X7LFiwIM4999yYP39+nHzyyZUecbc3cODAOOKII7bYp8cff7zH2zc2NsaTTz4Zq1at6j5dfPHF8YEPfCBWrVoVRx99dDXG3u1sbZ+29Xw67LDxERGxcePG7stWr14d/fr1i3322adyw+7mdmSvNm7cGP36lX4r7d+/f8VmpHYcYaJHZ511Vlx77Slx5JFHxrHHHht33HFHPPfcc3HxxRdHRMT06dPj+eefjx/96EcR8UYsTZ06Nb7zne/EMccc0/0vtEGDBkVTU1PNPo9d3bRp0+Lss88u2ae3/uv4rfvUr1+/GDduXMn9R4wYEXvssccWl1NePe3Ttp5PH//45LjppogZM2bEd797brz00ktxxRVXxPnnnx+DBg2q5aeyy+vtXk2ZMiUuvPDCuP322+NjH/tYvPDCC3HZZZfFwQePi6eequVnsnvasGFDPPPMM93n16xZE6tWrYphw4bFmDFj+vTYgokeTZo0KRobZ8XXv/71eOGFF2LcuHGxePHi2HfffSMi4oUXXih5XZLvf//78frrr0culyv5xdRzzjkn7r777mqPv9s47bTT4p///GfJPt16651x4YVvXP/2faI2etqnbT2fBg8eHBFv/Bj1yCOPjOHDh8epp54aN954Y03m3530dq/OPffcWL9+fcyePTu+/OUvx9ChQ+MjH/lInHXWt2Ly5Fp9Fruv5cuXx8SJE7vPT5s2LSLK9L2obC9QUCZeh6m26+4Or+NhvZ1/TetZL8vrWXPX5HeYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACRk5nWY8vl85PP56Ow8oNajAACUyMwRplwuF4VCIebOnVfrUQAASmQmmAAAskowAQAkCCYAgATBBACQIJgAABLqisVisdZDvFVHR0c0NTVFe3t7NDY21nocAIDsBVOxWIz169dHQ0ND1NXV1XocAIDsBRMAQNb4HSYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACDh/wN2b3YHdPyDlQAAAABJRU5ErkJggg==\n",
350 "text/plain": [
351 "Graphics object consisting of 1 graphics primitive"
352 ]
353 },
354 "metadata": {},
355 "output_type": "display_data"
356 },
357 {
358 "data": {
359 "image/png": "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35+2traYOnVqfOxjH6vEmoe8Nx6n1OMpImLmzJkREXHjjTfGs88+G0uWLIkTTzyxUisfsrp7rJ544omYOnVqXHHFFfHMM8/ET3/602htbY1bb721wpsTEdHe3h5jx47tfPxkqlhj2traihFRbGtrq/YqJdasKRYjdr89FGaOHn1J8aqrrir52IknnlicNWvWAX+tpqam4s0333xA8yp1H99s804//fSS47Rn3qWXfme/n3fBBRcUr7/++uJNN91UHDt27EHPr8b3aLXm9mTmG49Tsbj/x9NDDz1UHDjww2+q79XeMq+7x+ob3/hG8dhjjy257jvf+U5xyJD/16u+R3vj3P3Zs9M3v/mrzL5mzZxhyufz0dTUFM3NzdVehYj4/e9/HxMnTiy5buLEifHkk08e0Ofv2rUrtm/fHoMHDy7HesTuH9msWbNmr+MUEfH000/v8/PuvvvueO655+Kmm24q53r8x76O0/4eT8uWLYtRo0ZFRMTZZ58dJ5xwQnz1q1+Nf/7zn2Xf91B2MMfqjDPOiBdffDGWL18exWIx/vznP8d9990XZ555ZiVWpoJqJphyuVwUCoWKvCgfabt27YyhQ4eWXDd06NDYsmXLAX3+t771rWhvb4/zzz+/HOsREX/9619j5869j1NExN/+9rcuP+cPf/hDzJo1K+69997o16/mnobtTWlfx2l/j6fnn38+1q9fHxG7H0vz58+P++67r1c/S3JvcDDH6owzzoh77703LrjggjjssMNi2LBhceSRR8bMmV+rxMpUUM0EE7Xnja/cXCwWk6/mHBGxZMmSmDNnTixdujSGDBlSrvX4j66OSVfX7dy5My688MK4+eab44QTTqjEarxOdx5Pu3bt6vzYmDFjYvLkyTFv3ry45557nGWqgO4cq0KhEFdffXXceOONsWbNmnj44Ydj06ZNcdttcyuxKhXkn5h0qU+fvnv9i2rr1q1dns14vaVLl8YVV1wRP/3pT+PjH/94OVc85L31rW+Nvn33Pk4R0eWPQrdv3x6rV6+OdevWxRe/+MWI2P0Xc7FYjH79+sUjjzwSH/3oR8u+96FmX8dpf4+n4cOHx5Ah/ePFF/973ahRo6JYLMaLL74Yxx9/fDlXPmQdzLFqaWmJcePGxbXXXhsRESeffHIMGDAgPvShqyPCj73fTJxhokujRo2KFStWlFy3YsWKOOOMM/b5OUuWLIlLL700Fi9eHOecc065VzzkHXbYYXHaaaftdZwiIsaOHbvXdQ0NDfG73/0u1q9f33m56qqr4j3veU+sX78+3v/+91di7UPOvo7T/h5P48aNi7/85S8l123YsCH69OkT73jHO8q266HuYI7VK6+8En36lP5V2rdv37LtSPU4w0SXLr744rjxxnPjfe97X3zwgx+Mu+66K1544YW46qqrIiJi9uzZ8ac//Sl+/OMfR8TuWJo6dWp8+9vfjg984AOd/0Lr379/NDY2Vu1+vNnNmDEjLrnkks7j9K1vLY+Ir8R5550XEaXHqU+fPjFmzJiSzx8yZEgcfvjhe11Ptt54nFKPpwsvvDBuuOGB2Lp19+8z7djxYlx77bVx+eWXR//+/at5V970unuspkyZEp///OfjzjvvjLPPPjtefvnlmD59eowePSaeeaaa9+TQtGPHjti4cWM8+2z/iHhPvPTSS7F+/foYPHhwjBw5skdfWzDRpYkTJ0ZDw/y45ZZb4uWXX44xY8bE8uXL453vfGdE7H6en9c/L8n3v//9eO211yKXy5X8Yuq0adPinnvuqfT6h4wLLrgg/va3v3Uep2OP3R1Kw4cPj4i9jxPV8cbjlHo8DRw4MO64444477zd/3h529s2x/nnnx//8z//U627cMjo7rG69NJLY/v27bFgwYL4yle+EkceeWR89KMfjYsv/mZMmlSte3HoWr16dUyYMCEiTo2ItTFv3rdi3rx12fxdlNkTFGTE8zAdWjPNM6+3zH2z/7c1r3fPq9bMas7dn3Ls5HeYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACTUTDDl8/loamqK5ubmaq8CAFCiZoIpl8tFoVCI1tbWaq8CAFCiZoIJAKBWCSYAgATBBACQIJgAABIEEwBAQl2xWCxWe4nX27ZtWzQ2NkZbW1s0NDRUex0AgNoLpmKxGNu3b49BgwZFXV1dtdcBAKi9YAIAqDV+hwkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEj4/yzhf4eoNGqvAAAAAElFTkSuQmCC\n",
360 "text/plain": [
361 "Graphics object consisting of 1 graphics primitive"
362 ]
363 },
364 "metadata": {},
365 "output_type": "display_data"
366 },
367 {
368 "data": {
369 "image/png": "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CCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJGQmmPL5fDQ1NUVzc3OtRwEAKJGZYMrlclEoFKK1tbXWowAAlMhMMAEAZJVgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJBQ9mB66aWX4otf/GKMGTMm+vfvH29961vjpptuil27dpV7KQCAquhb7ju87bbb4lvf+lYsWrQo3vWud8W6devi4osvjsbGxrj66qvLvRwAQMWVPZh++9vfxoc//OE499xzIyLiqKOOimXLlsW6devKvRQAQFWU/UdyZ5xxRvz85z+PTZs2RUTE73//+1izZk184AMfKPdSAABVUfYzTNddd120tbXF0UcfHX369ImdO3fGrbfeGp/4xCd6vH1XV1d0dXV1X29vby/3SAAA+6XsZ5iWL18eS5YsiaVLl8aGDRti0aJF8dWvfjUWLVrU4+1bWlqisbGx+zJq1KhyjwQAsF/KHkzXXnttXH/99fHxj3883v3ud8eFF14Y11xzTbS0tPR4+1mzZkVbW1v3ZevWreUeCQBgv5T9R3I7duyIww4r7bA+ffrs9tcK1NfXR319fbnHAAAom7IH05QpU+LWW2+N0aNHx7ve9a545JFHYu7cuXHJJZeUeykAgKooezDNnz8/vvSlL8VnP/vZeO6552LkyJExffr0+PKXv1zupQAAqqLswdTQ0BDz5s2LefPmlfuuAQBqwnvJAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACZkJpnw+H01NTdHc3FzrUQAASmQmmHK5XBQKhWhtba31KAAAJTITTAAAWSWYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASMhMMOXz+Whqaorm5uZajwIAUCIzwZTL5aJQKERra2utRwEAKJGZYAIAyCrBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQEJmgimfz0dTU1M0NzfXehQAgBKZCaZcLheFQiFaW1trPQoAQInMBBMAQFYJJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJFQmmp59+Oj71qU/FEUccEQMGDIjjjz8+1q9fX4mlAAAqrm+57/CFF16I8ePHx8SJE+MnP/lJDB06NJ544okYPHhwuZcCAKiKsgfTbbfdFqNGjYo777yz+9hRRx1V7mUAAKqm7D+Se/DBB+Okk06Kj370ozF06NA44YQT4jvf+c5ub9/V1RXt7e0lFwCALCl7MD355JOxcOHCGDt2bPz0pz+Nyy+/PK666qr43ve+1+PtW1paorGxsfsyatSoco8EALBfyh5Mu3btive85z0xZ86cOOGEE2L69Onxmc98JhYuXNjj7WfNmhVtbW3dl61bt5Z7JADgEHL00RHr17/8sVzK/hqmESNGRFNTU8mxY445Jn7wgx/0ePv6+vqor68v9xgAwCFqwICI97ynvPdZ9jNM48ePj8cee6zk2KZNm+LII48s91IAAFVR9mC65pprYu3atTFnzpzYvHlzLF26NO64447I5XLlXgoAoCrKHkzNzc1x//33x7Jly2LcuHFx8803x7x58+KTn/xkuZcCAKiKsr+GKSLigx/8YHzwgx+sxF0DAFSd95IDAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASMhNM+Xw+mpqaorm5udajAACUyEww5XK5KBQK0draWutRAABKZCaYAACySjABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgATBBACQkJlgyufz0dTUFM3NzbUeBQCgRGaCKZfLRaFQiNbW1lqPAgBQIjPBBACQVYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACRkJpi8+S4AkFWZCSZvvgsAZFVmggkAIKsEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkFDxYGppaYm6urqYMWNGpZcCAKiIigZTa2tr3HHHHXHsscdWchkAgIqqWDBt3749PvnJT8Z3vvOdeMMb3lCpZQAAKq5iwZTL5eLcc8+N973vfXu8XVdXV7S3t3dfnn22PSIiduyo1GQAAL3TtxJ3+v3vfz82bNiwV2+k29LSEjfeeOOrjrz847tNmyKGD6/EdAAAvVP2M0xbt26Nq6++OpYsWRKHH3548vazZs2Ktra27suKFT8p90gAAPul7GeY1q9fH88991yceOKJ3cd27twZq1evjgULFkRXV1f06dOn+3P19fVRX1/ffX3gwHJPBACwf8oeTGeffXb88Y9/LDl28cUXx9FHHx3XXXdd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7GqMecjr7fMpIuKCCy6I3/3udxERcf/998eyZcvi6KOPrtbIh6ze7tWaNWti2rRpcemll8ajjz4a99xzT7S2tsZll11W5cmJiOjs7IzjjjsuFixYUPb7Fkz0aO7cuXHppZfGZZddFsccc0zMmzcvRo0aFQsXLuzx9vPmzYsvfOEL0dzcHGPHjo05c+bE2LFj40c/+lGVJz+0vHqfxowZExERw4cP3+0+vWL69OkxderUOO2006ox5iGvt8+nhx56KFatWhXf+MY3IiJi5MiRcfLJJ8fpp59ezbEPSb3dq7Vr18ZRRx0VV111VYwZMybOOOOMmD59eqxbt67KkxMRMXny5Ljlllvi/PPPL/t9ZyaY8vl8NDU1xYUXfqrWoxzyXnzxxVi/fn1MmjSp5PikSZPiN7/5zV7dx65du6KjoyOGDBlSiRGJiH//+9897tOpp566x326884744knnoivfOUrlR6R2P0+7en59OCDD8ZJJ50UixYtioiI8847Lz7/+c/HP//5z4rPeyjbl706/fTT489//nOsWLEiisViPPvss3HvvffGueeeW42RqaLMBFMul4tCoRCLFy+p9SiHvH/84x+xc+fOGDZsWMnxYcOGxbZt2/bqPr72ta9FZ2dnXHDBBZUYkYj429/+1uM+DRkyZLf79Pjjj8f1118fd999d/Ttm7lfw3ZQ2t0+7en59OSTT8aaNWviiSeeiIiIz3/+83Hvvfce0L8l+UCwL3t1+umnx9133x0f+9jHol+/fjF8+PAYPHhwzJ8/vxojU0WZCSay57/fublYLCbfzTkiYtmyZTF79uxYvnx5DB06tFLj8b962pOeju3cuTOmTp0aN954Y7zjHe+oxmi8Sm+eT7t27Yq6urq45ZZbIiLijDPOiLlz58Zdd93lLFMV9GavCoVCXHXVVfHlL3851q9fHw899FBs2bIlLr/88mqMShX5JyavMXjw4OjTp89r/kX13HPPveZfXv9t+fLlcemll8Y999wT73vf+yo55iHvjW98Y4/79Pe//73Hfero6Ih169bFI488EldccUVEvPwXc7FYjL59+8bPfvazOOuss6oy+6Fkd/u0p+fTiBEj4s1vfnM0NDR0HzvmmGOiWCzGn//85xg7dmxFZz5U7ctetbS0xPjx4+Paa6+NiIhjjz02Bg4cGGeeeWZccMH/iYg3VXpsqsQZJl7jda97XZx44omxcuXKkuMrV67c44tOly1bFp/+9Kdj6dKlfn5fBf369etxn9auXdvjPg0aNCj++Mc/xsaNG7svl19+ebzzne+MjRs3ximnnFKt0Q8pu9unPT2fxo8fH3/5y19ix44d3cc2bdoUhx12WLzlLW+p6LyHsn3Zqx07dsRhh5X+VdqnT5+KzUjtOMNEj2bOnBkXXnhhnHTSSXHaaafFHXfcEU899VT3aeZZs2bF008/Hd/73vci4uVYmjZtWnz961+PU089tftfaP3794/GxsaaPY6D3av3qbFxYkSMiW3btsXll8+NiNJ9Ouyww2LcuHElXz906NA4/PDDX3Oc8urt82nq1Klx8803/+97Yd0eGzZsiNtvvzYuueSS6N+/f+0eyCGgt3s1ZcqU+MxnPhMLFy6M97///fHMM8/EjBkz4uSTT443vcnZpWrbvn17bN68ufv6li1bYuPGjTFkyJAYPXr0ft23YKJHH/vYx+L555+Pm266KZ555pkYN25crFixIo488siIiHjmmWdKfi/Jt7/97XjppZcil8uVvDD1oosuirvuuqva4x8yXr1PTz/97Yj4vzF//vzd7hO10dvn0+tf//pYuXJlXHTR1yMi4oYbbohPfWpK92uaqJze7tWnP/3p6OjoiAULFsTnPve5GDx4cJx11llx2223xbPP1upRHLrWrVsXEydO7L4+c+bMiCjT30XFjFm1qq0YEcVVq9pqPUq39euLxYiXPx7M69bicR7Mj/Fgfmy1WC8Lax/s/42tZ70Dad1q8xomAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmZ+T1M+Xw+8vl8dHa+vdajAACUyMwZplwuF4VCIRYvXlLrUQAASmQmmAAAskowAQAkCCYAgATBBACQIJgAABLqisVisdZDvFp7e3s0NjZGW1tbDBo0qNbjAABkL5iKxWJ0dHREQ0ND1NXV1XocAIDsBRMAQNZ4DRMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJDw/wGi2Qq0bu4+vQAAAABJRU5ErkJggg==\n",
370 "text/plain": [
371 "Graphics object consisting of 1 graphics primitive"
372 ]
373 },
374 "metadata": {},
375 "output_type": "display_data"
376 },
377 {
378 "data": {
379 "image/png": "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ACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgIQB9R5gm2KxGMViMTo7D6r3KAAAFXJzhqlQKESpVIqFCxfVexQAgAq5CSYAgLwSTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASMg+m119/Pb74xS/GmDFjYtCgQfG+970vvvKVr8TWrVuzXgoAoCYyf6fvm266Kb797W/HHXfcEYceemisXLkyLr744mhubo7Pf/7zWS8HAFB1mQfTz3/+8/j4xz8ep59+ekREHHjggbFkyZJYuXJl1ksBANRE5i/JnXjiifHII4/Es88+GxERv/zlL+PJJ5+M0047LeulAABqIvMzTNdee210dHTEwQcfHP37948tW7bE1772tfjMZz7T4/FdXV3R1dXVfb2zc1PWIwEA9EnmwbR06dJYtGhRLF68OA499NBYu3ZtzJgxI0aPHh0XXnjhW45va2uLG2+88U23HJ71SAAAfZL5S3JXX311XHfddXHOOefEYYcdFueff3584QtfiLa2th6PnzVrVnR0dHRfli17IOuRAAD6JPMzTK+99lr061fZYf3799/u2wo0NjZGY2Nj9/XBg7OeCACgbzIPpilTpsTXvva1OOCAA+LQQw+NNWvWxNy5c+OSSy7JeikAgJrIPJhuueWW+NKXvhSf+9zn4tVXX43Ro0fHtGnT4oYbbsh6KQCAmsg8mIYMGRLz5s2LefPmZX3XAAB14bPkAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCAhMzfh2lXFYvFKBaL0dl5UL1HAQCokJszTIVCIUqlUixcuKjeowAAVMhNMAEA5JVgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIGFAvQfYplgsRrFYjM7Og+o9CgBAhdycYSoUClEqlWLhwkX1HgUAoEJuggkAIK8EEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAwNvKa69FrF79xtes5CaYisVitLS0xPnnn1fvUQCA3dj//m/E0Ue/8TUruQmmQqEQpVIpFi5cVO9RAAAq5CaYAADySjABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASKhKML300ktx3nnnxb777ht77713HHnkkbFq1apqLAUAUHUDsr7Dv/3tbzFhwoSYNGlSPPDAAzF8+PD4/e9/H0OHDs16KQCAmsg8mG666abYf//947bbbuu+7cADD8x6GQCAmsn8Jbn7778/jjnmmPj0pz8dw4cPj6OOOiq++93vbvf4rq6u2LBhQ/els3NT1iMBAPRJ5sH0hz/8IRYsWBBjx46Nhx56KC6//PK48sor48477+zx+La2tmhubu6+nHba5KxHAgDok8yDaevWrfHBD34w5syZE0cddVRMmzYtPvvZz8aCBQt6PH7WrFnR0dHRfVm27IGsRwIA6JPMg2nUqFHR0tJScdshhxwSzz//fI/HNzY2RlNTU/dl8OB9sh4JAKBPMg+mCRMmxDPPPFNx27PPPhvvfe97s14KAKAmMg+mL3zhC/H000/HnDlz4rnnnovFixfHrbfeGoVCIeulAABqIvNgam1tjXvvvTeWLFkS48aNi69+9asxb968OPfcc7NeCgCgJjJ/H6aIiDPOOCPOOOOMatw1AEDN+Sw5AIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgoSrvw7QrisViFIvF6Ow8qN6jAABUyM0ZpkKhEKVSKRYuXFTvUQAAKuQmmAAA8kowAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkDCg3gNsUywWo1gsRmfnQfUeBQCgQm7OMBUKhSiVSrFw4aJ6jwIAUCE3wQQAkFeCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAk+PBdAICE3Jxh8uG7AEBe5SaYAADySjABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJVQ+mtra2aGhoiBkzZlR7KQCAqqhqMLW3t8ett94ahx9+eDWXAQCoqqoF06ZNm+Lcc8+N7373u/HOd76zWssAAFRd1YKpUCjE6aefHh/96Ed3eFxXV1ds2LCh+9LZualaIwEA7JIB1bjT73//+7F69epob29PHtvW1hY33njjm27x8h0AkC+Zn2F64YUX4vOf/3wsWrQo9tprr+Txs2bNio6Oju7LsmUPZD0SAECfZH6GadWqVfHqq6/G0Ucf3X3bli1bYsWKFTF//vzo6uqK/v37d3+vsbExGhsbu68PHpz1RAAAfZN5MJ188snx61//uuK2iy++OA4++OC49tprK2IJAGB3kHkwDRkyJMaNG1dx2+DBg2Pfffd9y+0AALsD7/QNAJBQlf9L7j899thjtVgGAKAqnGECAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASavI+TDujWCxGsViMzs6D6j0KAECF3JxhKhQKUSqV4he/WBQREe9/f50HAgD4P7kJpm323rvyKwBAveUumAAA8kYwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJOQmmIrFYrS0tERra2u9RwEAqJCbYNr24bvt7e31HgUAoEJuggkAIK8EEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAm5CaZisRgtLS3R2tpa71EAACrkJpgKhUKUSqVob2+v9ygAABVyE0wAAHklmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkZB5MbW1t0draGkOGDInhw4fHJz7xiXjmmWeyXgYAoGYyD6bHH388CoVCPP3007F8+fJ4/fXX49RTT43Ozs6slwIAqIkBWd/hgw8+WHH9tttui+HDh8eqVaviwx/+cNbLAQBUXdV/h6mjoyMiIoYNG1btpQAAqiLzM0xvVi6XY+bMmXHiiSfGuHHjejymq6srurq6uq9v2LChmiMBAPRaVc8wXXHFFfGrX/0qlixZst1j2traorm5ufuy//77V3MkAIBeq1owTZ8+Pe6///549NFH4z3vec92j5s1a1Z0dHR0X1544YVqjQQAsEsyf0muXC7H9OnT4957743HHnssxowZs8PjGxsbo7GxMesxAAAyk3kwFQqFWLx4cfzwhz+MIUOGxPr16yMiorm5OQYNGpT1cgAAVZf5S3ILFiyIjo6OmDhxYowaNar7snTp0qyXAgCoiaq8JAcA8Hbis+QAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAICE3ARTsViMlpaWaG1trfcoAAAVchNMhUIhSqVStLe313sUAIAKuQkmAIC8EkwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAk5CaYisVitLS0RGtra71HAQCokJtgKhQKUSqVor29vd6jAABUyE0wAQDklWACAEgQ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qyMi4vDDD4/BgwfHhz70oTjrrP+OiP2qPTY14gwTb/GOd7wjjj766Fi+fHnF7cuXL9/hL50uWbIkLrrooli8eLHX72tg4MCBPe7T008/3eM+NTU1xa9//etYu3Zt9+Xyyy+PD3zgA7F27druXy4mW9vbpx09nyZMmBAvv/xybNq0qfu2P/7xj9GvX794z3veU9V592S7slevvfZa9OtX+Vdp//79qzYj9eMMEz2aOXNmnH/++XHMMcfECSecELfeems8//zz3aeZZ82aFS+99FLceeedEfFGLF1wwQXxzW9+M44//vjuf6ENGjSo4l/JZOvN+9TcPCkixsT69evj8svnRkTlPvXr16/75Z1thg8fHnvttddbbidbvX0+TZ06Nb761a/GxRdfHGeffVNEvC/mzZsXl1xySQwaNKiOj+Ttr7d7NWXKlPjsZz8bCxYsiI997GPxyiuvxIwZM+LYY4+N/fZzdqnWNm3aFM8991w888ygiPhAvPzyy7F27doYNmxYHHDAAX26b8FEj84+++z4y1/+El/5ylfilVdeiXHjxsWyZcvive99b0REvPLKKxXvS/Kd73wnXn/99SgUChW/mHrhhRfG7bffXuvx9xhv3qeXXvpORPwibrnllu3uE/XR2+fTPvvsE8uXL4/p06fHeeedFxFPxYc//OH4n//5f3V6BHuO3u7VRRddFBs3boz58+fHVVddFUOHDo2TTjopbrrppvjTn+r1KPZcK1eujEmTJkXEURGxOubOvTnmzl2Tzd9F5Zzp6OgoR0S5o6Oj3qN0W7WqXI544+vbeV3rWS+Pa+VtfftqvbyutyetmVKNmfwOEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAICE3ARTsViMlpaWaG1trfcoAAAVchNMhUIhSqVStLe313sUAIAKuQkmAIC8EkwAAAmCCQAgQTABACQIJgCAhIZyuVyu9xBvtmHDhmhubo6Ojo5oamqq9zgAAPkLpnK5HBs3bowhQ4ZEQ0NDvccBAMhfMAEA5I3fYQIASBBMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABL+P7RRFueJiwV7AAAAAElFTkSuQmCC\n",
380 "text/plain": [
381 "Graphics object consisting of 1 graphics primitive"
382 ]
383 },
384 "metadata": {},
385 "output_type": "display_data"
386 },
387 {
388 "data": {
389 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGGCAYAAACJ/96MAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAa3klEQVR4nO3de5DVdf348dcKsYLBEiYIhUoTpSuJt9VEMzAvQ4pdptRQMUIHfx4vSBdl/Gaoyf5s0ugrR0pn8gJiTI0aNaSSGUTmzALS7czPSzGKF6Ka2oW1NoXz+8PYOgm8Xficcz64j8fMmZ1z4bxfhzdnefI5hz0N5XK5HAAA7NBe9R4AACDvBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJCQu2Aql8vR0dERfp4mAJAXuQumTZs2RVNTU2zatKneo3RbsyaioeH1r2/lda23Z67VG9brzeu/1ffW76U1q6EaM+UumAAA8kYwAQAk9DiYVqxYEZMmTYoRI0ZEQ0NDPPjgg93Xvfrqq3HVVVfFBz7wgdhnn31ixIgRMWXKlHjppZcyHRoAoJZ6HEydnZ0xduzYmDdv3huue+WVV2LNmjXx5S9/OdasWRP3339/PP3003HmmWdmMiwAQD307ekvmDhxYkycOHG71zU1NcWyZcsqLrv11lvjmGOOieeffz4OOOCAXZsSAKCOehxMPdXe3h4NDQ0xePDg7V7f1dUVXV1d3ec7OjqqPRIAQI9U9U3f//jHP+Lqq6+OyZMnx6BBg7Z7m9bW1mhqauo+jRw5spojAQD0WNWC6dVXX41zzjkntm7dGrfddtsObzdr1qxob2/vPq1fv75aIwEA7JKqvCT36quvxllnnRXr1q2Ln/70pzs8uhQR0djYGI2NjdUYAwAgE5kH07ZYeuaZZ+Kxxx6LfffdN+slAABqqsfBtHnz5nj22We7z69bty7Wrl0bQ4YMiREjRsSnPvWpWLNmTfzoRz+KLVu2xIYNGyIiYsiQIdGvX7/sJgcAqJEeB9OqVatiwoQJ3ednzpwZEREXXHBBzJ49O5YsWRIREYcffnjFr3vsscdi/PjxuzEqAEB99DiYxo8fH+VyeYfX7+w6AIA9kc+SAwBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEnITTMViMZqbm6OlpaXeowAAVMhNMBUKhSiVStHW1lbvUQAAKuQmmAAA8kowAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAICE3ASTD98FAPIqN8Hkw3cBgLzKTTABAOSVYAIASBBMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACAhN8FULBajubk5Wlpa6j0KAECF3ARToVCIUqkUbW1t9R4FAKBCboIJACCvBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCAhB4H04oVK2LSpEkxYsSIaGhoiAcffLDi+nK5HLNnz44RI0ZE//79Y/z48fG73/0us4EBAGqtx8HU2dkZY8eOjXnz5m33+q997Wtxyy23xLx586KtrS3233//OOWUU2LTpk27PSwAQD307ekvmDhxYkycOHG715XL5Zg7d25cc8018clPfjIiIu6+++4YNmxYLFq0KKZPn7570wIA1EGm72Fat25dbNiwIU499dTuyxobG+PDH/5wPP7441kuBQBQMz0+wrQzGzZsiIiIYcOGVVw+bNiweO6557b7a7q6uqKrq6v7fEdHR5YjAQDstqr8L7mGhoaK8+Vy+Q2XbdPa2hpNTU3dp5EjR1ZjJACAXZZpMO2///4R8e8jTdts3LjxDUedtpk1a1a0t7d3n9avX5/lSAAAuy3TYBo1alTsv//+sWzZsu7L/vnPf8by5ctj3Lhx2/01jY2NMWjQoIoTAECe9Pg9TJs3b45nn322+/y6deti7dq1MWTIkDjggANixowZMWfOnBg9enSMHj065syZEwMGDIjJkydnOjgAQK30OJhWrVoVEyZM6D4/c+bMiIi44IIL4q677oovfelL8fe//z0uueSS+Otf/xrHHntsPPLIIzFw4MDspgYAqKEeB9P48eOjXC7v8PqGhoaYPXt2zJ49e3fmAgDIDZ8lBwCQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAICE3ARTsViM5ubmaGlpqfcoAAAVchNMhUIhSqVStLW11XsUAIAKuQkmAIC8EkwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAICE3weTDdwGAvMpNMPnwXQAgr3ITTAAAeSWYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASMhNMBWLxWhubo6WlpZ6jwIAUCE3wVQoFKJUKkVbW1u9RwEAqJCbYAIAyCvBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACAh82B67bXX4n/+539i1KhR0b9//3jPe94T119/fWzdujXrpQAAaqJv1nd40003xbe+9a24++6749BDD41Vq1bF1KlTo6mpKa644oqslwMAqLrMg+mXv/xlfOxjH4vTTz89IiIOOuiguO+++2LVqlVZLwUAUBOZvyR3wgknxKOPPhpPP/10RET86le/ipUrV8ZHP/rRrJcCAKiJzI8wXXXVVdHe3h4HH3xw9OnTJ7Zs2RI33nhjfOYzn9nu7bu6uqKrq6v7fEdHR9YjAQDslsyPMC1evDgWLlwYixYtijVr1sTdd98dX//61+Puu+/e7u1bW1ujqamp+zRy5MisRwIA2C2ZB9MXv/jFuPrqq+Occ86JD3zgA3H++efHlVdeGa2trdu9/axZs6K9vb37tH79+qxHAgDYLZm/JPfKK6/EXntVdlifPn12+GMFGhsbo7GxMesxAAAyk3kwTZo0KW688cY44IAD4tBDD40nn3wybrnllvjc5z6X9VIAADWReTDdeuut8eUvfzkuueSS2LhxY4wYMSKmT58e1157bdZLAQDURObBNHDgwJg7d27MnTs367sGAKgLnyUHAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAk5CaYisViNDc3R0tLS71HAQCokJtgKhQKUSqVoq2trd6jAABUyE0wAQDklWACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgITfBVCwWo7m5OVpaWuo9CgBAhdwEU6FQiFKpFG1tbfUeBQDYgx18cMTq1a9/zUrf7O4KAKD+BgyIOPLIbO8zN0eYAADySjABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgITcBFOxWIzm5uZoaWmp9ygAABVyE0yFQiFKpVK0tbXVexQAgAq5CSYAgLwSTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASqhJML774Ypx33nmx7777xoABA+Lwww+P1atXV2MpAICq65v1Hf71r3+N448/PiZM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2muvjYiIOXPmxMEHH1yrkXutnu7VypUrY8qUKTFt2rT43e9+F9/73veira0tLrzwwhpPTkREZ2dnjB07NubNm5f5fQsmtuuWW26JadOmxYUXXhiHHHJIzJ07N0aOHBnz58/f7u3nzp0bX/rSl6KlpSVGjx4dc+bMidGjR8cPf/jDGk/eu2zbp0984hMREfGFL3xhp/u0zfTp02Py5Mlx3HHH1WLMXq+nz6eHHnooli9fHkuXLo1jjz02IiLGjBkT48aNq+XYvVJP9+qJJ56Igw46KC6//PIYNWpUnHDCCTF9+vRYtWpVjScnImLixInx1a9+NT75yU9mft+5CaZisRjNzc1x/vnn1XuUXu/VV1+N1atXx6mnnlpx+amnnhqPP/74m7qPrVu3xqZNm2LIkCHVGJGI+Oc//7lL+3TnnXfG73//+/jKV75S7RGJXdunJUuWxNFHHx1f+9rX4rTTTouIiG984xvx97//verz9ma7slfjxo2LF154IZYuXRrlcjn++Mc/xve///3ul1J568hNMBUKhSiVSrFgwcJ6j9Lr/e1vf4stW7bEsGHDKi4fNmxYbNiw4U3dx8033xydnZ1x1llnVWNEIuLPf/5zj/fpmWeeiauvvjruvffe6Ns3dz+G7S1pV/bpD3/4Q6xcuTJ++9vfxs033xwRET/5yU/26J+SvCfYlb0aN25c3HvvvXH22WdHv379Yv/994/BgwfHrbfeWouRqaHcBBP589+f3Fwul5Of5hwRcd9998Xs2bNj8eLFMXTo0GqNx7+82X3asmVLTJ48Oa677rp43/veV6vx+JeePJ+2bt0aDQ0Nce+998aYMWMiIuLzn/983HXXXY4y1UBP9qpUKsXll18e1157baxevToeeuihWLduXVx88cW1GJUa8k9M3mDw4MHRp0+fN/yLauPGjW/4l9d/W7x4cUybNi2+973vxcknn1zNMXu9d77znd37dOCB/758R/u0adOmWLVqVTz55JNx6aWXRsTrfzGXy+Xo27dvPPLII3HSSSfVavxe4z/36T/t7Pk0fPjweNe73hVNTU3dl40aNSrK5XK88MILMXr06KrO3Fvtyl61trbG8ccfH1/84hcjIuKwww6LffbZJz70oQ/FWWf934jYr9pjUyOOMPEGb3vb2+Koo46KZcuWVVy+bNmynb7p9L777ovPfvazsWjRIq/f10C/fv16tE+DBg2K3/zmN7F27dru08UXXxzvf//7Y+3atd1vLiZbPd2niIjjjz8+Xnrppdi8eXP3Zc8991zstdde8e53v7uq8/Zmu7JXr7zySuy1V+VfpX369KnajNSPI0xs18yZM+P888+Po48+Oo477ri4/fbb4/nnn+8+zDxr1qx48cUX45577omI12NpypQp8c1vfjM++MEPdv8LrX///hX/SiZb2/Zpv/1Oi4iPxc0337zDfdprr726X97ZZujQobH33nu/4XKy1dPn0+TJk+OGG26IqVOnxtln3xQR74m5c+fG5z73uejfv38dH8lbX0/3atKkSXHRRRfF/Pnz47TTTouXX345ZsyYEcccc0zst5+jS7W2efPmePbZZ7vPr1u3LtauXRtDhgyJAw44YLfuWzCxXWeffXb85S9/ieuvvz5efvnlGDNmTCxdujQO/NdrPy+//HLFzyX59re/Ha+99loUCoWKN6ZecMEFcdddd9V6/F5j2z7dcMPtEfGxWLNmzU73ifro6fPp7W9/eyxbtiwuu+yyOO+88yLi8TjxxBPjf//3/9TpEfQePd2rz372s7Fp06aYN29efP7zn4/BgwfHSSedFDfddFP88Y/1ehS916pVq2LChAnd52fOnBkRGf1dVM6Z5cvbyxFRXr68vd6jdFu9ulyOeP3rW3ld6+2Za/WG9Xrz+m/1vfV7ac09hfcwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEjIzc9hKhaLUSwWo7PzvfUeBQCgQm6OMBUKhSiVSrFgwcJ6jwIAUCE3wQQAkFeCCQAgQTABACQIJgCABMEEAJDQUC6Xy/Ue4j91dHREU1NTtLe3x6BBg+o9DgBA/oKpXC7Hpk2bYuDAgdHQ0FDvcQAA8hdMAAB54z1MAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAwv8H94ULhyPLZ2AAAAAASUVORK5CYII=\n",
390 "text/plain": [
391 "Graphics object consisting of 1 graphics primitive"
392 ]
393 },
394 "metadata": {},
395 "output_type": "display_data"
396 },
397 {
398 "data": {
399 "image/png": "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rFhR4cl3LgsXLoxrr/1/ERGxYMGC5HHaqL29PSZOnBjHHntsJcbc6XX38RQRcdppp8WDDz4YP//5z+OOO+6IiIj99tuvQhPvvLp7rB577LGYOHFinHvuufH000/HbbfdFm1tbXHeeedVeHIiIjo6OmLEiBFx+eWXZ/61BRObNHPmzDj33HPjvPPOiwMPPDBmzZoVe++9d8yZM2eT+8+aNSsuu+yyaGlpiaFDh8aMGTNi6NChcc8991R48p3LzJkz45RTTo2IiCFDhiSP00aTJk2KCRMmxKc//elKjLnT6+7j6b777otHHnkkFi1aFMcdd1wMHjw4IiJGjBhRybF3St09Vk8++WTst99+MXny5BgyZEgcffTRMWnSpFi6dGmFJyciYty4cfHDH/4wjjnmmMy/ds0EUz6fj2HDhkVLS0u1R9npvfvuu7Fs2bI44YQTSrafcMIJ8cQTT2zV19iwYUOsXbs2+vbtW44RiYh//etfsWzZsjjyyCNLtqeO00033RQvvPBCfO973yv3iMR/jlN3Hk933313HH744XHNNdfEXnvtFaee+n4U//Of/yz7vDuzbTlWRx11VLzyyiuxaNGiKBaL8fe//z1+85vfxEknnVSJkamgmgmmXC4XhUKhIm/Kx5b94x//iPXr18eAAQNKtg8YMCBWr169VV/j2muvjY6OjjjttNPKMSIR8cYbb8T69eujX79+Jdu3dJyee+65uOKKK+LWW2+N3r1r7mXYdkgbj1N3Hk8vvvhiPPbYY/HnP/857rjjjvjWt74VERE//vGPyz7vzmxbjtVRRx0Vt956a5x++umx6667xsCBA6NPnz5x3XXXVWJkKqhmgona87/v3FwsFpPv5hzx/s/STJ8+PRYuXBj9+/cv13j829Yep/Xr18eECRPiqquuik984hOVGo9/687jacOGDVFXVxe33nprjBo1Ko4++uiIiLjnnnvinXfeKfusO7vuHKtCoRCTJ0+O7373u7Fs2bK47777YtWqVXH++edXYlQqyH8x+YA+ffpEr169PvA/qtdff/0D//P6XwsXLoxzzz03brvttjjuuOPKOeZO7yMf+Uj06tUr3njjjZLtmztOa9eujaVLl8aKFSviwgsvjIj3/2EuFovRu3fveOCBB8ryvP/ObuNx6s7jadCgQbHXXntFc3Pz/9xSjFdeeSWGDh1apml3bttyrFpbW2P06NFx6aWXRkTEIYccEg0NDfGZz3wmfvjDH0bEoHKPTYU4w8QHfOhDH4qRI0fG4sWLS7YvXrw4jjrqqM1+3oIFC+Lss8+O+fPne/6+AnbdddcYOXJk/OEPfyjZvrnj1NTUFE899VSsXLmy63L++efHJz/5yVi5cmXXr66TrY3HqTuPp9GjR8err74a69atK9leV7dLfOxjHyvbrDu7bTlWb7/9duyyS+k/pb169YqI989MseMQTGzS1KlT42c/+1n84he/iL/85S9xySWXxEsvvdR1mnnatGkxceLErv0XLFgQEydOjGuvvTaOPPLIWL16daxevTra29urdRd2ClOnTo0773z/V85XrVq1xeO0yy67xPDhw0su/fv3j9122y2GDx8eDQ0NVbsfO7ruPp4mTJgQ/fr1i3POOScKhUIsX748IiJOOeWU2H333atyH3YW3T1W48ePj9tvvz3mzJkTL774Yjz++OMxefLkGDVqVNdvN1I569ati5UrV8YzzzwTERGvvvpqrFy5MvlSK1vDU3Js0umnnx5vvvlmfP/734/XXnsthg8fHosWLYp99903IiJee+21kr+AP/3pT+O9996LXC4XuVyua/tZZ50VN998c6XH32mcfvrpsWJFXVx9dcQZZ5wRhxzy3haPE9XR3cfTnnvuGYsXL46LLrooDj/88Ghs/FxE3Nv1tA/l091jdfbZZ8fatWtj9uzZ8c1vfjP69OkTxxxzTFx99dXVugs7taVLl8bYsWMj4rCIWB4zZ14bM2euyObfomKNaW9vL0ZEsb29vdqjdFm2rFiMeP+jNbe/tXb09Xbk+1arM+zIf+Y78n2z3o6zZko5ZvKUHABAgmACAEgQTAAACYIJACBBMAEAJAgmAICEmgmmfD4fw4YNi5aWlmqPAgBQomaCKZfLRaFQiLa2tmqPAgBQomaCCQCgVgkmAIAEwQQAkCCYAAASBBMAQEJdsVgsVnuI/7ZmzZpobm6O9vb2aGpqqvY4AAC1F0zFYjHWrl0bjY2NUVdXV+1xAABqL5gAAGqNn2ECAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAAS/j+h/SHOTV7TiwAAAABJRU5ErkJggg==\n",
400 "text/plain": [
401 "Graphics object consisting of 1 graphics primitive"
402 ]
403 },
404 "metadata": {},
405 "output_type": "display_data"
406 },
407 {
408 "data": {
409 "image/png": "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HmeffXY8/fTT8cMf/jDa29vjnHPOqfHkRER0dXXFhAkTYv78+Znft2Bii26++eY4++yz45xzzomPfOQjMW/evBgzZkwsWLBgi/vPmzcvLr300mhtbY1x48bF3LlzY9y4cfHwww/XePK+5eabb46TTz4lIiLGjh2bPE5vmzlzZkybNi2OOOKIWozZ5/X2+fTII4/EsmXLYsmSJXHcccfF6NGjIyJiwoQJtRy7T+rtsXryySdj3333jQsuuCDGjh0bRx11VMycOTNWrFhR48mJiJgyZUpcd9118alPfSrz+85NMBWLxWhpaYnPf/5z9R6lz3v99ddj5cqVccIJJ1RsP+GEE+KJJ57YrvvYvHlzbNiwIYYOHVqNEYl/H6fDDz+8YnvqON1xxx3x/PPPx9VXX13tEYkdez499NBDceihh8aNN94Ye+65Z5xyyltR/Nprr1V93r5sR47VkUceGX/+859jyZIlUS6X4+9//3v86Ec/ihNPPLEWI1NDuQmmQqEQpVIp7r77nnqP0uf985//jE2bNsWIESMqto8YMSLWr1+/Xfdx0003RVdXV5x66qnVGJH493EaNmxYxfZtHadnn302Lr/88rj33nujf//c/Rq2d6UdeT698MIL8dhjj8Xvf//7uP/+++MrX/lKRER8/etfr/q8fdmOHKsjjzwy7r333jjttNNiwIABMXLkyNhjjz3illtuqcXI1FBugon8+e93bi6Xy8l3c45463tp5syZE4sXL47hw4dXazz+z/Yep02bNsW0adPimmuuiQ996EO1Go//05vn0+bNm6OhoSHuvffeOOyww+Koo46KiIiHH344Xn311arP2tf15liVSqW44IIL4qqrroqVK1fGI488EmvXro1zzz23FqNSQ/6LyTu8733vi379+r3jf1QvvfTSO/7n9d8WL14cZ599dvzwhz+M4447rppj9nlvH6d//vOfFdu3dpw2bNgQK1asiNWrV8d5550XEW/9w1wul6N///7xs5/9LI455piazN6X7MjzadSoUbHnnntGc3Pzf91Sjj//+c8xbty4Kk3bt+3IsWpra4uJEyfGJZdcEhERBxxwQAwePDiOPvrouO666yJiVLXHpkacYeIdBgwYEIccckgsXbq0YvvSpUvjyCOP3OrnLVq0KM4666xYuHCh1+9r4O3j9Jvf/KZi+9aOU1NTUzz11FOxZs2ansu5554bH/7wh2PNmjU9P7pOtnbk+TRx4sT461//Ghs3bqzY3tCwW+y1115Vm7Wv25Fj9corr8Ruu1X+U9qvX7+IeOvMFO8egoktmjVrVnz729+O7373u/GHP/whLr744njxxRd7TjPPnj07pk+f3rP/okWLYvr06XHTTTfF4YcfHuvXr4/169dHR0dHvR5CnzBr1qx44IG3fuR87dq12zxOu+22W4wfP77iMnz48Nh9991j/PjxMXjw4Lo9jne73j6fpk2bFsOGDYsZM2ZEqVSKVatWRUTEySefHAMHDqzLY+grenuspk6dGvfdd18sWLAgXnjhhXj88cfjggsuiMMOO6znpxupnY0bN/b8hzDira+La9asSf6qle3hJTm26LTTTot//etfce2118bf/va3GD9+fCxZsiT22WefiIj429/+VvEX8Fvf+la8+eabUSgUolAo9Gw/88wz484776z1+H3GaaedFqtXN8QNN0ScfvrpccABb27zOFEfvX0+vec974mlS5fG+eefH4ceemgMGfLxiPhJz8s+VE9vj9VZZ50VGzZsiPnz58eXv/zl2GOPPeKYY46JG264oV4PoU9bsWJFTJ48uef6rFmzIiKjf4vKObNsWUc5IsrLlnXUe5QeK1eWyxFvfXy3rmm9XXOtvrBeHmd4t/+Ze75YL+9r1oOX5AAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAk5Ob3MBWLxSgWi9HV9cF6jwIAUCE3Z5gKhUKUSqW4++576j0KAECF3AQTAEBeCSYAgATBBACQIJgAABIEEwBAQkO5XC7Xe4j/1NnZGc3NzdHR0RFNTU31HgcAIH/BVC6XY8OGDTFkyJBoaGio9zgAAPkLJgCAvPE9TAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQML/BzlzCxLaFs7JAAAAAElFTkSuQmCC\n",
410 "text/plain": [
411 "Graphics object consisting of 1 graphics primitive"
412 ]
413 },
414 "metadata": {},
415 "output_type": "display_data"
416 },
417 {
418 "data": {
419 "image/png": "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V8dNN/2/iIhYtWpV8jjt1tnZGTNmzIgPfvCD1RjzgNfb51NExAUXXBD33HNP/OAHP4hHH300Fi1aVMWJD1y9PVYPPvhgzJgxIy699NL4y1/+Ej//+c+jo6MjPvvZz1Z5ciIiisVijB8/PubNm5f59xZM7NHixYvj0ksvjc9+9rPx7ne/O5YsWRJHHXVULFu2bI/7L1myJL70pS9Fa2trjBkzJhYtWhRjxoyJX/3qV1We/MCyePHi+MhHPhoREaNHj04ep91mz54d06dPj/e+973VGPOA19vn09133x33339/tLe3x9lnnx2jRo2KcePGVXnqA1Nvj9UjjzwSo0aNijlz5sTo0aPjzDPPjNmzZ8e6deuqPDkREVOmTImvfe1r8YEPfCDz7103wZTP52Ps2LHR2tpa61EOeP/+979j/fr1ce6555ZtP/fcc+Phhx/ep++xa9eu2L59ewwZMqQSIxL/PU5nnHFG2fbUcbrlllviySefjBtuuKHSIxL793y6884749RTT41vfOMbceSRR8Zxxx0X3/zmN6sx7gFtf47VhAkT4u9//3u0t7dHqVSKf/7zn/GLX/wizjvvvGqMTBXVzfsw5XK5yOVysW3btmhpaan1OAe0559/Pnbu3BnDhw8v2z58+PDYunXrPn2Pm266KYrFYlxwwQWVGJH473EaOnRo2fY3Ok6PP/54XHPNNfHAAw/EwIF18/R/U9uf59NTTz0VDz74YAwaNChuv/32eP755+PSS/MRcVUVJj5w7c+xmjBhQtx6661x4YUXxssvvxw7duyI888/P26++eZqjEwV1c0ZJurP/165uVQqJa/mHPHq79IsWLAgVq9eHcOGDavUePzHvh6nnTt3xvTp02PhwoVx3HHHVWs8/qM3z6ddu3ZFQ0ND3HrrrXHaaafF1KlT4+qrr46IiJdffrnisx7oenOsCoVCzJkzJ66//vpYv3593H333bF58+a47LLLqjEqVeSfmLzOW9/61hgwYMDr/kX13HPPve5fXv9r9erVcemll8bPf/7zOPvssys55gFv93F6/vnny7bv7Tht37491q1bFxs3bozLL788Il79i7lUKsXAgQPjt7/9bUVe9z/Q7c/zacSIEXHkkUeWnW0fPXp0z9dFHF2xeQ9k+3Os2traYuLEifHFL34xIiJOPPHEaGpqive9733xta99LSJGVHpsqsQZJl7n4IMPjlNOOSXWrFlTtn3NmjUxYcKEvX7dqlWr4pJLLomVK1d6/b4Kdh+nP/zhD2Xb93acmpub489//nNs2rSp53bZZZfFO9/5zti0aVOcfvrp1Rr9gLI/z6eJEyfGM888E11dXT3bnn766YgIZ20raH+O1UsvvRQHHVT+V+mAAQMi4tUzU7x5CCb2aO7cufH9738/fvjDH8Zf//rXuOqqq2LLli09p5nnz58fM2bM6Nl/1apVMWPGjLjpppvijDPOiK1bt8bWrVujs7OzVg/hgDB37ty4447bIyJi8+bNb3icDjrooBg3blzZbdiwYTFo0KAYN25cNDU11exxvNn19vk0ffr0GDp0aMyaNSsKhUKsXbs2lixZEhERgwYNqsljOFD09lhNmzYtbrvttli2bFk89dRT8dBDD8WcOXPitNNOi5EjR9bqYRywurq6YtOmTfHoo49GRMQzzzwTmzZtSr7Vyr7wkhx7dOGFF8YLL7wQX/nKV+LZZ5+NcePGRXt7exxzzDEREfHss8+W/QH8zne+Ezt27Oj55f3dZs6cGT/60Y+qPf4B48ILL4yNGxvixhsjLrroojjxxB1veJyojd4+nw477LBYs2ZNXHHFFXHqqafG0KFD46yzropbb63VIzhw9PZYXXLJJbF9+/ZYunRpXH311XH44YfHBz7wgbjxxhtr9RAOaOvWrYvJkydHxMkRsSEWL74pFi/emM3fRaU609nZWYqIUmdnZ61H6bF+fakU8erHN+ua1uufa1V7vVo8F+p1Dse5f673Zn5stVivVmumVGImL8kBACQIJgCABMEEAJAgmAAAEgQTAECCYAIASKibYMrn8zF27NhobW2t9SgAAGXqJphyuVwUCoXo6Oio9SgAAGXqJpgAAOqVYAIASBBMAAAJggkAIEEwAQAkNJRKpVKth3itbdu2RUtLS3R2dkZzc3OtxwEAqL9gKpVKsX379hg8eHA0NDTUehwAgPoLJgCAeuN3mAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgIT/D73BKgM+c/+GAAAAAElFTkSuQmCC\n",
420 "text/plain": [
421 "Graphics object consisting of 1 graphics primitive"
422 ]
423 },
424 "metadata": {},
425 "output_type": "display_data"
426 },
427 {
428 "data": {
429 "image/png": "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p0/EAQdke5+5OcMEAJBXggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJOQmmIrFYjQ3N0dLS0u9RwEAqJCbYCoUClEqlaKtra3eowAAVMhNMAEA5JVgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJCQeTB99NFHceWVV8awYcNi2223jd133z2uu+66WLNmTdZLAQDURM+s7/D666+PH//4xzFz5szYe++9Y8GCBXH22WdHU1NTXHTRRVkvBwBQdZkH0x/+8If40pe+FMcff3xEROy2224xZ86cWLBgQdZLAQDUROYvyR1++OHx2GOPxcsvvxwREX/84x/jqaeeiuOOOy7rpQAAaiLzM0yXX355tLe3x/Dhw6NHjx6xevXq+N73vhdf//rX17l/Z2dndHZ2dl3v6OjIeiQAgE2S+RmmuXPnxl133RWzZ8+ORYsWxcyZM+MHP/hBzJw5c537t7a2RlNTU9dl6NChWY8EALBJMg+myy67LCZNmhSnnHJK7LPPPnHGGWfEJZdcEq2trevcf/LkydHe3t51Wbp0adYjAQBsksxfknvvvfdim20qO6xHjx7r/bUCjY2N0djYmPUYAACZyTyYxo0bF9/73vdil112ib333juee+65uOmmm+Ib3/hG1ksBANRE5sF08803x1VXXRXnn39+LF++PIYMGRLnnntuXH311VkvBQBQE5kHU9++fWPatGkxbdq0rO8aAKAuvJccAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgATBBACQkJtgKhaL0dzcHC0tLfUeBQCgQm6CqVAoRKlUira2tnqPAgBQITfBBACQV4IJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCAhNwEU7FYjObm5mhpaan3KAAAFXITTIVCIUqlUrS1tdV7FACACrkJJgCAvBJMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJOQmmIrFYjQ3N0dLS0u9RwEAqJCbYCoUClEqlaKtra3eowAAVMhNMAEA5JVgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJBQlWD661//GqeffnoMGDAg+vTpE/vtt18sXLiwGksBAFRdz6zv8N13343D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trb45je/WePJiYhYtWpVjBw5MqZPn579nZdz5skn28sRUX7yyfZ6j9Jl4cJyOeLjj1vqmv+53sEHH1w+77zzKvYZPnx4edKkSRt8n83NzeVrr712g9arpnr/WVbT3nufsdZaG3KcTj755PKVV15Zvuaaa8ojR47c4PXq8VzI6xzdmaG7z6eHHnqo3NTUVH7nnXc2ar1NtSU/Z1LrdfdYff/73y/vvvvuFdt+9KMflXfeeefkWtWwNXy/2lARUb733nszu7/cnGEqFovR3NwcZ5xxer1H2ep98MEHsXDhwhgzZkzF9jFjxsQzzzyzQfexZs2aWLFiRfTv378aIxIfH6cXX3xxre2p43T77bfHa6+9Ftdcc001x+P/bMzz6YEHHoiDDjoobrjhhthpp51izz33jB/+8Ie1GHertjHH6tBDD42//OUv8eCDD0a5XI6//e1v8atf/SqOP/74WoxMDeUmmAqFQpRKpbjzzrvqPcpW7x//+EesXr06Bg0aVLF90KBBsWzZsg26jxtvvDFWrVoVJ510UjVGJD4+TmvWrF5r+6cdp1deeSUmTZoUs2bNip49c/dr2LZIG/N8ev311+Opp56KP//5z3HvvffGtGnT4re//W0txt2qbcyxOvTQQ2PWrFlx8sknR69evWLHHXeM7bffPm6++eZajEwN5SaYyJ//fOfmcrmcfDfniIg5c+bElClTYu7cuTFw4MBqjcd6rO84rV69Ok499dS49tprY88996zDZFu37jyf1qxZEw0NDTFr1qw4+OCD47jjjotLL700IiLef//9qs+6tevOsSqVSnHhhRfG1VdfHQsXLoyHH344lixZEuedd14tRqWG/BOTteywww7Ro0ePtf5FtXz58rX+5fWf5s6dG+ecc07cfffdccwxx1RzzK3eDjvsENts0yPWrKncvr7jtGLFiliwYEE899xzccEFF0TEx9+Yy+Vy9OzZMx599NE46qijajH6VmVjnk+DBw+OnXbaKZqamrq2DRs2rOvzInap2rxbs405Vq2trXHYYYfFZZddFhER++67b2y33XZxxBFHxHe/+92IGFztsakRZ5hYS69eveLAAw+MefPmVWyfN29eHHrooev9vDlz5sRZZ50Vs2fP9vp9DfTq1Sv22muvtbav7zj169cvnn/++Vi8eHHX5bzzzovPf/7zsXjx4jjkkENqMfZWZ2OeT4cddli89dZbsXLlyq5tb7zxRkSEs7ZVtDHH6r333otttqn8VtqjR4+I+PjMFFsOwcQ6TZw4MX7605/Gz3/+83jxxRfjkksuiTfffLPrNPPkyZNj/PjxXfvPmTMnxo8fHzfeeGN84QtfiGXLlsWyZcuivb29Xg9hq3D66R//J4n7778/eZy22WabGDFiRMVl4MCB0bt37xgxYkRst912dXscW7ruPp9OPfXUGDBgQJx99tlRKpVi/vz5MW3atIiI6N27d10ew9aiu8dq3Lhxcc8998SMGTPi9ddfj6effjouvPDCOPjgg2PIkCH1ehhbrZUrV3b9gzAiYsmSJbF48eLkr1rZEF6SY51OPvnkeOedd+K6666Lt99+O0aMGBEPPvhg7LrrrhER8fbbb1f8BfzJT34SH330URQKhSgUCl3bzzzzzLjjjjtqPf5WY8yYMTF5csStt94a//u/v00eJ+qju8+nz3zmMzFv3ryYMGFCHHTQQTFgwIA48shLYtasej2CrUd3j9VZZ50VK1asiOnTp8ell14a22+/fRx11FFx/fXX1+shbNUWLFgQo0eP7ro+ceLEiMjme5FgYr3OP//8OP/889d523/+xXviiSeqPxDr9Zvf/CYOOGDt7akvEFOmTPHO6zXSnedTRMTw4cMrXhpatCgEU41091hNmDAhJkyYUOWp2BCjRo2q2kuhXpIDAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkJCbXytQLBajWCzGqlX/Xe9RAAAq5OYMU6FQiFKpFHfeeVe9RwEAqJCbYAIAyCvBBACQIJgAABIEEwBAgmACAEhoKFfrbX03UkdHRzQ1NUV7e3v069ev3uMAAOQvmMrlcqxYsSL69u0bDQ0N9R4HACB/wQQAkDd+hgkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEj4/zhGrP3rpv9oAAAAAElFTkSuQmCC\n",
430 "text/plain": [
431 "Graphics object consisting of 1 graphics primitive"
432 ]
433 },
434 "metadata": {},
435 "output_type": "display_data"
436 },
437 {
438 "data": {
439 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGGCAYAAACJ/96MAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAbCUlEQVR4nO3de5DVdf348dcK46IruwYGspZKg6aIoilUkAleaECxpik1NNSs0emkeZkSRk2wYr/aV2OSk2UXs0WIsfE2Daj8zMRLfodrOR6/mMmopeToNAt7zE3g/P7wy9YJ8M2yn3NZeDxmzuycz35236/DZ8/hyecs5zSUSqVSAACwQ3vVegAAgHonmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgIS6C6ZSqRQbNmwIr6cJANSLugumxx/fGC0tLfH44xtrPUq3VasiGhre/bi7rrk7r+e29d316nmO3f3P3s9x31urFuvVas1aqLtgAgCoN4IJACChx8G0bNmymDp1arS2tkZDQ0Pcd9993Z9755134uqrr46jjz46mpqaorW1NaZPnx6vvvpqpkMDAFRTj4OpWCzG6NGjY968edt87q233opVq1bFddddF6tWrYp77rknnn/++TjzzDMzGRYAoBb69/QLJk+eHJMnT97u51paWmLp0qVl22699dYYO3ZsvPzyy3HwwQfv2pQAADXU42DqqY6OjmhoaIj9999/u5/v6uqKrq6u7uvFYmelRwIA6JGK/tL322+/HTNmzIhp06ZFc3Pzdvdpa2uLlpaW7suUKds/ewUAUCsVC6Z33nknzjnnnNiyZUv88Ic/3OF+M2fOjI6Oju7L4sVLKjUSAMAuqchTcu+8806cddZZsW7duvjtb3+7w7NLERGNjY3R2NjYfb2pqRITAQDsusyDaWss/elPf4pHH300Bg8enPUSAABV1eNg6uzsjBdeeKH7+rp162LNmjUxaNCgaG1tjc997nOxatWq+M1vfhObN2+O9evXR0TEoEGDYu+9985ucgCAKulxMK1YsSImTpzYff3KK6+MiIjzzz8/Zs2aFQ888EBERBx77LFlX/foo4/GhAkTejEqAEBt9DiYJkyYEKVSaYeff6/PAQD0Rd5LDgAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASKjI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\n",
440 "text/plain": [
441 "Graphics object consisting of 1 graphics primitive"
442 ]
443 },
444 "metadata": {},
445 "output_type": "display_data"
446 },
447 {
448 "data": {
449 "image/png": "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UvzgBz+IkSNHxrPPPhv7779/1ksBADRF5sF04403xtixY+POO+/s3XbooYdmvQwAQNNk/pbcQw89FMcff3y8733vi5EjR8bb3va2uOOOO7a7f09PT3R3d9ddAADyJPNgeu655+K2226LI444In70ox/F5ZdfHldeeWV861vf2ub+nZ2d0dHR0XsZO3Zs1iMBAOySzINp8+bNceyxx8bcuXPjbW97W1x22WXx0Y9+NG677bZt7j979uzo6urqvaxduzbrkQAAdknmwTR69OgoFAp124466qh4/vnnt7l/e3t7DBs2rO4CAJAnmQfTySefHE8//XTdttWrV8chhxyS9VIAAE2ReTBdffXV8fOf/zzmzp0bzzzzTCxcuDBuv/32KJVKWS8FANAUmQdTsViM+++/PxYtWhTjx4+Pz33uczFv3rz44Ac/mPVSAABNkfnvYYqIOPvss+Pss89uxF0DADSdz5IDAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASchNM5XI5CoVCFIvFVo8CAFAnN8FUKpWiWq1GpVJp9SgAAHVyE0wAAHklmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEjITTCVy+UoFApRLBZbPQoAQJ3cBFOpVIpqtRqVSqXVowAA1MlNMAEA5JVgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJuQkmH74LAORVboLJh+8CAHmVm2ACAMgrwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQ0PJg6Ozujra0trrrqqkYvBQDQEA0NpkqlErfffnu89a1vbeQyAAAN1bBg2rBhQ3zwgx+MO+64I17/+tc3ahkAgIZrWDCVSqU466yz4vTTT9/hfj09PdHd3V13AQDIk4GNuNNvf/vbsXLlyp36IN3Ozs644YYbGjEGAEAmMn+Fae3atfGxj30s7r777hg8eHBy/9mzZ0dXV1fvZe3atVmPBACwSzJ/hWnFihXxwgsvxHHHHde7bdOmTbFs2bKYP39+9PT0xIABA3pva29vj/b29qzHAADITObBdNppp8WvfvWrum2XXHJJjBs3Lq699tq6WAIA2B1kHkxDhw6N8ePH123bb7/9YsSIEVttBwDYHfhN3wAACQ35X3L/7rHHHmvGMgAADeEVJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAICE3wVQul6NQKESxWGz1KAAAdXITTKVSKarValQqlVaPAgBQJzfBBACQV4IJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACTkJph8+C4AkFe5CSYfvgsA5FVuggkAIK8EEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAm5CaZyuRyFQiGKxWKrRwEAqJObYCqVSlGtVqNSqbR6FACAOrkJJgCAvBJMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABIyD6bOzs4oFosxdOjQGDlyZLz73e+Op59+OutlAACaJvNgWrp0aZRKpfj5z38eS5YsiVdffTUmT54cGzduzHopAICmGJj1Hf7whz+su37nnXfGyJEjY8WKFfGf//mfWS8HANBwDf8Zpq6uroiIGD58eKOXAgBoiMxfYfpXtVotZs6cGe985ztj/Pjx29ynp6cnenp6eq93d3c3ciQAgD5r6CtMV1xxRfzyl7+MRYsWbXefzs7O6Ojo6L2MHTu2kSMBAPRZw4JpxowZ8dBDD8Wjjz4ab3zjG7e73+zZs6Orq6v3snbt2kaNBADQL5m/JVer1WLGjBlx//33x2OPPRaHHXbYDvdvb2+P9vb2rMcAAMhM5sFUKpVi4cKF8eCDD8bQoUNj3bp1ERHR0dER++67b9bLAQA0XOZvyd12223R1dUVEydOjNGjR/deFi9enPVSAABN0ZC35AAA9iQ+Sw4AIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEjITTCVy+UoFApRLBZbPQoAQJ3cBFOpVIpqtRqVSqXVowAA1MlNMAEA5JVgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAICE3wVQul6NQKESxWGz1KAAAdXITTKVSKarValQqlVaPAgBQJzfBBACQV4IJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCAhNwEU7lcjkKhEMVisdWjAADUyU0wlUqlqFarUalUWj0KAECd3AQTAEBeCSYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkDCwWQvVarVYv379Vtt7enqip6en9/pf/rJlnz//ubtZoyVt2PDPr91NGqvZazZzPY/NeubI/3p76lp7+nqtOjfyck7219ChQ6OtrW2H+7TVarVaM4bp7u6Ojo6OZiwFALDTurq6YtiwYTvcp2nBtLOvMD366F9i2rRj4zvf+X9xxhmjGz5XsViMSqWyw31WrYo45ZSIpUsjjjmmsWtlsWZf1tmV9bq7u2Ps2LGxdu3a5B+0XV2rP4+pv+s1a61dWacv6/X3OPVnvSweUxZzZGlHjynLOXbmODXzuWh3W6tZz6/9OZ/6u16znsv7u1Z/1m3Wc0Rfj9POvMLUtLfk2tradmroAw7Y8mNVQ4YM3eUn950xYMCA5Dqve90/v+7KSDuzVhZr9mWdLNYbNmxYn9brz1r9eUz9Xa9Za+3KOv1Zr6/HqT/rZfGYspgjSzt6TI2YY0fHqZnPRbvbWs16fn1NX86n/q7XzOfyXT13d3bdZj1HvCaL573X7PU/9F0qlfa4tZr5mJrFcdo9eEy7B+fT7sFxyhfB5A/kbsFx2j14TLsH59PuwXHKl9wF06BBg+q+kl/t7e1x/fXXR3t7e6tHYQccp92D47R7cJx2D404Tk37Gaad9R//MajuK/nV3t4ec+bMafUYJDhOuwfHaffgOO0eGnGccvcKEwBA3ggmAIAEwQQAkCCY2K5bb701DjvssBg8eHAcd9xx8dOf/nS7+953331xxhlnxBve8IYYNmxYvOMd74gf/ehHTZx273b22Wfv1HH6V0888UQMHDgwjmn0b34kIvp2PkVs+aW+1113XRxyyCHR3t4eb3rTm+LBBx9s0rR7t74eq3vuuScmTJgQQ4YMidGjR8cll1wSL774YpOm5V8tW7Yspk6dGmPGjIm2trZ44IEHMrtvwcQ2LV68OK666qq47rrr4qmnnop3vetdMWXKlHj++ee3uf+yZcvijDPOiIcffjhWrFgRkyZNiqlTp8ZTTz3V5Mn3Lo888khERFx66aU7dZxe09XVFdOmTYvTTjutGWPu9fp6PkVEnHfeefHjH/84vvGNb8TTTz8dixYtikMPPbR5Q++l+nqsHn/88Zg2bVpceuml8etf/zruvffeqFQq8ZGPfKTJkxMRsXHjxpgwYULMnz8/+zuv5czSpV21iKgtXdrV6lF6rVhRq0Vs+bqnrvnv651wwgm1yy+/vG6fcePG1WbNmrXT91koFGo33HBDcq1Ga+Z6zX5sRx990Vbr7cxxOv/882uf+tSnatdff31twoQJO71eK86FPWGOvp5PP/jBD2odHR21F198sV/rZWFPXSu1Xl+P1Ze+9KXa4YcfXrftK1/5Su2Nb3zjTq2XtVadG3k5J/9VRNTuv//+zO4vN68wlcvlKBQKcdFFF7Z6lL3eP/7xj1ixYkVMnjy5bvvkyZPjySef3Kn72Lx5c6xfvz6GDx/eiBGJLcfpN7/5zVbbU8fpzjvvjGeffTauv/76Ro7H/+rP+fTQQw/F8ccfH1/84hfjoIMOiiOPPDI+8YlPxMsvv9yMkfda/TlWJ510Uvz+97+Phx9+OGq1Wvz5z3+O73znO3HWWWc1Y2SaKDe/h6lUKkWpVIply7rjlFM6Wj3OXu2vf/1rbNq0KUaNGlW3fdSoUbFu3bqduo+bbropNm7cGOedd14jRiS2HKfNmzdttX1Hx+m3v/1tzJo1K37605/GwIG5Of33aP05n5577rl4/PHHY/DgwXH//ffHX//615g+fXqsXv26iJjT+KH3Uv05VieddFLcc889cf7558fLL78cr776apxzzjlxyy23NGNkmig3rzCRP//+yc21Wi35ac4REYsWLYo5c+bE4sWLY+TIkY0aj+3Y3nHatGlTXHDBBXHDDTfEkUce2YLJ9m59OZ82b94cbW1tcc8998QJJ5wQZ555Ztx8883x3e9+txmj7vX6cqyq1WpceeWV8ZnPfCZWrFgRP/zhD2PNmjVx+eWXN2NUmsg/MdnKAQccEAMGDNjqX1QvvPDCVv/y+neLFy+OSy+9NO699944/fTTGznmXu+AAw6IffYZEJs312/f3nFav359LF++PJ566qm44oorImLLX8y1Wi0GDhwYjzzySJx66qnNGH2v0p/zafTo0XHQQQdFR8c/X20/6qijIqLWyFH3ev05Vp2dnXHyySfHNddcExERb33rW2O//faLd73rXfH5z38+Ro8e3fC5aQ6vMLGVQYMGxXHHHRdLliyp275kyZI46aSTtvt9ixYtig996EOxcOFC7983waBBg/73L9F62ztOw4YNi1/96lexatWq3svll18eb37zm2PVqlVx4oknNmPsvU5/zqeTTz45/vjHP8aGDRt6t61evTra2jxlN1J/jtVLL70U++xTf1wGDBgQEVtemWLP4exjm2bOnBlf//rX45vf/Gb85je/iauvvjqef/753peZZ8+eHdOmTevdf9GiRTFt2rS46aab4u1vf3usW7cu1q1bF11dXa16CHuFCy/c8p8kHnzwweRx2meffWL8+PF1l5EjR8bgwYNj/Pjxsd9++7Xscezp+no+XXDBBTFixIi45JJLolqtxrJly+Kaa66Jc889t1UPYa/R12M1derUuO++++K2226L5557Lp544om48sor44QTTogxY8a06mHstTZs2ND7D8KIiDVr1sSqVauSv2plZ3hLjm06//zz48UXX4zPfvaz8ac//SnGjx8fDz/8cBxyyCEREfGnP/2p7g/g1772tXj11Vd7f3j/NRdffHHcddddzR5/rzF58uSYPTvi9ttvj//+7/+bPE60Rl/Pp9e97nWxZMmSmDFjRhx//PExYsSIOO+88+K//uuayPD38LENfT1WH/rQh2L9+vUxf/78+PjHPx77779/nHrqqXHjjTe26iHs1ZYvXx6TJk3qvT5z5syIyObvIsHEdk2fPj2mT5++zdv+/Q/eY4891viB2K7vf//7ceyxW29PPUHMmTPHJ683SV/Op4iIcePGbfXW0MqVjZiMf9fXYzVjxoyYMWNGg6diZ0ycOLFhb4V6Sw4AIEEwAQAkCCYAgATBBACQIJgAABIEEwBAQm5+rUC5XI5yuRwbN/6fVo8CAFAnN68wlUqlqFar8T//c3erRwEAqJObYAIAyCvBBACQIJgAABIEEwBAgmACAEhoqzXqY337qbu7Ozo6OqKrqyuGDRvW6nEAAPIXTLVaLdavXx9Dhw6Ntra2Vo8DAJC/YAIAyBs/wwQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACT8f5XprQaPuPDzAAAAAElFTkSuQmCC\n",
450 "text/plain": [
451 "Graphics object consisting of 1 graphics primitive"
452 ]
453 },
454 "metadata": {},
455 "output_type": "display_data"
456 }
457 ],
458 "source": [
459 "def heat_fdm(u0j, u1j, ui0):\n",
460 " m, n = len(u0j)-1, len(ui0)-1\n",
461 " k, h = 1/m, 1/n\n",
462 " \n",
463 " u = [[0] * (m+1) for i in range(n+1)]\n",
464 " for j in range(m+1):\n",
465 " u[0][j] = u0j[j]\n",
466 " for j in range(m+1):\n",
467 " u[n][j] = u1j[j]\n",
468 " for i in range(n+1):\n",
469 " u[i][0] = ui0[i]\n",
470 " \n",
471 " for j in range(0,m):\n",
472 " for i in range(1,n):\n",
473 " u[i][j+1] = (k/(h*h)) * (u[i+1][j] - 2*u[i][j] + u[i-1][j]) + u[i][j]\n",
474 " \n",
475 " return u\n",
476 "\n",
477 "n, m = 20, 20\n",
478 "u0j = [10 - (j/m)*10 for j in range(m+1)] # One extreme goes from hot to cold\n",
479 "u1j = [(j/m)*10 for j in range(m+1)] # The other does the opposite\n",
480 "ui0 = [10 - (i/m)*10 for i in range(0,n+1)]\n",
481 "\n",
482 "u = heat_fdm(u0j, u1j, ui0)\n",
483 "for t in range(m+1):\n",
484 " show(line([(i/n, u[i][t]) for i in range(n+1)], ymin=-1, ymax =12))"
485 ]
486 },
487 {
488 "cell_type": "code",
489 "execution_count": null,
490 "metadata": {},
491 "outputs": [],
492 "source": []
493 }
494 ],
495 "metadata": {
496 "kernelspec": {
497 "display_name": "SageMath 9.0",
498 "language": "sage",
499 "name": "sagemath"
500 },
501 "language_info": {
502 "codemirror_mode": {
503 "name": "ipython",
504 "version": 3
505 },
506 "file_extension": ".py",
507 "mimetype": "text/x-python",
508 "name": "python",
509 "nbconvert_exporter": "python",
510 "pygments_lexer": "ipython3",
511 "version": "3.8.5"
512 }
513 },
514 "nbformat": 4,
515 "nbformat_minor": 4
516}
diff --git a/src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-checkpoint.ipynb b/src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-checkpoint.ipynb
new file mode 100644
index 0000000..ab7dd49
--- /dev/null
+++ b/src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-checkpoint.ipynb
@@ -0,0 +1,394 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Nested loops\n",
8 "\n",
9 "The following two functions compute sum and product of matrices, respectively.\n",
10 "\n",
11 "By counting the nested loops it is easy to see that `add()` is $O(n^2)$ while `prod()` is $O(n^3)$."
12 ]
13 },
14 {
15 "cell_type": "code",
16 "execution_count": 37,
17 "metadata": {},
18 "outputs": [
19 {
20 "name": "stdout",
21 "output_type": "stream",
22 "text": [
23 "Time for add: 0.00012074300000008975\n",
24 "Time for prod: 0.00036587199999971176\n"
25 ]
26 }
27 ],
28 "source": [
29 "from random import randint\n",
30 "import time\n",
31 "\n",
32 "def add(A, B):\n",
33 " S = [[0] * len(A) for i in range(len(A))]\n",
34 " for i in range(len(A)):\n",
35 " for j in range(len(A)):\n",
36 " S[i][j] = A[i][j] + B[i][j]\n",
37 " return S\n",
38 "\n",
39 "def prod(A, B):\n",
40 " S = [[0] * len(A) for i in range(len(A))]\n",
41 " for i in range(len(A)):\n",
42 " for j in range(len(A)):\n",
43 " for k in range(len(A)):\n",
44 " S[i][j] = S[i][j] + A[i][k] * B[k][j]\n",
45 " return S\n",
46 "\n",
47 "N = 10\n",
48 "A = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n",
49 "B = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n",
50 "\n",
51 "t0 = time.process_time()\n",
52 "add(A,B)\n",
53 "t1 = time.process_time()\n",
54 "prod(A,B)\n",
55 "t2 = time.process_time()\n",
56 "\n",
57 "print(\"Time for add: \", t1-t0)\n",
58 "print(\"Time for prod:\", t2-t1)"
59 ]
60 },
61 {
62 "cell_type": "markdown",
63 "metadata": {},
64 "source": [
65 "# Sorting a list, slow version\n",
66 "\n",
67 "The following code implements a slow version of the so-called *insertion sort* alogithm\n",
68 "\n",
69 "Complexity: $O(n^2)$."
70 ]
71 },
72 {
73 "cell_type": "code",
74 "execution_count": 61,
75 "metadata": {},
76 "outputs": [
77 {
78 "name": "stdout",
79 "output_type": "stream",
80 "text": [
81 "Running time: 1.1012288430000012\n"
82 ]
83 }
84 ],
85 "source": [
86 "from random import randint\n",
87 "import time\n",
88 "\n",
89 "def correct_position(e, S):\n",
90 " for i in range(len(S)):\n",
91 " if S[i] > e:\n",
92 " return i\n",
93 " return len(S)\n",
94 "\n",
95 "def sort_list(L):\n",
96 " S = []\n",
97 " for e in L:\n",
98 " cp = correct_position(e, S)\n",
99 " S.insert(cp, e)\n",
100 " return S\n",
101 "\n",
102 "N = 10000\n",
103 "L = [randint(0,10**9) for i in range(N)]\n",
104 "\n",
105 "t0 = time.process_time()\n",
106 "sort_list(L)\n",
107 "t1 = time.process_time()\n",
108 "\n",
109 "print(\"Running time:\", t1-t0)"
110 ]
111 },
112 {
113 "cell_type": "markdown",
114 "metadata": {},
115 "source": [
116 "# Binary search\n",
117 "\n",
118 "The following code implements a binary search.\n",
119 "\n",
120 "Complexity: $O(\\log_2(n))$"
121 ]
122 },
123 {
124 "cell_type": "code",
125 "execution_count": 53,
126 "metadata": {},
127 "outputs": [
128 {
129 "name": "stdout",
130 "output_type": "stream",
131 "text": [
132 "The correct position of e = 658230309 in L is:\n",
133 "... 658211821 658224379 e 658234625 658246765 ...\n",
134 "\n",
135 "Time for sorting: 0.021211020999999164\n",
136 "Time for searching: 7.820199999741817e-05\n"
137 ]
138 }
139 ],
140 "source": [
141 "from random import randint\n",
142 "import time\n",
143 "\n",
144 "def binary_search(e, S, start, end):\n",
145 " if start == end:\n",
146 " return start\n",
147 " midpoint = (start+end) // 2\n",
148 " if e < S[midpoint]:\n",
149 " return binary_search(e, S, start, midpoint)\n",
150 " else:\n",
151 " return binary_search(e, S, midpoint+1, end)\n",
152 " \n",
153 "N = 100000\n",
154 "L = [randint(0,10**9) for i in range(N)]\n",
155 "e = randint(0,10**9)\n",
156 "\n",
157 "t0 = time.process_time()\n",
158 "L.sort() # Using Python's sort()\n",
159 "t1 = time.process_time()\n",
160 "i = binary_search(e, L, 0, len(L))\n",
161 "t2 = time.process_time()\n",
162 "print(\"The correct position of e =\", e, \"in L is:\")\n",
163 "print(\"...\", L[i-2], L[i-1], \"e\", L[i], L[i+1], \"...\")\n",
164 "print(\"\")\n",
165 "print(\"Time for sorting: \", t1-t0)\n",
166 "print(\"Time for searching:\", t2-t1)\n"
167 ]
168 },
169 {
170 "cell_type": "markdown",
171 "metadata": {},
172 "source": [
173 "# Sorting a list, fast version (with binary_search)\n",
174 "\n",
175 "The following code uses the function `binary_search()` above instead of `correct_position()` in our insertion sort algorithm.\n",
176 "\n",
177 "Complexity: $O(n\\log_2(n))$"
178 ]
179 },
180 {
181 "cell_type": "code",
182 "execution_count": 69,
183 "metadata": {},
184 "outputs": [
185 {
186 "name": "stdout",
187 "output_type": "stream",
188 "text": [
189 "Running time: 0.03710268399998995\n"
190 ]
191 }
192 ],
193 "source": [
194 "from random import randint\n",
195 "import time\n",
196 "\n",
197 "def binary_search(e, S, start, end):\n",
198 " if start == end:\n",
199 " return start\n",
200 " midpoint = (start+end) // 2\n",
201 " if e < S[midpoint]:\n",
202 " return binary_search(e, S, start, midpoint)\n",
203 " else:\n",
204 " return binary_search(e, S, midpoint+1, end)\n",
205 " \n",
206 "def sort_list(L):\n",
207 " S = []\n",
208 " for e in L:\n",
209 " cp = binary_search(e, S, 0, len(S)) # Changed here\n",
210 " S.insert(cp, e)\n",
211 " return S\n",
212 " \n",
213 "N = 10000\n",
214 "L = [randint(0,10**9) for i in range(N)]\n",
215 "\n",
216 "t0 = time.process_time()\n",
217 "sort_list(L)\n",
218 "t1 = time.process_time()\n",
219 "\n",
220 "print(\"Running time:\", t1-t0)"
221 ]
222 },
223 {
224 "cell_type": "markdown",
225 "metadata": {},
226 "source": [
227 "# Fast exponentiation\n",
228 "\n",
229 "The following cell contains two functions for computing $a^n$ ($n$ non-negative integer): a slow one that runs in $O(n)$ and a fast one that runs in $O(\\log_2(n))$. We compare these two also with Python's built-in operator `**`.\n",
230 "\n",
231 "Complexity: $O(n)$ for the slow algorithm, $O(\\log_2(n))$ for the other two."
232 ]
233 },
234 {
235 "cell_type": "code",
236 "execution_count": 30,
237 "metadata": {},
238 "outputs": [
239 {
240 "name": "stdout",
241 "output_type": "stream",
242 "text": [
243 "2.71828179834636\n",
244 "2.7182817863957984\n",
245 "2.7182817983473577\n",
246 "Time for slow_power(): 3.234879998000004\n",
247 "Time for fast_power(): 9.059099999575437e-05\n",
248 "Time for Python's **: 0.00010159500000384014\n"
249 ]
250 }
251 ],
252 "source": [
253 "import time\n",
254 "\n",
255 "def slow_power(a, n):\n",
256 " r = 1\n",
257 " for i in range(n):\n",
258 " r = r * a\n",
259 " return r\n",
260 "\n",
261 "def fast_power(a, n):\n",
262 " if n == 0:\n",
263 " return 1\n",
264 " if n%2 == 0:\n",
265 " return fast_power(a*a, n//2)\n",
266 " else:\n",
267 " return a * fast_power(a, n-1)\n",
268 "\n",
269 "a = 1.00000001\n",
270 "n = 100000000\n",
271 "\n",
272 "t0 = time.process_time()\n",
273 "print(slow_power(a, n))\n",
274 "t1 = time.process_time()\n",
275 "print(fast_power(a, n))\n",
276 "t2 = time.process_time()\n",
277 "print(a**n)\n",
278 "t3 = time.process_time()\n",
279 "\n",
280 "print(\"Time for slow_power():\", t1-t0)\n",
281 "print(\"Time for fast_power():\", t2-t1)\n",
282 "print(\"Time for Python's **: \", t3-t2)"
283 ]
284 },
285 {
286 "cell_type": "markdown",
287 "metadata": {},
288 "source": [
289 "# Fast gcd\n",
290 "\n",
291 "Complexity: $O(\\log_2(n))$"
292 ]
293 },
294 {
295 "cell_type": "code",
296 "execution_count": 31,
297 "metadata": {},
298 "outputs": [
299 {
300 "name": "stdout",
301 "output_type": "stream",
302 "text": [
303 "126\n",
304 "Running time: 0.00017707599999994272\n"
305 ]
306 }
307 ],
308 "source": [
309 "import time\n",
310 "\n",
311 "def gcd(a, b):\n",
312 " if b == 0:\n",
313 " return a\n",
314 " else:\n",
315 " return gcd(b, a%b)\n",
316 "\n",
317 "t0 = time.process_time()\n",
318 "print(gcd(155275387236018, 572335397352432))\n",
319 "t1 = time.process_time()\n",
320 "\n",
321 "print(\"Running time:\", t1-t0)"
322 ]
323 },
324 {
325 "cell_type": "markdown",
326 "metadata": {},
327 "source": [
328 "# Fibonacci numbers\n",
329 "\n",
330 "In the following cell there are two functions that compute the $n$-th Fibonacci number. They are almost the same, but the second one memorizes the results in a list to avoid computing them multiple times, and it is much much faster.\n",
331 "\n",
332 "Complexity: $O\\left(\\left(\\frac{1+\\sqrt 5}{2}\\right)^n\\right)\\sim O(1.6^n)$ for the slow version, $O(n)$ for the fast version."
333 ]
334 },
335 {
336 "cell_type": "code",
337 "execution_count": null,
338 "metadata": {},
339 "outputs": [],
340 "source": [
341 "import time\n",
342 "\n",
343 "F_memorized = [-1] * (10**6)\n",
344 "\n",
345 "def F_slow(n):\n",
346 " if n <= 1:\n",
347 " return n\n",
348 " else:\n",
349 " return F_slow(n-1) + F_slow(n-2)\n",
350 " \n",
351 "def F_fast(n):\n",
352 " if F_memorized[n] == -1:\n",
353 " if n <= 1:\n",
354 " F_memorized[n] = n\n",
355 " else:\n",
356 " F_memorized[n] = F_fast(n-1) + F_fast(n-2)\n",
357 " \n",
358 " return F_memorized[n]\n",
359 "\n",
360 "n = 40\n",
361 "\n",
362 "t0 = time.process_time()\n",
363 "print(F_slow(n))\n",
364 "t1 = time.process_time()\n",
365 "print(F_fast(n))\n",
366 "t2 = time.process_time()\n",
367 "\n",
368 "print(\"Time for F_slow:\", t1-t0)\n",
369 "print(\"Time for F_fast:\", t2-t1)"
370 ]
371 }
372 ],
373 "metadata": {
374 "kernelspec": {
375 "display_name": "Python 3",
376 "language": "python",
377 "name": "python3"
378 },
379 "language_info": {
380 "codemirror_mode": {
381 "name": "ipython",
382 "version": 3
383 },
384 "file_extension": ".py",
385 "mimetype": "text/x-python",
386 "name": "python",
387 "nbconvert_exporter": "python",
388 "pygments_lexer": "ipython3",
389 "version": "3.8.5"
390 }
391 },
392 "nbformat": 4,
393 "nbformat_minor": 4
394}
diff --git a/src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-notebook-checkpoint.ipynb b/src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-notebook-checkpoint.ipynb
new file mode 100644
index 0000000..16a6d40
--- /dev/null
+++ b/src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-notebook-checkpoint.ipynb
@@ -0,0 +1,412 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Nested loops\n",
8 "\n",
9 "The following two functions compute sum and product of matrices, respectively.\n",
10 "\n",
11 "By counting the nested loops it is easy to see that `add()` is $O(n^2)$ while `prod()` is $O(n^3)$."
12 ]
13 },
14 {
15 "cell_type": "code",
16 "execution_count": 2,
17 "metadata": {},
18 "outputs": [
19 {
20 "name": "stdout",
21 "output_type": "stream",
22 "text": [
23 "Time for add: 0.005766554000000035\n",
24 "Time for prod: 1.3871021639999999\n"
25 ]
26 }
27 ],
28 "source": [
29 "from random import randint\n",
30 "import time\n",
31 "\n",
32 "def add(A, B):\n",
33 " S = [[0] * len(A) for i in range(len(A))]\n",
34 " for i in range(len(A)):\n",
35 " for j in range(len(A)):\n",
36 " S[i][j] = A[i][j] + B[i][j]\n",
37 " return S\n",
38 "\n",
39 "def prod(A, B):\n",
40 " S = [[0] * len(A) for i in range(len(A))]\n",
41 " for i in range(len(A)):\n",
42 " for j in range(len(A)):\n",
43 " for k in range(len(A)):\n",
44 " S[i][j] = S[i][j] + A[i][k] * B[k][j]\n",
45 " return S\n",
46 "\n",
47 "N = 200\n",
48 "A = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n",
49 "B = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n",
50 "\n",
51 "t0 = time.process_time()\n",
52 "add(A,B)\n",
53 "t1 = time.process_time()\n",
54 "prod(A,B)\n",
55 "t2 = time.process_time()\n",
56 "\n",
57 "print(\"Time for add: \", t1-t0)\n",
58 "print(\"Time for prod:\", t2-t1)"
59 ]
60 },
61 {
62 "cell_type": "markdown",
63 "metadata": {},
64 "source": [
65 "# Sorting a list, slow version\n",
66 "\n",
67 "The following code implements a slow version of the so-called *insertion sort* alogithm\n",
68 "\n",
69 "Complexity: $O(n^2)$."
70 ]
71 },
72 {
73 "cell_type": "code",
74 "execution_count": 1,
75 "metadata": {},
76 "outputs": [
77 {
78 "name": "stdout",
79 "output_type": "stream",
80 "text": [
81 "Running time: 1.1191449070000001\n"
82 ]
83 }
84 ],
85 "source": [
86 "from random import randint\n",
87 "import time\n",
88 "\n",
89 "def correct_position(e, S):\n",
90 " for i in range(len(S)):\n",
91 " if S[i] > e:\n",
92 " return i\n",
93 " return len(S)\n",
94 "\n",
95 "def sort_list(L):\n",
96 " S = []\n",
97 " for e in L:\n",
98 " cp = correct_position(e, S)\n",
99 " S.insert(cp, e)\n",
100 " return S\n",
101 "\n",
102 "N = 10000\n",
103 "L = [randint(0,10**9) for i in range(N)]\n",
104 "\n",
105 "t0 = time.process_time()\n",
106 "sort_list(L)\n",
107 "t1 = time.process_time()\n",
108 "\n",
109 "print(\"Running time:\", t1-t0)"
110 ]
111 },
112 {
113 "cell_type": "markdown",
114 "metadata": {},
115 "source": [
116 "# Binary search\n",
117 "\n",
118 "The following code implements a binary search.\n",
119 "\n",
120 "Complexity: $O(\\log_2(n))$"
121 ]
122 },
123 {
124 "cell_type": "code",
125 "execution_count": 3,
126 "metadata": {},
127 "outputs": [
128 {
129 "name": "stdout",
130 "output_type": "stream",
131 "text": [
132 "The correct position of e = 216197744 in L is:\n",
133 "... 216196218 216197540 e 216198673 216198962 ...\n",
134 "\n",
135 "Time for sorting: 0.26413054400000036\n",
136 "Time for searching: 9.616099999965044e-05\n"
137 ]
138 }
139 ],
140 "source": [
141 "from random import randint\n",
142 "import time\n",
143 "\n",
144 "def binary_search(e, S, start, end):\n",
145 " if start == end:\n",
146 " return start\n",
147 " midpoint = (start+end) // 2\n",
148 " if e < S[midpoint]:\n",
149 " return binary_search(e, S, start, midpoint)\n",
150 " else:\n",
151 " return binary_search(e, S, midpoint+1, end)\n",
152 " \n",
153 "N = 1000000\n",
154 "L = [randint(0,10**9) for i in range(N)]\n",
155 "e = randint(0,10**9)\n",
156 "\n",
157 "t0 = time.process_time()\n",
158 "L.sort() # Using Python's sort()\n",
159 "t1 = time.process_time()\n",
160 "i = binary_search(e, L, 0, len(L))\n",
161 "t2 = time.process_time()\n",
162 "print(\"The correct position of e =\", e, \"in L is:\")\n",
163 "print(\"...\", L[i-2], L[i-1], \"e\", L[i], L[i+1], \"...\")\n",
164 "print(\"\")\n",
165 "print(\"Time for sorting: \", t1-t0)\n",
166 "print(\"Time for searching:\", t2-t1)\n"
167 ]
168 },
169 {
170 "cell_type": "markdown",
171 "metadata": {},
172 "source": [
173 "# Sorting a list, fast version (with binary_search)\n",
174 "\n",
175 "The following code uses the function `binary_search()` above instead of `correct_position()` in our insertion sort algorithm.\n",
176 "\n",
177 "Complexity: $O(n\\log_2(n))$"
178 ]
179 },
180 {
181 "cell_type": "code",
182 "execution_count": 69,
183 "metadata": {},
184 "outputs": [
185 {
186 "name": "stdout",
187 "output_type": "stream",
188 "text": [
189 "Running time: 0.03710268399998995\n"
190 ]
191 }
192 ],
193 "source": [
194 "from random import randint\n",
195 "import time\n",
196 "\n",
197 "def binary_search(e, S, start, end):\n",
198 " if start == end:\n",
199 " return start\n",
200 " midpoint = (start+end) // 2\n",
201 " if e < S[midpoint]:\n",
202 " return binary_search(e, S, start, midpoint)\n",
203 " else:\n",
204 " return binary_search(e, S, midpoint+1, end)\n",
205 " \n",
206 "def sort_list(L):\n",
207 " S = []\n",
208 " for e in L:\n",
209 " cp = binary_search(e, S, 0, len(S)) # Changed here\n",
210 " S.insert(cp, e)\n",
211 " return S\n",
212 " \n",
213 "N = 10000\n",
214 "L = [randint(0,10**9) for i in range(N)]\n",
215 "\n",
216 "t0 = time.process_time()\n",
217 "sort_list(L)\n",
218 "t1 = time.process_time()\n",
219 "\n",
220 "print(\"Running time:\", t1-t0)"
221 ]
222 },
223 {
224 "cell_type": "markdown",
225 "metadata": {},
226 "source": [
227 "# Fast exponentiation\n",
228 "\n",
229 "The following cell contains two functions for computing $a^n$ ($n$ non-negative integer): a slow one that runs in $O(n)$ and a fast one that runs in $O(\\log_2(n))$. We compare these two also with Python's built-in operator `**`.\n",
230 "\n",
231 "Complexity: $O(n)$ for the slow algorithm, $O(\\log_2(n))$ for the other two."
232 ]
233 },
234 {
235 "cell_type": "code",
236 "execution_count": 30,
237 "metadata": {},
238 "outputs": [
239 {
240 "name": "stdout",
241 "output_type": "stream",
242 "text": [
243 "2.71828179834636\n",
244 "2.7182817863957984\n",
245 "2.7182817983473577\n",
246 "Time for slow_power(): 3.234879998000004\n",
247 "Time for fast_power(): 9.059099999575437e-05\n",
248 "Time for Python's **: 0.00010159500000384014\n"
249 ]
250 }
251 ],
252 "source": [
253 "import time\n",
254 "\n",
255 "def slow_power(a, n):\n",
256 " r = 1\n",
257 " for i in range(n):\n",
258 " r = r * a\n",
259 " return r\n",
260 "\n",
261 "def fast_power(a, n):\n",
262 " if n == 0:\n",
263 " return 1\n",
264 " if n%2 == 0:\n",
265 " return fast_power(a*a, n//2)\n",
266 " else:\n",
267 " return a * fast_power(a, n-1)\n",
268 "\n",
269 "a = 1.00000001\n",
270 "n = 100000000\n",
271 "\n",
272 "t0 = time.process_time()\n",
273 "print(slow_power(a, n))\n",
274 "t1 = time.process_time()\n",
275 "print(fast_power(a, n))\n",
276 "t2 = time.process_time()\n",
277 "print(a**n)\n",
278 "t3 = time.process_time()\n",
279 "\n",
280 "print(\"Time for slow_power():\", t1-t0)\n",
281 "print(\"Time for fast_power():\", t2-t1)\n",
282 "print(\"Time for Python's **: \", t3-t2)"
283 ]
284 },
285 {
286 "cell_type": "markdown",
287 "metadata": {},
288 "source": [
289 "# Fast gcd\n",
290 "\n",
291 "Complexity: $O(\\log_2(n))$"
292 ]
293 },
294 {
295 "cell_type": "code",
296 "execution_count": 31,
297 "metadata": {},
298 "outputs": [
299 {
300 "name": "stdout",
301 "output_type": "stream",
302 "text": [
303 "126\n",
304 "Running time: 0.00017707599999994272\n"
305 ]
306 }
307 ],
308 "source": [
309 "import time\n",
310 "\n",
311 "def gcd(a, b):\n",
312 " if b == 0:\n",
313 " return a\n",
314 " else:\n",
315 " return gcd(b, a%b)\n",
316 "\n",
317 "t0 = time.process_time()\n",
318 "print(gcd(155275387236018, 572335397352432))\n",
319 "t1 = time.process_time()\n",
320 "\n",
321 "print(\"Running time:\", t1-t0)"
322 ]
323 },
324 {
325 "cell_type": "markdown",
326 "metadata": {},
327 "source": [
328 "# Fibonacci numbers\n",
329 "\n",
330 "In the following cell there are two functions that compute the $n$-th Fibonacci number. They are almost the same, but the second one memorizes the results in a list to avoid computing them multiple times, and it is much much faster.\n",
331 "\n",
332 "Complexity: $O\\left(\\left(\\frac{1+\\sqrt 5}{2}\\right)^n\\right)\\sim O(1.6^n)$ for the slow version, $O(n)$ for the fast version."
333 ]
334 },
335 {
336 "cell_type": "code",
337 "execution_count": 37,
338 "metadata": {},
339 "outputs": [
340 {
341 "name": "stdout",
342 "output_type": "stream",
343 "text": [
344 "9227465\n",
345 "9227465\n",
346 "Time for F_slow: 2.3301570169999906\n",
347 "Time for F_fast: 8.848800000293977e-05\n"
348 ]
349 }
350 ],
351 "source": [
352 "import time\n",
353 "\n",
354 "F_memorized = [-1] * (10**6)\n",
355 "\n",
356 "def F_slow(n):\n",
357 " if n <= 1:\n",
358 " return n\n",
359 " else:\n",
360 " return F_slow(n-1) + F_slow(n-2)\n",
361 " \n",
362 "def F_fast(n):\n",
363 " if F_memorized[n] == -1:\n",
364 " if n <= 1:\n",
365 " F_memorized[n] = n\n",
366 " else:\n",
367 " F_memorized[n] = F_fast(n-1) + F_fast(n-2)\n",
368 " \n",
369 " return F_memorized[n]\n",
370 "\n",
371 "n = 35\n",
372 "\n",
373 "t0 = time.process_time()\n",
374 "print(F_slow(n))\n",
375 "t1 = time.process_time()\n",
376 "print(F_fast(n))\n",
377 "t2 = time.process_time()\n",
378 "\n",
379 "print(\"Time for F_slow:\", t1-t0)\n",
380 "print(\"Time for F_fast:\", t2-t1)"
381 ]
382 },
383 {
384 "cell_type": "code",
385 "execution_count": null,
386 "metadata": {},
387 "outputs": [],
388 "source": []
389 }
390 ],
391 "metadata": {
392 "kernelspec": {
393 "display_name": "Python 3",
394 "language": "python",
395 "name": "python3"
396 },
397 "language_info": {
398 "codemirror_mode": {
399 "name": "ipython",
400 "version": 3
401 },
402 "file_extension": ".py",
403 "mimetype": "text/x-python",
404 "name": "python",
405 "nbconvert_exporter": "python",
406 "pygments_lexer": "ipython3",
407 "version": "3.8.5"
408 }
409 },
410 "nbformat": 4,
411 "nbformat_minor": 4
412}
diff --git a/src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-checkpoint.ipynb b/src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-checkpoint.ipynb
new file mode 100644
index 0000000..a35bb8d
--- /dev/null
+++ b/src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-checkpoint.ipynb
@@ -0,0 +1,165 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Diffie-Hellman key exchange\n",
8 "\n",
9 "The following is a simple implementation of the classic [Diffie-Hellman key exchange](https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange) cryptographic protocol."
10 ]
11 },
12 {
13 "cell_type": "code",
14 "execution_count": 9,
15 "metadata": {},
16 "outputs": [
17 {
18 "name": "stdout",
19 "output_type": "stream",
20 "text": [
21 "Public key: p = 20747 and g = 13428 \n",
22 "\n",
23 "[[ Alice's secret key: a = 12403 ]]\n",
24 "[[ Bob's secret key: b = 17642 ]] \n",
25 "\n",
26 "Alice sends h1 = 14710 to Bob\n",
27 "Bob sends h2 = 10680 to Alice \n",
28 "\n",
29 "Alice computed 10455 using h2 and her secret a\n",
30 "Bob computed 10455 using h1 and his secret b\n"
31 ]
32 }
33 ],
34 "source": [
35 "# Public information:\n",
36 "p = Primes()[10^3 + randint(1,10000)] # random prime\n",
37 "g = randint(2, p-1) # random integer\n",
38 "\n",
39 "print(\"Public key: p =\", p, \"and g =\", g, \"\\n\")\n",
40 "\n",
41 "a = randint(2, p-1) # Only Alice knows this\n",
42 "b = randint(2, p-1) # Only Bob knows this\n",
43 "\n",
44 "print(\"[[ Alice's secret key: a =\", a, \"]]\")\n",
45 "print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n",
46 "\n",
47 "h1 = (g^a) % p # Alice sends this to Bob\n",
48 "h2 = (g^b) % p # Bob sends this to Alice\n",
49 "\n",
50 "print(\"Alice sends h1 =\", h1, \"to Bob\")\n",
51 "print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n",
52 "\n",
53 "secret_a = (h2^a) % p # Alice can compute this because she knows a\n",
54 "secret_b = (h1^b) % p # Bob can compute this because he knows b\n",
55 "\n",
56 "print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n",
57 "print(\"Bob computed\", secret_b, \"using h1 and his secret b\")"
58 ]
59 },
60 {
61 "cell_type": "markdown",
62 "metadata": {},
63 "source": [
64 "## General Diffie-Hellman\n",
65 "\n",
66 "The following code is an implementation of a generic Diffie-Hellman key exchange protocol that uses a group $G$ instead of $(\\mathbb Z/p \\mathbb Z)^\\times$."
67 ]
68 },
69 {
70 "cell_type": "code",
71 "execution_count": 24,
72 "metadata": {},
73 "outputs": [
74 {
75 "name": "stdout",
76 "output_type": "stream",
77 "text": [
78 "Public key:\n",
79 "G = Additive abelian group isomorphic to Z/171 embedded in Abelian group of points on Elliptic Curve defined by y^2 = x^3 + x + 156 over Finite Field of size 157 \n",
80 "g = (155 : 60 : 1) \n",
81 "\n",
82 "[[ Alice's secret key: a = 141 ]]\n",
83 "[[ Bob's secret key: b = 158 ]] \n",
84 "\n",
85 "Alice sends h1 = (29 : 125 : 1) to Bob\n",
86 "Bob sends h2 = (60 : 59 : 1) to Alice \n",
87 "\n",
88 "Alice computed (109 : 94 : 1) using h2 and her secret a\n",
89 "Bob computed (109 : 94 : 1) using h1 and his secret b\n"
90 ]
91 }
92 ],
93 "source": [
94 "def genericDH(G):\n",
95 " if G.cardinality() == 1:\n",
96 " print(\"Group is trivial, can't do anything\")\n",
97 " return\n",
98 " g = G.random_element()\n",
99 " while g == G.identity(): # Make sure g is not trivial\n",
100 " g = G.random_element()\n",
101 " \n",
102 " print(\"Public key:\\nG =\", G, \"\\ng =\", g, \"\\n\")\n",
103 " \n",
104 " a = randint(2, G.exponent()-1) # Only Alice knows this\n",
105 " b = randint(2, G.exponent()-1) # Only Bob knows this\n",
106 "\n",
107 " print(\"[[ Alice's secret key: a =\", a, \"]]\")\n",
108 " print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n",
109 " \n",
110 " # \"Ternary operator\", I did not explain this\n",
111 " # https://docs.python.org/3/reference/expressions.html#conditional-expressions\n",
112 " h1 = g^a if G.is_multiplicative() else a*g # Alice sends this to Bob\n",
113 " h2 = g^b if G.is_multiplicative() else b*g # Bob sends this to Alice\n",
114 "\n",
115 " print(\"Alice sends h1 =\", h1, \"to Bob\")\n",
116 " print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n",
117 " \n",
118 " secret_a = h2^a if G.is_multiplicative() else a*h2 # Alice can compute this because she knows a\n",
119 " secret_b = h1^b if G.is_multiplicative() else b*h1 # Bob can compute this because he knows b\n",
120 "\n",
121 " print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n",
122 " print(\"Bob computed\", secret_b, \"using h1 and his secret b\")\n",
123 " \n",
124 "E = EllipticCurve(GF(157), [1,-1])\n",
125 "G = E.abelian_group()\n",
126 "genericDH(G)"
127 ]
128 },
129 {
130 "cell_type": "markdown",
131 "metadata": {},
132 "source": [
133 "# Numerical methods for PDEs"
134 ]
135 },
136 {
137 "cell_type": "code",
138 "execution_count": null,
139 "metadata": {},
140 "outputs": [],
141 "source": []
142 }
143 ],
144 "metadata": {
145 "kernelspec": {
146 "display_name": "SageMath 9.0",
147 "language": "sage",
148 "name": "sagemath"
149 },
150 "language_info": {
151 "codemirror_mode": {
152 "name": "ipython",
153 "version": 3
154 },
155 "file_extension": ".py",
156 "mimetype": "text/x-python",
157 "name": "python",
158 "nbconvert_exporter": "python",
159 "pygments_lexer": "ipython3",
160 "version": "3.8.5"
161 }
162 },
163 "nbformat": 4,
164 "nbformat_minor": 4
165}
diff --git a/src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-notebook-checkpoint.ipynb b/src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-notebook-checkpoint.ipynb
new file mode 100644
index 0000000..ccd6a21
--- /dev/null
+++ b/src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-notebook-checkpoint.ipynb
@@ -0,0 +1,298 @@
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# Diffie-Hellman key exchange\n",
8 "\n",
9 "The following is a simple implementation of the classic [Diffie-Hellman key exchange](https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange) cryptographic protocol."
10 ]
11 },
12 {
13 "cell_type": "code",
14 "execution_count": 1,
15 "metadata": {},
16 "outputs": [
17 {
18 "name": "stdout",
19 "output_type": "stream",
20 "text": [
21 "Public key: p = 75521 and g = 58258 \n",
22 "\n",
23 "[[ Alice's secret key: a = 22794 ]]\n",
24 "[[ Bob's secret key: b = 69773 ]] \n",
25 "\n",
26 "Alice sends h1 = 31067 to Bob\n",
27 "Bob sends h2 = 54398 to Alice \n",
28 "\n",
29 "Alice computed 30031 using h2 and her secret a\n",
30 "Bob computed 30031 using h1 and his secret b\n"
31 ]
32 }
33 ],
34 "source": [
35 "# Public information:\n",
36 "p = Primes()[10^3 + randint(1,10000)] # random prime\n",
37 "g = randint(2, p-1) # random integer\n",
38 "\n",
39 "print(\"Public key: p =\", p, \"and g =\", g, \"\\n\")\n",
40 "\n",
41 "a = randint(2, p-1) # Only Alice knows this\n",
42 "b = randint(2, p-1) # Only Bob knows this\n",
43 "\n",
44 "print(\"[[ Alice's secret key: a =\", a, \"]]\")\n",
45 "print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n",
46 "\n",
47 "h1 = (g^a) % p # Alice sends this to Bob\n",
48 "h2 = (g^b) % p # Bob sends this to Alice\n",
49 "\n",
50 "print(\"Alice sends h1 =\", h1, \"to Bob\")\n",
51 "print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n",
52 "\n",
53 "secret_a = (h2^a) % p # Alice can compute this because she knows a\n",
54 "secret_b = (h1^b) % p # Bob can compute this because he knows b\n",
55 "\n",
56 "print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n",
57 "print(\"Bob computed\", secret_b, \"using h1 and his secret b\")"
58 ]
59 },
60 {
61 "cell_type": "markdown",
62 "metadata": {},
63 "source": [
64 "## General Diffie-Hellman\n",
65 "\n",
66 "The following code is an implementation of a generic Diffie-Hellman key exchange protocol that uses a group $G$ instead of $(\\mathbb Z/p \\mathbb Z)^\\times$."
67 ]
68 },
69 {
70 "cell_type": "code",
71 "execution_count": 2,
72 "metadata": {},
73 "outputs": [
74 {
75 "name": "stdout",
76 "output_type": "stream",
77 "text": [
78 "Public key:\n",
79 "G = Additive abelian group isomorphic to Z/171 embedded in Abelian group of points on Elliptic Curve defined by y^2 = x^3 + x + 156 over Finite Field of size 157 \n",
80 "g = (53 : 90 : 1) \n",
81 "\n",
82 "[[ Alice's secret key: a = 145 ]]\n",
83 "[[ Bob's secret key: b = 65 ]] \n",
84 "\n",
85 "Alice sends h1 = (150 : 80 : 1) to Bob\n",
86 "Bob sends h2 = (4 : 58 : 1) to Alice \n",
87 "\n",
88 "Alice computed (28 : 28 : 1) using h2 and her secret a\n",
89 "Bob computed (28 : 28 : 1) using h1 and his secret b\n"
90 ]
91 }
92 ],
93 "source": [
94 "def genericDH(G):\n",
95 " if G.cardinality() == 1:\n",
96 " print(\"Group is trivial, can't do anything\")\n",
97 " return\n",
98 " g = G.random_element()\n",
99 " while g == G.identity(): # Make sure g is not trivial\n",
100 " g = G.random_element()\n",
101 " \n",
102 " print(\"Public key:\\nG =\", G, \"\\ng =\", g, \"\\n\")\n",
103 " \n",
104 " a = randint(2, G.exponent()-1) # Only Alice knows this\n",
105 " b = randint(2, G.exponent()-1) # Only Bob knows this\n",
106 "\n",
107 " print(\"[[ Alice's secret key: a =\", a, \"]]\")\n",
108 " print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n",
109 " \n",
110 " # \"Ternary operator\", I did not explain this\n",
111 " # https://docs.python.org/3/reference/expressions.html#conditional-expressions\n",
112 " h1 = g^a if G.is_multiplicative() else a*g # Alice sends this to Bob\n",
113 " h2 = g^b if G.is_multiplicative() else b*g # Bob sends this to Alice\n",
114 "\n",
115 " print(\"Alice sends h1 =\", h1, \"to Bob\")\n",
116 " print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n",
117 " \n",
118 " secret_a = h2^a if G.is_multiplicative() else a*h2 # Alice can compute this because she knows a\n",
119 " secret_b = h1^b if G.is_multiplicative() else b*h1 # Bob can compute this because he knows b\n",
120 "\n",
121 " print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n",
122 " print(\"Bob computed\", secret_b, \"using h1 and his secret b\")\n",
123 " \n",
124 "E = EllipticCurve(GF(157), [1,-1])\n",
125 "G = E.abelian_group()\n",
126 "genericDH(G)"
127 ]
128 },
129 {
130 "cell_type": "markdown",
131 "metadata": {},
132 "source": [
133 "# Numerical methods for differential equations\n",
134 "\n",
135 "## Euler's method (ODE)\n",
136 "\n",
137 "In sage you can use [`ode_solver()`](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/ode.html) to solve any ordinary differential equation by hand, but Euler's method is very simple to implement by hand:"
138 ]
139 },
140 {
141 "cell_type": "code",
142 "execution_count": 4,
143 "metadata": {},
144 "outputs": [
145 {
146 "data": {
147 "image/png": "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uuhxAvxEjxOASJWXJ3XrJq1dK61aJVWt6nZFoYutOgAAPG7UKGn2bOmLLwhNRWGrDgAAD1u4UHriCWnoUOmKK9yuJvSxVQf4ia06AJFm3z6pZUupdm1pzhzuovMHK04AAHiQ41gTeHq69M47hCZ/0eMEAIAH/fvf0pQp0uTJUt26blcTPlhxAgDAY1atskGXAwZIN9zgdjXhhR4nwE/0OAGIBFlZUps2UunS0rffSrGxblcUXtiqA4qQnJys5ORk+Xw+t0sBgLN2333S1q3S0qWEpjPBihPgJ1acAIS7t9+WeveW3nhDuvNOt6sJT/Q4AQDgAT/8IN1zjwWnfv3criZ8seIE+IkVJwDhKjNTattWKlHC+prOOcftisIXPU4AAEQwx5H697e+piVLCE1ni+AEAEAEGzfOepvefVdq0sTtasIfPU4AAESoZcvsLroBA6Rbb3W7mshAjxPgJ3qcAISTffuk1q2lypWlBQukmBi3K4oMbNUBABBhHMfGDezbJ331FaEpkNiqA4qQnJyspk2bKikpye1SAMAvL74oTZ8uvfWWlJjodjWRha06wE9s1QEIB3PnSl26SA8+KI0c6XY1kYfgBPiJ4AQg1G3fbn1NzZtLn38ulaQhJ+DYqgMAIAJkZ0s33mjnz733HqGpuPCyAgAQAe69V/r+e7uDrmpVt6uJXKw4wROGDRumqKioYx7x8fFulwUAATF+vD1efVVq08btaiIbK07wjGbNmunLL7888nZ0dLSL1QBAYHz7rTRokPSXv9gIAhQvghM8o2TJkqwyAYgoqanW19S6tTR6tNvVeANbdfCMjRs3qmbNmkpMTNStt96qn3766ZSfn52drfT09GMeABAqDh+WbrlF8vmkDz+USpd2uyJvIDjBEy666CK99dZb+vzzzzV+/HilpKTo4osv1p49e076NSNGjFBcXNyRR0JCQhArBoBTe+ghaeFC6YMPpJo13a7GO5jjBE/KyspS/fr19fDDD2vIkCGFfk52drays7OPvJ2enq6EhATmOAFw3ZtvSv36SWPHWn8TgoceJ3jSOeeco/PPP18bN2486efExMQohgOeAISYRYuke+6R/vhHaeBAt6vxHrbq4EnZ2dlat26datSo4XYpAOC37dul66+X2raVXnlFiopyuyLvITjBEx588EHNnTtXW7Zs0bfffqubbrpJ6enp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\n",
148 "text/plain": [
149 "Graphics object consisting of 2 graphics primitives"
150 ]
151 },
152 "execution_count": 4,
153 "metadata": {},
154 "output_type": "execute_result"
155 }
156 ],
157 "source": [
158 "var('y')\n",
159 "\n",
160 "def euler_desolve(f, x0, y0, x1):\n",
161 " n = 5\n",
162 " h = (x1-x0)/n\n",
163 " S = []\n",
164 " Y = [y0]\n",
165 " for i in range(n+1):\n",
166 " S.append(x0 + i*h)\n",
167 " Y.append(N( Y[i] + h*f(S[i], Y[i]) ))\n",
168 " return S, Y\n",
169 "\n",
170 "f(x,y) = y\n",
171 "x0 = -1\n",
172 "x1 = 2\n",
173 "y0 = e^(-1)\n",
174 "\n",
175 "S, Y = euler_desolve(f, x0, y0, x1)\n",
176 "plot(e^x, -1, 2) + line([(S[i], Y[i]) for i in range(len(S))], color='red', marker='o', markersize=2)"
177 ]
178 },
179 {
180 "cell_type": "markdown",
181 "metadata": {},
182 "source": [
183 "Sage also has an `eulers_method()` function \"for pedagogical purposes only\":"
184 ]
185 },
186 {
187 "cell_type": "code",
188 "execution_count": 5,
189 "metadata": {},
190 "outputs": [
191 {
192 "name": "stdout",
193 "output_type": "stream",
194 "text": [
195 " x y h*f(x,y)\n",
196 " -1 0.367879441171442 0.0367879441171442\n",
197 "-0.900000000000000 0.404667385288587 0.0404667385288587\n",
198 "-0.800000000000000 0.445134123817445 0.0445134123817445\n",
199 "-0.700000000000000 0.489647536199190 0.0489647536199190\n",
200 "-0.600000000000000 0.538612289819109 0.0538612289819109\n",
201 "-0.500000000000000 0.592473518801020 0.0592473518801020\n",
202 "-0.400000000000000 0.651720870681122 0.0651720870681122\n",
203 "-0.300000000000000 0.716892957749234 0.0716892957749234\n",
204 "-0.200000000000000 0.788582253524157 0.0788582253524157\n",
205 "-0.100000000000000 0.867440478876573 0.0867440478876573\n",
206 "-1.38777878078145e-16 0.954184526764230 0.0954184526764230\n",
207 "0.0999999999999999 1.04960297944065 0.104960297944065\n",
208 "0.200000000000000 1.15456327738472 0.115456327738472\n",
209 "0.300000000000000 1.27001960512319 0.127001960512319\n",
210 "0.400000000000000 1.39702156563551 0.139702156563551\n",
211 "0.500000000000000 1.53672372219906 0.153672372219906\n",
212 "0.600000000000000 1.69039609441897 0.169039609441897\n",
213 "0.700000000000000 1.85943570386086 0.185943570386086\n",
214 "0.800000000000000 2.04537927424695 0.204537927424695\n",
215 "0.900000000000000 2.24991720167165 0.224991720167165\n",
216 "1.00000000000000 2.47490892183881 0.247490892183881\n",
217 "1.10000000000000 2.72239981402269 0.272239981402269\n",
218 "1.20000000000000 2.99463979542496 0.299463979542496\n",
219 "1.30000000000000 3.29410377496746 0.329410377496746\n",
220 "1.40000000000000 3.62351415246420 0.362351415246420\n",
221 "1.50000000000000 3.98586556771062 0.398586556771062\n",
222 "1.60000000000000 4.38445212448168 0.438445212448168\n",
223 "1.70000000000000 4.82289733692985 0.482289733692985\n",
224 "1.80000000000000 5.30518707062284 0.530518707062284\n",
225 "1.90000000000000 5.83570577768512 0.583570577768512\n",
226 "2.00000000000000 6.41927635545363 0.641927635545363\n"
227 ]
228 }
229 ],
230 "source": [
231 "# Usage: eulers_method(f, x0, y0, h, x1)\n",
232 "eulers_method(f, -1, N(e^(-1)), 0.1, 2)"
233 ]
234 },
235 {
236 "cell_type": "markdown",
237 "metadata": {},
238 "source": [
239 "## Solving the heat equation with a finite difference method"
240 ]
241 },
242 {
243 "cell_type": "code",
244 "execution_count": null,
245 "metadata": {},
246 "outputs": [],
247 "source": [
248 "def heat_fdm(u0j, u1j, ui0):\n",
249 " m, n = len(u0j)-1, len(ui0)-1\n",
250 " k, h = 1/m, 1/n\n",
251 " \n",
252 " u = [[0] * (m+1) for i in range(n+1)]\n",
253 " for j in range(m+1):\n",
254 " u[0][j] = u0j[j]\n",
255 " for j in range(m+1):\n",
256 " u[n][j] = u1j[j]\n",
257 " for i in range(n+1):\n",
258 " u[i][0] = ui0[i]\n",
259 " \n",
260 " for j in range(0,m):\n",
261 " for i in range(1,n):\n",
262 " u[i][j+1] = (k/(h*h)) * (u[i+1][j] - 2*u[i][j] + u[i-1][j]) + u[i][j]\n",
263 " \n",
264 " return u\n",
265 "\n",
266 "n, m = 20, 20\n",
267 "u0j = [10 - (j/m)*10 for j in range(m+1)] # One extreme goes from hot to cold\n",
268 "u1j = [(j/m)*10 for j in range(m+1)] # The other does the opposite\n",
269 "ui0 = [10 - (i/m)*10 for i in range(0,n+1)]\n",
270 "\n",
271 "u = heat_fdm(u0j, u1j, ui0)\n",
272 "for t in range(m+1):\n",
273 " show(line([(i/n, u[i][t]) for i in range(n+1)], ymin=-1, ymax =12))"
274 ]
275 }
276 ],
277 "metadata": {
278 "kernelspec": {
279 "display_name": "SageMath 9.0",
280 "language": "sage",
281 "name": "sagemath"
282 },
283 "language_info": {
284 "codemirror_mode": {
285 "name": "ipython",
286 "version": 3
287 },
288 "file_extension": ".py",
289 "mimetype": "text/x-python",
290 "name": "python",
291 "nbconvert_exporter": "python",
292 "pygments_lexer": "ipython3",
293 "version": "3.8.5"
294 }
295 },
296 "nbformat": 4,
297 "nbformat_minor": 4
298}
diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.aux b/src/Lecture7/slides/X1-ComputationalComplexity.aux
new file mode 100644
index 0000000..b0463b4
--- /dev/null
+++ b/src/Lecture7/slides/X1-ComputationalComplexity.aux
@@ -0,0 +1,100 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
4\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
5\global\let\oldcontentsline\contentsline
6\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
7\global\let\oldnewlabel\newlabel
8\gdef\newlabel#1#2{\newlabelxx{#1}#2}
9\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
10\AtEndDocument{\ifx\hyper@anchor\@undefined
11\let\contentsline\oldcontentsline
12\let\newlabel\oldnewlabel
13\fi}
14\fi}
15\global\let\hyper@last\relax
16\gdef\HyperFirstAtBeginDocument#1{#1}
17\providecommand\HyField@AuxAddToFields[1]{}
18\providecommand\HyField@AuxAddToCoFields[2]{}
19\providecommand \oddpage@label [2]{}
20\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
21\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
22\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}}
23\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}}
24\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}}
25\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}}
26\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}}
27\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}}
28\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}}
29\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}}
30\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}}
31\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}}
32\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}}
33\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}}
34\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}}
35\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}}
36\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}}
37\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}}
38\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}}
39\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}}
40\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}}
41\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}}
42\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}}
43\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}}
44\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}}
45\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}}
46\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}}
47\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}}
48\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}}
49\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}}
50\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}}
51\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}}
52\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}}
53\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}}
54\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}}
55\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}}
56\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}}
57\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}}
58\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}}
59\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}}
60\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}}
61\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}}
62\@writefile{nav}{\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}}
63\@writefile{nav}{\headcommand {\beamer@framepages {22}{22}}}
64\@writefile{nav}{\headcommand {\slideentry {0}{0}{23}{23/26}{}{0}}}
65\@writefile{nav}{\headcommand {\beamer@framepages {23}{26}}}
66\@writefile{nav}{\headcommand {\slideentry {0}{0}{24}{27/30}{}{0}}}
67\@writefile{nav}{\headcommand {\beamer@framepages {27}{30}}}
68\@writefile{nav}{\headcommand {\slideentry {0}{0}{25}{31/31}{}{0}}}
69\@writefile{nav}{\headcommand {\beamer@framepages {31}{31}}}
70\@writefile{nav}{\headcommand {\slideentry {0}{0}{26}{32/32}{}{0}}}
71\@writefile{nav}{\headcommand {\beamer@framepages {32}{32}}}
72\@writefile{nav}{\headcommand {\slideentry {0}{0}{27}{33/33}{}{0}}}
73\@writefile{nav}{\headcommand {\beamer@framepages {33}{33}}}
74\@writefile{nav}{\headcommand {\slideentry {0}{0}{28}{34/34}{}{0}}}
75\@writefile{nav}{\headcommand {\beamer@framepages {34}{34}}}
76\@writefile{nav}{\headcommand {\slideentry {0}{0}{29}{35/35}{}{0}}}
77\@writefile{nav}{\headcommand {\beamer@framepages {35}{35}}}
78\@writefile{nav}{\headcommand {\slideentry {0}{0}{30}{36/36}{}{0}}}
79\@writefile{nav}{\headcommand {\beamer@framepages {36}{36}}}
80\@writefile{nav}{\headcommand {\slideentry {0}{0}{31}{37/37}{}{0}}}
81\@writefile{nav}{\headcommand {\beamer@framepages {37}{37}}}
82\@writefile{nav}{\headcommand {\slideentry {0}{0}{32}{38/38}{}{0}}}
83\@writefile{nav}{\headcommand {\beamer@framepages {38}{38}}}
84\@writefile{nav}{\headcommand {\slideentry {0}{0}{33}{39/39}{}{0}}}
85\@writefile{nav}{\headcommand {\beamer@framepages {39}{39}}}
86\@writefile{nav}{\headcommand {\slideentry {0}{0}{34}{40/40}{}{0}}}
87\@writefile{nav}{\headcommand {\beamer@framepages {40}{40}}}
88\@writefile{nav}{\headcommand {\slideentry {0}{0}{35}{41/41}{}{0}}}
89\@writefile{nav}{\headcommand {\beamer@framepages {41}{41}}}
90\@writefile{nav}{\headcommand {\slideentry {0}{0}{36}{42/42}{}{0}}}
91\@writefile{nav}{\headcommand {\beamer@framepages {42}{42}}}
92\@writefile{nav}{\headcommand {\slideentry {0}{0}{37}{43/43}{}{0}}}
93\@writefile{nav}{\headcommand {\beamer@framepages {43}{43}}}
94\@writefile{nav}{\headcommand {\slideentry {0}{0}{38}{44/44}{}{0}}}
95\@writefile{nav}{\headcommand {\beamer@framepages {44}{44}}}
96\@writefile{nav}{\headcommand {\beamer@partpages {1}{44}}}
97\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{44}}}
98\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{44}}}
99\@writefile{nav}{\headcommand {\beamer@documentpages {44}}}
100\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {38}}}
diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.log b/src/Lecture7/slides/X1-ComputationalComplexity.log
new file mode 100644
index 0000000..03238ae
--- /dev/null
+++ b/src/Lecture7/slides/X1-ComputationalComplexity.log
@@ -0,0 +1,1513 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2021.5.20) 25 MAY 2021 16:23
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**X1-ComputationalComplexity.tex
6(./X1-ComputationalComplexity.tex
7LaTeX2e <2020-02-02> patch level 2
8L3 programming layer <2020-02-14>
9(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
10Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations
11(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
12(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
13Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW)
14\etb@tempcnta=\count167
15)
16\beamer@tempbox=\box45
17\beamer@tempcount=\count168
18\c@beamerpauses=\count169
19
20(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
21\beamer@slideinframe=\count170
22\beamer@minimum=\count171
23\beamer@decode@box=\box46
24)
25\beamer@commentbox=\box47
26\beamer@modecount=\count172
27)
28(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
29Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead.
30
31(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
32Package: iftex 2019/11/07 v1.0c TeX engine tests
33))
34\headdp=\dimen134
35\footheight=\dimen135
36\sidebarheight=\dimen136
37\beamer@tempdim=\dimen137
38\beamer@finalheight=\dimen138
39\beamer@animht=\dimen139
40\beamer@animdp=\dimen140
41\beamer@animwd=\dimen141
42\beamer@leftmargin=\dimen142
43\beamer@rightmargin=\dimen143
44\beamer@leftsidebar=\dimen144
45\beamer@rightsidebar=\dimen145
46\beamer@boxsize=\dimen146
47\beamer@vboxoffset=\dimen147
48\beamer@descdefault=\dimen148
49\beamer@descriptionwidth=\dimen149
50\beamer@lastskip=\skip47
51\beamer@areabox=\box48
52\beamer@animcurrent=\box49
53\beamer@animshowbox=\box50
54\beamer@sectionbox=\box51
55\beamer@logobox=\box52
56\beamer@linebox=\box53
57\beamer@sectioncount=\count173
58\beamer@subsubsectionmax=\count174
59\beamer@subsectionmax=\count175
60\beamer@sectionmax=\count176
61\beamer@totalheads=\count177
62\beamer@headcounter=\count178
63\beamer@partstartpage=\count179
64\beamer@sectionstartpage=\count180
65\beamer@subsectionstartpage=\count181
66\beamer@animationtempa=\count182
67\beamer@animationtempb=\count183
68\beamer@xpos=\count184
69\beamer@ypos=\count185
70\beamer@ypos@offset=\count186
71\beamer@showpartnumber=\count187
72\beamer@currentsubsection=\count188
73\beamer@coveringdepth=\count189
74\beamer@sectionadjust=\count190
75\beamer@tocsectionnumber=\count191
76
77(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
78(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
79Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
80\KV@toks@=\toks14
81))
82\beamer@paperwidth=\skip48
83\beamer@paperheight=\skip49
84
85(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
86Package: geometry 2020/01/02 v5.9 Page Geometry
87
88(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
89Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
90)
91\Gm@cnth=\count192
92\Gm@cntv=\count193
93\c@Gm@tempcnt=\count194
94\Gm@bindingoffset=\dimen150
95\Gm@wd@mp=\dimen151
96\Gm@odd@mp=\dimen152
97\Gm@even@mp=\dimen153
98\Gm@layoutwidth=\dimen154
99\Gm@layoutheight=\dimen155
100\Gm@layouthoffset=\dimen156
101\Gm@layoutvoffset=\dimen157
102\Gm@dimlist=\toks15
103)
104(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
105File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option)
106)
107(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
108(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
109Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR)
110
111(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
112Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR)
113
114(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
115Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
116)
117(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
118File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
119)
120Package graphics Info: Driver file: pdftex.def on input line 105.
121
122(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
123File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
124))
125\Gin@req@height=\dimen158
126\Gin@req@width=\dimen159
127)
128(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
129(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
130(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
131\pgfutil@everybye=\toks16
132\pgfutil@tempdima=\dimen160
133\pgfutil@tempdimb=\dimen161
134
135(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t
136ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
137\pgfutil@abb=\box54
138(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty
139Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS)
140))
141(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
142(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex)
143Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b)
144))
145(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
146Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b)
147
148(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
149\pgfkeys@pathtoks=\toks17
150\pgfkeys@temptoks=\toks18
151
152(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t
153ex
154\pgfkeys@tmptoks=\toks19
155))
156\pgf@x=\dimen162
157\pgf@y=\dimen163
158\pgf@xa=\dimen164
159\pgf@ya=\dimen165
160\pgf@xb=\dimen166
161\pgf@yb=\dimen167
162\pgf@xc=\dimen168
163\pgf@yc=\dimen169
164\pgf@xd=\dimen170
165\pgf@yd=\dimen171
166\w@pgf@writea=\write3
167\r@pgf@reada=\read2
168\c@pgf@counta=\count195
169\c@pgf@countb=\count196
170\c@pgf@countc=\count197
171\c@pgf@countd=\count198
172\t@pgf@toka=\toks20
173\t@pgf@tokb=\toks21
174\t@pgf@tokc=\toks22
175\pgf@sys@id@count=\count199
176 (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
177File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b)
178)
179Driver file for pgf: pgfsys-pdftex.def
180
181(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
182File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b)
183
184(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de
185f
186File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b)
187)))
188(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.
189tex
190File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b)
191\pgfsyssoftpath@smallbuffer@items=\count266
192\pgfsyssoftpath@bigbuffer@items=\count267
193)
194(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.
195tex
196File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b)
197)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
198Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
199
200(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
201File: color.cfg 2016/01/02 v1.6 sample color configuration
202)
203Package xcolor Info: Driver file: pdftex.def on input line 225.
204Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
205Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
206Package xcolor Info: Model `RGB' extended on input line 1364.
207Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
208Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
209Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
210Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
211Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
212Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
213)
214(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
215Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b)
216
217(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
218(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
219(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
220(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
221\pgfmath@dimen=\dimen172
222\pgfmath@count=\count268
223\pgfmath@box=\box55
224\pgfmath@toks=\toks23
225\pgfmath@stack@operand=\toks24
226\pgfmath@stack@operation=\toks25
227)
228(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
229(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code
230.tex)
231(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet
232ric.code.tex)
233(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod
234e.tex)
235(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison
236.code.tex)
237(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.
238tex)
239(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code
240.tex)
241(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.
242tex)
243(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari
244thmetics.code.tex)))
245(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
246\c@pgfmathroundto@lastzeros=\count269
247))
248(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
249(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te
250x
251File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b)
252\pgf@picminx=\dimen173
253\pgf@picmaxx=\dimen174
254\pgf@picminy=\dimen175
255\pgf@picmaxy=\dimen176
256\pgf@pathminx=\dimen177
257\pgf@pathmaxx=\dimen178
258\pgf@pathminy=\dimen179
259\pgf@pathmaxy=\dimen180
260\pgf@xx=\dimen181
261\pgf@xy=\dimen182
262\pgf@yx=\dimen183
263\pgf@yy=\dimen184
264\pgf@zx=\dimen185
265\pgf@zy=\dimen186
266)
267(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.
268code.tex
269File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b)
270\pgf@path@lastx=\dimen187
271\pgf@path@lasty=\dimen188
272)
273(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code
274.tex
275File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
276\pgf@shorten@end@additional=\dimen189
277\pgf@shorten@start@additional=\dimen190
278)
279(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te
280x
281File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
282\pgfpic=\box56
283\pgf@hbox=\box57
284\pgf@layerbox@main=\box58
285\pgf@picture@serial@count=\count270
286)
287(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c
288ode.tex
289File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b)
290\pgflinewidth=\dimen191
291)
292(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation
293s.code.tex
294File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b)
295\pgf@pt@x=\dimen192
296\pgf@pt@y=\dimen193
297\pgf@pt@temp=\dimen194
298)
299(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
300File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b)
301)
302(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t
303ex
304File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b)
305)
306(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing
307.code.tex
308File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b)
309)
310(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te
311x
312File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b)
313\pgfarrowsep=\dimen195
314)
315(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
316File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b)
317\pgf@max=\dimen196
318\pgf@sys@shading@range@num=\count271
319\pgf@shadingcount=\count272
320)
321(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
322File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
323
324(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.
325tex
326File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b)
327\pgfexternal@startupbox=\box59
328))
329(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te
330x
331File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
332)
333(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c
334ode.tex
335File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b)
336)
337(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.
338tex
339File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b)
340)
341(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
342File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b)
343))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
344Package: xxcolor 2003/10/24 ver 0.1
345\XC@nummixins=\count273
346\XC@countmixins=\count274
347)
348(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
349Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO)
350
351(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
352Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
353)
354(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
355Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO)
356))
357(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
358Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX
359
360(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty
361Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO
362)
363Package pdftexcmds Info: \pdf@primitive is available.
364Package pdftexcmds Info: \pdf@ifprimitive is available.
365Package pdftexcmds Info: \pdfdraftmode found.
366)
367(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
368Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
369)
370(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
371Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
372)
373(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
374Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
375)
376(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
377Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
378)
379(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
380Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
381)
382(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
383Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
384)
385(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
386Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO)
387)
388\@linkdim=\dimen197
389\Hy@linkcounter=\count275
390\Hy@pagecounter=\count276
391
392(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
393File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO)
394Now handling font encoding PD1 ...
395... no UTF-8 mapping file for font encoding PD1
396)
397(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
398Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
399)
400(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
401Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
402)
403\Hy@SavedSpaceFactor=\count277
404\pdfmajorversion=\count278
405Package hyperref Info: Option `bookmarks' set `true' on input line 4421.
406Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421.
407Package hyperref Info: Option `implicit' set `false' on input line 4421.
408Package hyperref Info: Hyper figures OFF on input line 4547.
409Package hyperref Info: Link nesting OFF on input line 4552.
410Package hyperref Info: Hyper index ON on input line 4555.
411Package hyperref Info: Plain pages OFF on input line 4562.
412Package hyperref Info: Backreferencing OFF on input line 4567.
413Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals.
414Package hyperref Info: Bookmarks ON on input line 4800.
415\c@Hy@tempcnt=\count279
416
417(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty
418\Urlmuskip=\muskip16
419Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
420)
421LaTeX Info: Redefining \url on input line 5159.
422\XeTeXLinkMargin=\dimen198
423
424(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
425Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
426
427(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
428Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
429)
430))
431\Fld@menulength=\count280
432\Field@Width=\dimen199
433\Fld@charsize=\dimen256
434Package hyperref Info: Hyper figures OFF on input line 6430.
435Package hyperref Info: Link nesting OFF on input line 6435.
436Package hyperref Info: Hyper index ON on input line 6438.
437Package hyperref Info: backreferencing OFF on input line 6445.
438Package hyperref Info: Link coloring OFF on input line 6450.
439Package hyperref Info: Link coloring with OCG OFF on input line 6455.
440Package hyperref Info: PDF/A mode OFF on input line 6460.
441LaTeX Info: Redefining \ref on input line 6500.
442LaTeX Info: Redefining \pageref on input line 6504.
443\Hy@abspage=\count281
444
445
446Package hyperref Message: Stopped early.
447
448)
449Package hyperref Info: Driver (autodetected): hpdftex.
450 (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
451File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX
452
453(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
454Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO)
455)
456\Fld@listcount=\count282
457\c@bookmark@seq@number=\count283
458
459(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
460Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
461
462(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
463Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
464)
465Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
46686.
467))
468(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
469(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty)
470(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
471(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
472Package: amssymb 2013/01/14 v3.01 AMS font symbols
473
474(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
475Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
476\@emptytoks=\toks26
477\symAMSa=\mathgroup4
478\symAMSb=\mathgroup5
479LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
480LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
481(Font) U/euf/m/n --> U/euf/b/n on input line 106.
482))
483(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
484Package: sansmathaccent 2020/01/31
485
486(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
487Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files)
488)))
489(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
490(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
491Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX
492))
493(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty)
494(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty)
495(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
496\beamer@argscount=\count284
497\beamer@lastskipcover=\skip50
498\beamer@trivlistdepth=\count285
499)
500(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty)
501(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
502\c@lecture=\count286
503\c@part=\count287
504\c@section=\count288
505\c@subsection=\count289
506\c@subsubsection=\count290
507)
508(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
509\beamer@framebox=\box60
510\beamer@frametitlebox=\box61
511\beamer@zoombox=\box62
512\beamer@zoomcount=\count291
513\beamer@zoomframecount=\count292
514\beamer@frametextheight=\dimen257
515\c@subsectionslide=\count293
516\beamer@frametopskip=\skip51
517\beamer@framebottomskip=\skip52
518\beamer@frametopskipautobreak=\skip53
519\beamer@framebottomskipautobreak=\skip54
520\beamer@envbody=\toks27
521\framewidth=\dimen258
522\c@framenumber=\count294
523)
524(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
525\beamer@verbatimfileout=\write4
526)
527(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
528\beamer@splitbox=\box63
529\beamer@autobreakcount=\count295
530\beamer@autobreaklastheight=\dimen259
531\beamer@frametitletoks=\toks28
532\beamer@framesubtitletoks=\toks29
533)
534(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
535\beamer@footins=\box64
536)
537(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty)
538(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
539\beamer@frameboxcopy=\box65
540)
541(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty)
542(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
543\beamer@sbttoks=\toks30
544
545(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
546(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
547\bmb@box=\box66
548\bmb@colorbox=\box67
549\bmb@boxshadow=\box68
550\bmb@boxshadowball=\box69
551\bmb@boxshadowballlarge=\box70
552\bmb@temp=\dimen260
553\bmb@dima=\dimen261
554\bmb@dimb=\dimen262
555\bmb@prevheight=\dimen263
556)
557\beamer@blockheadheight=\dimen264
558))
559(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
560(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
561Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
562\@enLab=\toks31
563)
564\c@figure=\count296
565\c@table=\count297
566\abovecaptionskip=\skip55
567\belowcaptionskip=\skip56
568)
569(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
570\beamer@section@min@dim=\dimen265
571)
572(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
573(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
574Package: amsmath 2020/01/20 v2.17e AMS math features
575\@mathmargin=\skip57
576
577For additional information on amsmath, use the `?' option.
578(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
579Package: amstext 2000/06/29 v2.01 AMS text
580
581(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
582File: amsgen.sty 1999/11/30 v2.0 generic functions
583\@emptytoks=\toks32
584\ex@=\dimen266
585))
586(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
587Package: amsbsy 1999/11/29 v1.2d Bold Symbols
588\pmbraise@=\dimen267
589)
590(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
591Package: amsopn 2016/03/08 v2.02 operator names
592)
593\inf@bad=\count298
594LaTeX Info: Redefining \frac on input line 227.
595\uproot@=\count299
596\leftroot@=\count300
597LaTeX Info: Redefining \overline on input line 389.
598\classnum@=\count301
599\DOTSCASE@=\count302
600LaTeX Info: Redefining \ldots on input line 486.
601LaTeX Info: Redefining \dots on input line 489.
602LaTeX Info: Redefining \cdots on input line 610.
603\Mathstrutbox@=\box71
604\strutbox@=\box72
605\big@size=\dimen268
606LaTeX Font Info: Redeclaring font encoding OML on input line 733.
607LaTeX Font Info: Redeclaring font encoding OMS on input line 734.
608\macc@depth=\count303
609\c@MaxMatrixCols=\count304
610\dotsspace@=\muskip17
611\c@parentequation=\count305
612\dspbrk@lvl=\count306
613\tag@help=\toks33
614\row@=\count307
615\column@=\count308
616\maxfields@=\count309
617\andhelp@=\toks34
618\eqnshift@=\dimen269
619\alignsep@=\dimen270
620\tagshift@=\dimen271
621\tagwidth@=\dimen272
622\totwidth@=\dimen273
623\lineht@=\dimen274
624\@envbody=\toks35
625\multlinegap=\skip58
626\multlinetaggap=\skip59
627\mathdisplay@stack=\toks36
628LaTeX Info: Redefining \[ on input line 2859.
629LaTeX Info: Redefining \] on input line 2860.
630)
631(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
632Package: amsthm 2017/10/31 v2.20.4
633\thm@style=\toks37
634\thm@bodyfont=\toks38
635\thm@headfont=\toks39
636\thm@notefont=\toks40
637\thm@headpunct=\toks41
638\thm@preskip=\skip60
639\thm@postskip=\skip61
640\thm@headsep=\skip62
641\dth@everypar=\toks42
642)
643\c@theorem=\count310
644)
645(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty))
646(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
647(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty)
648(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty)
649(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
650\beamer@dima=\dimen275
651\beamer@dimb=\dimen276
652)
653(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty)))
654(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty
655(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty)
656(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty)
657(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty)
658(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty))
659(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
660Package: inputenc 2018/08/11 v1.3c Input encoding file
661\inpenc@prehook=\toks43
662\inpenc@posthook=\toks44
663)
664(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.sty
665\lst@mode=\count311
666\lst@gtempboxa=\box73
667\lst@token=\toks45
668\lst@length=\count312
669\lst@currlwidth=\dimen277
670\lst@column=\count313
671\lst@pos=\count314
672\lst@lostspace=\dimen278
673\lst@width=\dimen279
674\lst@newlines=\count315
675\lst@lineno=\count316
676\lst@maxwidth=\dimen280
677
678(/usr/share/texlive/texmf-dist/tex/latex/listings/lstmisc.sty
679File: lstmisc.sty 2019/09/10 1.8c (Carsten Heinz)
680\c@lstnumber=\count317
681\lst@skipnumbers=\count318
682\lst@framebox=\box74
683)
684(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.cfg
685File: listings.cfg 2019/09/10 1.8c listings configuration
686))
687Package: listings 2019/09/10 1.8c (Carsten Heinz)
688
689(/usr/share/texlive/texmf-dist/tex/latex/mathtools/mathtools.sty
690Package: mathtools 2020/01/17 v1.23 mathematical typesetting tools
691
692(/usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
693Package: calc 2017/05/25 v4.3 Infix arithmetic (KKT,FJ)
694\calc@Acount=\count319
695\calc@Bcount=\count320
696\calc@Adimen=\dimen281
697\calc@Bdimen=\dimen282
698\calc@Askip=\skip63
699\calc@Bskip=\skip64
700LaTeX Info: Redefining \setlength on input line 80.
701LaTeX Info: Redefining \addtolength on input line 81.
702\calc@Ccount=\count321
703\calc@Cskip=\skip65
704)
705(/usr/share/texlive/texmf-dist/tex/latex/mathtools/mhsetup.sty
706Package: mhsetup 2017/03/31 v1.3 programming setup (MH)
707)
708LaTeX Info: Thecontrolsequence`\('isalreadyrobust on input line 129.
709LaTeX Info: Thecontrolsequence`\)'isalreadyrobust on input line 129.
710LaTeX Info: Thecontrolsequence`\['isalreadyrobust on input line 129.
711LaTeX Info: Thecontrolsequence`\]'isalreadyrobust on input line 129.
712\g_MT_multlinerow_int=\count322
713\l_MT_multwidth_dim=\dimen283
714\origjot=\skip66
715\l_MT_shortvdotswithinadjustabove_dim=\dimen284
716\l_MT_shortvdotswithinadjustbelow_dim=\dimen285
717\l_MT_above_intertext_sep=\dimen286
718\l_MT_below_intertext_sep=\dimen287
719\l_MT_above_shortintertext_sep=\dimen288
720\l_MT_below_shortintertext_sep=\dimen289
721)
722(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty
723Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ
724
725(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
726(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
727Package: pgf 2020/01/08 v3.1.5b (3.1.5b)
728
729(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
730File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
731\pgfnodeparttextbox=\box75
732) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
733File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b)
734)
735(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65
736.sty
737Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b)
738\pgf@nodesepstart=\dimen290
739\pgf@nodesepend=\dimen291
740)
741(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18
742.sty
743Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b)
744)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
745(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
746(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex))
747(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
748(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
749(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
750Package: pgffor 2020/01/08 v3.1.5b (3.1.5b)
751
752(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
753\pgffor@iter=\dimen292
754\pgffor@skip=\dimen293
755\pgffor@stack=\toks46
756\pgffor@toks=\toks47
757))
758(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
759Package: tikz 2020/01/08 v3.1.5b (3.1.5b)
760
761(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers
762.code.tex
763File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
764\pgf@plot@mark@count=\count323
765\pgfplotmarksize=\dimen294
766)
767\tikz@lastx=\dimen295
768\tikz@lasty=\dimen296
769\tikz@lastxsaved=\dimen297
770\tikz@lastysaved=\dimen298
771\tikz@lastmovetox=\dimen299
772\tikz@lastmovetoy=\dimen300
773\tikzleveldistance=\dimen301
774\tikzsiblingdistance=\dimen302
775\tikz@figbox=\box76
776\tikz@figbox@bg=\box77
777\tikz@tempbox=\box78
778\tikz@tempbox@bg=\box79
779\tikztreelevel=\count324
780\tikznumberofchildren=\count325
781\tikznumberofcurrentchild=\count326
782\tikz@fig@count=\count327
783
784(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
785File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
786\pgfmatrixcurrentrow=\count328
787\pgfmatrixcurrentcolumn=\count329
788\pgf@matrix@numberofcolumns=\count330
789)
790\tikz@expandcount=\count331
791
792(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
793zlibrarytopaths.code.tex
794File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b)
795)))
796(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex
797(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
798zlibrarymatrix.code.tex
799File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
800)
801(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
802zlibraryquotes.code.tex
803File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
804)
805(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.
806code.tex
807File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b)
808\pgfarrowinset=\dimen303
809\pgfarrowlength=\dimen304
810\pgfarrowwidth=\dimen305
811\pgfarrowlinewidth=\dimen306
812))) (/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjustbox.sty
813Package: adjustbox 2019/01/04 v1.2 Adjusting TeX boxes (trim, clip, ...)
814
815(/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
816Package: xkeyval 2014/12/03 v2.7a package option processing (HA)
817
818(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex
819(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex
820\XKV@toks=\toks48
821\XKV@tempa@toks=\toks49
822)
823\XKV@depth=\count332
824File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
825))
826(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjcalc.sty
827Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back
828-ends (calc, etex, pgfmath)
829)
830(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/trimclip.sty
831Package: trimclip 2018/04/08 v1.1 Trim and clip general TeX material
832
833(/usr/share/texlive/texmf-dist/tex/latex/collectbox/collectbox.sty
834Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes
835\collectedbox=\box80
836)
837\tc@llx=\dimen307
838\tc@lly=\dimen308
839\tc@urx=\dimen309
840\tc@ury=\dimen310
841Package trimclip Info: Using driver 'tc-pdftex.def'.
842
843(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/tc-pdftex.def
844File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex
845))
846\adjbox@Width=\dimen311
847\adjbox@Height=\dimen312
848\adjbox@Depth=\dimen313
849\adjbox@Totalheight=\dimen314
850\adjbox@pwidth=\dimen315
851\adjbox@pheight=\dimen316
852\adjbox@pdepth=\dimen317
853\adjbox@ptotalheight=\dimen318
854
855(/usr/share/texlive/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty
856Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection
857\c@checkoddpage=\count333
858)
859(/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty
860Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages
861\@vwid@box=\box81
862\sift@deathcycles=\count334
863\@vwid@loff=\dimen319
864\@vwid@roff=\dimen320
865))
866(/usr/share/texlive/texmf-dist/tex/latex/listings/lstlang1.sty
867File: lstlang1.sty 2019/09/10 1.8c listings language file
868)
869(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def
870File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode
871\l__kernel_color_stack_int=\count335
872\l__pdf_internal_box=\box82
873)
874(./X1-ComputationalComplexity.aux)
875\openout1 = `X1-ComputationalComplexity.aux'.
876
877LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 32.
878LaTeX Font Info: ... okay on input line 32.
879LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 32.
880LaTeX Font Info: ... okay on input line 32.
881LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 32.
882LaTeX Font Info: ... okay on input line 32.
883LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 32.
884LaTeX Font Info: ... okay on input line 32.
885LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 32.
886LaTeX Font Info: ... okay on input line 32.
887LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 32.
888LaTeX Font Info: ... okay on input line 32.
889LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 32.
890LaTeX Font Info: ... okay on input line 32.
891LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 32.
892LaTeX Font Info: ... okay on input line 32.
893
894*geometry* driver: auto-detecting
895*geometry* detected driver: pdftex
896*geometry* verbose mode - [ preamble ] result:
897* driver: pdftex
898* paper: custom
899* layout: <same size as paper>
900* layoutoffset:(h,v)=(0.0pt,0.0pt)
901* modes: includehead includefoot
902* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt)
903* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt)
904* \paperwidth=364.19536pt
905* \paperheight=273.14662pt
906* \textwidth=342.2953pt
907* \textheight=244.6939pt
908* \oddsidemargin=-61.31996pt
909* \evensidemargin=-61.31996pt
910* \topmargin=-72.26999pt
911* \headheight=14.22636pt
912* \headsep=0.0pt
913* \topskip=11.0pt
914* \footskip=14.22636pt
915* \marginparwidth=4.0pt
916* \marginparsep=10.0pt
917* \columnsep=10.0pt
918* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
919* \hoffset=0.0pt
920* \voffset=0.0pt
921* \mag=1000
922* \@twocolumnfalse
923* \@twosidefalse
924* \@mparswitchfalse
925* \@reversemarginfalse
926* (1in=72.27pt=25.4mm, 1cm=28.453pt)
927
928(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
929[Loading MPS to PDF converter (version 2006.09.02).]
930\scratchcounter=\count336
931\scratchdimen=\dimen321
932\scratchbox=\box83
933\nofMPsegments=\count337
934\nofMParguments=\count338
935\everyMPshowfont=\toks50
936\MPscratchCnt=\count339
937\MPscratchDim=\dimen322
938\MPnumerator=\count340
939\makeMPintoPDFobject=\count341
940\everyMPtoPDFconversion=\toks51
941) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
942Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
943Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
94485.
945
946(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
947File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
948e
949))
950ABD: EveryShipout initializing macros
951\AtBeginShipoutBox=\box84
952Package hyperref Info: Link coloring OFF on input line 32.
953
954(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
955Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
956
957(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
958Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
959)
960(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
961Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
962)
963\c@section@level=\count342
964)
965LaTeX Info: Redefining \ref on input line 32.
966LaTeX Info: Redefining \pageref on input line 32.
967LaTeX Info: Redefining \nameref on input line 32.
968
969(./X1-ComputationalComplexity.out) (./X1-ComputationalComplexity.out)
970\@outlinefile=\write5
971\openout5 = `X1-ComputationalComplexity.out'.
972
973LaTeX Font Info: Overwriting symbol font `operators' in version `normal'
974(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 32.
975LaTeX Font Info: Overwriting symbol font `operators' in version `bold'
976(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 32.
977\symnumbers=\mathgroup6
978\sympureletters=\mathgroup7
979LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal'
980(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 32.
981LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 32.
982LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal'
983(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 32.
984LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
985(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 32.
986LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 32.
987LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal'
988(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 32.
989LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
990(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 32.
991LaTeX Font Info: Redeclaring math alphabet \mathit on input line 32.
992LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal'
993(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 32.
994LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
995(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 32.
996LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 32.
997LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal'
998(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 32.
999LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
1000(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 32.
1001LaTeX Font Info: Overwriting symbol font `numbers' in version `bold'
1002(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 32.
1003LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
1004(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 32.
1005LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold'
1006(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 32.
1007LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
1008(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 32.
1009LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
1010(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 32.
1011LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
1012(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 32.
1013LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
1014(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 32.
1015LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 32.
1016LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal'
1017(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 3
10182.
1019LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
1020(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 3
10212.
1022LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
1023(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp
1024ut line 32.
1025
1026(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary
1027-English.dict
1028Dictionary: translator-basic-dictionary, Language: English
1029)
1030(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic
1031tionary-English.dict
1032Dictionary: translator-bibliography-dictionary, Language: English
1033)
1034(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict
1035ionary-English.dict
1036Dictionary: translator-environment-dictionary, Language: English
1037)
1038(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar
1039y-English.dict
1040Dictionary: translator-months-dictionary, Language: English
1041)
1042(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona
1043ry-English.dict
1044Dictionary: translator-numbers-dictionary, Language: English
1045)
1046(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona
1047ry-English.dict
1048Dictionary: translator-theorem-dictionary, Language: English
1049)
1050\c@lstlisting=\count343
1051 (./X1-ComputationalComplexity.nav)
1052<img/unilu.jpg, id=20, 645.16031pt x 578.16pt>
1053File: img/unilu.jpg Graphic file (type jpg)
1054<use img/unilu.jpg>
1055Package pdftex.def Info: img/unilu.jpg used on input line 36.
1056(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1057 [1
1058
1059{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>]
1060File: img/unilu.jpg Graphic file (type jpg)
1061<use img/unilu.jpg>
1062Package pdftex.def Info: img/unilu.jpg used on input line 51.
1063(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1064 [2
1065
1066]
1067File: img/unilu.jpg Graphic file (type jpg)
1068<use img/unilu.jpg>
1069Package pdftex.def Info: img/unilu.jpg used on input line 64.
1070(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1071 [3
1072
1073]
1074LaTeX Font Info: Trying to load font information for U+msa on input line 80.
1075
1076
1077(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
1078File: umsa.fd 2013/01/14 v3.01 AMS symbols A
1079)
1080LaTeX Font Info: Trying to load font information for U+msb on input line 80.
1081
1082
1083(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
1084File: umsb.fd 2013/01/14 v3.01 AMS symbols B
1085)
1086LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp
1087ut line 80.
1088
1089(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd
1090File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma
1091thkerncmss.
1092)
1093File: img/unilu.jpg Graphic file (type jpg)
1094<use img/unilu.jpg>
1095Package pdftex.def Info: img/unilu.jpg used on input line 80.
1096(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1097
1098[4
1099
1100]
1101File: img/unilu.jpg Graphic file (type jpg)
1102<use img/unilu.jpg>
1103Package pdftex.def Info: img/unilu.jpg used on input line 89.
1104(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1105 [5
1106
1107]
1108File: img/unilu.jpg Graphic file (type jpg)
1109<use img/unilu.jpg>
1110Package pdftex.def Info: img/unilu.jpg used on input line 111.
1111(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1112 [6
1113
1114]
1115File: img/unilu.jpg Graphic file (type jpg)
1116<use img/unilu.jpg>
1117Package pdftex.def Info: img/unilu.jpg used on input line 131.
1118(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1119 [7
1120
1121]
1122File: img/unilu.jpg Graphic file (type jpg)
1123<use img/unilu.jpg>
1124Package pdftex.def Info: img/unilu.jpg used on input line 143.
1125(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1126 [8
1127
1128]
1129<img/plot1.png, id=252, 426.32072pt x 280.84122pt>
1130File: img/plot1.png Graphic file (type png)
1131<use img/plot1.png>
1132Package pdftex.def Info: img/plot1.png used on input line 147.
1133(pdftex.def) Requested size: 298.42245pt x 196.5875pt.
1134File: img/unilu.jpg Graphic file (type jpg)
1135<use img/unilu.jpg>
1136Package pdftex.def Info: img/unilu.jpg used on input line 147.
1137(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1138 [9
1139
1140 <./img/plot1.png>]
1141<img/plot2.png, id=281, 424.73079pt x 280.84122pt>
1142File: img/plot2.png Graphic file (type png)
1143<use img/plot2.png>
1144Package pdftex.def Info: img/plot2.png used on input line 151.
1145(pdftex.def) Requested size: 297.30951pt x 196.5875pt.
1146File: img/unilu.jpg Graphic file (type jpg)
1147<use img/unilu.jpg>
1148Package pdftex.def Info: img/unilu.jpg used on input line 151.
1149(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1150 [10
1151
1152 <./img/plot2.png>]
1153<img/plot3.png, id=309, 425.23668pt x 280.84122pt>
1154File: img/plot3.png Graphic file (type png)
1155<use img/plot3.png>
1156Package pdftex.def Info: img/plot3.png used on input line 155.
1157(pdftex.def) Requested size: 297.66365pt x 196.5875pt.
1158File: img/unilu.jpg Graphic file (type jpg)
1159<use img/unilu.jpg>
1160Package pdftex.def Info: img/unilu.jpg used on input line 155.
1161(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1162 [11
1163
1164 <./img/plot3.png>]
1165<img/plot4.png, id=337, 424.87534pt x 280.84122pt>
1166File: img/plot4.png Graphic file (type png)
1167<use img/plot4.png>
1168Package pdftex.def Info: img/plot4.png used on input line 159.
1169(pdftex.def) Requested size: 297.4107pt x 196.5875pt.
1170File: img/unilu.jpg Graphic file (type jpg)
1171<use img/unilu.jpg>
1172Package pdftex.def Info: img/unilu.jpg used on input line 159.
1173(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1174 [12
1175
1176 <./img/plot4.png>]
1177<img/plot5.png, id=366, 424.65852pt x 280.84122pt>
1178File: img/plot5.png Graphic file (type png)
1179<use img/plot5.png>
1180Package pdftex.def Info: img/plot5.png used on input line 163.
1181(pdftex.def) Requested size: 297.25893pt x 196.5875pt.
1182File: img/unilu.jpg Graphic file (type jpg)
1183<use img/unilu.jpg>
1184Package pdftex.def Info: img/unilu.jpg used on input line 163.
1185(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1186 [13
1187
1188 <./img/plot5.png>]
1189File: img/unilu.jpg Graphic file (type jpg)
1190<use img/unilu.jpg>
1191Package pdftex.def Info: img/unilu.jpg used on input line 186.
1192(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1193 [14
1194
1195]
1196\openout4 = `X1-ComputationalComplexity.vrb'.
1197
1198
1199(./X1-ComputationalComplexity.vrb
1200LaTeX Font Info: Trying to load font information for TS1+cmss on input line
12015.
1202
1203(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmss.fd
1204File: ts1cmss.fd 2019/12/16 v2.5j Standard LaTeX font definitions
1205)) [15
1206
1207]
1208File: img/unilu.jpg Graphic file (type jpg)
1209<use img/unilu.jpg>
1210Package pdftex.def Info: img/unilu.jpg used on input line 224.
1211(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1212 [16
1213
1214]
1215\openout4 = `X1-ComputationalComplexity.vrb'.
1216
1217
1218(./X1-ComputationalComplexity.vrb
1219LaTeX Font Info: Trying to load font information for OML+cmss on input line
12205.
1221LaTeX Font Info: No file OMLcmss.fd. on input line 5.
1222
1223
1224LaTeX Font Warning: Font shape `OML/cmss/m/n' undefined
1225(Font) using `OML/cmm/m/it' instead
1226(Font) for symbol `textgreater' on input line 5.
1227
1228)
1229File: img/unilu.jpg Graphic file (type jpg)
1230<use img/unilu.jpg>
1231Package pdftex.def Info: img/unilu.jpg used on input line 241.
1232(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1233 [17
1234
1235]
1236File: img/unilu.jpg Graphic file (type jpg)
1237<use img/unilu.jpg>
1238Package pdftex.def Info: img/unilu.jpg used on input line 260.
1239(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1240 [18
1241
1242]
1243File: img/unilu.jpg Graphic file (type jpg)
1244<use img/unilu.jpg>
1245Package pdftex.def Info: img/unilu.jpg used on input line 269.
1246(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1247 [19
1248
1249]
1250File: img/unilu.jpg Graphic file (type jpg)
1251<use img/unilu.jpg>
1252Package pdftex.def Info: img/unilu.jpg used on input line 277.
1253(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1254 [20
1255
1256]
1257File: img/unilu.jpg Graphic file (type jpg)
1258<use img/unilu.jpg>
1259Package pdftex.def Info: img/unilu.jpg used on input line 291.
1260(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1261 [21
1262
1263]
1264\openout4 = `X1-ComputationalComplexity.vrb'.
1265
1266 (./X1-ComputationalComplexity.vrb)
1267File: img/unilu.jpg Graphic file (type jpg)
1268<use img/unilu.jpg>
1269Package pdftex.def Info: img/unilu.jpg used on input line 305.
1270(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1271 [22
1272
1273]
1274File: img/unilu.jpg Graphic file (type jpg)
1275<use img/unilu.jpg>
1276Package pdftex.def Info: img/unilu.jpg used on input line 363.
1277(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1278 [23
1279
1280]
1281File: img/unilu.jpg Graphic file (type jpg)
1282<use img/unilu.jpg>
1283Package pdftex.def Info: img/unilu.jpg used on input line 363.
1284(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1285
1286[24
1287
1288]
1289File: img/unilu.jpg Graphic file (type jpg)
1290<use img/unilu.jpg>
1291Package pdftex.def Info: img/unilu.jpg used on input line 363.
1292(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1293 [25
1294
1295]
1296File: img/unilu.jpg Graphic file (type jpg)
1297<use img/unilu.jpg>
1298Package pdftex.def Info: img/unilu.jpg used on input line 363.
1299(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1300 [26
1301
1302]
1303File: img/unilu.jpg Graphic file (type jpg)
1304<use img/unilu.jpg>
1305Package pdftex.def Info: img/unilu.jpg used on input line 419.
1306(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1307 [27
1308
1309]
1310File: img/unilu.jpg Graphic file (type jpg)
1311<use img/unilu.jpg>
1312Package pdftex.def Info: img/unilu.jpg used on input line 419.
1313(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1314 [28
1315
1316]
1317File: img/unilu.jpg Graphic file (type jpg)
1318<use img/unilu.jpg>
1319Package pdftex.def Info: img/unilu.jpg used on input line 419.
1320(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1321 [29
1322
1323]
1324File: img/unilu.jpg Graphic file (type jpg)
1325<use img/unilu.jpg>
1326Package pdftex.def Info: img/unilu.jpg used on input line 419.
1327(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1328 [30
1329
1330]
1331File: img/unilu.jpg Graphic file (type jpg)
1332<use img/unilu.jpg>
1333Package pdftex.def Info: img/unilu.jpg used on input line 427.
1334(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1335 [31
1336
1337]
1338\openout4 = `X1-ComputationalComplexity.vrb'.
1339
1340 (./X1-ComputationalComplexity.vrb)
1341File: img/unilu.jpg Graphic file (type jpg)
1342<use img/unilu.jpg>
1343Package pdftex.def Info: img/unilu.jpg used on input line 443.
1344(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1345
1346[32
1347
1348]
1349File: img/unilu.jpg Graphic file (type jpg)
1350<use img/unilu.jpg>
1351Package pdftex.def Info: img/unilu.jpg used on input line 456.
1352(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1353 [33
1354
1355]
1356\openout4 = `X1-ComputationalComplexity.vrb'.
1357
1358 (./X1-ComputationalComplexity.vrb
1359
1360LaTeX Font Warning: Font shape `OML/cmss/m/it' undefined
1361(Font) using `OML/cmm/m/it' instead
1362(Font) for symbol `textgreater' on input line 3.
1363
1364)
1365File: img/unilu.jpg Graphic file (type jpg)
1366<use img/unilu.jpg>
1367Package pdftex.def Info: img/unilu.jpg used on input line 469.
1368(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1369 [34
1370
1371]
1372File: img/unilu.jpg Graphic file (type jpg)
1373<use img/unilu.jpg>
1374Package pdftex.def Info: img/unilu.jpg used on input line 478.
1375(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1376 [35
1377
1378]
1379\openout4 = `X1-ComputationalComplexity.vrb'.
1380
1381 (./X1-ComputationalComplexity.vrb)
1382File: img/unilu.jpg Graphic file (type jpg)
1383<use img/unilu.jpg>
1384Package pdftex.def Info: img/unilu.jpg used on input line 507.
1385(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1386 [36
1387
1388]
1389File: img/unilu.jpg Graphic file (type jpg)
1390<use img/unilu.jpg>
1391Package pdftex.def Info: img/unilu.jpg used on input line 516.
1392(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1393 [37
1394
1395]
1396\openout4 = `X1-ComputationalComplexity.vrb'.
1397
1398
1399(./X1-ComputationalComplexity.vrb)
1400File: img/unilu.jpg Graphic file (type jpg)
1401<use img/unilu.jpg>
1402Package pdftex.def Info: img/unilu.jpg used on input line 538.
1403(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1404 [38
1405
1406]
1407\openout4 = `X1-ComputationalComplexity.vrb'.
1408
1409 (./X1-ComputationalComplexity.vrb)
1410File: img/unilu.jpg Graphic file (type jpg)
1411<use img/unilu.jpg>
1412Package pdftex.def Info: img/unilu.jpg used on input line 551.
1413(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1414
1415[39
1416
1417]
1418File: img/unilu.jpg Graphic file (type jpg)
1419<use img/unilu.jpg>
1420Package pdftex.def Info: img/unilu.jpg used on input line 560.
1421(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1422 [40
1423
1424]
1425\openout4 = `X1-ComputationalComplexity.vrb'.
1426
1427 (./X1-ComputationalComplexity.vrb)
1428File: img/unilu.jpg Graphic file (type jpg)
1429<use img/unilu.jpg>
1430Package pdftex.def Info: img/unilu.jpg used on input line 577.
1431(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1432 [41
1433
1434]
1435\openout4 = `X1-ComputationalComplexity.vrb'.
1436
1437
1438(./X1-ComputationalComplexity.vrb)
1439File: img/unilu.jpg Graphic file (type jpg)
1440<use img/unilu.jpg>
1441Package pdftex.def Info: img/unilu.jpg used on input line 589.
1442(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1443 [42
1444
1445]
1446File: img/unilu.jpg Graphic file (type jpg)
1447<use img/unilu.jpg>
1448Package pdftex.def Info: img/unilu.jpg used on input line 597.
1449(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1450 [43
1451
1452]
1453File: img/unilu.jpg Graphic file (type jpg)
1454<use img/unilu.jpg>
1455Package pdftex.def Info: img/unilu.jpg used on input line 606.
1456(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1457 [44
1458
1459]
1460\tf@nav=\write6
1461\openout6 = `X1-ComputationalComplexity.nav'.
1462
1463\tf@toc=\write7
1464\openout7 = `X1-ComputationalComplexity.toc'.
1465
1466\tf@snm=\write8
1467\openout8 = `X1-ComputationalComplexity.snm'.
1468
1469Package atveryend Info: Empty hook `BeforeClearDocument' on input line 608.
1470Package atveryend Info: Empty hook `AfterLastShipout' on input line 608.
1471
1472(./X1-ComputationalComplexity.aux)
1473Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 608.
1474Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 608.
1475Package rerunfilecheck Info: File `X1-ComputationalComplexity.out' has not chan
1476ged.
1477(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0.
1478
1479
1480LaTeX Font Warning: Some font shapes were not available, defaults substituted.
1481
1482 )
1483Here is how much of TeX's memory you used:
1484 25931 strings out of 481239
1485 509927 string characters out of 5920377
1486 935890 words of memory out of 5000000
1487 40483 multiletter control sequences out of 15000+600000
1488 549107 words of font info for 85 fonts, out of 8000000 for 9000
1489 1141 hyphenation exceptions out of 8191
1490 58i,31n,89p,810b,1569s stack positions out of 5000i,500n,10000p,200000b,80000s
1491 </home/sebastiano/.texlive2019/texmf-var/fonts/pk/ljfour/jknappen/ec/tcss090
14920.600pk></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pf
1493b></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></us
1494r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi9.pfb></usr/share
1495/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/texli
1496ve/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texlive/tex
1497mf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/texmf-dist
1498/fonts/type1/public/amsfonts/cm/cmss9.pfb></usr/share/texlive/texmf-dist/fonts/
1499type1/public/amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-dist/fonts/type
15001/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/fonts/type1/pub
1501lic/amsfonts/cm/cmssi8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/am
1502sfonts/cm/cmssi9.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts
1503/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cm
1504sy8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy9.pfb
1505></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb></usr
1506/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt8.pfb>
1507Output written on X1-ComputationalComplexity.pdf (44 pages, 1769406 bytes).
1508PDF statistics:
1509 1306 PDF objects out of 1440 (max. 8388607)
1510 1204 compressed objects within 13 object streams
1511 89 named destinations out of 1000 (max. 500000)
1512 121 words of extra memory for PDF output out of 10000 (max. 10000000)
1513
diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.nav b/src/Lecture7/slides/X1-ComputationalComplexity.nav
new file mode 100644
index 0000000..d21fe16
--- /dev/null
+++ b/src/Lecture7/slides/X1-ComputationalComplexity.nav
@@ -0,0 +1,81 @@
1\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
2\headcommand {\beamer@framepages {1}{1}}
3\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}
4\headcommand {\beamer@framepages {2}{2}}
5\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}
6\headcommand {\beamer@framepages {3}{3}}
7\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}
8\headcommand {\beamer@framepages {4}{4}}
9\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}
10\headcommand {\beamer@framepages {5}{5}}
11\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}
12\headcommand {\beamer@framepages {6}{6}}
13\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}
14\headcommand {\beamer@framepages {7}{7}}
15\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}
16\headcommand {\beamer@framepages {8}{8}}
17\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}
18\headcommand {\beamer@framepages {9}{9}}
19\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}
20\headcommand {\beamer@framepages {10}{10}}
21\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}
22\headcommand {\beamer@framepages {11}{11}}
23\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}
24\headcommand {\beamer@framepages {12}{12}}
25\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}
26\headcommand {\beamer@framepages {13}{13}}
27\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}
28\headcommand {\beamer@framepages {14}{14}}
29\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}
30\headcommand {\beamer@framepages {15}{15}}
31\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}
32\headcommand {\beamer@framepages {16}{16}}
33\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}
34\headcommand {\beamer@framepages {17}{17}}
35\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}
36\headcommand {\beamer@framepages {18}{18}}
37\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}
38\headcommand {\beamer@framepages {19}{19}}
39\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}
40\headcommand {\beamer@framepages {20}{20}}
41\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}
42\headcommand {\beamer@framepages {21}{21}}
43\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}
44\headcommand {\beamer@framepages {22}{22}}
45\headcommand {\slideentry {0}{0}{23}{23/26}{}{0}}
46\headcommand {\beamer@framepages {23}{26}}
47\headcommand {\slideentry {0}{0}{24}{27/30}{}{0}}
48\headcommand {\beamer@framepages {27}{30}}
49\headcommand {\slideentry {0}{0}{25}{31/31}{}{0}}
50\headcommand {\beamer@framepages {31}{31}}
51\headcommand {\slideentry {0}{0}{26}{32/32}{}{0}}
52\headcommand {\beamer@framepages {32}{32}}
53\headcommand {\slideentry {0}{0}{27}{33/33}{}{0}}
54\headcommand {\beamer@framepages {33}{33}}
55\headcommand {\slideentry {0}{0}{28}{34/34}{}{0}}
56\headcommand {\beamer@framepages {34}{34}}
57\headcommand {\slideentry {0}{0}{29}{35/35}{}{0}}
58\headcommand {\beamer@framepages {35}{35}}
59\headcommand {\slideentry {0}{0}{30}{36/36}{}{0}}
60\headcommand {\beamer@framepages {36}{36}}
61\headcommand {\slideentry {0}{0}{31}{37/37}{}{0}}
62\headcommand {\beamer@framepages {37}{37}}
63\headcommand {\slideentry {0}{0}{32}{38/38}{}{0}}
64\headcommand {\beamer@framepages {38}{38}}
65\headcommand {\slideentry {0}{0}{33}{39/39}{}{0}}
66\headcommand {\beamer@framepages {39}{39}}
67\headcommand {\slideentry {0}{0}{34}{40/40}{}{0}}
68\headcommand {\beamer@framepages {40}{40}}
69\headcommand {\slideentry {0}{0}{35}{41/41}{}{0}}
70\headcommand {\beamer@framepages {41}{41}}
71\headcommand {\slideentry {0}{0}{36}{42/42}{}{0}}
72\headcommand {\beamer@framepages {42}{42}}
73\headcommand {\slideentry {0}{0}{37}{43/43}{}{0}}
74\headcommand {\beamer@framepages {43}{43}}
75\headcommand {\slideentry {0}{0}{38}{44/44}{}{0}}
76\headcommand {\beamer@framepages {44}{44}}
77\headcommand {\beamer@partpages {1}{44}}
78\headcommand {\beamer@subsectionpages {1}{44}}
79\headcommand {\beamer@sectionpages {1}{44}}
80\headcommand {\beamer@documentpages {44}}
81\headcommand {\gdef \inserttotalframenumber {38}}
diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.out b/src/Lecture7/slides/X1-ComputationalComplexity.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture7/slides/X1-ComputationalComplexity.out
diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.pdf b/src/Lecture7/slides/X1-ComputationalComplexity.pdf
new file mode 100644
index 0000000..fe67ff6
--- /dev/null
+++ b/src/Lecture7/slides/X1-ComputationalComplexity.pdf
Binary files differ
diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.snm b/src/Lecture7/slides/X1-ComputationalComplexity.snm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture7/slides/X1-ComputationalComplexity.snm
diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.tex b/src/Lecture7/slides/X1-ComputationalComplexity.tex
new file mode 100644
index 0000000..c7e1602
--- /dev/null
+++ b/src/Lecture7/slides/X1-ComputationalComplexity.tex
@@ -0,0 +1,608 @@
1\documentclass[11pt]{beamer}
2\usetheme{Madrid}
3\usepackage[utf8]{inputenc}
4\usepackage{amsmath}
5
6\usepackage{color}
7\usepackage{listings}
8\usepackage{mathtools}
9\usepackage{tikz-cd}
10\usepackage{adjustbox}
11
12\definecolor{myblue}{rgb}{0,0,0.5}
13\lstset{
14 language=Python,
15 tabsize=4,
16 basicstyle=\footnotesize,
17 keywordstyle=\bf\color{myblue},
18 commentstyle=\it\color{gray},
19 numbers=left,
20 numbersep=3pt,
21 numberstyle=\tiny\color{gray},
22}
23
24\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto}
25\title[Computational Complexity]%
26{Why is my code slow?}
27\logo{\includegraphics[scale=0.1]{img/unilu.jpg}}
28%\institute{University of Luxembourg}
29
30\date{2021-05-21}
31
32\begin{document}
33
34\begin{frame}
35 \titlepage
36\end{frame}
37
38\begin{frame}{Computational Complexity}
39 \begin{itemize}
40 \item \textbf{Goal:}
41 estimate the running {\color{blue}time} of a program
42 \item \textbf{How:}
43 count the {\color{blue}basic steps} that an
44 {\color{blue}algorithm} takes to complete
45 \item \textbf{Why}:
46 find the \emph{bottleneck} of your program, make it faster
47 \end{itemize}
48
49 \vspace{0.5cm}
50 Our analysis should not depend on the hardware
51\end{frame}
52
53\begin{frame}{Algorithm}
54 \begin{definition}
55 \emph{An algorithm is a sequence of {\color{blue}steps} needed to
56 solve a {\color{blue}class of problems}. }
57 \end{definition}
58
59 \begin{definition}[alternative]
60 \emph{An algorithm is a sequence of steps that takes
61 an input satisfying certain conditions and produces an output
62 satisfying other conditions.}
63 \end{definition}
64\end{frame}
65
66\begin{frame}{Sorting a list}
67 \begin{block}{Class of problems}
68 Sort a list $L$ of numbers in increasing order.
69 \end{block}
70
71 \begin{block}{Algorithm}
72 \begin{enumerate}
73 \item Let $S$ be an empty list.
74 \item Take an element from $L$ an insert it in $S$ in its correct
75 position.
76 \item Repeat step $2$ until $L$ is empty.
77 \item Return $S$.
78 \end{enumerate}
79 \end{block}
80\end{frame}
81
82\begin{frame}{Sorting a list}
83\begin{itemize}
84 \item It solves a \emph{class} of problems: works for any list
85 \item The specific steps to sort the list $[3,7,1]$ are not an algorithm
86 \item Input conditions: must be a list of numbers
87 \item Output conditions: same numbers in increasing order
88\end{itemize}
89\end{frame}
90
91\begin{frame}{How to write an algorithm}
92 \begin{itemize}
93 \item \textbf{Human language}:
94 \begin{itemize}
95 \item Easy to understand
96 \item Not precise
97 \end{itemize}
98
99 \vspace{0.3cm}
100 \item \textbf{Computer code}:
101 \begin{itemize}
102 \item Can be executed by computers
103 \item Precise
104 \item From very low level (machine code) to high level
105 (Python, \dots)
106 \end{itemize}
107 \end{itemize}
108
109 %\vspace{0.5cm}
110 %To what \emph{level of detail}?
111\end{frame}
112
113\begin{frame}{Basic steps}
114 \begin{itemize}
115 %\item Strictly speaking, only CPU instructions are \emph{basic}
116 %\item In practice:%, we consider basic:
117 % \begin{itemize}
118 \item Arithmetic operations $+,-,*,//,\%$
119 \item Relational operations $==, !=, >, <,\dots$
120 \item Memory access (read/write variable)
121 % \end{itemize}
122 \end{itemize}
123
124 \vspace{0.5cm}
125 \textbf{Warning:}
126 Depends on data type (integer, floating point, string,\dots)
127 %\begin{itemize}
128 % \item Depends on data type (integer, floating point, string,\dots)
129 % \item There are non-basic instructions such as \texttt{sort()}
130 %\end{itemize}
131\end{frame}
132
133\begin{frame}{Running time}
134 \begin{itemize}
135 \item Depends on computer power, programming language, compiler\dots
136 %\item Not all basic steps are equal
137 \item ``Big O'' notation: an algorithm runs in time $O(f(n))$ if, when
138 run with input of size $n$, it takes about $c\cdot f(n)$ steps
139 \item Algorithm A is \emph{asymptotically faster} than algorithm B if
140 it is faster \textbf{for $n$ large enough}
141 \item Rule of thumb: $10^7\sim10^9$ basic steps per second
142 \end{itemize}
143\end{frame}
144
145\begin{frame}{Asymptotical analysis vs constant factors}
146 \includegraphics[scale=0.7]{img/plot1.png}
147\end{frame}
148
149\begin{frame}{Asymptotical analysis vs constant factors}
150 \includegraphics[scale=0.7]{img/plot2.png}
151\end{frame}
152
153\begin{frame}{Asymptotical analysis vs constant factors}
154 \includegraphics[scale=0.7]{img/plot3.png}
155\end{frame}
156
157\begin{frame}{Asymptotical analysis vs constant factors}
158 \includegraphics[scale=0.7]{img/plot4.png}
159\end{frame}
160
161\begin{frame}{Asymptotical analysis vs constant factors}
162 \includegraphics[scale=0.7]{img/plot5.png}
163\end{frame}
164
165%\begin{frame}{title}
166%graphs here, uncomment
167%\end{frame}
168
169\begin{frame}{Basic complexity analysis}
170
171 Easy things to do:
172
173 \vspace{0.3cm}
174 \begin{itemize}
175 \item Check documentation for ``non-basic steps''
176 \begin{itemize}
177 \item Example: check Sage's \href{https://doc.sagemath.org/html/en/reference/rings\_standard/sage/rings/integer.html\#sage.rings.integer.Integer.is\_prime}{\texttt{is\_prime()}} (redirects to PARI \href{https://pari.math.u-bordeaux.fr/dochtml/html/Arithmetic\_functions.html\#se:isprime}{\texttt{isprime()}})
178 \end{itemize}
179
180 \vspace{0.3cm}
181 \item Count nested loops
182 \begin{itemize}
183 \item How many times is a step repeated?
184 \end{itemize}
185 \end{itemize}
186\end{frame}
187
188{\setbeamertemplate{logo}{}
189\begin{frame}[fragile]{Nested loops - matrix sum and product}
190\begin{lstlisting}
191def add(A, B):
192 n = len(A)
193 S = [[0] * n for i in range(n)]
194 for i in range(0, n):
195 for j in range(0, n):
196 S[i][j] = A[i][j] + B[i][j]
197 return S
198\end{lstlisting}
199
200\vspace{0.5cm}
201\begin{lstlisting}
202def prod(A, B):
203 n = len(A)
204 S = [[0] * n for i in range(n)]
205 for i in range(0, n):
206 for j in range(0, n):
207 for k in range(0, n):
208 S[i][j] = S[i][j] + A[i][k]*B[k][j]
209 return S
210\end{lstlisting}
211\end{frame}
212}
213
214\begin{frame}{Nested loops - matrix sum and product}
215 \begin{itemize}
216 \item \texttt{add} is $O(n^2)$ (two loops)
217 \item \texttt{prod} is $O(n^3)$ (three loops)
218 \end{itemize}
219
220 \vspace{0.3cm}
221 \textbf{Fun fact:} there are faster algorithms for matrix multiplication,
222 for example \href{https://en.wikipedia.org/wiki/Strassen_algorithm}%
223 {Strassen's algorithm}.
224\end{frame}
225
226\begin{frame}[fragile]{Sorting a list}
227\begin{lstlisting}
228def correct_position(e, S):
229 for i in range(0, len(S)):
230 if S[i] > e:
231 return i
232 return len(S)
233
234def sort_list(L):
235 S = []
236 for e in L:
237 cp = correct_position(e, S)
238 S.insert(cp, e)
239 return S
240\end{lstlisting}
241\end{frame}
242
243\begin{frame}{Sorting a list}
244 \begin{itemize}
245 \item Complexity of \texttt{correct\_position()}:
246 \begin{itemize}
247 %\item best case $O(1)$
248 \item worst case $O($\texttt{len(S)}$)$
249 \item average $O($\texttt{len(S)}$)$
250 \end{itemize}
251
252 \vspace{0.3cm}
253 \item Complexity of \texttt{sort\_list} (here $n=$\texttt{len(L)}):
254 \begin{align*}
255 %\sum_{i=0}^{n-1} O(1) = O(n) && \text{best case}\\
256 \sum_{i=0}^{n-1} O(i) = O(n^2)% && \text{average/worst}
257 \end{align*}
258 (it calls \texttt{correct\_position()} $n$ times).
259 \end{itemize}
260\end{frame}
261
262\begin{frame}{Sorting a list}
263 \begin{itemize}
264 \item For which lists does the ``best case'' happen?
265 \item For which lists does the ``worst case'' happen?
266 \item How large can $n$ be for \texttt{sort\_list()} to run
267 in under a second?
268 \end{itemize}
269\end{frame}
270
271\begin{frame}{Sorting a list}
272 How to improve our code?
273 \begin{itemize}
274 \item Improve \texttt{correct\_position()}
275 \item Take advantage of the fact that $S$ is always sorted
276 \end{itemize}
277\end{frame}
278
279\begin{frame}{Binary search}
280 \begin{block}{Algorithm}
281 \textbf{Input:} a \emph{sorted} list $S$ and a value $e$.
282 \begin{enumerate}
283 \item If the list is empty, you have found the position of $e$
284 \item Otherwise, compare $e$ to the middle element $m$ of $S$
285 \begin{itemize}
286 \item If $e<m$, repeat from (1) on the first half of $S$
287 \item Otherwise, repeat from (1) on the second half of $S$
288 \end{itemize}
289 \end{enumerate}
290 \end{block}
291\end{frame}
292
293\begin{frame}[fragile]{Binary search}
294\begin{lstlisting}
295# Return position of e in L
296def binary_search(e, S, start, end):
297 if start == end:
298 return start
299 midpoint = (end+start)//2
300 if e < S[midpoint]:
301 return binary_search(e, S, start, midpoint)
302 else:
303 return binary_search(e, S, midpoint+1, end)
304\end{lstlisting}
305\end{frame}
306
307\begin{frame}{Binary search - example 1}
308 Searching for \texttt{e}$=2$:
309 \begin{align*}
310 \only<1>{
311 \underbrace{
312 \overset{{\color{blue}
313 \substack{\mathclap{\texttt{start}=0}\\\downarrow}}}{-2}
314 \quad 0\quad 1\quad 3\quad
315 \overset{\substack{\mathclap{\texttt{midpoint}=4}\\\downarrow}}{5}
316 \quad 6\quad 7\quad 9\quad 12
317 }\quad
318 \overset{{\color{red}
319 \substack{\mathclap{\texttt{end}=9}\\\downarrow}}}{\phantom{0}}
320 }
321 \only<2>{
322 \underbrace{
323 \overset{{\color{blue}
324 \substack{\mathclap{\texttt{start}=0}\\\downarrow}}}{-2}
325 \quad 0\quad
326 \overset{\substack{\mathclap{\texttt{midpoint}=2}\\\\\downarrow}}%
327 {1}
328 \quad 3
329 }\quad
330 \overset{{\color{red}
331 \substack{\mathclap{\texttt{end}=4}\\\downarrow}}}{5}
332 \quad 6\quad 7\quad 9\quad 12\quad \phantom{0}
333 }
334 \only<3>{
335 -2\quad 0\quad 1\quad
336 \underbrace{
337 \overset{
338 \substack{
339 \mathclap{
340 {\color{blue}\texttt{start}}=\texttt{midpoint}=3}\\\\
341 {\color{blue}\downarrow}
342 }
343 }{3}
344 } \quad
345 \overset{{\color{red}
346 \substack{\mathclap{\texttt{end}=4}\\\downarrow}}}{5}
347 \quad 6\quad 7\quad 9\quad 12\quad \phantom{0}
348 }
349 \only<4>{
350 -2\quad 0\quad 1\quad
351 \overset{
352 \substack{
353 \mathclap{
354 {\color{blue}\texttt{start}}=
355 {\color{red}\texttt{end}}=3}\\\downarrow}}{3}
356 \quad 5 \quad 6\quad 7\quad 9\quad 12\quad \phantom{0}
357 }
358 \end{align*}
359 \only<1>{{\color{blue}$e<5$}$\implies$ check left half}
360 \only<2>{{\color{red}$e>1$}$\implies$ check right half}
361 \only<3>{{\color{blue}$e<3$}$\implies$ check left half}
362 \only<4>{\texttt{start}=\texttt{end}, done}
363\end{frame}
364
365\begin{frame}{Binary search - example 2}
366 Searching for \texttt{e}$=11$:
367 \begin{align*}
368 \only<1>{
369 \underbrace{
370 \overset{{\color{blue}
371 \substack{\mathclap{\texttt{start}=0}\\\downarrow}}}{-2}
372 \quad 0\quad 1\quad 3\quad
373 \overset{\substack{\mathclap{\texttt{midpoint}=4}\\\downarrow}}{5}
374 \quad 6\quad 7\quad 9\quad 12
375 }\quad
376 \overset{{\color{red}
377 \substack{\mathclap{\texttt{end}=9}\\\downarrow}}}{\phantom{0}}
378 }
379 \only<2>{
380 -2 \quad 0\quad 1 \quad 3 \quad 5 \quad
381 \underbrace{
382 \overset{{\color{blue}
383 \substack{\mathclap{\texttt{start}=5}\\\downarrow}}}{6}
384 \quad 7 \quad
385 \overset{\substack{\mathclap{\texttt{midpoint}=7}\\\\\downarrow}}%
386 {9}
387 \quad 12
388 }\quad
389 \overset{{\color{red}
390 \substack{\mathclap{\texttt{end}=9}\\\downarrow}}}{\phantom{0}}
391 }
392 \only<3>{
393 -2\quad 0\quad 1\quad 3\quad 5\quad 6\quad 7\quad 9\quad
394 \underbrace{
395 \overset{
396 \substack{
397 \mathclap{
398 {\color{blue}\texttt{start}}=\texttt{midpoint}=8}\\\\
399 {\color{blue}\downarrow}
400 }
401 }{12}
402 } \quad
403 \overset{{\color{red}
404 \substack{\mathclap{\texttt{end}=9}\\\downarrow}}}{\phantom{0}}
405 }
406 \only<4>{
407 -2\quad 0\quad 1\quad 3\quad 5\quad 6\quad 7\quad 9\quad
408 \overset{
409 \substack{
410 \mathclap{
411 {\color{blue}\texttt{start}}=
412 {\color{red}\texttt{end}}=8}\\\downarrow}}{12}
413 }
414 \end{align*}
415 \only<1>{{\color{red}$e>5$}$\implies$ check right half}
416 \only<2>{{\color{red}$e>9$}$\implies$ check right half}
417 \only<3>{{\color{blue}$e<11$}$\implies$ check left half}
418 \only<4>{\texttt{start}=\texttt{end}, done}
419\end{frame}
420
421\begin{frame}{Binary search}
422 \begin{itemize}
423 \item Works only if the list is sorted
424 \item Complexity $O(\log_2(n))$: at every step we cut the list in half
425 \item Recursive, \emph{divide et impera}
426 \end{itemize}
427\end{frame}
428
429\begin{frame}[fragile]{Sorting a list - binary search version}
430\begin{lstlisting}
431def sort_list(L):
432 S = []
433 for e in L:
434 cp = binary_search(e, S, 0, len(S)) # This changed
435 S.insert(cp, e)
436 return S
437\end{lstlisting}
438 \vspace{0.3cm}
439 \begin{itemize}
440 \item Complexity: \[\sum_{i=0}^{n-1} O(\log_2(i)) = O(n\log_2(n))\]\\
441 (it calls \texttt{binary\_search} $n$ times).
442 \end{itemize}
443\end{frame}
444
445\begin{frame}{Fast exponentiation}
446 \begin{block}{Algorithm / formula}
447 \begin{align*}
448 a^n=
449 \begin{cases}
450 1 & \text{if }n=0,\\
451 (a\cdot a)^{\frac n2} & \text{if $n$ is even},\\
452 a\cdot a^{n-1} & \text{if $n$ is odd.}
453 \end{cases}
454 \end{align*}
455 \end{block}
456\end{frame}
457
458\begin{frame}[fragile]{Fast exponentiation}
459\begin{lstlisting}
460# Compute a^n (n>=0 integer)
461def power(a, n):
462 if n == 0:
463 return 1
464 if n % 2 == 0: # n is even
465 return power(a*a, n//2)
466 else: # n is odd
467 return a*power(a, n-1)
468\end{lstlisting}
469\end{frame}
470
471\begin{frame}{Fast exponentiation}
472
473 \begin{itemize}
474 \item Complexity: $O(\log_2(n))$ (after $2$ steps, $n$ is halved)
475 \item Python's operator $**$ does something similar
476 \item Naive algorithm (one loop): $O(n)$
477 \end{itemize}
478\end{frame}
479
480
481\begin{frame}[fragile]{Fast $\gcd$}
482 \begin{block}{Algorithm / formula}
483 \begin{align*}
484 \gcd(a,b) =
485 \begin{cases}
486 a & \text{if }b=0,\\
487 \gcd(b,a\bmod b) & \text{otherwise.}
488 \end{cases}
489 \end{align*}
490 \end{block}
491
492\begin{columns}
493\column{0.5\textwidth}
494\begin{lstlisting}
495def gcd(a, b):
496 if b == 0:
497 return a
498 else:
499 return gcd(b, a%b)
500\end{lstlisting}
501
502\column{0.5\textwidth}
503\begin{itemize}
504 \item After $2$ steps, $a$ is halved $\implies$ complexity $O(\log_2(a))$
505\end{itemize}
506\end{columns}
507\end{frame}
508
509\begin{frame}{Recursion}
510 \begin{itemize}
511 \item These examples use \emph{recursion}
512 (a function that calls itself)
513 \item If it calls itself more than once, it is slow
514 (\emph{exponential} complexity!)
515 \end{itemize}
516\end{frame}
517
518\begin{frame}[fragile]{Fibonacci numbers}
519
520 \begin{block}{Algorithm / formula}
521 \begin{align*}
522 F(n) =
523 \begin{cases}
524 n & \text{if }n\leq1,\\
525 F(n-1)+F(n-2) & \text{otherwise.}
526 \end{cases}
527 \end{align*}
528 \end{block}
529
530\vspace{0.5cm}
531\begin{lstlisting}
532def F(n):
533 if n <= 1:
534 return n
535 else:
536 return F(n-1) + F(n-2)
537\end{lstlisting}
538\end{frame}
539
540\begin{frame}[fragile]{Fibonacci}
541 \begin{adjustbox}{scale={0.85}{0.9},center}
542 \begin{tikzcd}[column sep=1mm]
543 & & & & & & & & F(5) \ar[drrr] \ar[dlll]\\
544 & & & & & F(4)\ar[dll]\ar[dr] & & & & & & F(3) \ar[dl] \ar[dr]\\
545 & & & F(3) \ar[dl]\ar[dr] & & & F(2) \ar[dr]\ar[dl]
546 & & & & F(2) \ar[dl]\ar[dr] & & F(1) \\
547 & & F(2) \ar[dl]\ar[dr] & & F(1) & F(1) & & F(0) & & F(1) & & F(0)\\
548 & F(1) & & F(0)
549 \end{tikzcd}
550 \end{adjustbox}
551\end{frame}
552
553\begin{frame}{Fibonacci}
554 \begin{itemize}
555 \item Complexity: almost $O(2^n)$ (actually $O(\varphi^n)$
556 with $\varphi=\frac{1+\sqrt 5}{2}\sim 1.6$)
557 \item But some values are computed many times!
558 \item Optimization: memorize previously computed values
559 \end{itemize}
560\end{frame}
561
562\begin{frame}[fragile]{Fibonacci with memorization}
563\begin{lstlisting}
564# List with memorized values, N is the largest possible
565N = 10**6
566F_memorized = [-1] * N
567
568def F(n):
569 if F_memorized[n] == -1:
570 if n <= 1:
571 F_memorized[n] = n
572 else:
573 F_memorized[n] = F(n-1) + F(n-2)
574
575 return F_memorized[n]
576\end{lstlisting}
577\end{frame}
578
579\begin{frame}[fragile]{Fibonacci with memorization}
580 \begin{adjustbox}{scale={0.85}{0.9},center}
581 \begin{tikzcd}[column sep=1mm]
582 & & & & & & & & F(5) \ar[drrr] \ar[dlll]\\
583 & & & & & F(4)\ar[dll]\ar[dr] & & & & & & {\color{blue}F(3)}\\
584 & & & F(3) \ar[dl]\ar[dr] & & & {\color{blue}F(2)}\\
585 & & F(2) \ar[dl]\ar[dr] & & {\color{blue}F(1)} \\
586 & F(1) & & F(0)
587 \end{tikzcd}
588 \end{adjustbox}
589\end{frame}
590
591\begin{frame}{Fibonacci with memorization}
592 \begin{itemize}
593 \item Complexity: $O(n)$, huge improvement!
594 \item Further improvement (but still $O(n)$): dynamic programming
595 \item Pay attention to memory usage
596 \end{itemize}
597\end{frame}
598
599\begin{frame}{References}
600 \begin{itemize}
601 \item Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and
602 Clifford Stein -
603 \href{https://en.wikipedia.org/wiki/Introduction\_to\_Algorithms}%
604 {\emph{Introductions to Algorithms}}
605 \end{itemize}
606\end{frame}
607
608\end{document}
diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.toc b/src/Lecture7/slides/X1-ComputationalComplexity.toc
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture7/slides/X1-ComputationalComplexity.toc
diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.vrb b/src/Lecture7/slides/X1-ComputationalComplexity.vrb
new file mode 100644
index 0000000..57dfae6
--- /dev/null
+++ b/src/Lecture7/slides/X1-ComputationalComplexity.vrb
@@ -0,0 +1,10 @@
1\frametitle{Fibonacci with memorization}
2\begin{adjustbox}{scale={0.85}{0.9},center}
3 \begin{tikzcd}[column sep=1mm]
4 & & & & & & & & F(5) \ar[drrr] \ar[dlll]\\
5 & & & & & F(4)\ar[dll]\ar[dr] & & & & & & {\color{blue}F(3)}\\
6 & & & F(3) \ar[dl]\ar[dr] & & & {\color{blue}F(2)}\\
7 & & F(2) \ar[dl]\ar[dr] & & {\color{blue}F(1)} \\
8 & F(1) & & F(0)
9 \end{tikzcd}
10 \end{adjustbox}
diff --git a/src/Lecture7/slides/X2-StudentsRequests.aux b/src/Lecture7/slides/X2-StudentsRequests.aux
new file mode 100644
index 0000000..65a5da5
--- /dev/null
+++ b/src/Lecture7/slides/X2-StudentsRequests.aux
@@ -0,0 +1,67 @@
1\relax
2\providecommand\hyper@newdestlabel[2]{}
3\providecommand{\transparent@use}[1]{}
4\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
5\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
6\global\let\oldcontentsline\contentsline
7\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
8\global\let\oldnewlabel\newlabel
9\gdef\newlabel#1#2{\newlabelxx{#1}#2}
10\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
11\AtEndDocument{\ifx\hyper@anchor\@undefined
12\let\contentsline\oldcontentsline
13\let\newlabel\oldnewlabel
14\fi}
15\fi}
16\global\let\hyper@last\relax
17\gdef\HyperFirstAtBeginDocument#1{#1}
18\providecommand\HyField@AuxAddToFields[1]{}
19\providecommand\HyField@AuxAddToCoFields[2]{}
20\providecommand \oddpage@label [2]{}
21\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
22\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
23\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}}
24\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}}
25\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}}
26\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}}
27\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}}
28\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}}
29\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}}
30\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}}
31\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}}
32\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}}
33\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}}
34\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}}
35\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}}
36\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}}
37\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}}
38\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}}
39\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}}
40\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}}
41\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}}
42\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}}
43\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}}
44\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}}
45\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}}
46\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}}
47\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}}
48\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}}
49\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}}
50\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}}
51\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}}
52\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}}
53\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}}
54\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}}
55\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}}
56\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}}
57\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}}
58\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}}
59\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}}
60\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}}
61\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}}
62\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}}
63\@writefile{nav}{\headcommand {\beamer@partpages {1}{21}}}
64\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{21}}}
65\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{21}}}
66\@writefile{nav}{\headcommand {\beamer@documentpages {21}}}
67\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {21}}}
diff --git a/src/Lecture7/slides/X2-StudentsRequests.log b/src/Lecture7/slides/X2-StudentsRequests.log
new file mode 100644
index 0000000..3af479e
--- /dev/null
+++ b/src/Lecture7/slides/X2-StudentsRequests.log
@@ -0,0 +1,1307 @@
1This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2021.5.20) 25 MAY 2021 16:22
2entering extended mode
3 \write18 enabled.
4 %&-line parsing enabled.
5**X2-StudentsRequests.tex
6(./X2-StudentsRequests.tex
7LaTeX2e <2020-02-02> patch level 2
8L3 programming layer <2020-02-14>
9(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
10Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations
11(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
12(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
13Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW)
14\etb@tempcnta=\count167
15)
16\beamer@tempbox=\box45
17\beamer@tempcount=\count168
18\c@beamerpauses=\count169
19
20(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
21\beamer@slideinframe=\count170
22\beamer@minimum=\count171
23\beamer@decode@box=\box46
24)
25\beamer@commentbox=\box47
26\beamer@modecount=\count172
27)
28(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
29Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead.
30
31(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
32Package: iftex 2019/11/07 v1.0c TeX engine tests
33))
34\headdp=\dimen134
35\footheight=\dimen135
36\sidebarheight=\dimen136
37\beamer@tempdim=\dimen137
38\beamer@finalheight=\dimen138
39\beamer@animht=\dimen139
40\beamer@animdp=\dimen140
41\beamer@animwd=\dimen141
42\beamer@leftmargin=\dimen142
43\beamer@rightmargin=\dimen143
44\beamer@leftsidebar=\dimen144
45\beamer@rightsidebar=\dimen145
46\beamer@boxsize=\dimen146
47\beamer@vboxoffset=\dimen147
48\beamer@descdefault=\dimen148
49\beamer@descriptionwidth=\dimen149
50\beamer@lastskip=\skip47
51\beamer@areabox=\box48
52\beamer@animcurrent=\box49
53\beamer@animshowbox=\box50
54\beamer@sectionbox=\box51
55\beamer@logobox=\box52
56\beamer@linebox=\box53
57\beamer@sectioncount=\count173
58\beamer@subsubsectionmax=\count174
59\beamer@subsectionmax=\count175
60\beamer@sectionmax=\count176
61\beamer@totalheads=\count177
62\beamer@headcounter=\count178
63\beamer@partstartpage=\count179
64\beamer@sectionstartpage=\count180
65\beamer@subsectionstartpage=\count181
66\beamer@animationtempa=\count182
67\beamer@animationtempb=\count183
68\beamer@xpos=\count184
69\beamer@ypos=\count185
70\beamer@ypos@offset=\count186
71\beamer@showpartnumber=\count187
72\beamer@currentsubsection=\count188
73\beamer@coveringdepth=\count189
74\beamer@sectionadjust=\count190
75\beamer@tocsectionnumber=\count191
76
77(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
78(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
79Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
80\KV@toks@=\toks14
81))
82\beamer@paperwidth=\skip48
83\beamer@paperheight=\skip49
84
85(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
86Package: geometry 2020/01/02 v5.9 Page Geometry
87
88(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
89Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead.
90)
91\Gm@cnth=\count192
92\Gm@cntv=\count193
93\c@Gm@tempcnt=\count194
94\Gm@bindingoffset=\dimen150
95\Gm@wd@mp=\dimen151
96\Gm@odd@mp=\dimen152
97\Gm@even@mp=\dimen153
98\Gm@layoutwidth=\dimen154
99\Gm@layoutheight=\dimen155
100\Gm@layouthoffset=\dimen156
101\Gm@layoutvoffset=\dimen157
102\Gm@dimlist=\toks15
103)
104(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
105File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option)
106)
107(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
108(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
109Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR)
110
111(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
112Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR)
113
114(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
115Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
116)
117(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
118File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration
119)
120Package graphics Info: Driver file: pdftex.def on input line 105.
121
122(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
123File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
124))
125\Gin@req@height=\dimen158
126\Gin@req@width=\dimen159
127)
128(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
129(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
130(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
131\pgfutil@everybye=\toks16
132\pgfutil@tempdima=\dimen160
133\pgfutil@tempdimb=\dimen161
134
135(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t
136ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
137\pgfutil@abb=\box54
138(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty
139Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS)
140))
141(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
142(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex)
143Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b)
144))
145(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
146Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b)
147
148(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
149\pgfkeys@pathtoks=\toks17
150\pgfkeys@temptoks=\toks18
151
152(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t
153ex
154\pgfkeys@tmptoks=\toks19
155))
156\pgf@x=\dimen162
157\pgf@y=\dimen163
158\pgf@xa=\dimen164
159\pgf@ya=\dimen165
160\pgf@xb=\dimen166
161\pgf@yb=\dimen167
162\pgf@xc=\dimen168
163\pgf@yc=\dimen169
164\pgf@xd=\dimen170
165\pgf@yd=\dimen171
166\w@pgf@writea=\write3
167\r@pgf@reada=\read2
168\c@pgf@counta=\count195
169\c@pgf@countb=\count196
170\c@pgf@countc=\count197
171\c@pgf@countd=\count198
172\t@pgf@toka=\toks20
173\t@pgf@tokb=\toks21
174\t@pgf@tokc=\toks22
175\pgf@sys@id@count=\count199
176 (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
177File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b)
178)
179Driver file for pgf: pgfsys-pdftex.def
180
181(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
182File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b)
183
184(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de
185f
186File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b)
187)))
188(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.
189tex
190File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b)
191\pgfsyssoftpath@smallbuffer@items=\count266
192\pgfsyssoftpath@bigbuffer@items=\count267
193)
194(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.
195tex
196File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b)
197)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
198Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
199
200(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
201File: color.cfg 2016/01/02 v1.6 sample color configuration
202)
203Package xcolor Info: Driver file: pdftex.def on input line 225.
204Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
205Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
206Package xcolor Info: Model `RGB' extended on input line 1364.
207Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
208Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
209Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
210Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
211Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
212Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
213)
214(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
215Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b)
216
217(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
218(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
219(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex)
220(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
221\pgfmath@dimen=\dimen172
222\pgfmath@count=\count268
223\pgfmath@box=\box55
224\pgfmath@toks=\toks23
225\pgfmath@stack@operand=\toks24
226\pgfmath@stack@operation=\toks25
227)
228(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
229(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code
230.tex)
231(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet
232ric.code.tex)
233(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod
234e.tex)
235(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison
236.code.tex)
237(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.
238tex)
239(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code
240.tex)
241(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.
242tex)
243(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari
244thmetics.code.tex)))
245(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
246\c@pgfmathroundto@lastzeros=\count269
247))
248(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex)
249(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te
250x
251File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b)
252\pgf@picminx=\dimen173
253\pgf@picmaxx=\dimen174
254\pgf@picminy=\dimen175
255\pgf@picmaxy=\dimen176
256\pgf@pathminx=\dimen177
257\pgf@pathmaxx=\dimen178
258\pgf@pathminy=\dimen179
259\pgf@pathmaxy=\dimen180
260\pgf@xx=\dimen181
261\pgf@xy=\dimen182
262\pgf@yx=\dimen183
263\pgf@yy=\dimen184
264\pgf@zx=\dimen185
265\pgf@zy=\dimen186
266)
267(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.
268code.tex
269File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b)
270\pgf@path@lastx=\dimen187
271\pgf@path@lasty=\dimen188
272)
273(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code
274.tex
275File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
276\pgf@shorten@end@additional=\dimen189
277\pgf@shorten@start@additional=\dimen190
278)
279(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te
280x
281File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
282\pgfpic=\box56
283\pgf@hbox=\box57
284\pgf@layerbox@main=\box58
285\pgf@picture@serial@count=\count270
286)
287(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c
288ode.tex
289File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b)
290\pgflinewidth=\dimen191
291)
292(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation
293s.code.tex
294File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b)
295\pgf@pt@x=\dimen192
296\pgf@pt@y=\dimen193
297\pgf@pt@temp=\dimen194
298)
299(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
300File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b)
301)
302(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t
303ex
304File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b)
305)
306(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing
307.code.tex
308File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b)
309)
310(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te
311x
312File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b)
313\pgfarrowsep=\dimen195
314)
315(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
316File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b)
317\pgf@max=\dimen196
318\pgf@sys@shading@range@num=\count271
319\pgf@shadingcount=\count272
320)
321(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
322File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b)
323
324(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.
325tex
326File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b)
327\pgfexternal@startupbox=\box59
328))
329(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te
330x
331File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
332)
333(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c
334ode.tex
335File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b)
336)
337(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.
338tex
339File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b)
340)
341(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
342File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b)
343))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
344Package: xxcolor 2003/10/24 ver 0.1
345\XC@nummixins=\count273
346\XC@countmixins=\count274
347)
348(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
349Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO)
350
351(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
352Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO)
353)
354(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
355Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO)
356))
357(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
358Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX
359
360(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty
361Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO
362)
363Package pdftexcmds Info: \pdf@primitive is available.
364Package pdftexcmds Info: \pdf@ifprimitive is available.
365Package pdftexcmds Info: \pdfdraftmode found.
366)
367(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
368Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO)
369)
370(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
371Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO)
372)
373(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
374Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO)
375)
376(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
377Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO)
378)
379(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
380Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO)
381)
382(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
383Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
384)
385(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
386Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO)
387)
388\@linkdim=\dimen197
389\Hy@linkcounter=\count275
390\Hy@pagecounter=\count276
391
392(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
393File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO)
394Now handling font encoding PD1 ...
395... no UTF-8 mapping file for font encoding PD1
396)
397(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
398Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
399)
400(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
401Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO)
402)
403\Hy@SavedSpaceFactor=\count277
404\pdfmajorversion=\count278
405Package hyperref Info: Option `bookmarks' set `true' on input line 4421.
406Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421.
407Package hyperref Info: Option `implicit' set `false' on input line 4421.
408Package hyperref Info: Hyper figures OFF on input line 4547.
409Package hyperref Info: Link nesting OFF on input line 4552.
410Package hyperref Info: Hyper index ON on input line 4555.
411Package hyperref Info: Plain pages OFF on input line 4562.
412Package hyperref Info: Backreferencing OFF on input line 4567.
413Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals.
414Package hyperref Info: Bookmarks ON on input line 4800.
415\c@Hy@tempcnt=\count279
416
417(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty
418\Urlmuskip=\muskip16
419Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
420)
421LaTeX Info: Redefining \url on input line 5159.
422\XeTeXLinkMargin=\dimen198
423
424(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
425Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
426
427(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
428Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO
429)
430))
431\Fld@menulength=\count280
432\Field@Width=\dimen199
433\Fld@charsize=\dimen256
434Package hyperref Info: Hyper figures OFF on input line 6430.
435Package hyperref Info: Link nesting OFF on input line 6435.
436Package hyperref Info: Hyper index ON on input line 6438.
437Package hyperref Info: backreferencing OFF on input line 6445.
438Package hyperref Info: Link coloring OFF on input line 6450.
439Package hyperref Info: Link coloring with OCG OFF on input line 6455.
440Package hyperref Info: PDF/A mode OFF on input line 6460.
441LaTeX Info: Redefining \ref on input line 6500.
442LaTeX Info: Redefining \pageref on input line 6504.
443\Hy@abspage=\count281
444
445
446Package hyperref Message: Stopped early.
447
448)
449Package hyperref Info: Driver (autodetected): hpdftex.
450 (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
451File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX
452
453(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
454Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO)
455)
456\Fld@listcount=\count282
457\c@bookmark@seq@number=\count283
458
459(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
460Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO)
461
462(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
463Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
464)
465Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
46686.
467))
468(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
469(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty)
470(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
471(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
472Package: amssymb 2013/01/14 v3.01 AMS font symbols
473
474(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
475Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
476\@emptytoks=\toks26
477\symAMSa=\mathgroup4
478\symAMSb=\mathgroup5
479LaTeX Font Info: Redeclaring math symbol \hbar on input line 98.
480LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
481(Font) U/euf/m/n --> U/euf/b/n on input line 106.
482))
483(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
484Package: sansmathaccent 2020/01/31
485
486(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
487Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files)
488)))
489(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
490(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
491Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX
492))
493(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty)
494(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty)
495(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
496\beamer@argscount=\count284
497\beamer@lastskipcover=\skip50
498\beamer@trivlistdepth=\count285
499)
500(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty)
501(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
502\c@lecture=\count286
503\c@part=\count287
504\c@section=\count288
505\c@subsection=\count289
506\c@subsubsection=\count290
507)
508(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
509\beamer@framebox=\box60
510\beamer@frametitlebox=\box61
511\beamer@zoombox=\box62
512\beamer@zoomcount=\count291
513\beamer@zoomframecount=\count292
514\beamer@frametextheight=\dimen257
515\c@subsectionslide=\count293
516\beamer@frametopskip=\skip51
517\beamer@framebottomskip=\skip52
518\beamer@frametopskipautobreak=\skip53
519\beamer@framebottomskipautobreak=\skip54
520\beamer@envbody=\toks27
521\framewidth=\dimen258
522\c@framenumber=\count294
523)
524(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
525\beamer@verbatimfileout=\write4
526)
527(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
528\beamer@splitbox=\box63
529\beamer@autobreakcount=\count295
530\beamer@autobreaklastheight=\dimen259
531\beamer@frametitletoks=\toks28
532\beamer@framesubtitletoks=\toks29
533)
534(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
535\beamer@footins=\box64
536)
537(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty)
538(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
539\beamer@frameboxcopy=\box65
540)
541(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty)
542(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
543\beamer@sbttoks=\toks30
544
545(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
546(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
547\bmb@box=\box66
548\bmb@colorbox=\box67
549\bmb@boxshadow=\box68
550\bmb@boxshadowball=\box69
551\bmb@boxshadowballlarge=\box70
552\bmb@temp=\dimen260
553\bmb@dima=\dimen261
554\bmb@dimb=\dimen262
555\bmb@prevheight=\dimen263
556)
557\beamer@blockheadheight=\dimen264
558))
559(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
560(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
561Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC)
562\@enLab=\toks31
563)
564\c@figure=\count296
565\c@table=\count297
566\abovecaptionskip=\skip55
567\belowcaptionskip=\skip56
568)
569(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
570\beamer@section@min@dim=\dimen265
571)
572(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
573(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
574Package: amsmath 2020/01/20 v2.17e AMS math features
575\@mathmargin=\skip57
576
577For additional information on amsmath, use the `?' option.
578(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
579Package: amstext 2000/06/29 v2.01 AMS text
580
581(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
582File: amsgen.sty 1999/11/30 v2.0 generic functions
583\@emptytoks=\toks32
584\ex@=\dimen266
585))
586(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
587Package: amsbsy 1999/11/29 v1.2d Bold Symbols
588\pmbraise@=\dimen267
589)
590(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
591Package: amsopn 2016/03/08 v2.02 operator names
592)
593\inf@bad=\count298
594LaTeX Info: Redefining \frac on input line 227.
595\uproot@=\count299
596\leftroot@=\count300
597LaTeX Info: Redefining \overline on input line 389.
598\classnum@=\count301
599\DOTSCASE@=\count302
600LaTeX Info: Redefining \ldots on input line 486.
601LaTeX Info: Redefining \dots on input line 489.
602LaTeX Info: Redefining \cdots on input line 610.
603\Mathstrutbox@=\box71
604\strutbox@=\box72
605\big@size=\dimen268
606LaTeX Font Info: Redeclaring font encoding OML on input line 733.
607LaTeX Font Info: Redeclaring font encoding OMS on input line 734.
608\macc@depth=\count303
609\c@MaxMatrixCols=\count304
610\dotsspace@=\muskip17
611\c@parentequation=\count305
612\dspbrk@lvl=\count306
613\tag@help=\toks33
614\row@=\count307
615\column@=\count308
616\maxfields@=\count309
617\andhelp@=\toks34
618\eqnshift@=\dimen269
619\alignsep@=\dimen270
620\tagshift@=\dimen271
621\tagwidth@=\dimen272
622\totwidth@=\dimen273
623\lineht@=\dimen274
624\@envbody=\toks35
625\multlinegap=\skip58
626\multlinetaggap=\skip59
627\mathdisplay@stack=\toks36
628LaTeX Info: Redefining \[ on input line 2859.
629LaTeX Info: Redefining \] on input line 2860.
630)
631(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
632Package: amsthm 2017/10/31 v2.20.4
633\thm@style=\toks37
634\thm@bodyfont=\toks38
635\thm@headfont=\toks39
636\thm@notefont=\toks40
637\thm@headpunct=\toks41
638\thm@preskip=\skip60
639\thm@postskip=\skip61
640\thm@headsep=\skip62
641\dth@everypar=\toks42
642)
643\c@theorem=\count310
644)
645(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty))
646(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
647(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty)
648(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty)
649(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
650\beamer@dima=\dimen275
651\beamer@dimb=\dimen276
652)
653(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty)))
654(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty
655(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty)
656(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty)
657(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty)
658(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty))
659(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
660Package: inputenc 2018/08/11 v1.3c Input encoding file
661\inpenc@prehook=\toks43
662\inpenc@posthook=\toks44
663)
664(/usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
665Package: svg 2020/01/13 v2.02e (include SVG pictures)
666
667(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
668Package: scrbase 2020/01/24 v3.29 KOMA-Script package (KOMA-Script-independent
669basics and keyval usage)
670)
671(/usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
672Package: shellesc 2019/11/08 v1.0c unified shell escape interface for LaTeX
673Package shellesc Info: Unrestricted shell escape enabled on input line 75.
674)
675(/usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
676Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
677)
678\svg@box=\box73
679\c@svg@param@lastpage=\count311
680\c@svg@param@currpage=\count312
681
682(/usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
683Package: ifplatform 2017/10/13 v0.4a Testing for the operating system
684
685(/usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
686Package: catchfile 2019/12/09 v1.8 Catch the contents of a file (HO)
687)
688(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
689Package: ifluatex 2019/10/25 v1.5 ifluatex legacy package. Use iftex instead.
690)
691runsystem(uname -s > "X2-StudentsRequests.w18")...executed.
692
693
694(./X2-StudentsRequests.w18)
695runsystem(rm -- "X2-StudentsRequests.w18")...executed.
696
697))
698(/usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
699Package: transparent 2019/11/29 v1.4 Transparency via pdfTeX's color stack (HO)
700
701)
702(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.sty
703\lst@mode=\count313
704\lst@gtempboxa=\box74
705\lst@token=\toks45
706\lst@length=\count314
707\lst@currlwidth=\dimen277
708\lst@column=\count315
709\lst@pos=\count316
710\lst@lostspace=\dimen278
711\lst@width=\dimen279
712\lst@newlines=\count317
713\lst@lineno=\count318
714\lst@maxwidth=\dimen280
715
716(/usr/share/texlive/texmf-dist/tex/latex/listings/lstmisc.sty
717File: lstmisc.sty 2019/09/10 1.8c (Carsten Heinz)
718\c@lstnumber=\count319
719\lst@skipnumbers=\count320
720\lst@framebox=\box75
721)
722(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.cfg
723File: listings.cfg 2019/09/10 1.8c listings configuration
724))
725Package: listings 2019/09/10 1.8c (Carsten Heinz)
726
727(/usr/share/texlive/texmf-dist/tex/latex/mathtools/mathtools.sty
728Package: mathtools 2020/01/17 v1.23 mathematical typesetting tools
729
730(/usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
731Package: calc 2017/05/25 v4.3 Infix arithmetic (KKT,FJ)
732\calc@Acount=\count321
733\calc@Bcount=\count322
734\calc@Adimen=\dimen281
735\calc@Bdimen=\dimen282
736\calc@Askip=\skip63
737\calc@Bskip=\skip64
738LaTeX Info: Redefining \setlength on input line 80.
739LaTeX Info: Redefining \addtolength on input line 81.
740\calc@Ccount=\count323
741\calc@Cskip=\skip65
742)
743(/usr/share/texlive/texmf-dist/tex/latex/mathtools/mhsetup.sty
744Package: mhsetup 2017/03/31 v1.3 programming setup (MH)
745)
746LaTeX Info: Thecontrolsequence`\('isalreadyrobust on input line 129.
747LaTeX Info: Thecontrolsequence`\)'isalreadyrobust on input line 129.
748LaTeX Info: Thecontrolsequence`\['isalreadyrobust on input line 129.
749LaTeX Info: Thecontrolsequence`\]'isalreadyrobust on input line 129.
750\g_MT_multlinerow_int=\count324
751\l_MT_multwidth_dim=\dimen283
752\origjot=\skip66
753\l_MT_shortvdotswithinadjustabove_dim=\dimen284
754\l_MT_shortvdotswithinadjustbelow_dim=\dimen285
755\l_MT_above_intertext_sep=\dimen286
756\l_MT_below_intertext_sep=\dimen287
757\l_MT_above_shortintertext_sep=\dimen288
758\l_MT_below_shortintertext_sep=\dimen289
759)
760(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty
761Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ
762
763(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
764(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
765Package: pgf 2020/01/08 v3.1.5b (3.1.5b)
766
767(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
768File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
769\pgfnodeparttextbox=\box76
770) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
771File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b)
772)
773(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65
774.sty
775Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b)
776\pgf@nodesepstart=\dimen290
777\pgf@nodesepend=\dimen291
778)
779(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18
780.sty
781Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b)
782)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
783(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
784(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex))
785(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
786(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex))
787(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
788Package: pgffor 2020/01/08 v3.1.5b (3.1.5b)
789
790(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)
791\pgffor@iter=\dimen292
792\pgffor@skip=\dimen293
793\pgffor@stack=\toks46
794\pgffor@toks=\toks47
795))
796(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
797Package: tikz 2020/01/08 v3.1.5b (3.1.5b)
798
799(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers
800.code.tex
801File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b)
802\pgf@plot@mark@count=\count325
803\pgfplotmarksize=\dimen294
804)
805\tikz@lastx=\dimen295
806\tikz@lasty=\dimen296
807\tikz@lastxsaved=\dimen297
808\tikz@lastysaved=\dimen298
809\tikz@lastmovetox=\dimen299
810\tikz@lastmovetoy=\dimen300
811\tikzleveldistance=\dimen301
812\tikzsiblingdistance=\dimen302
813\tikz@figbox=\box77
814\tikz@figbox@bg=\box78
815\tikz@tempbox=\box79
816\tikz@tempbox@bg=\box80
817\tikztreelevel=\count326
818\tikznumberofchildren=\count327
819\tikznumberofcurrentchild=\count328
820\tikz@fig@count=\count329
821
822(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
823File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
824\pgfmatrixcurrentrow=\count330
825\pgfmatrixcurrentcolumn=\count331
826\pgf@matrix@numberofcolumns=\count332
827)
828\tikz@expandcount=\count333
829
830(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
831zlibrarytopaths.code.tex
832File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b)
833)))
834(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex
835(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
836zlibrarymatrix.code.tex
837File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b)
838)
839(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik
840zlibraryquotes.code.tex
841File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b)
842)
843(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.
844code.tex
845File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b)
846\pgfarrowinset=\dimen303
847\pgfarrowlength=\dimen304
848\pgfarrowwidth=\dimen305
849\pgfarrowlinewidth=\dimen306
850))) (/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjustbox.sty
851Package: adjustbox 2019/01/04 v1.2 Adjusting TeX boxes (trim, clip, ...)
852
853(/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
854Package: xkeyval 2014/12/03 v2.7a package option processing (HA)
855
856(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex
857(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex
858\XKV@toks=\toks48
859\XKV@tempa@toks=\toks49
860)
861\XKV@depth=\count334
862File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
863))
864(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjcalc.sty
865Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back
866-ends (calc, etex, pgfmath)
867)
868(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/trimclip.sty
869Package: trimclip 2018/04/08 v1.1 Trim and clip general TeX material
870
871(/usr/share/texlive/texmf-dist/tex/latex/collectbox/collectbox.sty
872Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes
873\collectedbox=\box81
874)
875\tc@llx=\dimen307
876\tc@lly=\dimen308
877\tc@urx=\dimen309
878\tc@ury=\dimen310
879Package trimclip Info: Using driver 'tc-pdftex.def'.
880
881(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/tc-pdftex.def
882File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex
883))
884\adjbox@Width=\dimen311
885\adjbox@Height=\dimen312
886\adjbox@Depth=\dimen313
887\adjbox@Totalheight=\dimen314
888\adjbox@pwidth=\dimen315
889\adjbox@pheight=\dimen316
890\adjbox@pdepth=\dimen317
891\adjbox@ptotalheight=\dimen318
892
893(/usr/share/texlive/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty
894Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection
895\c@checkoddpage=\count335
896)
897(/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty
898Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages
899\@vwid@box=\box82
900\sift@deathcycles=\count336
901\@vwid@loff=\dimen319
902\@vwid@roff=\dimen320
903))
904(/usr/share/texlive/texmf-dist/tex/latex/listings/lstlang1.sty
905File: lstlang1.sty 2019/09/10 1.8c listings language file
906)
907(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def
908File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode
909\l__kernel_color_stack_int=\count337
910\l__pdf_internal_box=\box83
911)
912(./X2-StudentsRequests.aux)
913\openout1 = `X2-StudentsRequests.aux'.
914
915LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 33.
916LaTeX Font Info: ... okay on input line 33.
917LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 33.
918LaTeX Font Info: ... okay on input line 33.
919LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 33.
920LaTeX Font Info: ... okay on input line 33.
921LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 33.
922LaTeX Font Info: ... okay on input line 33.
923LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 33.
924LaTeX Font Info: ... okay on input line 33.
925LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 33.
926LaTeX Font Info: ... okay on input line 33.
927LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 33.
928LaTeX Font Info: ... okay on input line 33.
929LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 33.
930LaTeX Font Info: ... okay on input line 33.
931
932*geometry* driver: auto-detecting
933*geometry* detected driver: pdftex
934*geometry* verbose mode - [ preamble ] result:
935* driver: pdftex
936* paper: custom
937* layout: <same size as paper>
938* layoutoffset:(h,v)=(0.0pt,0.0pt)
939* modes: includehead includefoot
940* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt)
941* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt)
942* \paperwidth=364.19536pt
943* \paperheight=273.14662pt
944* \textwidth=342.2953pt
945* \textheight=244.6939pt
946* \oddsidemargin=-61.31996pt
947* \evensidemargin=-61.31996pt
948* \topmargin=-72.26999pt
949* \headheight=14.22636pt
950* \headsep=0.0pt
951* \topskip=11.0pt
952* \footskip=14.22636pt
953* \marginparwidth=4.0pt
954* \marginparsep=10.0pt
955* \columnsep=10.0pt
956* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
957* \hoffset=0.0pt
958* \voffset=0.0pt
959* \mag=1000
960* \@twocolumnfalse
961* \@twosidefalse
962* \@mparswitchfalse
963* \@reversemarginfalse
964* (1in=72.27pt=25.4mm, 1cm=28.453pt)
965
966(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
967[Loading MPS to PDF converter (version 2006.09.02).]
968\scratchcounter=\count338
969\scratchdimen=\dimen321
970\scratchbox=\box84
971\nofMPsegments=\count339
972\nofMParguments=\count340
973\everyMPshowfont=\toks50
974\MPscratchCnt=\count341
975\MPscratchDim=\dimen322
976\MPnumerator=\count342
977\makeMPintoPDFobject=\count343
978\everyMPtoPDFconversion=\toks51
979) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
980Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
981Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
98285.
983
984(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
985File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
986e
987))
988ABD: EveryShipout initializing macros
989\AtBeginShipoutBox=\box85
990Package hyperref Info: Link coloring OFF on input line 33.
991
992(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
993Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section
994
995(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
996Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO)
997)
998(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
999Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
1000)
1001\c@section@level=\count344
1002)
1003LaTeX Info: Redefining \ref on input line 33.
1004LaTeX Info: Redefining \pageref on input line 33.
1005LaTeX Info: Redefining \nameref on input line 33.
1006
1007(./X2-StudentsRequests.out) (./X2-StudentsRequests.out)
1008\@outlinefile=\write5
1009\openout5 = `X2-StudentsRequests.out'.
1010
1011LaTeX Font Info: Overwriting symbol font `operators' in version `normal'
1012(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 33.
1013LaTeX Font Info: Overwriting symbol font `operators' in version `bold'
1014(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 33.
1015\symnumbers=\mathgroup6
1016\sympureletters=\mathgroup7
1017LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal'
1018(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 33.
1019LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 33.
1020LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal'
1021(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 33.
1022LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
1023(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 33.
1024LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 33.
1025LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal'
1026(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 33.
1027LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
1028(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 33.
1029LaTeX Font Info: Redeclaring math alphabet \mathit on input line 33.
1030LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal'
1031(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 33.
1032LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
1033(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 33.
1034LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 33.
1035LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal'
1036(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 33.
1037LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
1038(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 33.
1039LaTeX Font Info: Overwriting symbol font `numbers' in version `bold'
1040(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 33.
1041LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
1042(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 33.
1043LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold'
1044(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 33.
1045LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold'
1046(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 33.
1047LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold'
1048(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 33.
1049LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold'
1050(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 33.
1051LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold'
1052(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 33.
1053LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 33.
1054LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal'
1055(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 3
10563.
1057LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
1058(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 3
10593.
1060LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold'
1061(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp
1062ut line 33.
1063
1064(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary
1065-English.dict
1066Dictionary: translator-basic-dictionary, Language: English
1067)
1068(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic
1069tionary-English.dict
1070Dictionary: translator-bibliography-dictionary, Language: English
1071)
1072(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict
1073ionary-English.dict
1074Dictionary: translator-environment-dictionary, Language: English
1075)
1076(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar
1077y-English.dict
1078Dictionary: translator-months-dictionary, Language: English
1079)
1080(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona
1081ry-English.dict
1082Dictionary: translator-numbers-dictionary, Language: English
1083)
1084(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona
1085ry-English.dict
1086Dictionary: translator-theorem-dictionary, Language: English
1087)
1088\c@lstlisting=\count345
1089 (./X2-StudentsRequests.nav)
1090<img/unilu.jpg, id=20, 645.16031pt x 578.16pt>
1091File: img/unilu.jpg Graphic file (type jpg)
1092<use img/unilu.jpg>
1093Package pdftex.def Info: img/unilu.jpg used on input line 37.
1094(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1095 [1
1096
1097{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>] [2
1098
1099]
1100File: img/unilu.jpg Graphic file (type jpg)
1101<use img/unilu.jpg>
1102Package pdftex.def Info: img/unilu.jpg used on input line 53.
1103(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1104 [3
1105
1106]
1107LaTeX Font Info: Trying to load font information for U+msa on input line 76.
1108
1109
1110(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
1111File: umsa.fd 2013/01/14 v3.01 AMS symbols A
1112)
1113LaTeX Font Info: Trying to load font information for U+msb on input line 76.
1114
1115
1116(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
1117File: umsb.fd 2013/01/14 v3.01 AMS symbols B
1118)
1119LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp
1120ut line 76.
1121
1122(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd
1123File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma
1124thkerncmss.
1125)
1126File: img/unilu.jpg Graphic file (type jpg)
1127<use img/unilu.jpg>
1128Package pdftex.def Info: img/unilu.jpg used on input line 76.
1129(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1130
1131[4
1132
1133]
1134File: img/unilu.jpg Graphic file (type jpg)
1135<use img/unilu.jpg>
1136Package pdftex.def Info: img/unilu.jpg used on input line 85.
1137(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1138 [5
1139
1140]
1141File: img/unilu.jpg Graphic file (type jpg)
1142<use img/unilu.jpg>
1143Package pdftex.def Info: img/unilu.jpg used on input line 95.
1144(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1145 [6
1146
1147]
1148File: img/unilu.jpg Graphic file (type jpg)
1149<use img/unilu.jpg>
1150Package pdftex.def Info: img/unilu.jpg used on input line 105.
1151(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1152 [7
1153
1154]
1155Package svg Info: Last page of `./svg-inkscape/DH_svg-tex.pdf' is 1 on input li
1156ne 109.
1157 (./svg-inkscape/DH_svg-tex.pdf_tex
1158<./svg-inkscape/DH_svg-tex.pdf, id=228, page=1, 321.11218pt x 481.97127pt>
1159File: ./svg-inkscape/DH_svg-tex.pdf Graphic file (type pdf)
1160<use ./svg-inkscape/DH_svg-tex.pdf, page 1>
1161Package pdftex.def Info: ./svg-inkscape/DH_svg-tex.pdf , page1 used on input li
1162ne 56.
1163(pdftex.def) Requested size: 144.49948pt x 216.88507pt.
1164)
1165File: img/unilu.jpg Graphic file (type jpg)
1166<use img/unilu.jpg>
1167Package pdftex.def Info: img/unilu.jpg used on input line 109.
1168(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1169 [8
1170
1171 <./svg-inkscape/DH_svg-tex.pdf>]
1172File: img/unilu.jpg Graphic file (type jpg)
1173<use img/unilu.jpg>
1174Package pdftex.def Info: img/unilu.jpg used on input line 120.
1175(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1176 [9
1177
1178] [10
1179
1180]
1181File: img/unilu.jpg Graphic file (type jpg)
1182<use img/unilu.jpg>
1183Package pdftex.def Info: img/unilu.jpg used on input line 133.
1184(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1185 [11
1186
1187]
1188File: img/unilu.jpg Graphic file (type jpg)
1189<use img/unilu.jpg>
1190Package pdftex.def Info: img/unilu.jpg used on input line 152.
1191(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1192 [12
1193
1194]
1195File: img/unilu.jpg Graphic file (type jpg)
1196<use img/unilu.jpg>
1197Package pdftex.def Info: img/unilu.jpg used on input line 165.
1198(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1199 [13
1200
1201]
1202File: img/unilu.jpg Graphic file (type jpg)
1203<use img/unilu.jpg>
1204Package pdftex.def Info: img/unilu.jpg used on input line 185.
1205(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1206 [14
1207
1208]
1209File: img/unilu.jpg Graphic file (type jpg)
1210<use img/unilu.jpg>
1211Package pdftex.def Info: img/unilu.jpg used on input line 193.
1212(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1213 [15
1214
1215]
1216File: img/unilu.jpg Graphic file (type jpg)
1217<use img/unilu.jpg>
1218Package pdftex.def Info: img/unilu.jpg used on input line 211.
1219(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1220 [16
1221
1222]
1223File: img/unilu.jpg Graphic file (type jpg)
1224<use img/unilu.jpg>
1225Package pdftex.def Info: img/unilu.jpg used on input line 232.
1226(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1227 [17
1228
1229]
1230File: img/unilu.jpg Graphic file (type jpg)
1231<use img/unilu.jpg>
1232Package pdftex.def Info: img/unilu.jpg used on input line 254.
1233(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1234 [18
1235
1236]
1237File: img/unilu.jpg Graphic file (type jpg)
1238<use img/unilu.jpg>
1239Package pdftex.def Info: img/unilu.jpg used on input line 266.
1240(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1241 [19
1242
1243]
1244File: img/unilu.jpg Graphic file (type jpg)
1245<use img/unilu.jpg>
1246Package pdftex.def Info: img/unilu.jpg used on input line 297.
1247(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1248 [20
1249
1250]
1251File: img/unilu.jpg Graphic file (type jpg)
1252<use img/unilu.jpg>
1253Package pdftex.def Info: img/unilu.jpg used on input line 307.
1254(pdftex.def) Requested size: 64.5198pt x 57.81938pt.
1255 [21
1256
1257]
1258\tf@nav=\write6
1259\openout6 = `X2-StudentsRequests.nav'.
1260
1261\tf@toc=\write7
1262\openout7 = `X2-StudentsRequests.toc'.
1263
1264\tf@snm=\write8
1265\openout8 = `X2-StudentsRequests.snm'.
1266
1267Package atveryend Info: Empty hook `BeforeClearDocument' on input line 309.
1268Package atveryend Info: Empty hook `AfterLastShipout' on input line 309.
1269
1270(./X2-StudentsRequests.aux)
1271Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 309.
1272Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 309.
1273Package rerunfilecheck Info: File `X2-StudentsRequests.out' has not changed.
1274(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0.
1275 )
1276Here is how much of TeX's memory you used:
1277 25732 strings out of 481239
1278 509817 string characters out of 5920377
1279 960739 words of memory out of 5000000
1280 40331 multiletter control sequences out of 15000+600000
1281 545963 words of font info for 73 fonts, out of 8000000 for 9000
1282 1141 hyphenation exceptions out of 8191
1283 58i,21n,89p,803b,926s stack positions out of 5000i,500n,10000p,200000b,80000s
1284</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></us
1285r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cmextra/cmex8.pfb></usr/
1286share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/
1287texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi12.pfb></usr/share/texliv
1288e/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb></usr/share/texlive/texmf
1289-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/texlive/texmf-dist/
1290fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texlive/texmf-dist/fonts/
1291type1/public/amsfonts/cm/cmss17.pfb></usr/share/texlive/texmf-dist/fonts/type1/
1292public/amsfonts/cm/cmss8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/
1293amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsf
1294onts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/
1295cm/cmssi12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cm
1296ssi8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.p
1297fb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></us
1298r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></usr/share
1299/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt8.pfb></usr/share/texliv
1300e/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb>
1301Output written on X2-StudentsRequests.pdf (21 pages, 271722 bytes).
1302PDF statistics:
1303 687 PDF objects out of 1000 (max. 8388607)
1304 621 compressed objects within 7 object streams
1305 43 named destinations out of 1000 (max. 500000)
1306 106 words of extra memory for PDF output out of 10000 (max. 10000000)
1307
diff --git a/src/Lecture7/slides/X2-StudentsRequests.nav b/src/Lecture7/slides/X2-StudentsRequests.nav
new file mode 100644
index 0000000..b90e3f7
--- /dev/null
+++ b/src/Lecture7/slides/X2-StudentsRequests.nav
@@ -0,0 +1,47 @@
1\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
2\headcommand {\beamer@framepages {1}{1}}
3\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}
4\headcommand {\beamer@framepages {2}{2}}
5\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}
6\headcommand {\beamer@framepages {3}{3}}
7\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}
8\headcommand {\beamer@framepages {4}{4}}
9\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}
10\headcommand {\beamer@framepages {5}{5}}
11\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}
12\headcommand {\beamer@framepages {6}{6}}
13\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}
14\headcommand {\beamer@framepages {7}{7}}
15\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}
16\headcommand {\beamer@framepages {8}{8}}
17\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}
18\headcommand {\beamer@framepages {9}{9}}
19\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}
20\headcommand {\beamer@framepages {10}{10}}
21\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}
22\headcommand {\beamer@framepages {11}{11}}
23\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}
24\headcommand {\beamer@framepages {12}{12}}
25\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}
26\headcommand {\beamer@framepages {13}{13}}
27\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}
28\headcommand {\beamer@framepages {14}{14}}
29\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}
30\headcommand {\beamer@framepages {15}{15}}
31\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}
32\headcommand {\beamer@framepages {16}{16}}
33\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}
34\headcommand {\beamer@framepages {17}{17}}
35\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}
36\headcommand {\beamer@framepages {18}{18}}
37\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}
38\headcommand {\beamer@framepages {19}{19}}
39\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}
40\headcommand {\beamer@framepages {20}{20}}
41\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}
42\headcommand {\beamer@framepages {21}{21}}
43\headcommand {\beamer@partpages {1}{21}}
44\headcommand {\beamer@subsectionpages {1}{21}}
45\headcommand {\beamer@sectionpages {1}{21}}
46\headcommand {\beamer@documentpages {21}}
47\headcommand {\gdef \inserttotalframenumber {21}}
diff --git a/src/Lecture7/slides/X2-StudentsRequests.out b/src/Lecture7/slides/X2-StudentsRequests.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture7/slides/X2-StudentsRequests.out
diff --git a/src/Lecture7/slides/X2-StudentsRequests.pdf b/src/Lecture7/slides/X2-StudentsRequests.pdf
new file mode 100644
index 0000000..8b5793e
--- /dev/null
+++ b/src/Lecture7/slides/X2-StudentsRequests.pdf
Binary files differ
diff --git a/src/Lecture7/slides/X2-StudentsRequests.snm b/src/Lecture7/slides/X2-StudentsRequests.snm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture7/slides/X2-StudentsRequests.snm
diff --git a/src/Lecture7/slides/X2-StudentsRequests.tex b/src/Lecture7/slides/X2-StudentsRequests.tex
new file mode 100644
index 0000000..787e7fb
--- /dev/null
+++ b/src/Lecture7/slides/X2-StudentsRequests.tex
@@ -0,0 +1,309 @@
1\documentclass[11pt]{beamer}
2\usetheme{Madrid}
3\usepackage[utf8]{inputenc}
4\usepackage{amsmath}
5
6\usepackage{svg}
7\usepackage{color}
8\usepackage{listings}
9\usepackage{mathtools}
10\usepackage{tikz-cd}
11\usepackage{adjustbox}
12
13\definecolor{myblue}{rgb}{0,0,0.5}
14\lstset{
15 language=Python,
16 tabsize=4,
17 basicstyle=\footnotesize,
18 keywordstyle=\bf\color{myblue},
19 commentstyle=\it\color{gray},
20 numbers=left,
21 numbersep=3pt,
22 numberstyle=\tiny\color{gray},
23}
24
25\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto}
26\title[Students requests]%
27{Students requests}
28\logo{\includegraphics[scale=0.1]{img/unilu.jpg}}
29%\institute{University of Luxembourg}
30
31\date{2021-05-21}
32
33\begin{document}
34
35\begin{frame}
36 \titlepage
37\end{frame}
38
39\begin{frame}[plain]
40 \begin{center} {\Huge More cryptography} \end{center}
41\end{frame}
42
43\begin{frame}{Cryptography}
44 What we have seen:
45
46 \vspace{0.3cm}
47 \begin{itemize}
48 \item \textbf{RSA:}
49 sending messages using a private key / public key pair
50 \item \textbf{Flip-a-coin:}
51 cryptographic ``proof'' that the opponent is not cheating
52 \end{itemize}
53\end{frame}
54
55\begin{frame}{Cryptography}
56 \begin{itemize}
57 \item Rely on integer factorization being hard
58
59 \vspace{0.3cm}
60 \textbf{Example:} the best-known factorization algorithm
61 (\href{https://en.wikipedia.org/wiki/General\_number\_field\_sieve}%
62 {\emph{General number field sieve}}) has complexity
63 \begin{align*}
64 \sim O\left(
65 e^{\sqrt[3]{\frac{64}{9}\log_2n\cdot(\log_2\log_2n)^2}}
66 \right)
67 \end{align*}
68
69 Factoring a number with $300$ digits:
70 \begin{itemize}
71 \item Your laptop: $10^{13}$ billion years
72 \item Best supercomputer: $13$ billion years
73 (age of the universe)
74 \end{itemize}
75 \end{itemize}
76\end{frame}
77
78\begin{frame}{Symmetric and asymmetric cryptography}
79 \begin{itemize}
80 \item Our examples are \emph{asymmetric}: different public/private keys
81 \item Safe against eavesdroppers
82 \item Symmetric protocols can be faster and simpler, but you need
83 a secure way to exchange a key
84 \end{itemize}
85\end{frame}
86
87\begin{frame}{Diffie-Hellman key exchange}
88 \begin{itemize}
89 \item Generate a ``password'' without communicating it directly
90 \item It can then be used for symmetric cryptography
91 \item Based on a different hard problem:
92 \href{https://en.wikipedia.org/wiki/Discrete\_logarithm}%
93 {\emph{discrete logarithm}}
94 \end{itemize}
95\end{frame}
96
97\begin{frame}{Diffie-Hellman key exchange}
98 \begin{itemize}
99 \item Alice and Bob agree on a prime number $p$ and an integer $g$
100 \item Alice picks an integer $a$ and sends $(g^a\bmod p)$ to Bob
101 \item Bob picks an integer $b$ and sends $(g^b\bmod p)$ to Alice
102 \item Alice can compute $(g^b)^a\bmod p$ and Bob can compute
103 $(g^a)^b\bmod p$. This is their shared secret (key).
104 \end{itemize}
105\end{frame}
106
107\begin{frame}{Diffie-Hellman with colors (from Wikipedia)}
108 \begin{center}\includesvg[scale=0.45]{img/DH}\end{center}
109\end{frame}
110
111\begin{frame}{Diffie-Hellman key exchange}
112 \begin{itemize}
113 \item Knowing $h$ and $a$, it is hard to find $g$ such that
114 $g^a \bmod p =h$ (discrete logarithm problem)
115 \item Very simple, many variants
116 \item Any group can be used, e.g. Elliptic Curves (see
117\href{https://en.wikipedia.org/wiki/Elliptic-curve_Diffie\%E2\%80\%93Hellman}%
118 {Wikipedia: elliptic-curve Diffie-Hellman})
119 \end{itemize}
120\end{frame}
121
122
123\begin{frame}[plain]
124 \begin{center} {\Huge Numerical methods for PDEs} \end{center}
125\end{frame}
126
127\begin{frame}{Solving partial differential equations}
128 \begin{itemize}
129 \item Very, very hard
130 \item Very important in practical applications (physics and such)
131 \item Approximations are necessary, might as well use numerical methods
132 \end{itemize}
133\end{frame}
134
135\begin{frame}{Numerical methods for ODEs}
136 \begin{block}{Problem}
137 Given $f(x,y)$, $x_0$ and $y_0$, find an approximation
138 for $y(x)$ such that
139 \begin{align*}
140 \begin{cases}
141 y'(x) = f(x, y(x))\\
142 y(x_0) =y_0
143 \end{cases}
144 \end{align*}
145 \end{block}
146
147 \begin{block}{Approximation}
148 We can describe $y(x)$ in an interval $[x_0,x_1]$ by giving the
149 (approximate) values $y(s_0)$, \dots, $y(s_n)$ for many
150 values of $s_i\in [x_0, x_1]$.
151 \end{block}
152\end{frame}
153
154\begin{frame}{Euler's method}
155 \begin{block}{Idea}
156 For $h$ small
157 \begin{align*}
158 y'(x)\approx\frac{y(x+h)-y(x)}{h}
159 \end{align*}
160 which implies
161 \begin{align*}
162 y(x+h) \approx y(x) + h\cdot f(x, y(x))
163 \end{align*}
164 \end{block}
165\end{frame}
166
167\begin{frame}{Euler's method}
168 \begin{block}{Algorithm}
169 \textbf{Input:} the data $f(x,y)$, $x_0$, $y_0$ and $x_1$ describing
170 the problem and the desired range for the solution.
171
172 \vspace{0.3cm}
173 \textbf{Output:} $x_0=s_0 < s_1 < \dots < s_n=x_1$ and
174 $y_0, \dots, y_n$ such that $y_i\approx y(s_i)$.
175
176 \vspace{0.3cm}
177 \begin{enumerate}
178 \item Choose a value $n$ and let
179 $h=\frac{x_1-x_0}{n}$ and $s_i=x_0+ih$
180 \item For $i=0,\dots, n-1$ compute
181 $y_{i+1}=y_i+h\cdot f(s_i, y_i)$
182 \item Return $s_0, \dots, s_n$ and $y_0, \dots, y_n$
183 \end{enumerate}
184 \end{block}
185\end{frame}
186
187\begin{frame}{Euler's method}
188 \begin{itemize}
189 \item Very simple and fast
190 \item Generalization for higher-order equations: Runge-Kutta methods
191 \item A similar idea works for some PDEs
192 \end{itemize}
193\end{frame}
194
195\begin{frame}{The heat equation (PDE)}
196 \begin{align*}
197 \frac{\partial u}{\partial t} = \frac{\partial^2 u}{\partial x_1^2} +
198 \frac{\partial^2 u}{\partial x_2^2} + \cdots +
199 \frac{\partial^2 u}{\partial x_n^2}
200 \end{align*}
201
202 Where
203 \[u(x_1,x_2,\dots,x_n,t): \mathbb R^n\times \mathbb R_+\to \mathbb R\]
204 describes the quantity of heat at the point $(x_1,\dots x_n)$ at time $t$.
205
206 \vspace{0.3cm} It appears also outside thermodynamics: mathematical finance
207 (\href{https://en.wikipedia.org/wiki/Black\%E2\%80\%93Scholes\_equation}%
208 {Black-Scholes equation}), quantum mechanics
209 (\href{https://en.wikipedia.org/wiki/Schr\%C3\%B6dinger\_equation}%
210 {Schrödinger equation}), image analysis\dots
211\end{frame}
212
213\begin{frame}{A simple case ($n=1$, in $[0,1]^2$)}
214 \begin{block}{Problem}
215 Given $u_0(t)$, $u_1(t)$ and $u^0(x)$, find an approximation
216 for $u(x,t)$ such that
217 \begin{align*}
218 \begin{cases}
219 \frac{\partial u}{\partial t} =
220 \frac{\partial^2 u}{\partial x^2} \\
221 u(0,t) = u_{(0)}(t) \quad \text{(boundary condition)}\\
222 u(1,t) = u_{(1)}(t) \quad \text{(boundary condition)}\\
223 u(x,0) = u^0(x) \quad \text{(initial condition)}
224 \end{cases}
225 \end{align*}
226 \end{block}
227
228 \begin{block}{Approximation}
229 Values $u_i^j\approx u(s_i, r^j)$ for
230 $(s_i,r^j)\in [0,1]\times [0,1]$
231 \end{block}
232\end{frame}
233
234\begin{frame}{Idea}
235 For $k$ small:
236 \begin{align*}
237 \frac{\partial u(x,t)}{\partial t} \approx \frac{u(x,t+k)-u(x,t)}{k}\\
238 \end{align*}
239 For $h$ small (left limit + right limit):
240 \begin{align*}
241 \frac{\partial^2 u(x,t)}{\partial x^2} &\approx
242 \frac{\partial}{\partial x}\left(
243 \frac{u(x,t) - u(x-h,t)}{h}
244 \right)\\
245 &\approx \frac1h\left(
246 \frac{\partial u(x,t)}{\partial x} -
247 \frac{\partial u(x-h,t)}{\partial x}
248 \right)\\
249 &\approx \frac1h\left(
250 \frac{u(x+h,t) - u(x,t)}{h} - \frac{u(x,t)-u(x-h,t)}{h}
251 \right)\\
252 &\approx \frac{u(x+h,t)-2u(x,t)+u(x-h,t)}{h^2}
253 \end{align*}
254\end{frame}
255
256\begin{frame}{Idea}
257 From the equation
258 \begin{align*}
259 \frac{u_i^{j+1}-u_i^j}{k}= \frac{u_{i+1}^j-2u_{i}^j+u_{i-1}^j}{h^2}
260 \end{align*}
261 we find the formula
262 \begin{align*}
263 u_i^{j+1} = \frac{k}{h^2}\left(u_{i+1}^j - 2u_i^j + u_{i-1}^j\right)
264 + u_i^j
265 \end{align*}
266\end{frame}
267
268\begin{frame}{Finite difference method for the heat equation}
269 \begin{block}{Algorithm}
270 \textbf{Input:} $u_{(0)}^j$, $u_{(1)}^j$ (boundary)
271 and $u_i^0$ (initial).
272
273 \vspace{0.3cm}
274 \textbf{Output:} values $u_i^j$ approximating a solution.
275
276 \vspace{0.3cm}
277 \begin{enumerate}
278 \item Let $m=\operatorname{len}(u_0)-1$,
279 $n=\operatorname{len}(u^0)-1$ and $k=1/m$, $h=1/n$
280 %\begin{align*}
281 % \begin{array}{cccc}
282 % k=\frac{t_1-t_0}{m}, & h=\frac{x_1-x_0}{n}, &
283 % r^j = t_0 +jk, & s_i = x_0+ih
284 % \end{array}
285 %\end{align*}
286 \item For $j=0,\dots, m-1$ do the following:
287 \begin{itemize}
288 \item For $i=1,\dots, n-1$ compute
289 \begin{align*}
290 u_i^{j+1} = \frac{k}{h^2}\left(u_{i+1}^j -
291 2u_i^j + u_{i-1}^j\right) + u_i^j
292 \end{align*}
293 \end{itemize}
294 \item Return the $u_i^j$
295 \end{enumerate}
296 \end{block}
297\end{frame}
298
299\begin{frame}{Other PDEs}
300 \begin{itemize}
301 \item In general, there is no generic method
302 \item You might need to write specific code for your equation
303 \item Some packages exists
304 (e.g. \href{https://wiki.octave.org/Fem-fenics}{fem-fenics} for
305 \href{https://www.gnu.org/software/octave/index}{Gnu Octave})
306 \end{itemize}
307\end{frame}
308
309\end{document}
diff --git a/src/Lecture7/slides/X2-StudentsRequests.toc b/src/Lecture7/slides/X2-StudentsRequests.toc
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/Lecture7/slides/X2-StudentsRequests.toc
diff --git a/src/Lecture7/slides/X2-StudentsRequests.vrb b/src/Lecture7/slides/X2-StudentsRequests.vrb
new file mode 100644
index 0000000..57dfae6
--- /dev/null
+++ b/src/Lecture7/slides/X2-StudentsRequests.vrb
@@ -0,0 +1,10 @@
1\frametitle{Fibonacci with memorization}
2\begin{adjustbox}{scale={0.85}{0.9},center}
3 \begin{tikzcd}[column sep=1mm]
4 & & & & & & & & F(5) \ar[drrr] \ar[dlll]\\
5 & & & & & F(4)\ar[dll]\ar[dr] & & & & & & {\color{blue}F(3)}\\
6 & & & F(3) \ar[dl]\ar[dr] & & & {\color{blue}F(2)}\\
7 & & F(2) \ar[dl]\ar[dr] & & {\color{blue}F(1)} \\
8 & F(1) & & F(0)
9 \end{tikzcd}
10 \end{adjustbox}
diff --git a/src/Lecture7/slides/img/DH.svg b/src/Lecture7/slides/img/DH.svg
new file mode 100644
index 0000000..1ea0408
--- /dev/null
+++ b/src/Lecture7/slides/img/DH.svg
@@ -0,0 +1,181 @@
1<svg width="426.5" height="641" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
2 <g id="k" style="">
3 <ellipse id="o" cx="45.75" cy="630.2" rx="45" ry="10" fill="#796300" stroke="#000" stroke-width="1.5"/>
4 <path fill="#796300" stroke="#000" stroke-width="1.5" d="m0.75 630.2v-60h90v60"/>
5 <use transform="translate(0,-60)" style="" xlink:href="#o"/>
6 </g>
7 <use transform="translate(335)" style="" xlink:href="#k"/>
8 <g id="j" style="">
9 <ellipse id="n" cx="45.75" cy="520.2" rx="45" ry="10" fill="#ff5a00" stroke="#000" stroke-width="1.5"/>
10 <path fill="#ff5a00" stroke="#000" stroke-width="1.5" d="m0.75 520.2v-20h90v20"/>
11 <use transform="translate(0,-20)" style="" xlink:href="#n"/>
12 </g>
13 <g id="i" style="">
14 <ellipse id="m" cx="380.8" cy="520.2" rx="45" ry="10" fill="#5dcac5" stroke="#000" stroke-width="1.5"/>
15 <path fill="#5dcac5" stroke="#000" stroke-width="1.5" d="m335.8 520.2v-20h90v20"/>
16 <use transform="translate(0,-20)" style="" xlink:href="#m"/>
17 </g>
18 <g id="h" style="">
19 <g id="c" style="">
20 <path fill="#fff" stroke="#000" stroke-width="1.5" d="m0.75 450.2v-60h90v60"/>
21 <ellipse cx="45.75" cy="390.2" rx="45" ry="10" fill="#fff" stroke="#000" stroke-width="1.5"/>
22 </g>
23 <g style="">
24 <ellipse id="l" cx="45.75" cy="450.2" rx="45" ry="10" fill="#93bbff" stroke="#000" stroke-width="1.5"/>
25 <path fill="#93bbff" stroke="#000" stroke-width="1.5" d="m0.75 450.2v-40h90v40"/>
26 <use transform="translate(0,-40)" style="" xlink:href="#l"/>
27 </g>
28 </g>
29 <g id="g" style="">
30 <use transform="translate(335)" style="" xlink:href="#c"/>
31 <g style="">
32 <ellipse id="p" cx="380.8" cy="450.2" rx="45" ry="10" fill="#ffbf61" stroke="#000" stroke-width="1.5"/>
33 <path fill="#ffbe60" stroke="#000" stroke-width="1.5" d="m335.8 450.2v-40h90v40"/>
34 <use transform="translate(0,-40)" style="" xlink:href="#p"/>
35 </g>
36 </g>
37 <use transform="translate(-335,-160)" style="" xlink:href="#g"/>
38 <use transform="translate(335,-160)" style="" xlink:href="#h"/>
39 <use transform="translate(0,-340)" style="" xlink:href="#j"/>
40 <use transform="translate(0,-340)" style="" xlink:href="#i"/>
41 <g id="f" style="">
42 <use transform="translate(0,-340)" style="" xlink:href="#c"/>
43 <g style="">
44 <use transform="translate(0,20)" style="" xlink:href="#q"/>
45 <path fill="#ff0" stroke="#000" stroke-width="1.5" d="m0.75 110.2v-20h90v20"/>
46 <ellipse id="q" cx="45.75" cy="90.25" rx="45" ry="10" fill="#ff0" stroke="#000" stroke-width="1.5"/>
47 </g>
48 </g>
49 <use transform="translate(335)" style="" xlink:href="#f"/>
50 <g id="e" style="">
51 <path stroke="#000" stroke-width="1.5" d="m91.5 301 243.5 78.5"/>
52 <path d="m326.4 372.8 2.406 4.719-4.719 2.406 13.66 0.4687" style=""/>
53 </g>
54 <use transform="matrix(-1,0,0,1,427.5,0)" style="" xlink:href="#e"/>
55 <g aria-label="Common secret">
56 <path d="m146.9 606.7q-2.484 0-3.726-1.674-1.224-1.674-1.224-4.824t1.224-4.824q1.242-1.674 3.726-1.674 3.618 0 4.446 3.618l-2.52 0.612q-0.234-1.008-0.666-1.53t-1.314-0.522q-1.062 0-1.548 0.828-0.468 0.828-0.468 2.394v2.196q0 1.566 0.468 2.394 0.486 0.828 1.548 0.828 0.882 0 1.314-0.522t0.666-1.53l2.52 0.612q-0.828 3.618-4.446 3.618z"/>
57 <path d="m157.4 606.7q-2.178 0-3.42-1.296-1.242-1.314-1.242-3.564t1.242-3.546q1.242-1.314 3.42-1.314t3.42 1.314q1.242 1.296 1.242 3.546t-1.242 3.564q-1.242 1.296-3.42 1.296zm0-1.98q0.9 0 1.404-0.558t0.504-1.584v-1.476q0-1.026-0.504-1.584t-1.404-0.558-1.404 0.558-0.504 1.584v1.476q0 1.026 0.504 1.584t1.404 0.558z"/>
58 <path d="m164.1 597.1h2.664v1.602h0.108q0.27-0.828 0.9-1.314 0.648-0.504 1.638-0.504 0.972 0 1.656 0.486t0.99 1.422h0.054q0.27-0.828 1.044-1.368 0.792-0.54 1.836-0.54 1.368 0 2.088 0.99 0.738 0.972 0.738 2.754v5.922h-2.664v-5.706q0-0.918-0.324-1.35-0.306-0.45-0.972-0.45-0.648 0-1.116 0.36-0.45 0.36-0.45 1.026v6.12h-2.664v-5.706q0-1.8-1.296-1.8-0.63 0-1.098 0.36t-0.468 1.026v6.12h-2.664z"/>
59 <path d="m180.3 597.1h2.664v1.602h0.108q0.27-0.828 0.9-1.314 0.648-0.504 1.638-0.504 0.972 0 1.656 0.486t0.99 1.422h0.054q0.27-0.828 1.044-1.368 0.792-0.54 1.836-0.54 1.368 0 2.088 0.99 0.738 0.972 0.738 2.754v5.922h-2.664v-5.706q0-0.918-0.324-1.35-0.306-0.45-0.972-0.45-0.648 0-1.116 0.36-0.45 0.36-0.45 1.026v6.12h-2.664v-5.706q0-1.8-1.296-1.8-0.63 0-1.098 0.36t-0.468 1.026v6.12h-2.664z"/>
60 <path d="m200.6 606.7q-2.178 0-3.42-1.296-1.242-1.314-1.242-3.564t1.242-3.546q1.242-1.314 3.42-1.314t3.42 1.314q1.242 1.296 1.242 3.546t-1.242 3.564q-1.242 1.296-3.42 1.296zm0-1.98q0.9 0 1.404-0.558t0.504-1.584v-1.476q0-1.026-0.504-1.584t-1.404-0.558-1.404 0.558-0.504 1.584v1.476q0 1.026 0.504 1.584t1.404 0.558z"/>
61 <path d="m207.2 606.5v-9.288h2.664v1.692h0.108q0.342-0.864 1.008-1.386 0.684-0.522 1.728-0.522 1.368 0 2.196 0.918t0.828 2.574v6.012h-2.664v-5.652q0-0.882-0.396-1.332-0.396-0.468-1.17-0.468-0.666 0-1.152 0.36t-0.486 0.99v6.102z"/>
62 <path d="m230.2 606.7q-1.53 0-2.682-0.468t-1.728-1.278l1.494-1.386q1.152 1.26 2.934 1.26 0.792 0 1.242-0.252t0.45-0.738q0-0.36-0.288-0.522-0.27-0.18-0.864-0.27l-1.494-0.234q-1.368-0.216-2.178-0.846-0.792-0.63-0.792-1.872 0-1.458 1.116-2.286 1.134-0.828 3.132-0.828 2.646 0 3.87 1.422l-1.332 1.512q-0.432-0.486-1.098-0.774t-1.53-0.288q-0.756 0-1.152 0.252-0.396 0.234-0.396 0.684 0 0.378 0.27 0.558 0.288 0.162 0.882 0.252l1.476 0.234q1.386 0.216 2.178 0.846 0.81 0.63 0.81 1.872 0 1.458-1.134 2.304t-3.186 0.846z"/>
63 <path d="m241.4 606.7q-2.304 0-3.528-1.278t-1.224-3.546q0-2.286 1.206-3.582 1.224-1.314 3.312-1.314 2.07 0 3.276 1.278 1.206 1.26 1.206 3.438v0.792h-6.354v0.162q0 0.918 0.576 1.458t1.62 0.54q1.476 0 2.448-1.152l1.44 1.566q-0.594 0.738-1.584 1.188t-2.394 0.45zm-0.216-7.812q-0.864 0-1.386 0.54-0.504 0.522-0.504 1.422v0.144h3.744v-0.144q0-0.9-0.504-1.422-0.486-0.54-1.35-0.54z"/>
64 <path d="m252.3 606.7q-2.196 0-3.456-1.296-1.242-1.296-1.242-3.564 0-2.25 1.242-3.546 1.26-1.314 3.438-1.314 2.79 0 3.87 2.268l-2.052 1.116q-0.27-0.594-0.702-0.918-0.414-0.342-1.116-0.342-0.9 0-1.404 0.54-0.504 0.522-0.504 1.44v1.512q0 0.936 0.504 1.458t1.44 0.522q0.72 0 1.17-0.324 0.468-0.342 0.792-0.972l2.016 1.152q-0.522 1.062-1.512 1.674-0.99 0.594-2.484 0.594z"/>
65 <path d="m258.6 597.2h2.664v2.628h0.126q0.666-2.628 2.97-2.628h0.342v2.448h-1.44q-0.954 0-1.476 0.576-0.522 0.558-0.522 1.44v4.824h-2.664z"/>
66 <path d="m271 606.7q-2.304 0-3.528-1.278t-1.224-3.546q0-2.286 1.206-3.582 1.224-1.314 3.312-1.314 2.07 0 3.276 1.278 1.206 1.26 1.206 3.438v0.792h-6.354v0.162q0 0.918 0.576 1.458t1.62 0.54q1.476 0 2.448-1.152l1.44 1.566q-0.594 0.738-1.584 1.188t-2.394 0.45zm-0.216-7.812q-0.864 0-1.386 0.54-0.504 0.522-0.504 1.422v0.144h3.744v-0.144q0-0.9-0.504-1.422-0.486-0.54-1.35-0.54z"/>
67 <path d="m281.4 603.8q0 0.252 0.18 0.432t0.432 0.18h1.566v2.07h-1.998q-1.404 0-2.124-0.72-0.72-0.738-0.72-1.962v-4.536h-1.8v-2.07h1.8v-3.276h2.664v3.276h2.178v2.07h-2.178z"/>
68 </g>
69 <use transform="translate(0 340)" style="" xlink:href="#a"/>
70 <use transform="translate(335 340)" style="" xlink:href="#a"/>
71 <use width="100%" height="100%" transform="translate(0,340)" xlink:href="#d"/>
72 <use transform="translate(0,340)" style="" xlink:href="#b"/>
73 <use transform="translate(335,340)" style="" xlink:href="#b"/>
74 <g aria-label="Public transport">
75 <path d="m139.9 311.4v-12.56h4.86q1.836 0 2.844 1.08 1.008 1.062 1.008 2.916t-1.008 2.934q-1.008 1.062-2.844 1.062h-2.142v4.572zm2.718-6.75h1.458q0.936 0 1.314-0.36t0.378-1.188v-0.54q0-0.828-0.378-1.188t-1.314-0.36h-1.458z"/>
76 <path d="m156.3 309.7h-0.108q-0.342 0.864-1.026 1.386-0.666 0.522-1.71 0.522-1.368 0-2.196-0.918t-0.828-2.574v-6.012h2.664v5.652q0 0.882 0.396 1.35 0.396 0.45 1.17 0.45 0.666 0 1.152-0.36t0.486-0.99v-6.102h2.664v9.288h-2.664z"/>
77 <path d="m161.2 298.1h2.664v5.724h0.126q0.378-0.9 1.026-1.404 0.666-0.504 1.728-0.504 1.602 0 2.538 1.224 0.954 1.206 0.954 3.636t-0.954 3.654q-0.936 1.206-2.538 1.206-1.062 0-1.728-0.504-0.648-0.504-1.026-1.404h-0.126v1.692h-2.664zm4.392 11.47q0.882 0 1.368-0.54 0.504-0.558 0.504-1.53v-1.44q0-0.972-0.504-1.512-0.486-0.558-1.368-0.558-0.756 0-1.242 0.36t-0.486 1.062v2.736q0 0.702 0.486 1.062t1.242 0.36z"/>
78 <path d="m174.7 311.4q-2.646 0-2.646-2.592v-10.73h2.664v10.66q0 0.288 0.144 0.45 0.162 0.144 0.45 0.144h0.594v2.07z"/>
79 <path d="m180.5 298v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/>
80 <path d="m187.5 311.6q-2.196 0-3.456-1.296-1.242-1.296-1.242-3.564 0-2.25 1.242-3.546 1.26-1.314 3.438-1.314 2.79 0 3.87 2.268l-2.052 1.116q-0.27-0.594-0.702-0.918-0.414-0.342-1.116-0.342-0.9 0-1.404 0.54-0.504 0.522-0.504 1.44v1.512q0 0.936 0.504 1.458t1.44 0.522q0.72 0 1.17-0.324 0.468-0.342 0.792-0.972l2.016 1.152q-0.522 1.062-1.512 1.674-0.99 0.594-2.484 0.594z"/>
81 <path d="m205.9 308.7q0 0.252 0.18 0.432t0.432 0.18h1.566v2.07h-1.998q-1.404 0-2.124-0.72-0.72-0.738-0.72-1.962v-4.536h-1.8v-2.07h1.8v-3.276h2.664v3.276h2.178v2.07h-2.178z"/>
82 <path d="m210 302.1h2.664v2.628h0.126q0.666-2.628 2.97-2.628h0.342v2.448h-1.44q-0.954 0-1.476 0.576-0.522 0.558-0.522 1.44v4.824h-2.664z"/>
83 <path d="m225.6 311.4q-0.828 0-1.35-0.432-0.504-0.432-0.576-1.206h-0.09q-0.234 0.9-0.99 1.386-0.756 0.468-1.836 0.468-1.368 0-2.178-0.738t-0.81-2.034q0-2.862 4.176-2.862h1.494v-0.468q0-0.846-0.396-1.26t-1.296-0.414q-0.792 0-1.332 0.306-0.522 0.306-0.936 0.864l-1.458-1.296q0.486-0.828 1.512-1.314 1.026-0.504 2.52-0.504 1.926 0 2.988 0.9 1.062 0.882 1.062 2.61v3.456q0 0.252 0.18 0.432t0.432 0.18h0.414v1.926zm-3.834-1.53q0.738 0 1.206-0.342 0.468-0.36 0.468-0.99v-1.116h-1.422q-0.792 0-1.224 0.288-0.414 0.27-0.414 0.81v0.36q0 0.486 0.36 0.738 0.378 0.252 1.026 0.252z"/>
84 <path d="m228.8 311.4v-9.288h2.664v1.692h0.108q0.342-0.864 1.008-1.386 0.684-0.522 1.728-0.522 1.368 0 2.196 0.918t0.828 2.574v6.012h-2.664v-5.652q0-0.882-0.396-1.332-0.396-0.468-1.17-0.468-0.666 0-1.152 0.36t-0.486 0.99v6.102z"/>
85 <path d="m243.7 311.6q-1.53 0-2.682-0.468t-1.728-1.278l1.494-1.386q1.152 1.26 2.934 1.26 0.792 0 1.242-0.252t0.45-0.738q0-0.36-0.288-0.522-0.27-0.18-0.864-0.27l-1.494-0.234q-1.368-0.216-2.178-0.846-0.792-0.63-0.792-1.872 0-1.458 1.116-2.286 1.134-0.828 3.132-0.828 2.646 0 3.87 1.422l-1.332 1.512q-0.432-0.486-1.098-0.774t-1.53-0.288q-0.756 0-1.152 0.252-0.396 0.234-0.396 0.684 0 0.378 0.27 0.558 0.288 0.162 0.882 0.252l1.476 0.234q1.386 0.216 2.178 0.846 0.81 0.63 0.81 1.872 0 1.458-1.134 2.304t-3.186 0.846z"/>
86 <path d="m250.2 302.1h2.664v1.692h0.126q0.378-0.9 1.026-1.404 0.666-0.504 1.728-0.504 1.602 0 2.538 1.224 0.954 1.206 0.954 3.636t-0.954 3.654q-0.936 1.206-2.538 1.206-1.062 0-1.728-0.504-0.648-0.504-1.026-1.404h-0.126v5.292h-2.664zm4.392 7.434q0.882 0 1.368-0.54 0.504-0.558 0.504-1.53v-1.44q0-0.972-0.504-1.512-0.486-0.558-1.368-0.558-0.756 0-1.242 0.36t-0.486 1.062v2.736q0 0.702 0.486 1.062t1.242 0.36z"/>
87 <path d="m265.4 311.6q-2.178 0-3.42-1.296-1.242-1.314-1.242-3.564t1.242-3.546q1.242-1.314 3.42-1.314t3.42 1.314q1.242 1.296 1.242 3.546t-1.242 3.564q-1.242 1.296-3.42 1.296zm0-1.98q0.9 0 1.404-0.558t0.504-1.584v-1.476q0-1.026-0.504-1.584t-1.404-0.558-1.404 0.558-0.504 1.584v1.476q0 1.026 0.504 1.584t1.404 0.558z"/>
88 <path d="m272 302.1h2.664v2.628h0.126q0.666-2.628 2.97-2.628h0.342v2.448h-1.44q-0.954 0-1.476 0.576-0.522 0.558-0.522 1.44v4.824h-2.664z"/>
89 <path d="m284.1 308.7q0 0.252 0.18 0.432t0.432 0.18h1.566v2.07h-1.998q-1.404 0-2.124-0.72-0.72-0.738-0.72-1.962v-4.536h-1.8v-2.07h1.8v-3.276h2.664v3.276h2.178v2.07h-2.178z"/>
90 </g>
91 <g id="a" aria-label="=">
92 <path d="m41.47 204.4v-2.124h8.568v2.124zm0 4.14v-2.124h8.568v2.124z"/>
93 </g>
94 <use transform="translate(335)" style="" xlink:href="#a"/>
95 <g id="d" aria-label="Secret colours">
96 <path d="m150.5 177q-1.53 0-2.718-0.504-1.188-0.522-1.926-1.44l1.566-1.728q0.666 0.738 1.476 1.116 0.828 0.36 1.692 0.36 0.954 0 1.458-0.432 0.522-0.432 0.522-1.242 0-0.666-0.396-1.008-0.378-0.342-1.296-0.486l-1.314-0.216q-1.62-0.27-2.412-1.206-0.792-0.954-0.792-2.394 0-1.8 1.188-2.808t3.33-1.008q1.404 0 2.502 0.45 1.098 0.432 1.782 1.224l-1.53 1.71q-0.504-0.576-1.206-0.882t-1.53-0.306q-1.818 0-1.818 1.494 0 0.63 0.396 0.972 0.396 0.324 1.332 0.486l1.314 0.234q1.53 0.27 2.358 1.17t0.828 2.358q0 1.188-0.558 2.124-0.54 0.918-1.638 1.44-1.08 0.522-2.61 0.522z"/>
97 <path d="m161.7 177q-2.304 0-3.528-1.278t-1.224-3.546q0-2.286 1.206-3.582 1.224-1.314 3.312-1.314 2.07 0 3.276 1.278 1.206 1.26 1.206 3.438v0.792h-6.354v0.162q0 0.918 0.576 1.458t1.62 0.54q1.476 0 2.448-1.152l1.44 1.566q-0.594 0.738-1.584 1.188t-2.394 0.45zm-0.216-7.812q-0.864 0-1.386 0.54-0.504 0.522-0.504 1.422v0.144h3.744v-0.144q0-0.9-0.504-1.422-0.486-0.54-1.35-0.54z"/>
98 <path d="m172.7 177q-2.196 0-3.456-1.296-1.242-1.296-1.242-3.564 0-2.25 1.242-3.546 1.26-1.314 3.438-1.314 2.79 0 3.87 2.268l-2.052 1.116q-0.27-0.594-0.702-0.918-0.414-0.342-1.116-0.342-0.9 0-1.404 0.54-0.504 0.522-0.504 1.44v1.512q0 0.936 0.504 1.458t1.44 0.522q0.72 0 1.17-0.324 0.468-0.342 0.792-0.972l2.016 1.152q-0.522 1.062-1.512 1.674-0.99 0.594-2.484 0.594z"/>
99 <path d="m179 167.5h2.664v2.628h0.126q0.666-2.628 2.97-2.628h0.342v2.448h-1.44q-0.954 0-1.476 0.576-0.522 0.558-0.522 1.44v4.824h-2.664z"/>
100 <path d="m191.4 177q-2.304 0-3.528-1.278t-1.224-3.546q0-2.286 1.206-3.582 1.224-1.314 3.312-1.314 2.07 0 3.276 1.278 1.206 1.26 1.206 3.438v0.792h-6.354v0.162q0 0.918 0.576 1.458t1.62 0.54q1.476 0 2.448-1.152l1.44 1.566q-0.594 0.738-1.584 1.188t-2.394 0.45zm-0.216-7.812q-0.864 0-1.386 0.54-0.504 0.522-0.504 1.422v0.144h3.744v-0.144q0-0.9-0.504-1.422-0.486-0.54-1.35-0.54z"/>
101 <path d="m201.8 174.1q0 0.252 0.18 0.432t0.432 0.18h1.566v2.07h-1.998q-1.404 0-2.124-0.72-0.72-0.738-0.72-1.962v-4.536h-1.8v-2.07h1.8v-3.276h2.664v3.276h2.178v2.07h-2.178z"/>
102 <path d="m218.5 177q-2.196 0-3.456-1.296-1.242-1.296-1.242-3.564 0-2.25 1.242-3.546 1.26-1.314 3.438-1.314 2.79 0 3.87 2.268l-2.052 1.116q-0.27-0.594-0.702-0.918-0.414-0.342-1.116-0.342-0.9 0-1.404 0.54-0.504 0.522-0.504 1.44v1.512q0 0.936 0.504 1.458t1.44 0.522q0.72 0 1.17-0.324 0.468-0.342 0.792-0.972l2.016 1.152q-0.522 1.062-1.512 1.674-0.99 0.594-2.484 0.594z"/>
103 <path d="m228.9 177q-2.178 0-3.42-1.296-1.242-1.314-1.242-3.564t1.242-3.546q1.242-1.314 3.42-1.314t3.42 1.314q1.242 1.296 1.242 3.546t-1.242 3.564q-1.242 1.296-3.42 1.296zm0-1.98q0.9 0 1.404-0.558t0.504-1.584v-1.476q0-1.026-0.504-1.584t-1.404-0.558-1.404 0.558-0.504 1.584v1.476q0 1.026 0.504 1.584t1.404 0.558z"/>
104 <path d="m238.1 176.8q-2.646 0-2.646-2.592v-10.73h2.664v10.66q0 0.288 0.144 0.45 0.162 0.144 0.45 0.144h0.594v2.07z"/>
105 <path d="m245.1 177q-2.178 0-3.42-1.296-1.242-1.314-1.242-3.564t1.242-3.546q1.242-1.314 3.42-1.314t3.42 1.314q1.242 1.296 1.242 3.546t-1.242 3.564q-1.242 1.296-3.42 1.296zm0-1.98q0.9 0 1.404-0.558t0.504-1.584v-1.476q0-1.026-0.504-1.584t-1.404-0.558-1.404 0.558-0.504 1.584v1.476q0 1.026 0.504 1.584t1.404 0.558z"/>
106 <path d="m257.5 175.1h-0.108q-0.342 0.864-1.026 1.386-0.666 0.522-1.71 0.522-1.368 0-2.196-0.918t-0.828-2.574v-6.012h2.664v5.652q0 0.882 0.396 1.35 0.396 0.45 1.17 0.45 0.666 0 1.152-0.36t0.486-0.99v-6.102h2.664v9.288h-2.664z"/>
107 <path d="m262.6 167.5h2.664v2.628h0.126q0.666-2.628 2.97-2.628h0.342v2.448h-1.44q-0.954 0-1.476 0.576-0.522 0.558-0.522 1.44v4.824h-2.664z"/>
108 <path d="m274.7 177q-1.53 0-2.682-0.468t-1.728-1.278l1.494-1.386q1.152 1.26 2.934 1.26 0.792 0 1.242-0.252t0.45-0.738q0-0.36-0.288-0.522-0.27-0.18-0.864-0.27l-1.494-0.234q-1.368-0.216-2.178-0.846-0.792-0.63-0.792-1.872 0-1.458 1.116-2.286 1.134-0.828 3.132-0.828 2.646 0 3.87 1.422l-1.332 1.512q-0.432-0.486-1.098-0.774t-1.53-0.288q-0.756 0-1.152 0.252-0.396 0.234-0.396 0.684 0 0.378 0.27 0.558 0.288 0.162 0.882 0.252l1.476 0.234q1.386 0.216 2.178 0.846 0.81 0.63 0.81 1.872 0 1.458-1.134 2.304t-3.186 0.846z"/>
109 </g>
110 <g id="b" aria-label="+">
111 <path d="m44.6 139.8v-3.312h-3.132v-2.124h3.132v-3.312h2.304v3.312h3.132v2.124h-3.132v3.312z"/>
112 </g>
113 <use transform="translate(335)" style="" xlink:href="#b"/>
114 <g aria-label="Common paint">
115 <path d="m153.7 85.37q-2.484 0-3.726-1.674-1.224-1.674-1.224-4.824t1.224-4.824q1.242-1.674 3.726-1.674 3.618 0 4.446 3.618l-2.52 0.612q-0.234-1.008-0.666-1.53t-1.314-0.522q-1.062 0-1.548 0.828-0.468 0.828-0.468 2.394v2.196q0 1.566 0.468 2.394 0.486 0.828 1.548 0.828 0.882 0 1.314-0.522t0.666-1.53l2.52 0.612q-0.828 3.618-4.446 3.618z"/>
116 <path d="m164.2 85.37q-2.178 0-3.42-1.296-1.242-1.314-1.242-3.564t1.242-3.546q1.242-1.314 3.42-1.314t3.42 1.314q1.242 1.296 1.242 3.546t-1.242 3.564q-1.242 1.296-3.42 1.296zm0-1.98q0.9 0 1.404-0.558t0.504-1.584v-1.476q0-1.026-0.504-1.584t-1.404-0.558-1.404 0.558-0.504 1.584v1.476q0 1.026 0.504 1.584t1.404 0.558z"/>
117 <path d="m170.8 75.7h2.664v1.602h0.108q0.27-0.828 0.9-1.314 0.648-0.504 1.638-0.504 0.972 0 1.656 0.486t0.99 1.422h0.054q0.27-0.828 1.044-1.368 0.792-0.54 1.836-0.54 1.368 0 2.088 0.99 0.738 0.972 0.738 2.754v5.922h-2.664v-5.706q0-0.918-0.324-1.35-0.306-0.45-0.972-0.45-0.648 0-1.116 0.36-0.45 0.36-0.45 1.026v6.12h-2.664v-5.706q0-1.8-1.296-1.8-0.63 0-1.098 0.36t-0.468 1.026v6.12h-2.664z"/>
118 <path d="m187 75.7h2.664v1.602h0.108q0.27-0.828 0.9-1.314 0.648-0.504 1.638-0.504 0.972 0 1.656 0.486t0.99 1.422h0.054q0.27-0.828 1.044-1.368 0.792-0.54 1.836-0.54 1.368 0 2.088 0.99 0.738 0.972 0.738 2.754v5.922h-2.664v-5.706q0-0.918-0.324-1.35-0.306-0.45-0.972-0.45-0.648 0-1.116 0.36-0.45 0.36-0.45 1.026v6.12h-2.664v-5.706q0-1.8-1.296-1.8-0.63 0-1.098 0.36t-0.468 1.026v6.12h-2.664z"/>
119 <path d="m207.4 85.37q-2.178 0-3.42-1.296-1.242-1.314-1.242-3.564t1.242-3.546q1.242-1.314 3.42-1.314t3.42 1.314q1.242 1.296 1.242 3.546t-1.242 3.564q-1.242 1.296-3.42 1.296zm0-1.98q0.9 0 1.404-0.558t0.504-1.584v-1.476q0-1.026-0.504-1.584t-1.404-0.558-1.404 0.558-0.504 1.584v1.476q0 1.026 0.504 1.584t1.404 0.558z"/>
120 <path d="m213.9 85.15v-9.288h2.664v1.692h0.108q0.342-0.864 1.008-1.386 0.684-0.522 1.728-0.522 1.368 0 2.196 0.918t0.828 2.574v6.012h-2.664v-5.652q0-0.882-0.396-1.332-0.396-0.468-1.17-0.468-0.666 0-1.152 0.36t-0.486 0.99v6.102z"/>
121 <path d="m232.7 75.87h2.664v1.692h0.126q0.378-0.9 1.026-1.404 0.666-0.504 1.728-0.504 1.602 0 2.538 1.224 0.954 1.206 0.954 3.636t-0.954 3.654q-0.936 1.206-2.538 1.206-1.062 0-1.728-0.504-0.648-0.504-1.026-1.404h-0.126v5.292h-2.664zm4.392 7.434q0.882 0 1.368-0.54 0.504-0.558 0.504-1.53v-1.44q0-0.972-0.504-1.512-0.486-0.558-1.368-0.558-0.756 0-1.242 0.36t-0.486 1.062v2.736q0 0.702 0.486 1.062t1.242 0.36z"/>
122 <path d="m251.2 85.15q-0.828 0-1.35-0.432-0.504-0.432-0.576-1.206h-0.09q-0.234 0.9-0.99 1.386-0.756 0.468-1.836 0.468-1.368 0-2.178-0.738t-0.81-2.034q0-2.862 4.176-2.862h1.494v-0.468q0-0.846-0.396-1.26t-1.296-0.414q-0.792 0-1.332 0.306-0.522 0.306-0.936 0.864l-1.458-1.296q0.486-0.828 1.512-1.314 1.026-0.504 2.52-0.504 1.926 0 2.988 0.9 1.062 0.882 1.062 2.61v3.456q0 0.252 0.18 0.432t0.432 0.18h0.414v1.926zm-3.834-1.53q0.738 0 1.206-0.342 0.468-0.36 0.468-0.99v-1.116h-1.422q-0.792 0-1.224 0.288-0.414 0.27-0.414 0.81v0.36q0 0.486 0.36 0.738 0.378 0.252 1.026 0.252z"/>
123 <path d="m257.4 71.74v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/>
124 <path d="m259.8 85.15v-9.288h2.664v1.692h0.108q0.342-0.864 1.008-1.386 0.684-0.522 1.728-0.522 1.368 0 2.196 0.918t0.828 2.574v6.012h-2.664v-5.652q0-0.882-0.396-1.332-0.396-0.468-1.17-0.468-0.666 0-1.152 0.36t-0.486 0.99v6.102z"/>
125 <path d="m274.7 82.47q0 0.252 0.18 0.432t0.432 0.18h1.566v2.07h-1.998q-1.404 0-2.124-0.72-0.72-0.738-0.72-1.962v-4.536h-1.8v-2.07h1.8v-3.276h2.664v3.276h2.178v2.07h-2.178z"/>
126 </g>
127 <g aria-label="Alice">
128 <path d="m21.98 24.56-1.408-5.376h-6.112l-1.376 5.376h-4.864l6.048-22.34h6.784l6.048 22.34zm-4.32-17.7h-0.256l-2.176 8.448h4.608z"/>
129 <path d="m34.03 24.56q-4.704 0-4.704-4.608v-19.07h4.736v18.94q0 0.512 0.256 0.8 0.288 0.256 0.8 0.256h1.056v3.68z"/>
130 <path d="m44.23 0.7225v5.056h-5.088v-5.056zm-4.928 7.328h4.736v16.51h-4.736z"/>
131 <path d="m56.77 24.95q-3.904 0-6.144-2.304-2.208-2.304-2.208-6.336 0-4 2.208-6.304 2.24-2.336 6.112-2.336 4.96 0 6.88 4.032l-3.648 1.984q-0.48-1.056-1.248-1.632-0.736-0.608-1.984-0.608-1.6 0-2.496 0.96-0.896 0.928-0.896 2.56v2.688q0 1.664 0.896 2.592t2.56 0.928q1.28 0 2.08-0.576 0.832-0.608 1.408-1.728l3.584 2.048q-0.928 1.888-2.688 2.976-1.76 1.056-4.416 1.056z"/>
132 <path d="m75.73 24.95q-4.096 0-6.272-2.272t-2.176-6.304q0-4.064 2.144-6.368 2.176-2.336 5.888-2.336 3.68 0 5.824 2.272 2.144 2.24 2.144 6.112v1.408h-11.3v0.288q0 1.632 1.024 2.592t2.88 0.96q2.624 0 4.352-2.048l2.56 2.784q-1.056 1.312-2.816 2.112t-4.256 0.8zm-0.384-13.89q-1.536 0-2.464 0.96-0.896 0.928-0.896 2.528v0.256h6.656v-0.256q0-1.6-0.896-2.528-0.864-0.96-2.4-0.96z"/>
133 </g>
134 <g aria-label="Bob">
135 <path d="m353.8 2.226h7.84q3.232 0 4.992 1.6 1.792 1.6 1.792 4.352 0 3.648-3.648 4.704v0.192q4.352 1.056 4.352 5.344 0 2.816-1.824 4.48-1.792 1.664-4.928 1.664h-8.576zm6.496 9.472q1.728 0 2.464-0.576 0.768-0.576 0.768-2.016v-0.96q0-1.44-0.768-1.984-0.736-0.576-2.464-0.576h-1.824v6.112zm0.608 9.504q1.76 0 2.528-0.576 0.8-0.608 0.8-2.112v-0.928q0-1.472-0.8-2.08-0.768-0.608-2.528-0.608h-2.432v6.304z"/>
136 <path d="m380.1 24.95q-3.872 0-6.08-2.304-2.208-2.336-2.208-6.336t2.208-6.304q2.208-2.336 6.08-2.336t6.08 2.336q2.208 2.304 2.208 6.304t-2.208 6.336q-2.208 2.304-6.08 2.304zm0-3.52q1.6 0 2.496-0.992t0.896-2.816v-2.624q0-1.824-0.896-2.816t-2.496-0.992-2.496 0.992-0.896 2.816v2.624q0 1.824 0.896 2.816t2.496 0.992z"/>
137 <path d="m391.6 0.8825h4.736v10.18h0.224q0.672-1.6 1.824-2.496 1.184-0.896 3.072-0.896 2.848 0 4.512 2.176 1.696 2.144 1.696 6.464t-1.696 6.496q-1.664 2.144-4.512 2.144-1.888 0-3.072-0.896-1.152-0.896-1.824-2.496h-0.224v3.008h-4.736zm7.808 20.38q1.568 0 2.432-0.96 0.896-0.992 0.896-2.72v-2.56q0-1.728-0.896-2.688-0.864-0.992-2.432-0.992-1.344 0-2.208 0.64t-0.864 1.888v4.864q0 1.248 0.864 1.888t2.208 0.64z"/>
138 </g>
139 <g aria-label="(assume that mixture separation is expensive)">
140 <path d="m152.4 375.8q0-1.692 0.504-3.258t1.35-2.808 1.89-2.016h2.664q-1.8 1.242-2.988 3.132t-1.188 4.032v1.836q0 2.142 1.188 4.032t2.988 3.132h-2.664q-1.044-0.774-1.89-2.016t-1.35-2.808-0.504-3.258z"/>
141 <path d="m168.8 381.4q-0.828 0-1.35-0.432-0.504-0.432-0.576-1.206h-0.09q-0.234 0.9-0.99 1.386-0.756 0.468-1.836 0.468-1.368 0-2.178-0.738t-0.81-2.034q0-2.862 4.176-2.862h1.494v-0.468q0-0.846-0.396-1.26t-1.296-0.414q-0.792 0-1.332 0.306-0.522 0.306-0.936 0.864l-1.458-1.296q0.486-0.828 1.512-1.314 1.026-0.504 2.52-0.504 1.926 0 2.988 0.9 1.062 0.882 1.062 2.61v3.456q0 0.252 0.18 0.432t0.432 0.18h0.414v1.926zm-3.834-1.53q0.738 0 1.206-0.342 0.468-0.36 0.468-0.99v-1.116h-1.422q-0.792 0-1.224 0.288-0.414 0.27-0.414 0.81v0.36q0 0.486 0.36 0.738 0.378 0.252 1.026 0.252z"/>
142 <path d="m176.1 381.6q-1.53 0-2.682-0.468t-1.728-1.278l1.494-1.386q1.152 1.26 2.934 1.26 0.792 0 1.242-0.252t0.45-0.738q0-0.36-0.288-0.522-0.27-0.18-0.864-0.27l-1.494-0.234q-1.368-0.216-2.178-0.846-0.792-0.63-0.792-1.872 0-1.458 1.116-2.286 1.134-0.828 3.132-0.828 2.646 0 3.87 1.422l-1.332 1.512q-0.432-0.486-1.098-0.774t-1.53-0.288q-0.756 0-1.152 0.252-0.396 0.234-0.396 0.684 0 0.378 0.27 0.558 0.288 0.162 0.882 0.252l1.476 0.234q1.386 0.216 2.178 0.846 0.81 0.63 0.81 1.872 0 1.458-1.134 2.304t-3.186 0.846z"/>
143 <path d="m186.9 381.6q-1.53 0-2.682-0.468t-1.728-1.278l1.494-1.386q1.152 1.26 2.934 1.26 0.792 0 1.242-0.252t0.45-0.738q0-0.36-0.288-0.522-0.27-0.18-0.864-0.27l-1.494-0.234q-1.368-0.216-2.178-0.846-0.792-0.63-0.792-1.872 0-1.458 1.116-2.286 1.134-0.828 3.132-0.828 2.646 0 3.87 1.422l-1.332 1.512q-0.432-0.486-1.098-0.774t-1.53-0.288q-0.756 0-1.152 0.252-0.396 0.234-0.396 0.684 0 0.378 0.27 0.558 0.288 0.162 0.882 0.252l1.476 0.234q1.386 0.216 2.178 0.846 0.81 0.63 0.81 1.872 0 1.458-1.134 2.304t-3.186 0.846z"/>
144 <path d="m199.4 379.7h-0.108q-0.342 0.864-1.026 1.386-0.666 0.522-1.71 0.522-1.368 0-2.196-0.918t-0.828-2.574v-6.012h2.664v5.652q0 0.882 0.396 1.35 0.396 0.45 1.17 0.45 0.666 0 1.152-0.36t0.486-0.99v-6.102h2.664v9.288h-2.664z"/>
145 <path d="m204.4 371.9h2.664v1.602h0.108q0.27-0.828 0.9-1.314 0.648-0.504 1.638-0.504 0.972 0 1.656 0.486t0.99 1.422h0.054q0.27-0.828 1.044-1.368 0.792-0.54 1.836-0.54 1.368 0 2.088 0.99 0.738 0.972 0.738 2.754v5.922h-2.664v-5.706q0-0.918-0.324-1.35-0.306-0.45-0.972-0.45-0.648 0-1.116 0.36-0.45 0.36-0.45 1.026v6.12h-2.664v-5.706q0-1.8-1.296-1.8-0.63 0-1.098 0.36t-0.468 1.026v6.12h-2.664z"/>
146 <path d="m225 381.6q-2.304 0-3.528-1.278t-1.224-3.546q0-2.286 1.206-3.582 1.224-1.314 3.312-1.314 2.07 0 3.276 1.278 1.206 1.26 1.206 3.438v0.792h-6.354v0.162q0 0.918 0.576 1.458t1.62 0.54q1.476 0 2.448-1.152l1.44 1.566q-0.594 0.738-1.584 1.188t-2.394 0.45zm-0.216-7.812q-0.864 0-1.386 0.54-0.504 0.522-0.504 1.422v0.144h3.744v-0.144q0-0.9-0.504-1.422-0.486-0.54-1.35-0.54z"/>
147 <path d="m243.5 378.7q0 0.252 0.18 0.432t0.432 0.18h1.566v2.07h-1.998q-1.404 0-2.124-0.72-0.72-0.738-0.72-1.962v-4.536h-1.8v-2.07h1.8v-3.276h2.664v3.276h2.178v2.07h-2.178z"/>
148 <path d="m247.5 368.1h2.664v5.724h0.108q0.342-0.864 1.008-1.386 0.684-0.522 1.728-0.522 1.368 0 2.196 0.918t0.828 2.574v6.012h-2.664v-5.652q0-0.882-0.396-1.332-0.396-0.468-1.17-0.468-0.666 0-1.152 0.36t-0.486 0.99v6.102h-2.664z"/>
149 <path d="m265.9 381.4q-0.828 0-1.35-0.432-0.504-0.432-0.576-1.206h-0.09q-0.234 0.9-0.99 1.386-0.756 0.468-1.836 0.468-1.368 0-2.178-0.738t-0.81-2.034q0-2.862 4.176-2.862h1.494v-0.468q0-0.846-0.396-1.26t-1.296-0.414q-0.792 0-1.332 0.306-0.522 0.306-0.936 0.864l-1.458-1.296q0.486-0.828 1.512-1.314 1.026-0.504 2.52-0.504 1.926 0 2.988 0.9 1.062 0.882 1.062 2.61v3.456q0 0.252 0.18 0.432t0.432 0.18h0.414v1.926zm-3.834-1.53q0.738 0 1.206-0.342 0.468-0.36 0.468-0.99v-1.116h-1.422q-0.792 0-1.224 0.288-0.414 0.27-0.414 0.81v0.36q0 0.486 0.36 0.738 0.378 0.252 1.026 0.252z"/>
150 <path d="m273.2 378.7q0 0.252 0.18 0.432t0.432 0.18h1.566v2.07h-1.998q-1.404 0-2.124-0.72-0.72-0.738-0.72-1.962v-4.536h-1.8v-2.07h1.8v-3.276h2.664v3.276h2.178v2.07h-2.178z"/>
151 <path d="m126.2 394.4h2.664v1.602h0.108q0.27-0.828 0.9-1.314 0.648-0.504 1.638-0.504 0.972 0 1.656 0.486t0.99 1.422h0.054q0.27-0.828 1.044-1.368 0.792-0.54 1.836-0.54 1.368 0 2.088 0.99 0.738 0.972 0.738 2.754v5.922h-2.664v-5.706q0-0.918-0.324-1.35-0.306-0.45-0.972-0.45-0.648 0-1.116 0.36-0.45 0.36-0.45 1.026v6.12h-2.664v-5.706q0-1.8-1.296-1.8-0.63 0-1.098 0.36t-0.468 1.026v6.12h-2.664z"/>
152 <path d="m145.3 390.5v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/>
153 <path d="m147 403.9 3.474-4.716-3.24-4.572h3.042l0.99 1.494 0.756 1.206h0.144l0.774-1.206 1.008-1.494h2.79l-3.24 4.428 3.474 4.86h-3.06l-1.17-1.746-0.81-1.242h-0.144l-0.792 1.242-1.188 1.746z"/>
154 <path d="m162.6 401.2q0 0.252 0.18 0.432t0.432 0.18h1.566v2.07h-1.998q-1.404 0-2.124-0.72-0.72-0.738-0.72-1.962v-4.536h-1.8v-2.07h1.8v-3.276h2.664v3.276h2.178v2.07h-2.178z"/>
155 <path d="m172.4 402.2h-0.108q-0.342 0.864-1.026 1.386-0.666 0.522-1.71 0.522-1.368 0-2.196-0.918t-0.828-2.574v-6.012h2.664v5.652q0 0.882 0.396 1.35 0.396 0.45 1.17 0.45 0.666 0 1.152-0.36t0.486-0.99v-6.102h2.664v9.288h-2.664z"/>
156 <path d="m177.5 394.6h2.664v2.628h0.126q0.666-2.628 2.97-2.628h0.342v2.448h-1.44q-0.954 0-1.476 0.576-0.522 0.558-0.522 1.44v4.824h-2.664z"/>
157 <path d="m190 404.1q-2.304 0-3.528-1.278t-1.224-3.546q0-2.286 1.206-3.582 1.224-1.314 3.312-1.314 2.07 0 3.276 1.278 1.206 1.26 1.206 3.438v0.792h-6.354v0.162q0 0.918 0.576 1.458t1.62 0.54q1.476 0 2.448-1.152l1.44 1.566q-0.594 0.738-1.584 1.188t-2.394 0.45zm-0.216-7.812q-0.864 0-1.386 0.54-0.504 0.522-0.504 1.422v0.144h3.744v-0.144q0-0.9-0.504-1.422-0.486-0.54-1.35-0.54z"/>
158 <path d="m208.5 404.1q-1.53 0-2.682-0.468t-1.728-1.278l1.494-1.386q1.152 1.26 2.934 1.26 0.792 0 1.242-0.252t0.45-0.738q0-0.36-0.288-0.522-0.27-0.18-0.864-0.27l-1.494-0.234q-1.368-0.216-2.178-0.846-0.792-0.63-0.792-1.872 0-1.458 1.116-2.286 1.134-0.828 3.132-0.828 2.646 0 3.87 1.422l-1.332 1.512q-0.432-0.486-1.098-0.774t-1.53-0.288q-0.756 0-1.152 0.252-0.396 0.234-0.396 0.684 0 0.378 0.27 0.558 0.288 0.162 0.882 0.252l1.476 0.234q1.386 0.216 2.178 0.846 0.81 0.63 0.81 1.872 0 1.458-1.134 2.304t-3.186 0.846z"/>
159 <path d="m219.6 404.1q-2.304 0-3.528-1.278t-1.224-3.546q0-2.286 1.206-3.582 1.224-1.314 3.312-1.314 2.07 0 3.276 1.278 1.206 1.26 1.206 3.438v0.792h-6.354v0.162q0 0.918 0.576 1.458t1.62 0.54q1.476 0 2.448-1.152l1.44 1.566q-0.594 0.738-1.584 1.188t-2.394 0.45zm-0.216-7.812q-0.864 0-1.386 0.54-0.504 0.522-0.504 1.422v0.144h3.744v-0.144q0-0.9-0.504-1.422-0.486-0.54-1.35-0.54z"/>
160 <path d="m225.8 394.6h2.664v1.692h0.126q0.378-0.9 1.026-1.404 0.666-0.504 1.728-0.504 1.602 0 2.538 1.224 0.954 1.206 0.954 3.636t-0.954 3.654q-0.936 1.206-2.538 1.206-1.062 0-1.728-0.504-0.648-0.504-1.026-1.404h-0.126v5.292h-2.664zm4.392 7.434q0.882 0 1.368-0.54 0.504-0.558 0.504-1.53v-1.44q0-0.972-0.504-1.512-0.486-0.558-1.368-0.558-0.756 0-1.242 0.36t-0.486 1.062v2.736q0 0.702 0.486 1.062t1.242 0.36z"/>
161 <path d="m244.3 403.9q-0.828 0-1.35-0.432-0.504-0.432-0.576-1.206h-0.09q-0.234 0.9-0.99 1.386-0.756 0.468-1.836 0.468-1.368 0-2.178-0.738t-0.81-2.034q0-2.862 4.176-2.862h1.494v-0.468q0-0.846-0.396-1.26t-1.296-0.414q-0.792 0-1.332 0.306-0.522 0.306-0.936 0.864l-1.458-1.296q0.486-0.828 1.512-1.314 1.026-0.504 2.52-0.504 1.926 0 2.988 0.9 1.062 0.882 1.062 2.61v3.456q0 0.252 0.18 0.432t0.432 0.18h0.414v1.926zm-3.834-1.53q0.738 0 1.206-0.342 0.468-0.36 0.468-0.99v-1.116h-1.422q-0.792 0-1.224 0.288-0.414 0.27-0.414 0.81v0.36q0 0.486 0.36 0.738 0.378 0.252 1.026 0.252z"/>
162 <path d="m247.6 394.6h2.664v2.628h0.126q0.666-2.628 2.97-2.628h0.342v2.448h-1.44q-0.954 0-1.476 0.576-0.522 0.558-0.522 1.44v4.824h-2.664z"/>
163 <path d="m263.2 403.9q-0.828 0-1.35-0.432-0.504-0.432-0.576-1.206h-0.09q-0.234 0.9-0.99 1.386-0.756 0.468-1.836 0.468-1.368 0-2.178-0.738t-0.81-2.034q0-2.862 4.176-2.862h1.494v-0.468q0-0.846-0.396-1.26t-1.296-0.414q-0.792 0-1.332 0.306-0.522 0.306-0.936 0.864l-1.458-1.296q0.486-0.828 1.512-1.314 1.026-0.504 2.52-0.504 1.926 0 2.988 0.9 1.062 0.882 1.062 2.61v3.456q0 0.252 0.18 0.432t0.432 0.18h0.414v1.926zm-3.834-1.53q0.738 0 1.206-0.342 0.468-0.36 0.468-0.99v-1.116h-1.422q-0.792 0-1.224 0.288-0.414 0.27-0.414 0.81v0.36q0 0.486 0.36 0.738 0.378 0.252 1.026 0.252z"/>
164 <path d="m270.5 401.2q0 0.252 0.18 0.432t0.432 0.18h1.566v2.07h-1.998q-1.404 0-2.124-0.72-0.72-0.738-0.72-1.962v-4.536h-1.8v-2.07h1.8v-3.276h2.664v3.276h2.178v2.07h-2.178z"/>
165 <path d="m277.5 390.5v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/>
166 <path d="m284.1 404.1q-2.178 0-3.42-1.296-1.242-1.314-1.242-3.564t1.242-3.546q1.242-1.314 3.42-1.314t3.42 1.314q1.242 1.296 1.242 3.546t-1.242 3.564q-1.242 1.296-3.42 1.296zm0-1.98q0.9 0 1.404-0.558t0.504-1.584v-1.476q0-1.026-0.504-1.584t-1.404-0.558-1.404 0.558-0.504 1.584v1.476q0 1.026 0.504 1.584t1.404 0.558z"/>
167 <path d="m290.7 403.9v-9.288h2.664v1.692h0.108q0.342-0.864 1.008-1.386 0.684-0.522 1.728-0.522 1.368 0 2.196 0.918t0.828 2.574v6.012h-2.664v-5.652q0-0.882-0.396-1.332-0.396-0.468-1.17-0.468-0.666 0-1.152 0.36t-0.486 0.99v6.102z"/>
168 <path d="m153.3 413v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/>
169 <path d="m159.9 426.6q-1.53 0-2.682-0.468t-1.728-1.278l1.494-1.386q1.152 1.26 2.934 1.26 0.792 0 1.242-0.252t0.45-0.738q0-0.36-0.288-0.522-0.27-0.18-0.864-0.27l-1.494-0.234q-1.368-0.216-2.178-0.846-0.792-0.63-0.792-1.872 0-1.458 1.116-2.286 1.134-0.828 3.132-0.828 2.646 0 3.87 1.422l-1.332 1.512q-0.432-0.486-1.098-0.774t-1.53-0.288q-0.756 0-1.152 0.252-0.396 0.234-0.396 0.684 0 0.378 0.27 0.558 0.288 0.162 0.882 0.252l1.476 0.234q1.386 0.216 2.178 0.846 0.81 0.63 0.81 1.872 0 1.458-1.134 2.304t-3.186 0.846z"/>
170 <path d="m179.2 426.6q-2.304 0-3.528-1.278t-1.224-3.546q0-2.286 1.206-3.582 1.224-1.314 3.312-1.314 2.07 0 3.276 1.278 1.206 1.26 1.206 3.438v0.792h-6.354v0.162q0 0.918 0.576 1.458t1.62 0.54q1.476 0 2.448-1.152l1.44 1.566q-0.594 0.738-1.584 1.188t-2.394 0.45zm-0.216-7.812q-0.864 0-1.386 0.54-0.504 0.522-0.504 1.422v0.144h3.744v-0.144q0-0.9-0.504-1.422-0.486-0.54-1.35-0.54z"/>
171 <path d="m184.7 426.4 3.474-4.716-3.24-4.572h3.042l0.99 1.494 0.756 1.206h0.144l0.774-1.206 1.008-1.494h2.79l-3.24 4.428 3.474 4.86h-3.06l-1.17-1.746-0.81-1.242h-0.144l-0.792 1.242-1.188 1.746z"/>
172 <path d="m196.1 417.1h2.664v1.692h0.126q0.378-0.9 1.026-1.404 0.666-0.504 1.728-0.504 1.602 0 2.538 1.224 0.954 1.206 0.954 3.636t-0.954 3.654q-0.936 1.206-2.538 1.206-1.062 0-1.728-0.504-0.648-0.504-1.026-1.404h-0.126v5.292h-2.664zm4.392 7.434q0.882 0 1.368-0.54 0.504-0.558 0.504-1.53v-1.44q0-0.972-0.504-1.512-0.486-0.558-1.368-0.558-0.756 0-1.242 0.36t-0.486 1.062v2.736q0 0.702 0.486 1.062t1.242 0.36z"/>
173 <path d="m211.5 426.6q-2.304 0-3.528-1.278t-1.224-3.546q0-2.286 1.206-3.582 1.224-1.314 3.312-1.314 2.07 0 3.276 1.278 1.206 1.26 1.206 3.438v0.792h-6.354v0.162q0 0.918 0.576 1.458t1.62 0.54q1.476 0 2.448-1.152l1.44 1.566q-0.594 0.738-1.584 1.188t-2.394 0.45zm-0.216-7.812q-0.864 0-1.386 0.54-0.504 0.522-0.504 1.422v0.144h3.744v-0.144q0-0.9-0.504-1.422-0.486-0.54-1.35-0.54z"/>
174 <path d="m217.8 426.4v-9.288h2.664v1.692h0.108q0.342-0.864 1.008-1.386 0.684-0.522 1.728-0.522 1.368 0 2.196 0.918t0.828 2.574v6.012h-2.664v-5.652q0-0.882-0.396-1.332-0.396-0.468-1.17-0.468-0.666 0-1.152 0.36t-0.486 0.99v6.102z"/>
175 <path d="m232.8 426.6q-1.53 0-2.682-0.468t-1.728-1.278l1.494-1.386q1.152 1.26 2.934 1.26 0.792 0 1.242-0.252t0.45-0.738q0-0.36-0.288-0.522-0.27-0.18-0.864-0.27l-1.494-0.234q-1.368-0.216-2.178-0.846-0.792-0.63-0.792-1.872 0-1.458 1.116-2.286 1.134-0.828 3.132-0.828 2.646 0 3.87 1.422l-1.332 1.512q-0.432-0.486-1.098-0.774t-1.53-0.288q-0.756 0-1.152 0.252-0.396 0.234-0.396 0.684 0 0.378 0.27 0.558 0.288 0.162 0.882 0.252l1.476 0.234q1.386 0.216 2.178 0.846 0.81 0.63 0.81 1.872 0 1.458-1.134 2.304t-3.186 0.846z"/>
176 <path d="m242.4 413v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/>
177 <path d="m247.5 426.4-3.33-9.288h2.808l1.206 3.978 0.882 3.096h0.144l0.882-3.096 1.206-3.978h2.7l-3.33 9.288z"/>
178 <path d="m260.1 426.6q-2.304 0-3.528-1.278t-1.224-3.546q0-2.286 1.206-3.582 1.224-1.314 3.312-1.314 2.07 0 3.276 1.278 1.206 1.26 1.206 3.438v0.792h-6.354v0.162q0 0.918 0.576 1.458t1.62 0.54q1.476 0 2.448-1.152l1.44 1.566q-0.594 0.738-1.584 1.188t-2.394 0.45zm-0.216-7.812q-0.864 0-1.386 0.54-0.504 0.522-0.504 1.422v0.144h3.744v-0.144q0-0.9-0.504-1.422-0.486-0.54-1.35-0.54z"/>
179 <path d="m272.9 420.8q0 1.692-0.504 3.258t-1.35 2.808-1.89 2.016h-2.664q1.8-1.242 2.988-3.132t1.188-4.032v-1.836q0-2.142-1.188-4.032t-2.988-3.132h2.664q1.044 0.774 1.89 2.016t1.35 2.808 0.504 3.258z"/>
180 </g>
181</svg> \ No newline at end of file
diff --git a/src/Lecture7/slides/img/plot1.png b/src/Lecture7/slides/img/plot1.png
new file mode 100644
index 0000000..15798bb
--- /dev/null
+++ b/src/Lecture7/slides/img/plot1.png
Binary files differ
diff --git a/src/Lecture7/slides/img/plot2.png b/src/Lecture7/slides/img/plot2.png
new file mode 100644
index 0000000..9ca9bae
--- /dev/null
+++ b/src/Lecture7/slides/img/plot2.png
Binary files differ
diff --git a/src/Lecture7/slides/img/plot3.png b/src/Lecture7/slides/img/plot3.png
new file mode 100644
index 0000000..0c27f8a
--- /dev/null
+++ b/src/Lecture7/slides/img/plot3.png
Binary files differ
diff --git a/src/Lecture7/slides/img/plot4.png b/src/Lecture7/slides/img/plot4.png
new file mode 100644
index 0000000..48bad2e
--- /dev/null
+++ b/src/Lecture7/slides/img/plot4.png
Binary files differ
diff --git a/src/Lecture7/slides/img/plot5.png b/src/Lecture7/slides/img/plot5.png
new file mode 100644
index 0000000..e8cfacd
--- /dev/null
+++ b/src/Lecture7/slides/img/plot5.png
Binary files differ
diff --git a/src/Lecture7/slides/img/unilu.jpg b/src/Lecture7/slides/img/unilu.jpg
new file mode 100644
index 0000000..5265563
--- /dev/null
+++ b/src/Lecture7/slides/img/unilu.jpg
Binary files differ
diff --git a/src/Lecture7/slides/svg-inkscape/DH_svg-tex.pdf b/src/Lecture7/slides/svg-inkscape/DH_svg-tex.pdf
new file mode 100644
index 0000000..c5c0f10
--- /dev/null
+++ b/src/Lecture7/slides/svg-inkscape/DH_svg-tex.pdf
Binary files differ
diff --git a/src/Lecture7/slides/svg-inkscape/DH_svg-tex.pdf_tex b/src/Lecture7/slides/svg-inkscape/DH_svg-tex.pdf_tex
new file mode 100644
index 0000000..3964967
--- /dev/null
+++ b/src/Lecture7/slides/svg-inkscape/DH_svg-tex.pdf_tex
@@ -0,0 +1,58 @@
1%% Creator: Inkscape inkscape 0.92.5, www.inkscape.org
2%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
3%% Accompanies image file 'DH_svg-tex.pdf' (pdf, eps, ps)
4%%
5%% To include the image in your LaTeX document, write
6%% \input{<filename>.pdf_tex}
7%% instead of
8%% \includegraphics{<filename>.pdf}
9%% To scale the image, write
10%% \def\svgwidth{<desired width>}
11%% \input{<filename>.pdf_tex}
12%% instead of
13%% \includegraphics[width=<desired width>]{<filename>.pdf}
14%%
15%% Images with a different path to the parent latex file can
16%% be accessed with the `import' package (which may need to be
17%% installed) using
18%% \usepackage{import}
19%% in the preamble, and then including the image with
20%% \import{<path to file>}{<filename>.pdf_tex}
21%% Alternatively, one can specify
22%% \graphicspath{{<path to file>/}}
23%%
24%% For more information, please see info/svg-inkscape on CTAN:
25%% http://tug.ctan.org/tex-archive/info/svg-inkscape
26%%
27\begingroup%
28 \makeatletter%
29 \providecommand\color[2][]{%
30 \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
31 \renewcommand\color[2][]{}%
32 }%
33 \providecommand\transparent[1]{%
34 \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
35 \renewcommand\transparent[1]{}%
36 }%
37 \providecommand\rotatebox[2]{#2}%
38 \newcommand*\fsize{\dimexpr\f@size pt\relax}%
39 \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
40 \ifx\svgwidth\undefined%
41 \setlength{\unitlength}{319.9125bp}%
42 \ifx\svgscale\undefined%
43 \relax%
44 \else%
45 \setlength{\unitlength}{\unitlength * \real{\svgscale}}%
46 \fi%
47 \else%
48 \setlength{\unitlength}{\svgwidth}%
49 \fi%
50 \global\let\svgwidth\undefined%
51 \global\let\svgscale\undefined%
52 \makeatother%
53 \begin{picture}(1,1.50094365)%
54 \lineheight{1}%
55 \setlength\tabcolsep{0pt}%
56 \put(0,0){\includegraphics[width=\unitlength,page=1]{DH_svg-tex.pdf}}%
57 \end{picture}%
58\endgroup%

Generated with cgit - Back to sebastiano.tronto.net