mathsoftware

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

commit d6c61d988bfa4255baf9cdae42db59ebee38363f
parent 46eef66b1e1571c77dc828d7e950b129b4c8bfd0
Author: Sebastiano Tronto <sebastiano.tronto@gmail.com>
Date:   Tue, 25 May 2021 17:10:49 +0200

Added files

Diffstat:
M.gitignore | 4++--
AHomework/Homework1.pdf | 0
AHomework/Homework2.pdf | 0
AHomework/Homework3.ipynb | 179+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AHomework/Homework3.pdf | 0
AHomework/Homework4.ipynb | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AHomework/Homework4.pdf | 0
ALectures/1-Introduction.pdf | 0
ALectures/2-LatexFundamentals.pdf | 0
ALectures/3-MoreLatex.pdf | 0
ALectures/4-TikZ.pdf | 0
ALectures/5-Beamer.pdf | 0
ALectures/6-PythonIntroduction.pdf | 0
ALectures/7-SageAlgebra.ipynb | 1046+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ALectures/7-SageAlgebra.pdf | 0
ALectures/8-SageCalculus.ipynb | 1372+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ALectures/8-SageCalculus.pdf | 0
ALectures/9-SageLatex.ipynb | 346+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ALectures/9-SageLatex.pdf | 0
ALectures/X1-ComputationalComplexity-notebook.pdf | 0
ALectures/X1-ComputationalComplexity.pdf | 0
ALectures/X2-StudentsRequests-notebook.pdf | 0
ALectures/X2-StudentsRequests.pdf | 0
AREADME.md | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rresources/amsthdoc.pdf -> Resources/amsthdoc.pdf | 0
Rresources/pgfmanual.pdf -> Resources/pgfmanual.pdf | 0
Rresources/symbols.pdf -> Resources/symbols.pdf | 0
Rresources/tikz-cd-doc.pdf -> Resources/tikz-cd-doc.pdf | 0
Asrc/Homework1/Homework1.aux | 4++++
Asrc/Homework1/Homework1.log | 257+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework1/Homework1.pdf | 0
Asrc/Homework1/Homework1.tex | 144+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework2/Homework2.aux | 2++
Asrc/Homework2/Homework2.log | 584+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework2/Homework2.pdf | 0
Asrc/Homework2/Homework2.tex | 175+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework3/.ipynb_checkpoints/Homework3-checkpoint.ipynb | 179+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework3/.ipynb_checkpoints/solution-checkpoint.ipynb | 166+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework3/Homework3.aux | 20++++++++++++++++++++
Asrc/Homework3/Homework3.ipynb | 179+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework3/Homework3.log | 962+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework3/Homework3.out | 0
Asrc/Homework3/Homework3.pdf | 0
Asrc/Homework3/Homework3.tex | 552+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework4/.ipynb_checkpoints/Homework4-checkpoint.ipynb | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework4/.ipynb_checkpoints/Homework4-solutions-checkpoint.ipynb | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework4/.ipynb_checkpoints/Untitled-checkpoint.ipynb | 6++++++
Asrc/Homework4/Homework4.aux | 20++++++++++++++++++++
Asrc/Homework4/Homework4.ipynb | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework4/Homework4.log | 953+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Homework4/Homework4.out | 0
Asrc/Homework4/Homework4.pdf | 0
Asrc/Homework4/Homework4.tex | 530+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/live/live.aux | 9+++++++++
Asrc/Lecture1/live/live.log | 249+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/live/live.pdf | 0
Asrc/Lecture1/live/live.tex | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/slides/1-Introduction.aux | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/slides/1-Introduction.log | 1126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/slides/1-Introduction.nav | 34++++++++++++++++++++++++++++++++++
Asrc/Lecture1/slides/1-Introduction.out | 5+++++
Asrc/Lecture1/slides/1-Introduction.pdf | 0
Asrc/Lecture1/slides/1-Introduction.snm | 0
Asrc/Lecture1/slides/1-Introduction.tex | 115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/slides/1-Introduction.toc | 5+++++
Asrc/Lecture1/slides/1-Introduction.vrb | 14++++++++++++++
Asrc/Lecture1/slides/2-LatexFundamentals.aux | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/slides/2-LatexFundamentals.log | 1174+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/slides/2-LatexFundamentals.nav | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/slides/2-LatexFundamentals.out | 0
Asrc/Lecture1/slides/2-LatexFundamentals.pdf | 0
Asrc/Lecture1/slides/2-LatexFundamentals.snm | 0
Asrc/Lecture1/slides/2-LatexFundamentals.tex | 340+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/slides/2-LatexFundamentals.toc | 0
Asrc/Lecture1/slides/2-LatexFundamentals.vrb | 18++++++++++++++++++
Asrc/Lecture1/slides/img/example2-preamble-edited.png | 0
Asrc/Lecture1/slides/img/example2-preamble.png | 0
Asrc/Lecture1/slides/img/latex.png | 0
Asrc/Lecture1/slides/img/sage.svg | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture1/slides/img/thm_pdf.png | 0
Asrc/Lecture1/slides/img/thm_pre.png | 0
Asrc/Lecture1/slides/img/thm_tex.png | 0
Asrc/Lecture1/slides/img/unilu.jpg | 0
Asrc/Lecture1/slides/svg-inkscape/sage_svg-tex.pdf | 0
Asrc/Lecture1/slides/svg-inkscape/sage_svg-tex.pdf_tex | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/biblio1.aux | 10++++++++++
Asrc/Lecture2/live/biblio1.log | 203+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/biblio1.pdf | 0
Asrc/Lecture2/live/biblio1.synctex.gz | 0
Asrc/Lecture2/live/biblio1.tex | 35+++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/biblio2.aux | 10++++++++++
Asrc/Lecture2/live/biblio2.bbl | 18++++++++++++++++++
Asrc/Lecture2/live/biblio2.blg | 46++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/biblio2.log | 203+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/biblio2.pdf | 0
Asrc/Lecture2/live/biblio2.synctex.gz | 0
Asrc/Lecture2/live/biblio2.tex | 19+++++++++++++++++++
Asrc/Lecture2/live/commands.aux | 2++
Asrc/Lecture2/live/commands.log | 215+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/commands.pdf | 0
Asrc/Lecture2/live/commands.synctex.gz | 0
Asrc/Lecture2/live/commands.tex | 28++++++++++++++++++++++++++++
Asrc/Lecture2/live/me.jpg | 0
Asrc/Lecture2/live/my_biblio.bib | 36++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/new.aux | 8++++++++
Asrc/Lecture2/live/new.log | 245+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/new.pdf | 0
Asrc/Lecture2/live/new.synctex.gz | 0
Asrc/Lecture2/live/new.tex | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/old.aux | 10++++++++++
Asrc/Lecture2/live/old.log | 284+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/old.pdf | 0
Asrc/Lecture2/live/old.synctex.gz | 0
Asrc/Lecture2/live/old.tex | 177+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/pic.aux | 3+++
Asrc/Lecture2/live/pic.log | 300+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/pic.pdf | 0
Asrc/Lecture2/live/pic.synctex.gz | 0
Asrc/Lecture2/live/pic.tex | 35+++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/sentencecounter.aux | 6++++++
Asrc/Lecture2/live/sentencecounter.bbl | 0
Asrc/Lecture2/live/sentencecounter.blg | 48++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/sentencecounter.log | 256+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/live/sentencecounter.pdf | 0
Asrc/Lecture2/live/sentencecounter.synctex.gz | 0
Asrc/Lecture2/live/sentencecounter.tex | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/slides/3-MoreLatex.aux | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/slides/3-MoreLatex.log | 1193+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/slides/3-MoreLatex.nav | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/slides/3-MoreLatex.out | 0
Asrc/Lecture2/slides/3-MoreLatex.pdf | 0
Asrc/Lecture2/slides/3-MoreLatex.snm | 0
Asrc/Lecture2/slides/3-MoreLatex.tex | 478+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture2/slides/3-MoreLatex.toc | 0
Asrc/Lecture2/slides/img/thm_pdf.png | 0
Asrc/Lecture2/slides/img/thm_pre.png | 0
Asrc/Lecture2/slides/img/thm_tex.png | 0
Asrc/Lecture2/slides/img/unilu.jpg | 0
Asrc/Lecture3/live/beamer.aux | 36++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/live/beamer.log | 944+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/live/beamer.nav | 16++++++++++++++++
Asrc/Lecture3/live/beamer.out | 1+
Asrc/Lecture3/live/beamer.pdf | 0
Asrc/Lecture3/live/beamer.snm | 0
Asrc/Lecture3/live/beamer.synctex.gz | 0
Asrc/Lecture3/live/beamer.tex | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/live/beamer.toc | 1+
Asrc/Lecture3/live/tikz.aux | 2++
Asrc/Lecture3/live/tikz.bbl | 0
Asrc/Lecture3/live/tikz.blg | 48++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/live/tikz.log | 544+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/live/tikz.pdf | 0
Asrc/Lecture3/live/tikz.synctex.gz | 0
Asrc/Lecture3/live/tikz.tex | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/live/unilu.jpg | 0
Asrc/Lecture3/slides/4-TikZ.aux | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/slides/4-TikZ.bbl | 0
Asrc/Lecture3/slides/4-TikZ.blg | 48++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/slides/4-TikZ.log | 1201+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/slides/4-TikZ.nav | 47+++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/slides/4-TikZ.out | 0
Asrc/Lecture3/slides/4-TikZ.pdf | 0
Asrc/Lecture3/slides/4-TikZ.snm | 0
Asrc/Lecture3/slides/4-TikZ.tex | 420+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/slides/4-TikZ.toc | 0
Asrc/Lecture3/slides/4-TikZ.vrb | 24++++++++++++++++++++++++
Asrc/Lecture3/slides/5-Beamer.aux | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/slides/5-Beamer.log | 1132+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/slides/5-Beamer.nav | 31+++++++++++++++++++++++++++++++
Asrc/Lecture3/slides/5-Beamer.out | 0
Asrc/Lecture3/slides/5-Beamer.pdf | 0
Asrc/Lecture3/slides/5-Beamer.snm | 0
Asrc/Lecture3/slides/5-Beamer.tex | 203+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture3/slides/5-Beamer.toc | 0
Asrc/Lecture3/slides/5-Beamer.vrb | 18++++++++++++++++++
Asrc/Lecture3/slides/img/beamer.png | 0
Asrc/Lecture3/slides/img/diophantus.jpg | 0
Asrc/Lecture3/slides/img/unilu.jpg | 0
Asrc/Lecture4/live/live.zip | 0
Asrc/Lecture4/live/live1.py | 17+++++++++++++++++
Asrc/Lecture4/live/live2.py | 7+++++++
Asrc/Lecture4/live/live3.py | 9+++++++++
Asrc/Lecture4/live/live4.py | 39+++++++++++++++++++++++++++++++++++++++
Asrc/Lecture4/live/live_interactive.py | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture4/slides/6-PythonIntroduction.aux | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture4/slides/6-PythonIntroduction.log | 1283+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture4/slides/6-PythonIntroduction.nav | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture4/slides/6-PythonIntroduction.out | 0
Asrc/Lecture4/slides/6-PythonIntroduction.pdf | 0
Asrc/Lecture4/slides/6-PythonIntroduction.snm | 0
Asrc/Lecture4/slides/6-PythonIntroduction.tex | 466+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture4/slides/6-PythonIntroduction.toc | 0
Asrc/Lecture4/slides/6-PythonIntroduction.vrb | 32++++++++++++++++++++++++++++++++
Asrc/Lecture4/slides/img/calc.jpg | 0
Asrc/Lecture4/slides/img/equal.png | 0
Asrc/Lecture4/slides/img/geany.png | 0
Asrc/Lecture4/slides/img/laptop.png | 0
Asrc/Lecture4/slides/img/python.png | 0
Asrc/Lecture4/slides/img/sage.svg | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture4/slides/img/term.png | 0
Asrc/Lecture4/slides/img/unilu.jpg | 0
Asrc/Lecture4/slides/svg-inkscape/sage_svg-tex.pdf | 0
Asrc/Lecture4/slides/svg-inkscape/sage_svg-tex.pdf_tex | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture5/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb | 1067+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture5/live/7-SageAlgebra-modified+solutions.ipynb | 1099+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb | 1046+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-modified+solutions-checkpoint.ipynb | 1099+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture5/notebook/.ipynb_checkpoints/scratchpad-checkpoint.ipynb | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture5/notebook/7-SageAlgebra.aux | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture5/notebook/7-SageAlgebra.ipynb | 1046+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture5/notebook/7-SageAlgebra.log | 967+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture5/notebook/7-SageAlgebra.out | 16++++++++++++++++
Asrc/Lecture5/notebook/7-SageAlgebra.pdf | 0
Asrc/Lecture5/notebook/7-SageAlgebra.tex | 1297+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/live/8-SageCalculus-modified.ipynb | 1614+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb | 1372+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb | 1614+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb | 339+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/8-SageCalculus.aux | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/8-SageCalculus.ipynb | 1372+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/8-SageCalculus.log | 1106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/8-SageCalculus.out | 19+++++++++++++++++++
Asrc/Lecture6/notebook/8-SageCalculus.pdf | 0
Asrc/Lecture6/notebook/8-SageCalculus.tex | 1456+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/9-SageLatex.aux | 32++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/9-SageLatex.ipynb | 346+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/9-SageLatex.log | 954+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/9-SageLatex.out | 6++++++
Asrc/Lecture6/notebook/9-SageLatex.pdf | 0
Asrc/Lecture6/notebook/9-SageLatex.tex | 634+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture6/notebook/output_75_0.png | 0
Asrc/Lecture6/notebook/output_77_0.png | 0
Asrc/Lecture6/notebook/output_80_0.png | 0
Asrc/Lecture6/notebook/output_82_0.png | 0
Asrc/Lecture6/notebook/output_84_0.png | 0
Asrc/Lecture6/notebook/output_86_0.png | 0
Asrc/Lecture6/notebook/output_88_0.png | 0
Asrc/Lecture7/notebook/X1-ComputationalComplexity-notebook.ipynb | 412+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/notebook/X2-StudentsRequests-notebook.ipynb | 516+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-checkpoint.ipynb | 394+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-notebook-checkpoint.ipynb | 412+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-checkpoint.ipynb | 165+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-notebook-checkpoint.ipynb | 298+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/X1-ComputationalComplexity.aux | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/X1-ComputationalComplexity.log | 1513+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/X1-ComputationalComplexity.nav | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/X1-ComputationalComplexity.out | 0
Asrc/Lecture7/slides/X1-ComputationalComplexity.pdf | 0
Asrc/Lecture7/slides/X1-ComputationalComplexity.snm | 0
Asrc/Lecture7/slides/X1-ComputationalComplexity.tex | 608+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/X1-ComputationalComplexity.toc | 0
Asrc/Lecture7/slides/X1-ComputationalComplexity.vrb | 10++++++++++
Asrc/Lecture7/slides/X2-StudentsRequests.aux | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/X2-StudentsRequests.log | 1307+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/X2-StudentsRequests.nav | 47+++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/X2-StudentsRequests.out | 0
Asrc/Lecture7/slides/X2-StudentsRequests.pdf | 0
Asrc/Lecture7/slides/X2-StudentsRequests.snm | 0
Asrc/Lecture7/slides/X2-StudentsRequests.tex | 309+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/X2-StudentsRequests.toc | 0
Asrc/Lecture7/slides/X2-StudentsRequests.vrb | 10++++++++++
Asrc/Lecture7/slides/img/DH.svg | 182+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/Lecture7/slides/img/plot1.png | 0
Asrc/Lecture7/slides/img/plot2.png | 0
Asrc/Lecture7/slides/img/plot3.png | 0
Asrc/Lecture7/slides/img/plot4.png | 0
Asrc/Lecture7/slides/img/plot5.png | 0
Asrc/Lecture7/slides/img/unilu.jpg | 0
Asrc/Lecture7/slides/svg-inkscape/DH_svg-tex.pdf | 0
Asrc/Lecture7/slides/svg-inkscape/DH_svg-tex.pdf_tex | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
270 files changed, 48501 insertions(+), 2 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,2 +1,2 @@ -administration -homework_submissions +Administration +Homework_submissions diff --git a/Homework/Homework1.pdf b/Homework/Homework1.pdf Binary files differ. diff --git a/Homework/Homework2.pdf b/Homework/Homework2.pdf Binary files differ. diff --git a/Homework/Homework3.ipynb b/Homework/Homework3.ipynb @@ -0,0 +1,179 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*For this exercise you should have received this text in .ipynb format. Complete the exercises by modifying this file, and submit the modified version*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 1**\n", + "\n", + "Use SageMath to solve the following problems:\n", + "\n", + "(a) Find the roots of the following polynomial over $\\mathbb Q$:\n", + "\\begin{align*}\n", + " 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", + "\\end{align*}\n", + "\n", + "(b) Find the roots of the same polynomial $p$ over $\\mathbb R$ and over $\\mathbb C$.\n", + "\n", + "(c) Find the determinant, the trace and the characteristic polynomial of the following matrix:\n", + "\\begin{align*}\n", + "A=\\left(\\begin{array}{rrrr}\n", + "-1 & 1 & -1 & 0 \\\\\n", + "1 & \\frac{1}{2} & 1 & 0 \\\\\n", + "\\frac{1}{2} & -\\frac{1}{2} & -2 & 1 \\\\\n", + "0 & 0 & 1 & 1\n", + "\\end{array}\\right)\n", + "\\end{align*}\n", + "\n", + "(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", + "\n", + "Write your code in the cell below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 2**\n", + "\n", + "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", + "\n", + "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", + "\n", + "The game plays out as follows:\n", + "\n", + "(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", + "\n", + "(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", + "\n", + "(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", + "\n", + "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", + "\\begin{align*}\\begin{cases}\n", + "z\\equiv \\pm x\\pmod p\\\\\n", + "z \\equiv \\pm y\\pmod q\n", + "\\end{cases}\\end{align*}\n", + "\n", + "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", + "\n", + "(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", + "\n", + "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", + "\n", + "Now to the actual exercise:\n", + "\n", + "(a) Write the code for the functions A1, B1 and B2 as indicated in the cell below. The function A2 is already written.\n", + "\n", + "(b) Modify the functions B1, A2 and B2 to check that the opponent is not cheating. More precisely:\n", + "* 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", + "* In A2, Alice should check that $b$ is a square modulo $n$.\n", + "* In B2, Bob should check that $z^2\\equiv a^2\\pmod n$.\n", + "\n", + "In case cheating is detected, a message should be printed saying that the person is cheating." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "ename": "IndentationError", + "evalue": "expected an indented block (<ipython-input-1-60f510bf175f>, line 7)", + "output_type": "error", + "traceback": [ + "\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" + ] + } + ], + "source": [ + "# Alice needs this to compute the square roots\n", + "from sage.rings.finite_rings.integer_mod import square_root_mod_prime\n", + "\n", + "def A1():\n", + " # This function must return two distinct primes and their product.\n", + " \n", + "def B1(n):\n", + " # This function must return a random integer a\n", + " # with 1<a<n and gcd(a,n)=1.\n", + "\n", + "def A2(b, p, q):\n", + " x = ZZ(square_root_mod_prime(Integers(p)(b), p))\n", + " y = ZZ(square_root_mod_prime(Integers(q)(b), q))\n", + " return crt(x, y, p, q)\n", + "\n", + "def B2(a, z, n):\n", + " # This function must print out one of two messages:\n", + " # \"Bob has lost\" if z is congruent to a or -a modulo n.\n", + " # \"Bob has won, proof: \" followed by a prime factor of n otherwise.\n", + " # In this case the prime must be calculated as explained above.\n", + "\n", + "\n", + "# This is how the game plays out:\n", + "p, q, n = A1()\n", + "print(\"Alice picked n =\", n)\n", + "print(\"[[ Alice's secret:\", p, q, \"]]\")\n", + "a = B1(n)\n", + "b = a^2 % n\n", + "print(\"Bob picked b =\", b)\n", + "print(\"[[ Bob's secret:\", a, \"]]\")\n", + "z = A2(b, p, q)\n", + "print(\"Alice picked z =\", z)\n", + "B2(a, z, n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Grading**\n", + "\n", + "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**." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Homework/Homework3.pdf b/Homework/Homework3.pdf Binary files differ. diff --git a/Homework/Homework4.ipynb b/Homework/Homework4.ipynb @@ -0,0 +1,172 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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", + "\n", + "**Deadline:** Sunday, June 6." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 1 (6 points)**\n", + "\n", + "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", + "\n", + "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2\\right)^2 + (2y)^2 = 4$.\n", + "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2-2\\right)^2 + (2y)^2 = 4$.\n", + "* The curve of equation $y^2 = x^3 -x +1$ and the horizontal line $y=10$.\n", + "* The $x$-axis and the graph of the function $f(x)=\\log(x) - e^{-x}$. *Hint: $f(x)$ has only one real zero.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 2 (6 points)**\n", + "\n", + "(a) Use Sage to compute\n", + "* the derivative\n", + "* a primite (i.e. integral)\n", + "* the power series expansion around $0$ up to order $4$\n", + "\n", + "of the following functions:\n", + "* $f(x) = e^x$\n", + "* $f(x) = \\sin(x)$\n", + "* $f(x) = \\cos(x)$\n", + "* $f(x) = \\tan(x)$\n", + "* $f(x) = \\log(1+x)$\n", + "* $f(x) = \\sqrt[3]{1+x}$\n", + "\n", + "(b) Use Sage to get the Latex code that represents the objects you computed above.\n", + "\n", + "(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.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute derivatives etc..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute Latex code" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(Write your table here)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 3 (4 points)**\n", + "\n", + "The equation\n", + "\\begin{align*}\n", + "y^2+x^{16}=1\n", + "\\end{align*}\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 4 (12 points)**\n", + "\n", + "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", + "\n", + "(a) Using Sage, find a solution for the differential equation with initial conditions\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + "P'(t)&=\\frac{P(t)}{10}-b\\\\\n", + "P(1)&=1000\n", + "\\end{cases}\n", + "\\end{align*}\n", + "where $b$ is a generic constant.\n", + "\n", + "(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", + "* The data as a bar chart.\n", + "* A curve that interpolates the data, using one of the methods shown in class.\n", + "* The solution of the differential equation for $b=0$.\n", + "* 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)*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Grading**\n", + "\n", + "This homework assignment is worth $28$ ($24+4$) points, distributed as described above.\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + "\\operatorname{grade} = \\operatorname{min}\\left(20, \\left\\lfloor \\frac{\\operatorname{total}}{4} + 0.5\\right\\rfloor\\right)\n", + "\\end{align*}" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.0", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Homework/Homework4.pdf b/Homework/Homework4.pdf Binary files differ. diff --git a/Lectures/1-Introduction.pdf b/Lectures/1-Introduction.pdf Binary files differ. diff --git a/Lectures/2-LatexFundamentals.pdf b/Lectures/2-LatexFundamentals.pdf Binary files differ. diff --git a/Lectures/3-MoreLatex.pdf b/Lectures/3-MoreLatex.pdf Binary files differ. diff --git a/Lectures/4-TikZ.pdf b/Lectures/4-TikZ.pdf Binary files differ. diff --git a/Lectures/5-Beamer.pdf b/Lectures/5-Beamer.pdf Binary files differ. diff --git a/Lectures/6-PythonIntroduction.pdf b/Lectures/6-PythonIntroduction.pdf Binary files differ. diff --git a/Lectures/7-SageAlgebra.ipynb b/Lectures/7-SageAlgebra.ipynb @@ -0,0 +1,1046 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "# The Jupyter Notebook\n", + "**Reference:** [[1](https://jupyter.org/documentation)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "## Cells\n", + "\n", + "The notebook contains one or more *interactive cells* that you can run, like this one below:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2/5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Exercise: modify this cell to use the print() command\n", + "2+2\n", + "2/5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Markdown\n", + "\n", + "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n", + "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n", + "\n", + "You can also include some LaTeX code in Markdown cells, with dollar signs $ or align environments:\n", + "\n", + "\\begin{align*}\n", + "\\frac{(x+y)^2}{x+1} = \\frac{x^2+y^2}{x+1}\n", + "\\end{align*}\n", + "\n", + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[x == -sqrt(6) - 1, x == sqrt(6) - 1]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = x^2 + 2*x - 5 == 0\n", + "solve(f,x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mathematical variables\n", + "\n", + "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", + "\n", + "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[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]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('y')\n", + "solve(y^2 + (x+1)*y - 2 == 0, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try removing the first line in the cell above and see what error you get!\n", + "\n", + "Here is another example:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[x == -1/2*a - 1/2*sqrt(a^2 - 4*b), x == -1/2*a + 1/2*sqrt(a^2 - 4*b)]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('a', 'b')\n", + "f = x^2+a*x+b\n", + "solve(f,x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "e^(pi*I)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will study symbolic expressions more in detail next time, in the context of calculus/analysis." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic rings and fields\n", + "\n", + "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n", + "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n", + "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n", + "\n", + "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", + "\n", + "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n", + "\n", + "|Mathematical object|Math symbol|Sage name|\n", + "|------------------:|:---------:|:--------|\n", + "|Integers|$\\mathbb Z$|`ZZ`|\n", + "|Rational numbers|$\\mathbb Q$|`QQ`|\n", + "|Real numbers|$\\mathbb R$|`RR`|\n", + "|Complex numbers|$\\mathbb C$|`CC`|\n", + "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n", + "|Finite fields|$\\mathbb F_p$|GF(p)|\n", + "|$\\dots$|$\\dots$|$\\dots$|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parents and coercion\n", + "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Rational Field" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Edit this cell to find out the type of other objects that we used\n", + "parent(3/5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Symbolic Ring\n", + "Integer Ring\n" + ] + } + ], + "source": [ + "minus_one = e^(pi*I)\n", + "minus_one_coerced = ZZ(e^(pi*I)) # coercion\n", + "print(parent(minus_one))\n", + "print(parent(minus_one_coerced))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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*." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "3.00000000000000\n" + ] + } + ], + "source": [ + "print(QQ(3))\n", + "print(RR(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also choose the precision of this approximation using the alternative name `RealField`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Real Field with 53 bits of precision\n", + "Real Field with 1000 bits of precision\n" + ] + } + ], + "source": [ + "print(RR)\n", + "print(RealField(prec=1000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Polynomial rings\n", + "\n", + "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of precision" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring.<x,y,z> = RR[] # Alternative: polring.<x,y,z> = PolynomialRing(RR)\n", + "polring" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "## Operations on polynomials\n", + "\n", + "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", + "\n", + "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n", + "\n", + "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x + 1\n", + "-4\n", + "(x^2 + 2*x - 3)/(x + 1)\n" + ] + } + ], + "source": [ + "polring.<x> = QQ[]\n", + "p = x^2 + 2*x - 3 # Don't forget * for multiplication!\n", + "q = p // (x+1)\n", + "r = p % (x+1)\n", + "f = p / (x+1)\n", + "print(q)\n", + "print(r)\n", + "print(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n", + "\n", + "**Remark.** Notice how the result can change substantially if you change the base ring.\n", + "\n", + "**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))`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(t + 1) * (t^2 - 3) * (t^2 + 1)\n", + "[(-1, 1)]\n" + ] + }, + { + "data": { + "text/plain": [ + "(y + 1) * x" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring_onevar.<t> = QQ[]\n", + "\n", + "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n", + "print(factor(f))\n", + "print(f.roots()) # Result: list of pairs (root,multiplicity)\n", + "\n", + "polring_manyvar.<x,y,z> = QQ[]\n", + "factor(x*y+x)\n", + "\n", + "# The following line gives an error, because the polynomial\n", + "# is understood to possibly have many variables:\n", + "#(x^2-1).roots()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Matrices and vectors\n", + "\n", + "**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", + "\n", + "In Sage you can easily manipulate matrices and vectors" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 0 0 1]\n", + "[ 4 -3 22/7] \n", + "\n", + "[1/2 0 0]\n", + "[ 7 0 0]\n", + "[ 1 1 1] \n", + "\n", + "(3/2, 21, 6) \n", + "\n", + "[ -7/2 -10 80/7]\n", + "[ 17 -4 15/7]\n", + "[ 241/7 -18/7 869/49] \n", + "\n", + "Rank of A = 3\n", + "Rank of B = 2\n" + ] + } + ], + "source": [ + "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n", + "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n", + "v = vector([3,4,-1])\n", + "\n", + "print(A, \"\\n\") # \\n just means \"newline\"\n", + "print(B, \"\\n\")\n", + "print(B*v, \"\\n\")\n", + "print(A^2 + 2*B - A*B, \"\\n\")\n", + "\n", + "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n", + "print(\"Rank of B =\", rank(B))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "As for polynomials, you can specify where a matrix or a vector lives" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "M = matrix(CC, [[0,1],[1,0]])\n", + "parent(M)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n", + "\n", + "**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$." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.289916349448506, 0.0241596957873755)" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n", + "v = vector(RR, [3,0])\n", + "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + "(-0.3722813232690144?, Vector space of degree 2 and dimension 1 over Algebraic Field\n", + "User basis matrix:\n", + "[ 1 -0.6861406616345072?]),\n", + "(5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic Field\n", + "User basis matrix:\n", + "[ 1 2.186140661634508?])\n", + "]" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix(QQ, [[1,2],[3,4]])\n", + "A.eigenspaces_right() # Also: A.eigenvalues(), A.eigenvectors_right()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-14 2 0 -1 1 -2 -1]\n", + "[ 0 -8 0 9 -2 11 1]\n", + "[ 0 3 1 -1 1 1 221]\n", + "[ -1 2 1 -25 -10 4 0]\n", + "[ -3 0 0 2 16 -1 -2]\n", + "[ 1 -3 3 -41 1 0 0]\n", + "[ -2 1 0 0 -6 2 12] \n", + "\n", + "[ 0 9 -2]\n", + "[ 1 -1 1] \n", + "\n", + "[-14 2 0 -1 1 -2 -1] \n", + "\n", + "[-14 2 0 -1 1]\n", + "[ 1 -3 3 -41 1]\n", + "[ 0 3 1 -1 1]\n" + ] + } + ], + "source": [ + "A = MatrixSpace(ZZ, 7).random_element()\n", + "print(A, \"\\n\")\n", + "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n", + "print(A[0,0:], \"\\n\") # First row, all columns\n", + "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\\begin{align*}\n", + " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n", + "\\end{align*}\n", + "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$." + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "def my_det(A):\n", + " if not A.is_square():\n", + " print(\"Error: matrix is not square\")\n", + " \n", + " n = A.nrows() # size of the matrix\n", + " \n", + " # Continue from here!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Number Theory\n", + "\n", + "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n", + "\n", + "Sage includes a large library of functions for computing with the integers, see the link above." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3^2 * 3607 * 3803\n", + "True\n", + "True\n", + "619703040\n", + "9\n", + "13548070123626141\n" + ] + } + ], + "source": [ + "n = 123456789\n", + "m = 987654321\n", + "p = 3607\n", + "\n", + "print(factor(n))\n", + "print(is_prime(p))\n", + "print(p.divides(n))\n", + "print(euler_phi(m))\n", + "print(gcd(n, m))\n", + "print(lcm(n, m))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Primes\n", + "\n", + "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Set of all prime numbers: 2, 3, 5, 7, ...\n", + "31 15485867\n", + "47\n", + "[79, 83, 89, 97]\n" + ] + } + ], + "source": [ + "PP = Primes()\n", + "print(PP)\n", + "print(PP[10], PP[10^6])\n", + "print(PP.next(44))\n", + "\n", + "First_Thousand_Primes = PP[0:1000]\n", + "print([p for p in First_Thousand_Primes if p < 100 and p > 75])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Chinese remainder theorem (CRT)\n", + "\n", + "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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a \\pmod n\\\\\n", + " x \\equiv b \\pmod m\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "74306 2 798\n" + ] + } + ], + "source": [ + "a = 2\n", + "b = -1\n", + "n = 172\n", + "m = 799\n", + "\n", + "if gcd(n,m) != 1:\n", + " print(\"The numbers are not comprime, I can't solve this!\")\n", + "else:\n", + " x = crt(a, b, n, m)\n", + " print(x, x%n, x%m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a_0 \\pmod {n_0}\\\\\n", + " x \\equiv a_1 \\pmod {n_1}\\\\\n", + " \\dots \\\\\n", + " x \\equiv a_k \\pmod {n_k}\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n", + "*Hint: start by running the command `help(crt)`." + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "#help(crt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cryptography: RSA\n", + "\n", + "[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", + "\n", + "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", + "\n", + "## Public-key cryptography\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "Let's see how we can do this in practice, using number theory!\n", + "\n", + "## RSA\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True True False\n" + ] + } + ], + "source": [ + "p = 100003100019100043100057100069\n", + "q = 100144655312449572059845328443\n", + "n = p*q\n", + "print(is_prime(p), is_prime(q), is_prime(p*q))\n", + "\n", + "# Use the command below to see how long it takes\n", + "#timeit(\"factor(n)\", number=1, repeat=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "Of course, she does all of this using Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(419199544978969, 235530823946467, 80799425863927)" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def two_large_primes():\n", + " p, q = 0, 0\n", + " # We make sure that they are different\n", + " while p == q:\n", + " p = Primes()[randint(10^6, 2*10^6)]\n", + " q = Primes()[randint(10^6, 2*10^6)]\n", + " return p, q\n", + "\n", + "def random_unit_mod(N):\n", + " R = Integers(N)\n", + " d = R(0)\n", + " # We make sure that it is invertible\n", + " while not d.is_unit():\n", + " d = R.random_element()\n", + " return d\n", + "\n", + "def Alice_generate_keys():\n", + " p, q = two_large_primes()\n", + " n = p*q\n", + " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n", + " \n", + " d = random_unit_mod(phi_n)\n", + " e = d^-1\n", + " return n, d, e\n", + "\n", + "Alice_generate_keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "Now he computes $m^d\\pmod n$ and sends it back to Alice." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "149461597163501" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Bob_encrypt(m, n, d):\n", + " R = Integers(n)\n", + " return R(m)^d # Assume that n is large enough\n", + " \n", + "message = 42424242\n", + "Bob_encrypt(message, 419199544978969, 235530823946467)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "42424242" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Alice_decrypt(m_encrypted, n, e):\n", + " R = Integers(n)\n", + " return R(m_encrypted)^e\n", + "\n", + "Alice_decrypt(149461597163501, 419199544978969, 80799425863927)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Lectures/7-SageAlgebra.pdf b/Lectures/7-SageAlgebra.pdf Binary files differ. diff --git a/Lectures/8-SageCalculus.ipynb b/Lectures/8-SageCalculus.ipynb @@ -0,0 +1,1372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Last time we saw the basics of symbolic expressions:\n", + "* How to define and manipulate symbolic expressions\n", + "* How to introduce new variables (in the Mathematical sense) with `var()`\n", + "* How to solve equations and inequalities\n", + "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n", + "\n", + "Here are some examples to remind you of these basic things:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "x == -sqrt(-pi),\n", + "x == sqrt(-pi)\n", + "]\n", + "[\n", + "z == -sqrt(pi + x^2),\n", + "z == sqrt(pi + x^2)\n", + "]\n", + "[[y < -2], [y > 1]]\n", + "2*pi + e is approximately 9.00146713563863\n" + ] + } + ], + "source": [ + "var('y', 'z') # Define new variables (x is already defined by Sage)\n", + "f = x^2 + pi\n", + "g = y^2 + y - 2 > 0\n", + "print( solve(f==0, x) )\n", + "print( solve(z^2 - f, z) )\n", + "print( solve(g, y) )\n", + "print( 2*pi + e, \"is approximately\", n(2*pi + e) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will see some more details about solving equations and manipulating their solutions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving equations and inequalities\n", + "\n", + "**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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x + y = 2 \\\\\n", + " 2x - y = 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "\n", + "Can be solved as" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[x == (8/3), y == (-2/3)]]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The set of solutions\n", + "\n", + "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)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x == -3" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solutions = solve(x^2-9 == 0, x)\n", + "solutions[0] # This is the expression 'x == -3'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rhs: 2\n", + "lhs: x\n" + ] + } + ], + "source": [ + "f = x == 2\n", + "print(\"rhs:\", f.rhs())\n", + "print(\"lhs:\", f.lhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simple inequality: [[x < -3], [x > 3]]\n", + "System of inequalities:\n", + " [\n", + "[3 < x, x < 6],\n", + "[x < -3]\n", + "]\n" + ] + } + ], + "source": [ + "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n", + "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the last example (system of inequalities), Sage is telling us that the system\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x^2-9 > 9 \\\\\n", + " x < 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "has two solutions:\n", + "* $x$ is between $3$ and $6$;\n", + "* $x$ is less than $-3$.\n", + "\n", + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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)$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{x: 8/3, y: -2/3}]" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Alternative method for real roots: `find_root()`\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using solve():\n", + " [\n", + "x == -e^x + 10\n", + "]\n", + "Using find_root(): 2.070579904980303\n" + ] + } + ], + "source": [ + "f = e^x + x - 10\n", + "print(\"Using solve():\\n\", solve(f, x))\n", + "print(\"Using find_root():\", f.find_root(0,100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating functions\n", + "\n", + "If an expression contains only one variable you can evaluate it easily, even if it is not a function." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "y + 3 > (y + 3)^2\n" + ] + } + ], + "source": [ + "var('y')\n", + "f = x^2-3\n", + "g = x > x^2\n", + "\n", + "print(f(2))\n", + "print(g(3+y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2 == 0\n", + "3*y == 2\n" + ] + } + ], + "source": [ + "var('y','z')\n", + "\n", + "f = y*z^2 - y == z\n", + "print(f(2, 0))\n", + "print(f(z=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Symbolic computations\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{array}{llcc}\n", + " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n", + " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n", + " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n", + " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1) 1/2*n^2 + 1/2*n\n", + "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n", + "(3) 2^n\n", + "(4) 1/6*pi^2\n" + ] + } + ], + "source": [ + "var('k', 'n') # Remember to declare all variables\n", + "\n", + "s = []\n", + "s.append( sum(k, k, 0, n) )\n", + "s.append( sum(k^4, k, 0, n) )\n", + "s.append( sum(binomial(n,k), k, 0, n) )\n", + "s.append( sum(1/k^2, k, 1, infinity) )\n", + "\n", + "for i in range(len(s)):\n", + " print(\"({}) {}\".format(i+1, s[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(x + 1)^2 - (x - 1)^2\n", + "4*x\n" + ] + } + ], + "source": [ + "f = (x+1)^2 - (x-1)^2\n", + "print(f)\n", + "print(f.expand())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Symbolic Ring\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n", + "\n", + "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\"." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-b*c + a*d\n", + "[(-a, 2)]\n" + ] + } + ], + "source": [ + "var('a', 'b', 'c', 'd')\n", + "\n", + "M = matrix([[a,b], [c,d]])\n", + "print(M.determinant())\n", + "\n", + "polring.<x> = SR[]\n", + "f = x^2 + 2*a*x + a^2\n", + "print(f.roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the eigenvalues of the matrix\n", + "\\begin{align*}\n", + "\\begin{pmatrix}\n", + "\\cos \\alpha & \\sin \\alpha\\\\\n", + "-\\sin\\alpha & \\cos \\alpha\n", + "\\end{pmatrix}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculus\n", + "**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)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Limits and series\n", + "\n", + "**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", + "\n", + "You can compute limits" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "0\n" + ] + } + ], + "source": [ + "f = sin(x)/x\n", + "# print(f(0)) # This one gives an error\n", + "print( f.limit(x=0) )\n", + "\n", + "print( (e^(-x)).limit(x=infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the constant $e$ using a limit." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "und\n", + "1\n", + "-1\n" + ] + } + ], + "source": [ + "f = abs(x)/x # 1 if x>0, -1 if x<0\n", + "print( f.limit(x=0) ) # undefined\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1*x + 1/2*x^2 + Order(x^3)\n", + "(-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", + "1*(x - 1) + (-1/2)*(x - 1)^2 + Order((x - 1)^3)\n" + ] + } + ], + "source": [ + "f = e^x\n", + "g = sin(x) - 2*cos(x)\n", + "h = log(x)\n", + "\n", + "print(f.series(x==0, 3))\n", + "print(g.series(x==0, 7))\n", + "print(h.series(x==1, 3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivatives\n", + "**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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8*y^3\n", + "6*x^2 - 1\n" + ] + } + ], + "source": [ + "var('y')\n", + "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n", + "print( (2*x^3-x+2).derivative() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute higher order derivatives:" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6*x\n", + "84*x^5*y + 10*y^4 + 24*x^2*y\n", + "1680*x^3 + 48\n" + ] + } + ], + "source": [ + "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n", + "\n", + "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n", + "print( f.derivative(x, x, y) ) # Twice in x, once in y\n", + "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jacobian and Hessian matrices are also easy to compute:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-2*x + 2*y 2*x]\n", + "[ 0 3*y^2]\n", + "[ y + 1 x + 1] \n", + "\n", + "[ 2 -4*y + 1]\n", + "[ -4*y + 1 -4*x + 6*y]\n" + ] + } + ], + "source": [ + "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n", + "print( jacobian(f, [x,y]), \"\\n\" )\n", + "\n", + "g = x^2 + x*y + y^3 -2*x*y^2 -3\n", + "print( g.hessian() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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([...])`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrals\n", + "**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", + "\n", + "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n", + "When using a computer software to solve your integrals, you have two choices:\n", + "\n", + "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", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Symbolic integration\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*x^2 - cos(x)\n", + "0\n", + "-1/2*a^2 + 1/2*b^2 + cos(a) - cos(b)\n" + ] + } + ], + "source": [ + "var('a', 'b')\n", + "f = x + sin(x)\n", + "print( f.integral(x) ) # Alternative: integral(f, x)\n", + "print( f.integral(x, -10, 10) )\n", + "print( f.integral(x, a, b) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your endpoints can also be $\\pm\\infty$:" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "sqrt(pi)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x), x, 0, infinity) )\n", + "print( integral(e^(-x^2), x, -infinity, infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*sqrt(pi)*erf(x)\n", + "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x^2), x) )\n", + "print( integral(e^(-x^2), x, 1, 2) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical integration\n", + "\n", + "In order to get an explicit value for the computations above, we can use a *numerical* method.\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.13525725794999466, 1.5016572202374808e-15)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numerical_integral(e^(-x^2), 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result above means, in symbols\n", + "\\begin{align*}\n", + "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n", + "\\end{align*}\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Differential equations\n", + "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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()`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "_C*e^x" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('x')\n", + "function('f')\n", + "equation = derivative(f(x)) == f(x)\n", + "desolve(equation, f(x)) # f is the unknown function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3*e^x" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "desolve(equation, f(x), (0,3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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))$." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n", + "desolve(equation, f(x), (0, 0, 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n", + "\\begin{align*}\n", + " \\begin{array}{rlcrl}\n", + " (A) &\n", + " \\begin{cases}\n", + " f(0) &= 1\\\\\n", + " f'(0) &= 0\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " & \\qquad \\qquad &\n", + " (B) &\n", + " \\begin{cases}\n", + " f(0) &= 0\\\\\n", + " f'(0) &= 1\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A real-world example\n", + "\n", + "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n", + "\n", + "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", + "\n", + "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", + "\n", + "Since the acceleration is the derivative of the velocity, we have a differential equation\n", + "\\begin{align*}\n", + " v'(t) = -g -kv(t)\n", + "\\end{align*}\n", + "and we can try to solve it with Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-98/15*(e^(3/2*t) - 1)*e^(-3/2*t)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t')\n", + "function('v')\n", + "g = 9.8\n", + "k = 1.5\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-(g*e^(k*t) - g)*e^(-k*t)/k" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t', 'g', 'k')\n", + "function('v')\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic data analysis and visualization\n", + "\n", + "## Statistics\n", + "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n", + "\n", + "Sage includes the most basic functions for statistical analysis." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "Mean:\t\t\t 5/13\n", + "Median:\t\t\t 1\n", + "Mode:\t\t\t [3]\n", + "Standard deviation:\t 2*sqrt(29/13)\n", + "Variance:\t\t 116/13\n", + "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n" + ] + } + ], + "source": [ + "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "\n", + "print(\"Values:\\t\", L)\n", + "\n", + "print(\"Mean:\\t\\t\\t\", mean(L))\n", + "print(\"Median:\\t\\t\\t\", median(L))\n", + "print(\"Mode:\\t\\t\\t\", mode(L))\n", + "\n", + "print(\"Standard deviation:\\t\", std(L))\n", + "print(\"Variance:\\t\\t\", variance(L))\n", + "\n", + "print(\"Moving average (5):\", moving_average(L,5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "**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", + "\n", + "Some Sage objects can be plotted:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f,\n", + " -2*pi, 2*pi, # bounds for x\n", + " ymin = -0.7, ymax = 0.7, # bounds for y\n", + " color = \"red\",\n", + " title = \"The sin function\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n", + "exponential = plot(exp(x), (x,-2,0.5))\n", + "\n", + "show(cosine + exponential)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b = bar_chart(range(1,10))\n", + "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n", + " marker = \"*\", # symbol\n", + " markersize = 100,\n", + " edgecolor = \"black\",\n", + " facecolor = \"red\"\n", + " )\n", + "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n", + "show(b + s + t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpolation\n", + "**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", + "\n", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n", + "polring.<x> = QQ[] # you need to specify a polynomial ring\n", + "lp = polring.lagrange_polynomial(points)\n", + "show(scatter_plot(points, facecolor=\"red\")\n", + " + plot(lp, 0, 3) # slightly different notation for polynomials\n", + " + text(lp, (1,8), color=\"black\")\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "However, it does not always give you good approximation of your data:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "R = [x/10 for x in range(-10,10)]\n", + "L = [1/(1+25*x^2) for x in R]\n", + "points = [(R[i], L[i]) for i in range(len(L))]\n", + "polring.<x> = RR[]\n", + "lp = polring.lagrange_polynomial(points)\n", + "\n", + "show(plot(lp, -0.82, 0.72) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show(plot(spline(points), -1, 1) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Lectures/8-SageCalculus.pdf b/Lectures/8-SageCalculus.pdf Binary files differ. diff --git a/Lectures/9-SageLatex.ipynb b/Lectures/9-SageLatex.ipynb @@ -0,0 +1,346 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "In this document we will describe some of these interactions between LaTeX and Sage." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The `show()` command\n", + "**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", + "\n", + "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", + "\n", + "You can see it as an alternative to `print()`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)\n" + ] + }, + { + "data": { + "text/html": [ + "<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>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\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", + "\\end{math}" + ], + "text/plain": [ + "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 4 5 6]\n", + "[ 8 9 10]\n" + ] + }, + { + "data": { + "text/html": [ + "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)</script></html>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)\n", + "\\end{math}" + ], + "text/plain": [ + "[ 1 2 3]\n", + "[ 4 5 6]\n", + "[ 8 9 10]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pi\n" + ] + }, + { + "data": { + "text/html": [ + "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi</script></html>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi\n", + "\\end{math}" + ], + "text/plain": [ + "pi" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "s = (e^x).series(x==0, 4)\n", + "M = matrix([[1,2,3],[4,5,6],[8,9,10]])\n", + "print(s)\n", + "show(s)\n", + "print(M)\n", + "show(M)\n", + "print(pi)\n", + "show(pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In a Jupyter notebook, the results above are displayed using [MathJax](https://www.mathjax.org/).\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The `latex()` command\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html)]\n", + "\n", + "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", + "\n", + "Technically, this is a function that returns a string, so you need to `print()` it to see the result." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n", + "\n", + "\n", + "\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)\n" + ] + } + ], + "source": [ + "print(latex(s))\n", + "print(\"\\n\")\n", + "print(latex(M))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "#latex(plot(x^2)) # The output is more than 20 pages long" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is probably easier to just generate the picture and include that in your Latex document with `\\includegraphics`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A Latex name for your variables\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html)]\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "phi1(epsilon)\n" + ] + }, + { + "data": { + "text/html": [ + "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)</script></html>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)\n", + "\\end{math}" + ], + "text/plain": [ + "e^epsilon + phi1(epsilon)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('epsilon', latex_name=\"\\\\varepsilon\")\n", + "function('phi1', latex_name=\"\\\\phi_1\")\n", + "\n", + "print(phi1(epsilon))\n", + "show(phi1(epsilon) + e^epsilon)\n", + "latex(phi1(epsilon) + e^epsilon)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# From Jupyter to Latex\n", + "**Reference:** [[4](https://nbconvert.readthedocs.io/en/latest/)]\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SageTex\n", + "**Reference:** [[5](https://doc.sagemath.org/html/en/tutorial/sagetex.html)]\n", + "\n", + "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", + "\n", + "You might need to take some extra steps to make this work on your system, see the link above." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The Latex `listings` package\n", + "**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", + "\n", + "If you want to include some code (Sage, Python or anything else) in a Latex document you can use the listings package.\n", + "\n", + "```\n", + "\\usepackage{listings}\n", + "\n", + "...\n", + "\n", + "\\begin{lstlisting}[language=Python]\n", + "for i in range(0,100):\n", + " if i%5 == 0:\n", + " print(\"Multiple of 5!\")\n", + "\\end{lstlisting}\n", + "```\n", + "\n", + "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", + "\n", + "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", + "\n", + "```\n", + "\\lstinputlisting[language=Python]{file.py}\n", + "```\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Lectures/9-SageLatex.pdf b/Lectures/9-SageLatex.pdf Binary files differ. diff --git a/Lectures/X1-ComputationalComplexity-notebook.pdf b/Lectures/X1-ComputationalComplexity-notebook.pdf Binary files differ. diff --git a/Lectures/X1-ComputationalComplexity.pdf b/Lectures/X1-ComputationalComplexity.pdf Binary files differ. diff --git a/Lectures/X2-StudentsRequests-notebook.pdf b/Lectures/X2-StudentsRequests-notebook.pdf Binary files differ. diff --git a/Lectures/X2-StudentsRequests.pdf b/Lectures/X2-StudentsRequests.pdf Binary files differ. diff --git a/README.md b/README.md @@ -0,0 +1,78 @@ +# Mathematical software + +Course given in Spring 2021 at the University of Luxembourg. + +If you just want to check out the notes for the course, see the `Lectures` +folder and the `Videos` section below. If you want to teach a similar course, +see the `Teaching` section below. + +## Description + +The goal of the course is to teach the basics of +[LaTeX](https://en.wikipedia.org/wiki/LaTeX) and +[SageMath](https://www.sagemath.org/), so that the students reach a broad +understanding of these tools and can use them whenever needed, such as if they +need to write a Thesis, prepare slides for a presentation or carry out +intense computations. + +### LaTeX + +LaTeX is a markup language to write and format documents of any type. It is +particularly well-suited for scientific documents, but it can be used for any +type of document, including books, CVs and even presentation slides. +It can be used together with a graphical front-end (such as TexMaker, +TexStudio, Overleaf...) to immediately see the pdf output. The main advantage +over a more classical word processor such as Microsoft Word, besides a much +better support for writing mathematical formulas and theorems, is that in +LaTeX [What you see is what you mean](https://en.wikipedia.org/wiki/WYSIWYM): +by typing commands instead of +visually changing the appearence of the text, the "compiler" will always try to +produce an output that is faithful to what the user indicated, so the user does +not have to manually adjust the result after every major modification. + +### SageMath + +SageMath is a free and open-source mathematical software system which builds +on top of many existing ones: NumPy, SciPy, matplotlib, Sympy, Pari/GP, GAP, R +and many more. Thanks to it, all the features all these languages can be +accessed from a common Python-based interface. +In practice, the SageMath "language" is almost identical to Python, but it +provides a complete set of libraries to deal with many mathematical objects and +computations. + +## Videos + +For the first few lectures I have filmed some videos which are a shorter +version of what explained in class. You can find all of them in [this YouTube +channel](https://www.youtube.com/channel/UCUPWzPfoW5UJInqZcqGCigg). + +* [Getting started with LaTeX](https://www.youtube.com/watch?v=HVvQpZEeIDI) +* [LaTeX bibliography](https://www.youtube.com/watch?v=-KrNY7BXdPo) +* [Defining commands in LaTeX](https://www.youtube.com/watch?v=IFt259434Zg) +* [LaTeX theorem numbering](https://www.youtube.com/watch?v=pjm18Ceg6lg) +* [Graphics with TikZ](https://www.youtube.com/watch?v=mWqhB6qOIk0) +* [Introduction to Python](https://www.youtube.com/watch?v=b7k3hlW2DMs) + +## Files + +The files in this repository are organized as follows: + +* `Lectures` contains the slides and notes I have made and used during the + lectures. Some of them are classic (Beamer) slides, some other are + [Jupyter Notebook](https://jupyter.org/) files. +* `Homework` contains the four homework assignment given during the course. + They accounted for 100% of the final grade. +* `Resources` contains some random files (tutorials, reference manual) that I + have found online. All credits go to the original authors. +* `src` contains the LaTeX and (and Sage) source code for the files in the + `Lectures` and `Homework` folders, as well as some "scratchpad" LaTeX file + written during the lectures as a live example. + +## Teaching + +INS guidelines for teachers who want to do something similar (including how long +each lecture was etc.) + +INS also stuff about license (use my personal email address instead of unilu) + +INS also list of topics for each lecture (take from moodle) diff --git a/resources/amsthdoc.pdf b/Resources/amsthdoc.pdf Binary files differ. diff --git a/resources/pgfmanual.pdf b/Resources/pgfmanual.pdf Binary files differ. diff --git 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 Binary files differ. diff --git a/src/Homework1/Homework1.aux b/src/Homework1/Homework1.aux @@ -0,0 +1,4 @@ +\relax +\newlabel{prop:fta}{{1}{1}} +\newlabel{eq:fubini}{{2}{1}} +\gdef \@abspage@last{2} diff --git a/src/Homework1/Homework1.log b/src/Homework1/Homework1.log @@ -0,0 +1,257 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**homework1.tex +(./homework1.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size12.clo +File: size12.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks17 +\ex@=\dimen139 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks18 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks19 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks20 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks21 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2020/05/29 v2.20.6 +\thm@style=\toks22 +\thm@bodyfont=\toks23 +\thm@headfont=\toks24 +\thm@notefont=\toks25 +\thm@headpunct=\toks26 +\thm@preskip=\skip52 +\thm@postskip=\skip53 +\thm@headsep=\skip54 +\dth@everypar=\toks27 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks28 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count197 +\Gm@cntv=\count198 +\c@Gm@tempcnt=\count199 +\Gm@bindingoffset=\dimen148 +\Gm@wd@mp=\dimen149 +\Gm@odd@mp=\dimen150 +\Gm@even@mp=\dimen151 +\Gm@layoutwidth=\dimen152 +\Gm@layoutheight=\dimen153 +\Gm@layouthoffset=\dimen154 +\Gm@layoutvoffset=\dimen155 +\Gm@dimlist=\toks29 +) +\c@thm=\count266 +\c@ex=\count267 + +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count268 +\l__pdf_internal_box=\box49 +) +(./homework1.aux) +\openout1 = `homework1.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=483.69687pt +* \textheight=731.23584pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=12.0pt +* \footskip=30.0pt +* \marginparwidth=35.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.8pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +LaTeX Font Info: Trying to load font information for U+msa on input line 31. + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 31. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for OMS+cmtt on input line +49. +LaTeX Font Info: No file OMScmtt.fd. on input line 49. + + +LaTeX Font Warning: Font shape `OMS/cmtt/m/n' undefined +(Font) using `OMS/cmsy/m/n' instead +(Font) for symbol `textbackslash' on input line 49. + +[1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] + +LaTeX Font Warning: Font shape `OMS/cmtt/m/it' undefined +(Font) using `OMS/cmtt/m/n' instead +(Font) for symbol `textbackslash' on input line 139. + +[2] (./homework1.aux) + +LaTeX Font Warning: Some font shapes were not available, defaults substituted. + + ) +Here is how much of TeX's memory you used: + 2221 strings out of 479383 + 29071 string characters out of 5875799 + 312548 words of memory out of 5000000 + 19342 multiletter control sequences out of 15000+600000 + 410962 words of font info for 55 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 66i,12n,72p,226b,343s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/share/ +texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf-dist/fon +ts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/texmf-dist/fonts/type1/publi +c/amsfonts/cm/cmitt10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm +/cmmi12.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb></u +sr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb></usr/share/texmf- +dist/fonts/type1/public/amsfonts/cm/cmr8.pfb></usr/share/texmf-dist/fonts/type1 +/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfon +ts/cm/cmsy8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmti12.pf +b></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt12.pfb></usr/share/ +texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb></usr/share/texmf-dis +t/fonts/type1/public/cm-super/sfrm1200.pfb> +Output written on homework1.pdf (2 pages, 120157 bytes). +PDF statistics: + 64 PDF objects out of 1000 (max. 8388607) + 46 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Homework1/Homework1.pdf b/src/Homework1/Homework1.pdf Binary files differ. diff --git a/src/Homework1/Homework1.tex b/src/Homework1/Homework1.tex @@ -0,0 +1,143 @@ +\documentclass[12pt,a4paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} + +\title{Mathematical software - homework 1} +\author{Sebastiano Tronto} + +\newtheorem{thm}{Theorem} +\newtheorem{prop}[thm]{Proposition} + +\theoremstyle{definition} +\newtheorem{ex}{Exercise} + +\theoremstyle{definition} +\newtheorem*{remark}{Remark} + +\begin{document} + +\noindent\hrulefill + +\begin{center} +\Huge{\textbf{Mathematical Software - Homework 1}} +\end{center} + +\noindent\hrulefill +\begin{center} +\begin{tabular}{lcr} +\texttt{sebastiano.tronto@uni.lu} & \qquad \qquad \qquad \qquad & +\textbf{Deadline: Sunday, March 28th} +\end{tabular} +\end{center} + +\vspace{1cm} + +\begin{center} + \emph{\large + For each of the following exercises submit a .tex and a .pdf file. + } +\end{center} + +\vspace{1cm} + +\begin{ex} + Write a short Latex document that contains the following theorem-like + environments using the \texttt{\textbackslash newtheorem} command of the + \texttt{amsthm} package (the box around the text is not needed): + \begin{center} + \fbox{\parbox{0.95\textwidth}{ + \begin{prop}[Fundamental Theorem of Algebra] + \label{prop:fta} + Let \(p(x)\) be a non-constant polynomial with coefficients in + $\mathbb C$. Then there is \(z\in\mathbb C\) such that $p(z)=0$. + \end{prop} + + \begin{remark} + Proposition \ref{prop:fta} is not true for polynomials with + coefficients in $\mathbb R$. For example + \begin{align} + p(x) = x^2+1 + \end{align} + does not have real roots. + \end{remark} + + \begin{thm} + If $X$ and $Y$ are $\sigma$-finite measure spaces and $f:X\times Y\to + \mathbb R$ is measurable and such that + \begin{align*} + \int_{X\times Y}|f(x,y)|\mathrm d(x,y) < \infty + \end{align*} + then + \begin{align} + \label{eq:fubini} + \int_X\left(\int_Yf(x,y)\mathrm d y\right)\mathrm d x = + \int_Y\left(\int_Xf(x,y)\mathrm d x\right)\mathrm d y = + \int_{X\times Y} f(x,y)\mathrm d(x,y)\,. + \end{align} + \end{thm} + + \begin{remark} + In practice, equation \eqref{eq:fubini} means that we can switch the + order of integration in a double integral. + \end{remark} + }} + \end{center} + Notice that Propositions, Theorems and some of the equations are numbered, + and some of them are referred to in the Remarks. This numbering should change + accordingly if more numbered Theorems and equations are added before this + part of the text. +\end{ex} + +\vspace{0.8cm} + +\begin{ex} +[This is basically a ``do whatever you want, just do something'' exercise] +Write a Mathematical document in Latex, where ``Mathematical'' means any text +that contains both inline and displaystyle symbols and formulas, and where most +of the sentences contain a Mathematical symbol. +For example, you can submit (part of) your homework or notes for another course +that you are following at the moment. + +You must follow the following rules: +\begin{itemize} + \item Your document must be at least 2 pages long. + \item Use the following in your preamble: + \begin{verbatim} +\documentaclass[12pt,a4paper]{article} +\usepackage[left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm]{geometry} + \end{verbatim} +\end{itemize} +The document itself can be about any area of Mathematics, Physics or similar. +The correctness of the Mathematics itself will not be judged for this course. +\end{ex} + +\section*{Grading} + +This homework assignment is worth 25\% of your final grade. + +\vspace{0.3cm} +\textbf{Exercise 1 (10 points).} +\begin{itemize} + \item A correct use of the \texttt{\textbackslash newtheorem} command is + worth 4 out of 10 points. + \item A correct use of the labelling and reference system is worth 4 points. + \item Reproducing correctly the mathematical formulas is worth 2 points. +\end{itemize} + +\textbf{Exercise 2 (10 points).} +\begin{itemize} + \item A resulting pdf file that looks readable and correct is worth 6 out of + 10 points. + \item The correct use of latex commands and environments is worth 4 out of + 10 points. \emph{Examples of mistakes in this sense: adjusting manually + the size of parenthesis instead of using \texttt{\textbackslash left} + and \texttt{\textbackslash right}; using \texttt{\textbackslash Sigma} + when you actually want to write a sum symbol.} +\end{itemize} + + +\end{document} +\ No newline at end of file diff --git a/src/Homework2/Homework2.aux b/src/Homework2/Homework2.aux @@ -0,0 +1,2 @@ +\relax +\gdef \@abspage@last{3} diff --git a/src/Homework2/Homework2.log b/src/Homework2/Homework2.log @@ -0,0 +1,584 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**homework2.tex +(./homework2.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size12.clo +File: size12.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks17 +\ex@=\dimen139 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks18 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks19 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks20 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks21 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2020/05/29 v2.20.6 +\thm@style=\toks22 +\thm@bodyfont=\toks23 +\thm@headfont=\toks24 +\thm@notefont=\toks25 +\thm@headpunct=\toks26 +\thm@preskip=\skip52 +\thm@postskip=\skip53 +\thm@headsep=\skip54 +\dth@everypar=\toks27 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks28 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count197 +\Gm@cntv=\count198 +\c@Gm@tempcnt=\count199 +\Gm@bindingoffset=\dimen148 +\Gm@wd@mp=\dimen149 +\Gm@odd@mp=\dimen150 +\Gm@even@mp=\dimen151 +\Gm@layoutwidth=\dimen152 +\Gm@layoutheight=\dimen153 +\Gm@layouthoffset=\dimen154 +\Gm@layoutvoffset=\dimen155 +\Gm@dimlist=\toks29 +) +(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip55 +\enit@outerparindent=\dimen156 +\enit@toks=\toks30 +\enit@inbox=\box49 +\enit@count@id=\count266 +\enitdp@description=\count267 +) +(/usr/share/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks31 +\pgfutil@tempdima=\dimen157 +\pgfutil@tempdimb=\dimen158 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box50 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +Package: pgf 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen159 +\Gin@req@width=\dimen160 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks32 +\pgfkeys@temptoks=\toks33 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks34 +)) +\pgf@x=\dimen161 +\pgf@y=\dimen162 +\pgf@xa=\dimen163 +\pgf@ya=\dimen164 +\pgf@xb=\dimen165 +\pgf@yb=\dimen166 +\pgf@xc=\dimen167 +\pgf@yc=\dimen168 +\pgf@xd=\dimen169 +\pgf@yd=\dimen170 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count268 +\c@pgf@countb=\count269 +\c@pgf@countc=\count270 +\c@pgf@countd=\count271 +\t@pgf@toka=\toks35 +\t@pgf@tokb=\toks36 +\t@pgf@tokc=\toks37 +\pgf@sys@id@count=\count272 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count273 +\pgfsyssoftpath@bigbuffer@items=\count274 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen171 +\pgfmath@count=\count275 +\pgfmath@box=\box51 +\pgfmath@toks=\toks38 +\pgfmath@stack@operand=\toks39 +\pgfmath@stack@operation=\toks40 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count276 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen172 +\pgf@picmaxx=\dimen173 +\pgf@picminy=\dimen174 +\pgf@picmaxy=\dimen175 +\pgf@pathminx=\dimen176 +\pgf@pathmaxx=\dimen177 +\pgf@pathminy=\dimen178 +\pgf@pathmaxy=\dimen179 +\pgf@xx=\dimen180 +\pgf@xy=\dimen181 +\pgf@yx=\dimen182 +\pgf@yy=\dimen183 +\pgf@zx=\dimen184 +\pgf@zy=\dimen185 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen186 +\pgf@path@lasty=\dimen187 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen188 +\pgf@shorten@start@additional=\dimen189 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box52 +\pgf@hbox=\box53 +\pgf@layerbox@main=\box54 +\pgf@picture@serial@count=\count277 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen190 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen191 +\pgf@pt@y=\dimen192 +\pgf@pt@temp=\dimen193 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen194 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen195 +\pgf@sys@shading@range@num=\count278 +\pgf@shadingcount=\count279 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box55 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfnodeparttextbox=\box56 +) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a) +\pgf@nodesepstart=\dimen196 +\pgf@nodesepend=\dimen197 +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen198 +\pgffor@skip=\dimen199 +\pgffor@stack=\toks41 +\pgffor@toks=\toks42 +)) +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.te +x +File: pgflibraryplothandlers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@plot@mark@count=\count280 +\pgfplotmarksize=\dimen256 +) +\tikz@lastx=\dimen257 +\tikz@lasty=\dimen258 +\tikz@lastxsaved=\dimen259 +\tikz@lastysaved=\dimen260 +\tikz@lastmovetox=\dimen261 +\tikz@lastmovetoy=\dimen262 +\tikzleveldistance=\dimen263 +\tikzsiblingdistance=\dimen264 +\tikz@figbox=\box57 +\tikz@figbox@bg=\box58 +\tikz@tempbox=\box59 +\tikz@tempbox@bg=\box60 +\tikztreelevel=\count281 +\tikznumberofchildren=\count282 +\tikznumberofcurrentchild=\count283 +\tikz@fig@count=\count284 + (/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfmatrixcurrentrow=\count285 +\pgfmatrixcurrentcolumn=\count286 +\pgf@matrix@numberofcolumns=\count287 +) +\tikz@expandcount=\count288 + +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary +topaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) (/usr/share/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty +Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ + +(/usr/share/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary +matrix.code.tex +File: tikzlibrarymatrix.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary +quotes.code.tex +File: tikzlibraryquotes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex +File: pgflibraryarrows.meta.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowinset=\dimen265 +\pgfarrowlength=\dimen266 +\pgfarrowwidth=\dimen267 +\pgfarrowlinewidth=\dimen268 +))) (/usr/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +\c@thm=\count289 +\c@ex=\count290 + +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count291 +\l__pdf_internal_box=\box61 +) +(./homework2.aux) +\openout1 = `homework2.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=483.69687pt +* \textheight=731.23584pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=12.0pt +* \footskip=30.0pt +* \marginparwidth=35.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.8pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count292 +\scratchdimen=\dimen269 +\scratchbox=\box62 +\nofMPsegments=\count293 +\nofMParguments=\count294 +\everyMPshowfont=\toks43 +\MPscratchCnt=\count295 +\MPscratchDim=\dimen270 +\MPnumerator=\count296 +\makeMPintoPDFobject=\count297 +\everyMPtoPDFconversion=\toks44 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +LaTeX Font Info: Trying to load font information for U+msa on input line 37. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 37. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for OMS+cmtt on input line +59. +LaTeX Font Info: No file OMScmtt.fd. on input line 59. + + +LaTeX Font Warning: Font shape `OMS/cmtt/m/n' undefined +(Font) using `OMS/cmsy/m/n' instead +(Font) for symbol `textbackslash' on input line 59. + +Missing character: There is no ; in font nullfont! +[1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [2] [3] +(./homework2.aux) + +LaTeX Font Warning: Some font shapes were not available, defaults substituted. + + ) +Here is how much of TeX's memory you used: + 14867 strings out of 479383 + 301095 string characters out of 5875799 + 572478 words of memory out of 5000000 + 31720 multiletter control sequences out of 15000+600000 + 410794 words of font info for 54 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 108i,15n,111p,410b,1144s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/share/ +texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf-dist/fon +ts/type1/public/amsfonts/cm/cmmi12.pfb></usr/share/texmf-dist/fonts/type1/publi +c/amsfonts/cm/cmmi6.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c +mmi8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb></usr/ +share/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-di +st/fonts/type1/public/amsfonts/cm/cmsy6.pfb></usr/share/texmf-dist/fonts/type1/ +public/amsfonts/cm/cmsy8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts +/cm/cmti12.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt12.pfb +></usr/share/texmf-dist/fonts/type1/public/cm-super/sfrm1200.pfb> +Output written on homework2.pdf (3 pages, 107428 bytes). +PDF statistics: + 62 PDF objects out of 1000 (max. 8388607) + 45 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 13 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Homework2/Homework2.pdf b/src/Homework2/Homework2.pdf Binary files differ. diff --git a/src/Homework2/Homework2.tex b/src/Homework2/Homework2.tex @@ -0,0 +1,174 @@ +\documentclass[12pt,a4paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} +\usepackage{enumitem} +\usepackage{tikz} +\usepackage{tikz-cd} +\usepackage{url} + +\title{Mathematical software - homework 2} +\author{Sebastiano Tronto} + +\newtheorem{thm}{Theorem} +\newtheorem{prop}[thm]{Proposition} + +\theoremstyle{definition} +\newtheorem{ex}{Exercise} + +\theoremstyle{definition} +\newtheorem*{remark}{Remark} + +\newcommand{\bs}{\textbackslash} + +\begin{document} + +\noindent\hrulefill + +\begin{center} +\Huge{\textbf{Mathematical Software - Homework 2}} +\end{center} + +\noindent\hrulefill +\begin{center} +\begin{tabular}{lcr} +\texttt{sebastiano.tronto@uni.lu} & \qquad \qquad \qquad \qquad & +\textbf{Deadline: Sunday, April 18th} +\end{tabular} +\end{center} + +\vspace{1cm} + +\begin{center} + \emph{\large + For each of the following exercises submit a .tex and a .pdf file. + } +\end{center} + +\vspace{1cm} + +\begin{ex} + Create a Latex document containing the following pictures: + \begin{enumerate}[label=(\alph*)] + \item The regular polygon with $N$-sides centered at the origin of the + plane (see below). + The number $N$ of sides must be easy to change at will: you should + use the \texttt{\textbackslash pgfmathsetmacro} command to set a + value for $N$ at the beginning, so that changing only that number + makes the whole picture change accordingly. + \begin{center} + \begin{tikzpicture}[scale=1] + \pgfmathsetmacro{\N}{6} + \pgfmathsetmacro{\an}{360/\N} + \pgfmathsetmacro{\r}{4} + + \draw[lightgray!30,thin] (-6,-6) grid (6,6); + \draw[->] (-5,0) -- (5,0); + \draw[->] (0,-5) -- (0,5); + + \filldraw[draw=green,fill=green!30,thick] (0.3*\r,0) + arc[radius=0.3*\r,start angle=0, end angle=\an] + -- node[right] {$\alpha=\an$}(0,0) -- cycle; + \draw[thin] (\an:\r) -- (0,0) circle[radius=\r] -- (\r,0); + \draw[line width=1.1pt] + (\r,0) \foreach \x in {1,2,...,\N} { -- (\x*\an:\r) }; + \foreach \x in {1,...,\N} { + \filldraw[red] (\x*\an:\r) circle[radius=0.1]; + }; + \end{tikzpicture} + \end{center} + \item The following commutative diagram: + \begin{tikzcd} + 0 \ar[r] & A' \ar[r,hook] \ar[d] & A \ar[r,two heads] \ar[d,"\sim"] & + A'' \ar[r] \ar[d] \ar[l,dashed,"s"',bend right] & 0 \\ + 0 \ar[r] & A' \ar[r,hook,"i_{A'}"'] & A'\oplus A'' + \ar[r,two heads,"\pi_{A''}"'] & A'' \ar[r] & 0 + \end{tikzcd} + \end{enumerate} +\end{ex} + +\vspace{0.8cm} + +\begin{ex} + Suppose you have to give a short presentation (10 minutes) on a topic of + your choice related to your study programme (you will not be asked to + actually perform this presentation). You can choose to talk about a theorem + you find important, a result you have seen in class or something else (see + below for a list of possible topics). For example, if you talk about an + important theorem you can give the theorem statement, explain why this + theorem is important and/or possible applications of this result, and + optionally an idea of the proof; but you can also deviate from this and talk + for example about the historical background that lead to the development of + this theorem. + + Your task is to prepare slides for such a presentation using Beamer (Latex). + Since the time for the (imaginary) presentation is very short, you should + write 5-8 slides (you can have more if some contain very few or no + words). + + If you feel like certain slides do not make sense without your explanation + (for example if you have one slide with just one picture and you plan to + talk with the picture in background), you can write some comments in the + .tex file. + + If you can't think of a topic that you like, you can pick one of the + following: + \begin{itemize} + \item The fundamental theorem of arithmetic (about prime numbers) + \item The central limit theorem (probability theory) + \item Differential equations (what they are, applications, + methods to solve them...) + \end{itemize} +\end{ex} + +\newpage +\section*{Grading} + +This homework assignment is worth 25\% of your final grade. + +\vspace{0.3cm} +\noindent\textbf{Exercise 1 (10 points).} +Part (a) is worth 5 points, divided as follows: +\begin{itemize} + \item 3 points for obtaining a regular polygon whose number of sides + can be changed by setting a variable with \texttt{\bs pgfmathsetmacro} + (or in a similarly easy way). + \item 1.5 points for other features of the picture (verteces, angle) that + also change accordingly to the same variable. + \item 0.5 points for the style of the other elements of the picture. This is + a matter of personal preference and it does not need to be exactly the + same as the picture, but some key features should remain (e.g. + the grid lines should be less visible than the rest of the picture, + the circle line style should be different from the polygon). +\end{itemize} +Part (b) is worth 5 points, divided as follows: +\begin{itemize} + \item 3 points if the nodes and arrows of the diagram are correct from a + mathematical point of view (that is, the arrows point to the correct + object). + \item 1 point if the labels of the arrows are placed as shown in the picture + above. + \item 1 point for the correct style of the arrows (dashed, curved). +\end{itemize} + +\vspace{0.2cm} +\noindent\textbf{Exercise 2 (10 points).} +\begin{itemize} + \item Producing a presentation that contains at least 4 slides is worth + 5 points (but within reason: for example, the slides must not be empty). + \item Up to 3 more points are given if the presentation is of a suitable + length (watch out: both a presentation too short and one too long can + loose points!). + Comments in the .tex file can help me understand how long you plan to + spend on each slide. If you are not sure how long your presentation is + going to take, try it and write down how long each slide took. + \item Up to 2 more points will be given if the slides ``look nice'' from + the audience's perspective (e.g. not too many words on the same slides, + are there nice pictures, etc). +\end{itemize} + + +\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 @@ -0,0 +1,179 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*For this exercise you should have received this text in .ipynb format. Complete the exercises by modifying this file, and submit the modified version*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 1**\n", + "\n", + "Use SageMath to solve the following problems:\n", + "\n", + "(a) Find the roots of the following polynomial over $\\mathbb Q$:\n", + "\\begin{align*}\n", + " 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", + "\\end{align*}\n", + "\n", + "(b) Find the roots of the same polynomial $p$ over $\\mathbb R$ and over $\\mathbb C$.\n", + "\n", + "(c) Find the determinant, the trace and the characteristic polynomial of the following matrix:\n", + "\\begin{align*}\n", + "A=\\left(\\begin{array}{rrrr}\n", + "-1 & 1 & -1 & 0 \\\\\n", + "1 & \\frac{1}{2} & 1 & 0 \\\\\n", + "\\frac{1}{2} & -\\frac{1}{2} & -2 & 1 \\\\\n", + "0 & 0 & 1 & 1\n", + "\\end{array}\\right)\n", + "\\end{align*}\n", + "\n", + "(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", + "\n", + "Write your code in the cell below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 2**\n", + "\n", + "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", + "\n", + "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", + "\n", + "The game plays out as follows:\n", + "\n", + "(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", + "\n", + "(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", + "\n", + "(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", + "\n", + "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", + "\\begin{align*}\\begin{cases}\n", + "z\\equiv \\pm x\\pmod p\\\\\n", + "z \\equiv \\pm y\\pmod q\n", + "\\end{cases}\\end{align*}\n", + "\n", + "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", + "\n", + "(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", + "\n", + "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", + "\n", + "Now to the actual exercise:\n", + "\n", + "(a) Write the code for the functions A1, B1 and B2 as indicated in the cell below. The function A2 is already written.\n", + "\n", + "(b) Modify the functions B1, A2 and B2 to check that the opponent is not cheating. More precisely:\n", + "* 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", + "* In A2, Alice should check that $b$ is a square modulo $n$.\n", + "* In B2, Bob should check that $z^2\\equiv a^2\\pmod n$.\n", + "\n", + "In case cheating is detected, a message should be printed saying that the person is cheating." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "ename": "IndentationError", + "evalue": "expected an indented block (<ipython-input-1-60f510bf175f>, line 7)", + "output_type": "error", + "traceback": [ + "\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" + ] + } + ], + "source": [ + "# Alice needs this to compute the square roots\n", + "from sage.rings.finite_rings.integer_mod import square_root_mod_prime\n", + "\n", + "def A1():\n", + " # This function must return two distinct primes and their product.\n", + " \n", + "def B1(n):\n", + " # This function must return a random integer a\n", + " # with 1<a<n and gcd(a,n)=1.\n", + "\n", + "def A2(b, p, q):\n", + " x = ZZ(square_root_mod_prime(Integers(p)(b), p))\n", + " y = ZZ(square_root_mod_prime(Integers(q)(b), q))\n", + " return crt(x, y, p, q)\n", + "\n", + "def B2(a, z, n):\n", + " # This function must print out one of two messages:\n", + " # \"Bob has lost\" if z is congruent to a or -a modulo n.\n", + " # \"Bob has won, proof: \" followed by a prime factor of n otherwise.\n", + " # In this case the prime must be calculated as explained above.\n", + "\n", + "\n", + "# This is how the game plays out:\n", + "p, q, n = A1()\n", + "print(\"Alice picked n =\", n)\n", + "print(\"[[ Alice's secret:\", p, q, \"]]\")\n", + "a = B1(n)\n", + "b = a^2 % n\n", + "print(\"Bob picked b =\", b)\n", + "print(\"[[ Bob's secret:\", a, \"]]\")\n", + "z = A2(b, p, q)\n", + "print(\"Alice picked z =\", z)\n", + "B2(a, z, n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Grading**\n", + "\n", + "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**." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Homework3/.ipynb_checkpoints/solution-checkpoint.ipynb b/src/Homework3/.ipynb_checkpoints/solution-checkpoint.ipynb @@ -0,0 +1,166 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 1**\n", + "\n", + "Use SageMath to solve the following problems:\n", + "\n", + "(a) Find the roots of the following polynomial over $\\mathbb Q$:\n", + "\\begin{align*}\n", + " 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", + "\\end{align*}\n", + "\n", + "(b) Find the roots of the same polynomial $p$ over $\\mathbb R$ and over $\\mathbb C$.\n", + "\n", + "(c) Find the determinant, the trace and the characteristic polynomial of the following matrix:\n", + "\\begin{align*}\n", + "A=\\left(\\begin{array}{rrrr}\n", + "-1 & 1 & -1 & 0 \\\\\n", + "1 & \\frac{1}{2} & 1 & 0 \\\\\n", + "\\frac{1}{2} & -\\frac{1}{2} & -2 & 1 \\\\\n", + "0 & 0 & 1 & 1\n", + "\\end{array}\\right)\n", + "\\end{align*}\n", + "\n", + "(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", + "\n", + "Write your code in the cell below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 2**\n", + "\n", + "*(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", + "\n", + "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", + "\n", + "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", + "\n", + "The game plays as follows:\n", + "\n", + "(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", + "\n", + "(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", + "\n", + "(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", + "\n", + "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", + "\\begin{align*}\\begin{cases}\n", + "z\\equiv \\pm x\\pmod p\\\\\n", + "z \\equiv \\pm y\\pmod q\n", + "\\end{cases}\\end{align*}\n", + "\n", + "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", + "\n", + "(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", + "\n", + "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", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Alice picked n = 239880868500983\n", + "(Alice's secret: 15489269 15486907 )\n", + "Bob picked b = 19945704365802\n", + "(Bob's secret: 3040890259756 )\n", + "Alice picked z = 3040890259756\n", + "Bob has lost\n" + ] + } + ], + "source": [ + "# Alice needs this to compute the square roots\n", + "from sage.rings.finite_rings.integer_mod import square_root_mod_prime\n", + "\n", + "def A1():\n", + " # This function must return two distinct primes and their product\n", + " p, q = 0, 0\n", + " while p == q:\n", + " p = Primes()[10^6+randint(1,1000)]\n", + " q = Primes()[10^6+randint(1,1000)]\n", + " return p, q, p*q\n", + " \n", + "def B1(n):\n", + " a = 0\n", + " while gcd(a,n) != 1:\n", + " a = randint(2,n-1)\n", + " return a\n", + "\n", + "def A2(b, p, q):\n", + " x = ZZ(square_root_mod_prime(Integers(p)(b), p))\n", + " y = ZZ(square_root_mod_prime(Integers(q)(b), q))\n", + " return crt(x, y, p, q)\n", + "\n", + "def B2(a, z, n):\n", + " # This function must print out one of two messages:\n", + " # \"Bob has lost\" if z is congruent to a or -a modulo n\n", + " # \"Bob has won, proof: \" followed by a prime factor of n otherwise\n", + " if a%n == z%n or a%n == (-z)%n:\n", + " print(\"Bob has lost\")\n", + " else:\n", + " print(\"Bob has won, proof:\", gcd(n, a+z))\n", + "\n", + "# This is how the game plays:\n", + "p, q, n = A1() # p and q are secret to Alice\n", + "print(\"Alice picked n =\", n)\n", + "print(\"(Alice's secret:\", p, q, \")\")\n", + "a = B1(n) # a is secret to Bob\n", + "b = a^2 % n\n", + "print(\"Bob picked b =\", b)\n", + "print(\"(Bob's secret:\", a, \")\")\n", + "z = A2(b, p, q)\n", + "print(\"Alice picked z =\", z)\n", + "B2(a, z, n)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Homework3/Homework3.aux b/src/Homework3/Homework3.aux @@ -0,0 +1,20 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\gdef \@abspage@last{3} diff --git a/src/Homework3/Homework3.ipynb b/src/Homework3/Homework3.ipynb @@ -0,0 +1,179 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*For this exercise you should have received this text in .ipynb format. Complete the exercises by modifying this file, and submit the modified version*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 1**\n", + "\n", + "Use SageMath to solve the following problems:\n", + "\n", + "(a) Find the roots of the following polynomial over $\\mathbb Q$:\n", + "\\begin{align*}\n", + " 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", + "\\end{align*}\n", + "\n", + "(b) Find the roots of the same polynomial $p$ over $\\mathbb R$ and over $\\mathbb C$.\n", + "\n", + "(c) Find the determinant, the trace and the characteristic polynomial of the following matrix:\n", + "\\begin{align*}\n", + "A=\\left(\\begin{array}{rrrr}\n", + "-1 & 1 & -1 & 0 \\\\\n", + "1 & \\frac{1}{2} & 1 & 0 \\\\\n", + "\\frac{1}{2} & -\\frac{1}{2} & -2 & 1 \\\\\n", + "0 & 0 & 1 & 1\n", + "\\end{array}\\right)\n", + "\\end{align*}\n", + "\n", + "(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", + "\n", + "Write your code in the cell below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 2**\n", + "\n", + "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", + "\n", + "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", + "\n", + "The game plays out as follows:\n", + "\n", + "(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", + "\n", + "(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", + "\n", + "(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", + "\n", + "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", + "\\begin{align*}\\begin{cases}\n", + "z\\equiv \\pm x\\pmod p\\\\\n", + "z \\equiv \\pm y\\pmod q\n", + "\\end{cases}\\end{align*}\n", + "\n", + "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", + "\n", + "(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", + "\n", + "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", + "\n", + "Now to the actual exercise:\n", + "\n", + "(a) Write the code for the functions A1, B1 and B2 as indicated in the cell below. The function A2 is already written.\n", + "\n", + "(b) Modify the functions B1, A2 and B2 to check that the opponent is not cheating. More precisely:\n", + "* 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", + "* In A2, Alice should check that $b$ is a square modulo $n$.\n", + "* In B2, Bob should check that $z^2\\equiv a^2\\pmod n$.\n", + "\n", + "In case cheating is detected, a message should be printed saying that the person is cheating." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "ename": "IndentationError", + "evalue": "expected an indented block (<ipython-input-1-60f510bf175f>, line 7)", + "output_type": "error", + "traceback": [ + "\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" + ] + } + ], + "source": [ + "# Alice needs this to compute the square roots\n", + "from sage.rings.finite_rings.integer_mod import square_root_mod_prime\n", + "\n", + "def A1():\n", + " # This function must return two distinct primes and their product.\n", + " \n", + "def B1(n):\n", + " # This function must return a random integer a\n", + " # with 1<a<n and gcd(a,n)=1.\n", + "\n", + "def A2(b, p, q):\n", + " x = ZZ(square_root_mod_prime(Integers(p)(b), p))\n", + " y = ZZ(square_root_mod_prime(Integers(q)(b), q))\n", + " return crt(x, y, p, q)\n", + "\n", + "def B2(a, z, n):\n", + " # This function must print out one of two messages:\n", + " # \"Bob has lost\" if z is congruent to a or -a modulo n.\n", + " # \"Bob has won, proof: \" followed by a prime factor of n otherwise.\n", + " # In this case the prime must be calculated as explained above.\n", + "\n", + "\n", + "# This is how the game plays out:\n", + "p, q, n = A1()\n", + "print(\"Alice picked n =\", n)\n", + "print(\"[[ Alice's secret:\", p, q, \"]]\")\n", + "a = B1(n)\n", + "b = a^2 % n\n", + "print(\"Bob picked b =\", b)\n", + "print(\"[[ Bob's secret:\", a, \"]]\")\n", + "z = A2(b, p, q)\n", + "print(\"Alice picked z =\", z)\n", + "B2(a, z, n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Grading**\n", + "\n", + "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**." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Homework3/Homework3.log b/src/Homework3/Homework3.log @@ -0,0 +1,962 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**Homework3.tex +(./Homework3.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty +Package: tcolorbox 2020/10/09 version 4.42 text color boxes + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks15 +\pgfutil@tempdima=\dimen139 +\pgfutil@tempdimb=\dimen140 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box47 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +Package: pgf 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen141 +\Gin@req@width=\dimen142 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen143 +\pgf@y=\dimen144 +\pgf@xa=\dimen145 +\pgf@ya=\dimen146 +\pgf@xb=\dimen147 +\pgf@yb=\dimen148 +\pgf@xc=\dimen149 +\pgf@yc=\dimen150 +\pgf@xd=\dimen151 +\pgf@yd=\dimen152 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count185 +\c@pgf@countb=\count186 +\c@pgf@countc=\count187 +\c@pgf@countd=\count188 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count189 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count190 +\pgfsyssoftpath@bigbuffer@items=\count191 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen153 +\pgfmath@count=\count192 +\pgfmath@box=\box48 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count193 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen154 +\pgf@picmaxx=\dimen155 +\pgf@picminy=\dimen156 +\pgf@picmaxy=\dimen157 +\pgf@pathminx=\dimen158 +\pgf@pathmaxx=\dimen159 +\pgf@pathminy=\dimen160 +\pgf@pathmaxy=\dimen161 +\pgf@xx=\dimen162 +\pgf@xy=\dimen163 +\pgf@yx=\dimen164 +\pgf@yy=\dimen165 +\pgf@zx=\dimen166 +\pgf@zy=\dimen167 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen168 +\pgf@path@lasty=\dimen169 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen170 +\pgf@shorten@start@additional=\dimen171 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box49 +\pgf@hbox=\box50 +\pgf@layerbox@main=\box51 +\pgf@picture@serial@count=\count194 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen172 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen173 +\pgf@pt@y=\dimen174 +\pgf@pt@temp=\dimen175 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen176 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen177 +\pgf@sys@shading@range@num=\count195 +\pgf@shadingcount=\count196 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box52 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfnodeparttextbox=\box53 +) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a) +\pgf@nodesepstart=\dimen178 +\pgf@nodesepend=\dimen179 +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements +\every@verbatim=\toks26 +\verbatim@line=\toks27 +\verbatim@in@stream=\read3 +) +(/usr/share/texmf-dist/tex/latex/environ/environ.sty +Package: environ 2014/05/04 v0.3 A new way to define environments + +(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\@envbody=\toks28 +) +(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count197 +) +\tcb@titlebox=\box54 +\tcb@upperbox=\box55 +\tcb@lowerbox=\box56 +\tcb@phantombox=\box57 +\c@tcbbreakpart=\count198 +\c@tcblayer=\count199 +\c@tcolorbox@number=\count266 +\tcb@temp=\box58 +\tcb@temp=\box59 +\tcb@temp=\box60 +\tcb@temp=\box61 +\tcb@out=\write4 +\tcb@record@out=\write5 + +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex +Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42' +(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty +Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO) + +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23. +\tcb@testbox=\box62 +\tcb@totalupperbox=\box63 +\tcb@totallowerbox=\box64 +)) +(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty +Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments + +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) + +(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +))) +(/usr/share/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2020/08/10 v2.0s Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2020/10/26 v3.5g Customizing captions (AR) + +(/usr/share/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2020/10/21 v2.2e caption3 kernel (AR) +\captionmargin=\dimen180 +\captionmargin@=\dimen181 +\captionwidth=\dimen182 +\caption@tempdima=\dimen183 +\caption@indent=\dimen184 +\caption@parindent=\dimen185 +\caption@hangindent=\dimen186 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count267 +\c@continuedfloat=\count268 +) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2020/11/20 v2.8 package option processing (HA) + +(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks29 +\XKV@tempa@toks=\toks30 +) +\XKV@depth=\count269 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material + +(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box65 +) +\tc@llx=\dimen187 +\tc@lly=\dimen188 +\tc@urx=\dimen189 +\tc@ury=\dimen190 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex +)) +\adjbox@Width=\dimen191 +\adjbox@Height=\dimen192 +\adjbox@Depth=\dimen193 +\adjbox@Totalheight=\dimen194 +\adjbox@pwidth=\dimen195 +\adjbox@pheight=\dimen196 +\adjbox@pdepth=\dimen197 +\adjbox@ptotalheight=\dimen198 + +(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection +\c@checkoddpage=\count270 +) +(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box66 +\sift@deathcycles=\count271 +\@vwid@loff=\dimen199 +\@vwid@roff=\dimen256 +)) +(/usr/share/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count272 +\float@exts=\toks31 +\float@box=\box67 +\@float@everytoks=\toks32 +\@floatcapt=\box68 +) +(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks33 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count273 +\Gm@cntv=\count274 +\c@Gm@tempcnt=\count275 +\Gm@bindingoffset=\dimen257 +\Gm@wd@mp=\dimen258 +\Gm@odd@mp=\dimen259 +\Gm@even@mp=\dimen260 +\Gm@layoutwidth=\dimen261 +\Gm@layoutheight=\dimen262 +\Gm@layouthoffset=\dimen263 +\Gm@layoutvoffset=\dimen264 +\Gm@dimlist=\toks34 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks35 +\ex@=\dimen265 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen266 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count276 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count277 +\leftroot@=\count278 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count279 +\DOTSCASE@=\count280 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box69 +\strutbox@=\box70 +\big@size=\dimen267 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count281 +\c@MaxMatrixCols=\count282 +\dotsspace@=\muskip16 +\c@parentequation=\count283 +\dspbrk@lvl=\count284 +\tag@help=\toks36 +\row@=\count285 +\column@=\count286 +\maxfields@=\count287 +\andhelp@=\toks37 +\eqnshift@=\dimen268 +\alignsep@=\dimen269 +\tagshift@=\dimen270 +\tagwidth@=\dimen271 +\totwidth@=\dimen272 +\lineht@=\dimen273 +\@envbody=\toks38 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks39 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box71 +) +(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count288 +\uc@combtoks=\toks40 +\uc@combtoksb=\toks41 +\uc@temptokena=\toks42 +) +(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv) +\FV@CodeLineNo=\count289 +\FV@InFile=\read4 +\FV@TabBox=\box72 +\c@FancyVerbLine=\count290 +\FV@StepNumber=\count291 +\FV@OutFile=\write6 +) +(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty +Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac +y) +Package grffile Info: This package is an empty stub for compatibility on input +line 40. +) +(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX + +(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen274 +\Hy@linkcounter=\count292 +\Hy@pagecounter=\count293 + +(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count294 +Package hyperref Info: Hyper figures OFF on input line 4464. +Package hyperref Info: Link nesting OFF on input line 4469. +Package hyperref Info: Hyper index ON on input line 4472. +Package hyperref Info: Plain pages OFF on input line 4479. +Package hyperref Info: Backreferencing OFF on input line 4484. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4717. +\c@Hy@tempcnt=\count295 + +(/usr/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5076. +\XeTeXLinkMargin=\dimen275 + +(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count296 +\Field@Width=\dimen276 +\Fld@charsize=\dimen277 +Package hyperref Info: Hyper figures OFF on input line 6347. +Package hyperref Info: Link nesting OFF on input line 6352. +Package hyperref Info: Hyper index ON on input line 6355. +Package hyperref Info: backreferencing OFF on input line 6362. +Package hyperref Info: Link coloring OFF on input line 6367. +Package hyperref Info: Link coloring with OCG OFF on input line 6372. +Package hyperref Info: PDF/A mode OFF on input line 6377. +LaTeX Info: Redefining \ref on input line 6417. +LaTeX Info: Redefining \pageref on input line 6421. + +(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa +ge +with kernel methods +) +\Hy@abspage=\count297 +\c@Item=\count298 +\c@Hfootnote=\count299 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX + +(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag +e +with kernel methods +) +\Fld@listcount=\count300 +\c@bookmark@seq@number=\count301 + +(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +) +\Hy@SectionHShift=\skip52 +) +(/usr/share/texmf-dist/tex/latex/titling/titling.sty +Package: titling 2009/09/04 v2.1d maketitle typesetting +\thanksmarkwidth=\skip53 +\thanksmargin=\skip54 +\droptitle=\skip55 +) +(/usr/share/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC) +\LTleft=\skip56 +\LTright=\skip57 +\LTpre=\skip58 +\LTpost=\skip59 +\LTchunksize=\count302 +\LTcapwidth=\dimen278 +\LT@head=\box73 +\LT@firsthead=\box74 +\LT@foot=\box75 +\LT@lastfoot=\box76 +\LT@cols=\count303 +\LT@rows=\count304 +\c@LT@tables=\count305 +\c@LT@chunks=\count306 +\LT@p@ftn=\toks43 +) +(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen279 +\lightrulewidth=\dimen280 +\cmidrulewidth=\dimen281 +\belowrulesep=\dimen282 +\belowbottomsep=\dimen283 +\aboverulesep=\dimen284 +\abovetopsep=\dimen285 +\cmidrulesep=\dimen286 +\cmidrulekern=\dimen287 +\defaultaddspace=\dimen288 +\@cmidla=\count307 +\@cmidlb=\count308 +\@aboverulesep=\dimen289 +\@belowrulesep=\dimen290 +\@thisruleclass=\count309 +\@lastruleclass=\count310 +\@thisrulewidth=\dimen291 +) +(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip60 +\enit@outerparindent=\dimen292 +\enit@toks=\toks44 +\enit@inbox=\box77 +\enit@count@id=\count311 +\enitdp@description=\count312 +) +(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box78 +\UL@hyphenbox=\box79 +\UL@skip=\skip61 +\UL@hook=\toks45 +\UL@height=\dimen293 +\UL@pe=\count313 +\UL@pixel=\dimen294 +\ULC@box=\box80 +Package: ulem 2019/11/18 +\ULdepth=\dimen295 +) +(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty +Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk) +\symrsfs=\mathgroup7 +) +\Wrappedcontinuationbox=\box81 +\Wrappedvisiblespacebox=\box82 +Package hyperref Info: Option `breaklinks' set `true' on input line 360. +Package hyperref Info: Option `colorlinks' set `true' on input line 360. +LaTeX Font Info: Trying to load font information for T1+ppl on input line 36 +7. + +(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count314 +\l__pdf_internal_box=\box83 +) +(./Homework3.aux) +\openout1 = `Homework3.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. + (/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count315 +\scratchdimen=\dimen296 +\scratchbox=\box84 +\nofMPsegments=\count316 +\nofMParguments=\count317 +\everyMPshowfont=\toks46 +\MPscratchCnt=\count318 +\MPscratchDim=\dimen297 +\MPnumerator=\count319 +\makeMPintoPDFobject=\count320 +\everyMPtoPDFconversion=\toks47 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: float package is loaded. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2020/05/30 v1.4b longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: <default> +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +Package hyperref Info: Link coloring ON on input line 367. + +(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count321 +) +LaTeX Info: Redefining \ref on input line 367. +LaTeX Info: Redefining \pageref on input line 367. +LaTeX Info: Redefining \nameref on input line 367. + +(./Homework3.out) (./Homework3.out) +\@outlinefile=\write7 +\openout7 = `Homework3.out'. + +LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3 +69. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Trying to load font information for OML+zplm on input line +369. + +(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Trying to load font information for OMS+zplm on input line +369. + +(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Trying to load font information for OMX+zplm on input line +369. + +(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Trying to load font information for OT1+zplm on input line +369. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 369. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 369. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 369. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 369. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 369. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 369. +LaTeX Font Info: Trying to load font information for U+rsfs on input line 36 +9. + +(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd +File: ursfs.fd 1998/03/24 rsfs font definition file (jk) +) + +LaTeX Warning: No \author given. + +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 387. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 387. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 387. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 387. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 387. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 387. +LaTeX Font Info: Trying to load font information for U+fplmbb on input line +387. +(/usr/share/texmf-dist/tex/latex/psnfss/ufplmbb.fd +File: ufplmbb.fd 2003/10/30 Fontinst v1.914 font definitions for U/fplmbb. +) +LaTeX Font Info: Trying to load font information for T1+cmtt on input line 4 +12. + +(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 5.21004pt on input line 413. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 5.21004pt on input line 413. + [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +LaTeX Font Info: Trying to load font information for TS1+ppl on input line 4 +87. + +(/usr/share/texmf-dist/tex/latex/psnfss/ts1ppl.fd +File: ts1ppl.fd 2001/06/04 font definitions for TS1/ppl. +) [2] +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 507. +LaTeX Font Info: Trying to load font information for TS1+cmtt on input line +531. + +(/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) [3] (./Homework3.aux) +Package rerunfilecheck Info: File `Homework3.out' has not changed. +(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. + ) +Here is how much of TeX's memory you used: + 21220 strings out of 479383 + 386765 string characters out of 5875798 + 724227 words of memory out of 5000000 + 37854 multiletter control sequences out of 15000+600000 + 436783 words of font info for 121 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 107i,14n,111p,502b,594s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/ +texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/usr/share/texmf-dist/font +s/enc/dvips/base/8r.enc}</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c +mex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></us +r/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-d +ist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type +1/public/mathpazo/fplmbb.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super +/sfit1095.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb>< +/usr/share/texmf-dist/fonts/type1/urw/palatino/uplb8a.pfb></usr/share/texmf-dis +t/fonts/type1/urw/palatino/uplr8a.pfb></usr/share/texmf-dist/fonts/type1/urw/pa +latino/uplri8a.pfb> +Output written on Homework3.pdf (3 pages, 146471 bytes). +PDF statistics: + 77 PDF objects out of 1000 (max. 8388607) + 61 compressed objects within 1 object stream + 10 named destinations out of 1000 (max. 500000) + 13 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Homework3/Homework3.out b/src/Homework3/Homework3.out diff --git a/src/Homework3/Homework3.pdf b/src/Homework3/Homework3.pdf Binary files differ. diff --git a/src/Homework3/Homework3.tex b/src/Homework3/Homework3.tex @@ -0,0 +1,552 @@ +\documentclass[11pt]{article} + + \usepackage[breakable]{tcolorbox} + \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour) + + \usepackage{iftex} + \ifPDFTeX + \usepackage[T1]{fontenc} + \usepackage{mathpazo} + \else + \usepackage{fontspec} + \fi + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % Maintain compatibility with old templates. Remove in nbconvert 6.0 + \let\Oldincludegraphics\includegraphics + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionFormat{nocaption}{} + \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt} + + \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size + \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}} + \usepackage{float} + \floatplacement{figure}{H} % forces figures to be placed at the correct location + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + \makeatletter % fix for grffile with XeLaTeX + \def\Gread@@xetex#1{% + \IfFileExists{"\Gin@base".bb}% + {\Gread@eps{\Gin@base.bb}}% + {\Gread@@xetex@aux#1}% + } + \makeatother + + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + % The default LaTeX title has an obnoxious amount of whitespace. By default, + % titling removes some of it. It also provides customization options. + \usepackage{titling} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + \usepackage{mathrsfs} + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF} + \definecolor{ansi-default-inverse-bg}{HTML}{000000} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatibility definitions + \def\gt{>} + \def\lt{<} + \let\Oldtex\TeX + \let\Oldlatex\LaTeX + \renewcommand{\TeX}{\textrm{\Oldtex}} + \renewcommand{\LaTeX}{\textrm{\Oldlatex}} + % Document parameters + % Document title + \title{Mathematical Software - Homework 3} + \date{Deadline: Sunday, May 9th} + + + + + +% Pygments definitions +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\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}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % For linebreaks inside Verbatim environment from package fancyvrb. + \makeatletter + \newbox\Wrappedcontinuationbox + \newbox\Wrappedvisiblespacebox + \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}} + \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}} + \newcommand*\Wrappedcontinuationindent {3ex } + \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox} + % Take advantage of the already applied Pygments mark-up to insert + % potential linebreaks for TeX processing. + % {, <, #, %, $, ' and ": go to next line. + % _, }, ^, &, >, - and ~: stay at end of broken line. + % Use of \textquotesingle for straight quote. + \newcommand*\Wrappedbreaksatspecials {% + \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}% + \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}% + \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}% + \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}% + \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}% + \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}% + \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}% + \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}% + \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}% + \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}% + \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}% + \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}% + \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}% + \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}% + } + % Some characters . , ; ? ! / are not pygmentized. + % This macro makes them "active" and they will insert potential linebreaks + \newcommand*\Wrappedbreaksatpunct {% + \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}% + \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}% + \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}% + \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}% + \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}% + \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}% + \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}% + \catcode`\.\active + \catcode`\,\active + \catcode`\;\active + \catcode`\:\active + \catcode`\?\active + \catcode`\!\active + \catcode`\/\active + \lccode`\~`\~ + } + \makeatother + + \let\OriginalVerbatim=\Verbatim + \makeatletter + \renewcommand{\Verbatim}[1][1]{% + %\parskip\z@skip + \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}% + \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}% + \def\FancyVerbFormatLine ##1{\hsize\linewidth + \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ + \strut ##1\strut}% + }% + % If the linebreak is at a space, the latter will be displayed as visible + % space at end of first line, and a continuation symbol starts next line. + % Stretch/shrink are however usually zero for typewriter font. + \def\FV@Space {% + \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font + \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak} + {\kern\fontdimen2\font}% + }% + + % Allow breaks at special characters using \PYG... macros. + \Wrappedbreaksatspecials + % Breaks at punctuation characters . , ; ? ! and / need catcode=\active + \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]% + } + \makeatother + + % Exact colors from NB + \definecolor{incolor}{HTML}{303F9F} + \definecolor{outcolor}{HTML}{D84315} + \definecolor{cellborder}{HTML}{CFCFCF} + \definecolor{cellbackground}{HTML}{F7F7F7} + + % prompt + \makeatletter + \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep} + \makeatother + \newcommand{\prompt}[4]{ + \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip} + } + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + +\begin{document} + + \maketitle + + + + \begin{center} + \emph{For this exercise you should have received this text in .ipynb +format. Complete the exercises by modifying this file, and submit the +modified version} + \end{center} + + \vspace{1cm} + \textbf{Exercise 1} + +Use SageMath to solve the following problems: + +\begin{enumerate} +\def\labelenumi{(\alph{enumi})} +\item + Find the roots of the following polynomial over \(\mathbb Q\): + \begin{align*} + 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] + \end{align*} +\item + Find the roots of the same polynomial \(p\) over \(\mathbb R\) and + over \(\mathbb C\). +\item + Find the determinant, the trace and the characteristic polynomial of + the following matrix: \begin{align*} + A=\left(\begin{array}{rrrr} + -1 & 1 & -1 & 0 \\ + 1 & \frac{1}{2} & 1 & 0 \\ + \frac{1}{2} & -\frac{1}{2} & -2 & 1 \\ + 0 & 0 & 1 & 1 + \end{array}\right) + \end{align*} +\item + 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)\). +\end{enumerate} + +Write your code in the cell below. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{ }{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] + +\end{Verbatim} +\end{tcolorbox} + + \vspace{1cm} + \textbf{Exercise 2} + +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. + +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. + +The game plays out as follows: + +\begin{itemize} +\item[(A1)] Alice picks two large prime numbers \(p\) and \(q\), she computes +\(n=pq\) and sends \(n\) to Bob, keeping \(p\) and \(q\) secret. + +\item[(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. + +\item[(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. + +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\)) \begin{align*}\begin{cases} +z\equiv \pm x\pmod p\\ +z \equiv \pm y\pmod q +\end{cases}\end{align*} + +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\): + +\item[(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)\). \emph{(One can prove that in this +situation \(g\) is always one of the two prime factors of \(n\).)} + +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. + +\end{itemize} + +Now to the actual exercise: + +\begin{enumerate} +\def\labelenumi{(\alph{enumi})} +\item + Write the code for the functions A1, B1 and B2 as indicated in the + cell below. The function A2 is already written. +\item + Modify the functions B1, A2 and B2 to check that the opponent is not + cheating. More precisely: + +\begin{itemize} +\tightlist +\item + In B1, Bob should check that \(n\) is not a prime power. \emph{(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!)} +\item + In A2, Alice should check that \(b\) is a square modulo \(n\). +\item + In B2, Bob should check that \(z^2\equiv a^2\pmod n\). +\end{itemize} + +In case cheating is detected, a message should be printed saying that +the person is cheating. +\end{enumerate} + +\newpage + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{1}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{c+c1}{\PYZsh{} Alice needs this to compute the square roots} +\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} + +\PY{k}{def} \PY{n+nf}{A1}\PY{p}{(}\PY{p}{)}\PY{p}{:} + \PY{c+c1}{\PYZsh{} This function must return two distinct primes and their product.} + +\PY{k}{def} \PY{n+nf}{B1}\PY{p}{(}\PY{n}{n}\PY{p}{)}\PY{p}{:} + \PY{c+c1}{\PYZsh{} This function must return a random integer a} + \PY{c+c1}{\PYZsh{} with 1\PYZlt{}a\PYZlt{}n and gcd(a,n)=1.} + +\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}{:} + \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}{)} + \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}{)} + \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}{)} + +\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}{:} + \PY{c+c1}{\PYZsh{} This function must print out one of two messages:} + \PY{c+c1}{\PYZsh{} \PYZdq{}Bob has lost\PYZdq{} if z is congruent to a or \PYZhy{}a modulo n.} + \PY{c+c1}{\PYZsh{} \PYZdq{}Bob has won, proof: \PYZdq{} followed by a prime factor of n otherwise.} + \PY{c+c1}{\PYZsh{} In this case the prime must be calculated as explained above.} + + +\PY{c+c1}{\PYZsh{} This is how the game plays out:} +\PY{n}{p}\PY{p}{,} \PY{n}{q}\PY{p}{,} \PY{n}{n} \PY{o}{=} \PY{n}{A1}\PY{p}{(}\PY{p}{)} +\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}{)} +\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}{)} +\PY{n}{a} \PY{o}{=} \PY{n}{B1}\PY{p}{(}\PY{n}{n}\PY{p}{)} +\PY{n}{b} \PY{o}{=} \PY{n}{a}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZpc{}} \PY{n}{n} +\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}{)} +\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}{)} +\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}{)} +\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}{)} +\PY{n}{B2}\PY{p}{(}\PY{n}{a}\PY{p}{,} \PY{n}{z}\PY{p}{,} \PY{n}{n}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \vspace{1cm} + \textbf{Grading} + +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 +\textbf{16 points}. + + + +\end{document} diff --git a/src/Homework4/.ipynb_checkpoints/Homework4-checkpoint.ipynb b/src/Homework4/.ipynb_checkpoints/Homework4-checkpoint.ipynb @@ -0,0 +1,172 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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", + "\n", + "**Deadline:** Sunday, June 6." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 1 (6 points)**\n", + "\n", + "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", + "\n", + "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2\\right)^2 + (2y)^2 = 4$.\n", + "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2-2\\right)^2 + (2y)^2 = 4$.\n", + "* The curve of equation $y^2 = x^3 -x +1$ and the horizontal line $y=10$.\n", + "* The $x$-axis and the graph of the function $f(x)=\\log(x) - e^{-x}$. *Hint: $f(x)$ has only one real zero.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 2 (6 points)**\n", + "\n", + "(a) Use Sage to compute\n", + "* the derivative\n", + "* a primite (i.e. integral)\n", + "* the power series expansion around $0$ up to order $4$\n", + "\n", + "of the following functions:\n", + "* $f(x) = e^x$\n", + "* $f(x) = \\sin(x)$\n", + "* $f(x) = \\cos(x)$\n", + "* $f(x) = \\tan(x)$\n", + "* $f(x) = \\log(1+x)$\n", + "* $f(x) = \\sqrt[3]{1+x}$\n", + "\n", + "(b) Use Sage to get the Latex code that represents the objects you computed above.\n", + "\n", + "(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.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute derivatives etc..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute Latex code" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(Write your table here)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 3 (4 points)**\n", + "\n", + "The equation\n", + "\\begin{align*}\n", + "y^2+x^{16}=1\n", + "\\end{align*}\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 4 (12 points)**\n", + "\n", + "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", + "\n", + "(a) Using Sage, find a solution for the differential equation with initial conditions\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + "P'(t)&=\\frac{P(t)}{10}-b\\\\\n", + "P(1)&=1000\n", + "\\end{cases}\n", + "\\end{align*}\n", + "where $b$ is a generic constant.\n", + "\n", + "(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", + "* The data as a bar chart.\n", + "* A curve that interpolates the data, using one of the methods shown in class.\n", + "* The solution of the differential equation for $b=0$.\n", + "* 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)*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Grading**\n", + "\n", + "This homework assignment is worth $28$ ($24+4$) points, distributed as described above.\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + "\\operatorname{grade} = \\operatorname{min}\\left(20, \\left\\lfloor \\frac{\\operatorname{total}}{4} + 0.5\\right\\rfloor\\right)\n", + "\\end{align*}" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Homework4/.ipynb_checkpoints/Homework4-solutions-checkpoint.ipynb b/src/Homework4/.ipynb_checkpoints/Homework4-solutions-checkpoint.ipynb @@ -0,0 +1,61 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f(x) \t Derivative \t Integral \t Series expansion\n", + "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", + "sin(x) \t cos(x) \t -cos(x) \t 1*x + (-1/6)*x^3 + Order(x^5)\n", + "cos(x) \t -sin(x) \t sin(x) \t 1 + (-1/2)*x^2 + 1/24*x^4 + Order(x^5)\n", + "tan(x) \t tan(x)^2 + 1 \t log(sec(x)) \t 1*x + 1/3*x^3 + Order(x^5)\n", + "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", + "(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" + ] + } + ], + "source": [ + "print(\"f(x)\", \"\\t\", \"Derivative\", \"\\t\", \"Integral\", \"\\t\", \"Series expansion\")\n", + "var('a')\n", + "f(x) = (1+x)^a\n", + "assume(a>0)\n", + "functions = [e^x, sin, cos, tan, log(1+x), f]\n", + "for g in functions:\n", + " print(g(x), \"\\t\", derivative(g(x), x), \"\\t\", integral(g(x),x), \"\\t\", g(x).series(x==0,5))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Homework4/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/src/Homework4/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Homework4/Homework4.aux b/src/Homework4/Homework4.aux @@ -0,0 +1,20 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\gdef \@abspage@last{2} diff --git a/src/Homework4/Homework4.ipynb b/src/Homework4/Homework4.ipynb @@ -0,0 +1,172 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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", + "\n", + "**Deadline:** Sunday, June 6." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 1 (6 points)**\n", + "\n", + "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", + "\n", + "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2\\right)^2 + (2y)^2 = 4$.\n", + "* The circle of equation $x^2 + y^2 = 4$ and the ellipse of equation $\\left(\\frac x2-2\\right)^2 + (2y)^2 = 4$.\n", + "* The curve of equation $y^2 = x^3 -x +1$ and the horizontal line $y=10$.\n", + "* The $x$-axis and the graph of the function $f(x)=\\log(x) - e^{-x}$. *Hint: $f(x)$ has only one real zero.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 2 (6 points)**\n", + "\n", + "(a) Use Sage to compute\n", + "* the derivative\n", + "* a primite (i.e. integral)\n", + "* the power series expansion around $0$ up to order $4$\n", + "\n", + "of the following functions:\n", + "* $f(x) = e^x$\n", + "* $f(x) = \\sin(x)$\n", + "* $f(x) = \\cos(x)$\n", + "* $f(x) = \\tan(x)$\n", + "* $f(x) = \\log(1+x)$\n", + "* $f(x) = \\sqrt[3]{1+x}$\n", + "\n", + "(b) Use Sage to get the Latex code that represents the objects you computed above.\n", + "\n", + "(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.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute derivatives etc..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute Latex code" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(Write your table here)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 3 (4 points)**\n", + "\n", + "The equation\n", + "\\begin{align*}\n", + "y^2+x^{16}=1\n", + "\\end{align*}\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise 4 (12 points)**\n", + "\n", + "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", + "\n", + "(a) Using Sage, find a solution for the differential equation with initial conditions\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + "P'(t)&=\\frac{P(t)}{10}-b\\\\\n", + "P(1)&=1000\n", + "\\end{cases}\n", + "\\end{align*}\n", + "where $b$ is a generic constant.\n", + "\n", + "(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", + "* The data as a bar chart.\n", + "* A curve that interpolates the data, using one of the methods shown in class.\n", + "* The solution of the differential equation for $b=0$.\n", + "* 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)*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Grading**\n", + "\n", + "This homework assignment is worth $28$ ($24+4$) points, distributed as described above.\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + "\\operatorname{grade} = \\operatorname{min}\\left(20, \\left\\lfloor \\frac{\\operatorname{total}}{4} + 0.5\\right\\rfloor\\right)\n", + "\\end{align*}" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.0", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Homework4/Homework4.log b/src/Homework4/Homework4.log @@ -0,0 +1,953 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**Homework4.tex +(./Homework4.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty +Package: tcolorbox 2020/10/09 version 4.42 text color boxes + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks15 +\pgfutil@tempdima=\dimen139 +\pgfutil@tempdimb=\dimen140 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box47 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +Package: pgf 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen141 +\Gin@req@width=\dimen142 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen143 +\pgf@y=\dimen144 +\pgf@xa=\dimen145 +\pgf@ya=\dimen146 +\pgf@xb=\dimen147 +\pgf@yb=\dimen148 +\pgf@xc=\dimen149 +\pgf@yc=\dimen150 +\pgf@xd=\dimen151 +\pgf@yd=\dimen152 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count185 +\c@pgf@countb=\count186 +\c@pgf@countc=\count187 +\c@pgf@countd=\count188 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count189 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count190 +\pgfsyssoftpath@bigbuffer@items=\count191 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen153 +\pgfmath@count=\count192 +\pgfmath@box=\box48 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count193 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen154 +\pgf@picmaxx=\dimen155 +\pgf@picminy=\dimen156 +\pgf@picmaxy=\dimen157 +\pgf@pathminx=\dimen158 +\pgf@pathmaxx=\dimen159 +\pgf@pathminy=\dimen160 +\pgf@pathmaxy=\dimen161 +\pgf@xx=\dimen162 +\pgf@xy=\dimen163 +\pgf@yx=\dimen164 +\pgf@yy=\dimen165 +\pgf@zx=\dimen166 +\pgf@zy=\dimen167 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen168 +\pgf@path@lasty=\dimen169 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen170 +\pgf@shorten@start@additional=\dimen171 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box49 +\pgf@hbox=\box50 +\pgf@layerbox@main=\box51 +\pgf@picture@serial@count=\count194 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen172 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen173 +\pgf@pt@y=\dimen174 +\pgf@pt@temp=\dimen175 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen176 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen177 +\pgf@sys@shading@range@num=\count195 +\pgf@shadingcount=\count196 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box52 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfnodeparttextbox=\box53 +) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a) +\pgf@nodesepstart=\dimen178 +\pgf@nodesepend=\dimen179 +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements +\every@verbatim=\toks26 +\verbatim@line=\toks27 +\verbatim@in@stream=\read3 +) +(/usr/share/texmf-dist/tex/latex/environ/environ.sty +Package: environ 2014/05/04 v0.3 A new way to define environments + +(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\@envbody=\toks28 +) +(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count197 +) +\tcb@titlebox=\box54 +\tcb@upperbox=\box55 +\tcb@lowerbox=\box56 +\tcb@phantombox=\box57 +\c@tcbbreakpart=\count198 +\c@tcblayer=\count199 +\c@tcolorbox@number=\count266 +\tcb@temp=\box58 +\tcb@temp=\box59 +\tcb@temp=\box60 +\tcb@temp=\box61 +\tcb@out=\write4 +\tcb@record@out=\write5 + +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex +Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42' +(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty +Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO) + +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23. +\tcb@testbox=\box62 +\tcb@totalupperbox=\box63 +\tcb@totallowerbox=\box64 +)) +(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty +Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments + +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) + +(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +))) +(/usr/share/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2020/08/10 v2.0s Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2020/10/26 v3.5g Customizing captions (AR) + +(/usr/share/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2020/10/21 v2.2e caption3 kernel (AR) +\captionmargin=\dimen180 +\captionmargin@=\dimen181 +\captionwidth=\dimen182 +\caption@tempdima=\dimen183 +\caption@indent=\dimen184 +\caption@parindent=\dimen185 +\caption@hangindent=\dimen186 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count267 +\c@continuedfloat=\count268 +) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2020/11/20 v2.8 package option processing (HA) + +(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks29 +\XKV@tempa@toks=\toks30 +) +\XKV@depth=\count269 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material + +(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box65 +) +\tc@llx=\dimen187 +\tc@lly=\dimen188 +\tc@urx=\dimen189 +\tc@ury=\dimen190 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex +)) +\adjbox@Width=\dimen191 +\adjbox@Height=\dimen192 +\adjbox@Depth=\dimen193 +\adjbox@Totalheight=\dimen194 +\adjbox@pwidth=\dimen195 +\adjbox@pheight=\dimen196 +\adjbox@pdepth=\dimen197 +\adjbox@ptotalheight=\dimen198 + +(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection +\c@checkoddpage=\count270 +) +(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box66 +\sift@deathcycles=\count271 +\@vwid@loff=\dimen199 +\@vwid@roff=\dimen256 +)) +(/usr/share/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count272 +\float@exts=\toks31 +\float@box=\box67 +\@float@everytoks=\toks32 +\@floatcapt=\box68 +) +(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks33 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count273 +\Gm@cntv=\count274 +\c@Gm@tempcnt=\count275 +\Gm@bindingoffset=\dimen257 +\Gm@wd@mp=\dimen258 +\Gm@odd@mp=\dimen259 +\Gm@even@mp=\dimen260 +\Gm@layoutwidth=\dimen261 +\Gm@layoutheight=\dimen262 +\Gm@layouthoffset=\dimen263 +\Gm@layoutvoffset=\dimen264 +\Gm@dimlist=\toks34 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks35 +\ex@=\dimen265 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen266 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count276 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count277 +\leftroot@=\count278 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count279 +\DOTSCASE@=\count280 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box69 +\strutbox@=\box70 +\big@size=\dimen267 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count281 +\c@MaxMatrixCols=\count282 +\dotsspace@=\muskip16 +\c@parentequation=\count283 +\dspbrk@lvl=\count284 +\tag@help=\toks36 +\row@=\count285 +\column@=\count286 +\maxfields@=\count287 +\andhelp@=\toks37 +\eqnshift@=\dimen268 +\alignsep@=\dimen269 +\tagshift@=\dimen270 +\tagwidth@=\dimen271 +\totwidth@=\dimen272 +\lineht@=\dimen273 +\@envbody=\toks38 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks39 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box71 +) +(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count288 +\uc@combtoks=\toks40 +\uc@combtoksb=\toks41 +\uc@temptokena=\toks42 +) +(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv) +\FV@CodeLineNo=\count289 +\FV@InFile=\read4 +\FV@TabBox=\box72 +\c@FancyVerbLine=\count290 +\FV@StepNumber=\count291 +\FV@OutFile=\write6 +) +(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty +Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac +y) +Package grffile Info: This package is an empty stub for compatibility on input +line 40. +) +(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX + +(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen274 +\Hy@linkcounter=\count292 +\Hy@pagecounter=\count293 + +(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count294 +Package hyperref Info: Hyper figures OFF on input line 4464. +Package hyperref Info: Link nesting OFF on input line 4469. +Package hyperref Info: Hyper index ON on input line 4472. +Package hyperref Info: Plain pages OFF on input line 4479. +Package hyperref Info: Backreferencing OFF on input line 4484. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4717. +\c@Hy@tempcnt=\count295 + +(/usr/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5076. +\XeTeXLinkMargin=\dimen275 + +(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count296 +\Field@Width=\dimen276 +\Fld@charsize=\dimen277 +Package hyperref Info: Hyper figures OFF on input line 6347. +Package hyperref Info: Link nesting OFF on input line 6352. +Package hyperref Info: Hyper index ON on input line 6355. +Package hyperref Info: backreferencing OFF on input line 6362. +Package hyperref Info: Link coloring OFF on input line 6367. +Package hyperref Info: Link coloring with OCG OFF on input line 6372. +Package hyperref Info: PDF/A mode OFF on input line 6377. +LaTeX Info: Redefining \ref on input line 6417. +LaTeX Info: Redefining \pageref on input line 6421. + +(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa +ge +with kernel methods +) +\Hy@abspage=\count297 +\c@Item=\count298 +\c@Hfootnote=\count299 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX + +(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag +e +with kernel methods +) +\Fld@listcount=\count300 +\c@bookmark@seq@number=\count301 + +(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +) +\Hy@SectionHShift=\skip52 +) +(/usr/share/texmf-dist/tex/latex/titling/titling.sty +Package: titling 2009/09/04 v2.1d maketitle typesetting +\thanksmarkwidth=\skip53 +\thanksmargin=\skip54 +\droptitle=\skip55 +) +(/usr/share/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC) +\LTleft=\skip56 +\LTright=\skip57 +\LTpre=\skip58 +\LTpost=\skip59 +\LTchunksize=\count302 +\LTcapwidth=\dimen278 +\LT@head=\box73 +\LT@firsthead=\box74 +\LT@foot=\box75 +\LT@lastfoot=\box76 +\LT@cols=\count303 +\LT@rows=\count304 +\c@LT@tables=\count305 +\c@LT@chunks=\count306 +\LT@p@ftn=\toks43 +) +(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen279 +\lightrulewidth=\dimen280 +\cmidrulewidth=\dimen281 +\belowrulesep=\dimen282 +\belowbottomsep=\dimen283 +\aboverulesep=\dimen284 +\abovetopsep=\dimen285 +\cmidrulesep=\dimen286 +\cmidrulekern=\dimen287 +\defaultaddspace=\dimen288 +\@cmidla=\count307 +\@cmidlb=\count308 +\@aboverulesep=\dimen289 +\@belowrulesep=\dimen290 +\@thisruleclass=\count309 +\@lastruleclass=\count310 +\@thisrulewidth=\dimen291 +) +(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip60 +\enit@outerparindent=\dimen292 +\enit@toks=\toks44 +\enit@inbox=\box77 +\enit@count@id=\count311 +\enitdp@description=\count312 +) +(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box78 +\UL@hyphenbox=\box79 +\UL@skip=\skip61 +\UL@hook=\toks45 +\UL@height=\dimen293 +\UL@pe=\count313 +\UL@pixel=\dimen294 +\ULC@box=\box80 +Package: ulem 2019/11/18 +\ULdepth=\dimen295 +) +(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty +Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk) +\symrsfs=\mathgroup7 +) +\Wrappedcontinuationbox=\box81 +\Wrappedvisiblespacebox=\box82 +Package hyperref Info: Option `breaklinks' set `true' on input line 360. +Package hyperref Info: Option `colorlinks' set `true' on input line 360. +LaTeX Font Info: Trying to load font information for T1+ppl on input line 36 +7. + +(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count314 +\l__pdf_internal_box=\box83 +) +(./Homework4.aux) +\openout1 = `Homework4.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 367. +LaTeX Font Info: ... okay on input line 367. + (/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count315 +\scratchdimen=\dimen296 +\scratchbox=\box84 +\nofMPsegments=\count316 +\nofMParguments=\count317 +\everyMPshowfont=\toks46 +\MPscratchCnt=\count318 +\MPscratchDim=\dimen297 +\MPnumerator=\count319 +\makeMPintoPDFobject=\count320 +\everyMPtoPDFconversion=\toks47 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: float package is loaded. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2020/05/30 v1.4b longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: <default> +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +Package hyperref Info: Link coloring ON on input line 367. + +(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count321 +) +LaTeX Info: Redefining \ref on input line 367. +LaTeX Info: Redefining \pageref on input line 367. +LaTeX Info: Redefining \nameref on input line 367. + +(./Homework4.out) (./Homework4.out) +\@outlinefile=\write7 +\openout7 = `Homework4.out'. + +LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3 +69. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Trying to load font information for OML+zplm on input line +369. + +(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Trying to load font information for OMS+zplm on input line +369. + +(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Trying to load font information for OMX+zplm on input line +369. + +(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Trying to load font information for OT1+zplm on input line +369. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 369. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 369. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 369. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 369. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 369. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 369. +LaTeX Font Info: Trying to load font information for U+rsfs on input line 36 +9. + +(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd +File: ursfs.fd 1998/03/24 rsfs font definition file (jk) +) + +LaTeX Warning: No \author given. + +LaTeX Font Info: Trying to load font information for TS1+ppl on input line 3 +87. +(/usr/share/texmf-dist/tex/latex/psnfss/ts1ppl.fd +File: ts1ppl.fd 2001/06/04 font definitions for TS1/ppl. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 387. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 387. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 387. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 387. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 387. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 387. + [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +LaTeX Font Info: Trying to load font information for U+fplmbb on input line +454. + +(/usr/share/texmf-dist/tex/latex/psnfss/ufplmbb.fd +File: ufplmbb.fd 2003/10/30 Fontinst v1.914 font definitions for U/fplmbb. +) +LaTeX Font Info: Trying to load font information for T1+cmtt on input line 4 +82. + +(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 5.21004pt on input line 506. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 5.21004pt on input line 506. + [2] (./Homework4.aux) +Package rerunfilecheck Info: File `Homework4.out' has not changed. +(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. + ) +Here is how much of TeX's memory you used: + 21207 strings out of 479383 + 386260 string characters out of 5875798 + 695232 words of memory out of 5000000 + 37838 multiletter control sequences out of 15000+600000 + 440078 words of font info for 127 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 107i,14n,111p,874b,517s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/usr/share/t +exmf-dist/fonts/enc/dvips/base/8r.enc}</usr/share/texmf-dist/fonts/type1/public +/amsfonts/cm/cmex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c +mmi10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr +/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-d +ist/fonts/type1/public/mathpazo/fplmbb.pfb></usr/share/texmf-dist/fonts/type1/p +ublic/cm-super/sftt1095.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/upl +b8a.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplr8a.pfb></usr/share/ +texmf-dist/fonts/type1/urw/palatino/uplri8a.pfb> +Output written on Homework4.pdf (2 pages, 116266 bytes). +PDF statistics: + 65 PDF objects out of 1000 (max. 8388607) + 51 compressed objects within 1 object stream + 8 named destinations out of 1000 (max. 500000) + 13 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Homework4/Homework4.out b/src/Homework4/Homework4.out diff --git a/src/Homework4/Homework4.pdf b/src/Homework4/Homework4.pdf Binary files differ. diff --git a/src/Homework4/Homework4.tex b/src/Homework4/Homework4.tex @@ -0,0 +1,530 @@ +\documentclass[11pt]{article} + + \usepackage[breakable]{tcolorbox} + \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour) + + \usepackage{iftex} + \ifPDFTeX + \usepackage[T1]{fontenc} + \usepackage{mathpazo} + \else + \usepackage{fontspec} + \fi + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % Maintain compatibility with old templates. Remove in nbconvert 6.0 + \let\Oldincludegraphics\includegraphics + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionFormat{nocaption}{} + \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt} + + \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size + \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}} + \usepackage{float} + \floatplacement{figure}{H} % forces figures to be placed at the correct location + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + \makeatletter % fix for grffile with XeLaTeX + \def\Gread@@xetex#1{% + \IfFileExists{"\Gin@base".bb}% + {\Gread@eps{\Gin@base.bb}}% + {\Gread@@xetex@aux#1}% + } + \makeatother + + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + % The default LaTeX title has an obnoxious amount of whitespace. By default, + % titling removes some of it. It also provides customization options. + \usepackage{titling} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + \usepackage{mathrsfs} + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF} + \definecolor{ansi-default-inverse-bg}{HTML}{000000} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatibility definitions + \def\gt{>} + \def\lt{<} + \let\Oldtex\TeX + \let\Oldlatex\LaTeX + \renewcommand{\TeX}{\textrm{\Oldtex}} + \renewcommand{\LaTeX}{\textrm{\Oldlatex}} + % Document parameters + % Document title + \title{Mathematical Software - Homework 4} + \date{\textbf{Deadline:} Sunday, June 6} + + + + + +% Pygments definitions +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\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}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % For linebreaks inside Verbatim environment from package fancyvrb. + \makeatletter + \newbox\Wrappedcontinuationbox + \newbox\Wrappedvisiblespacebox + \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}} + \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}} + \newcommand*\Wrappedcontinuationindent {3ex } + \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox} + % Take advantage of the already applied Pygments mark-up to insert + % potential linebreaks for TeX processing. + % {, <, #, %, $, ' and ": go to next line. + % _, }, ^, &, >, - and ~: stay at end of broken line. + % Use of \textquotesingle for straight quote. + \newcommand*\Wrappedbreaksatspecials {% + \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}% + \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}% + \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}% + \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}% + \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}% + \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}% + \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}% + \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}% + \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}% + \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}% + \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}% + \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}% + \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}% + \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}% + } + % Some characters . , ; ? ! / are not pygmentized. + % This macro makes them "active" and they will insert potential linebreaks + \newcommand*\Wrappedbreaksatpunct {% + \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}% + \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}% + \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}% + \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}% + \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}% + \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}% + \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}% + \catcode`\.\active + \catcode`\,\active + \catcode`\;\active + \catcode`\:\active + \catcode`\?\active + \catcode`\!\active + \catcode`\/\active + \lccode`\~`\~ + } + \makeatother + + \let\OriginalVerbatim=\Verbatim + \makeatletter + \renewcommand{\Verbatim}[1][1]{% + %\parskip\z@skip + \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}% + \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}% + \def\FancyVerbFormatLine ##1{\hsize\linewidth + \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ + \strut ##1\strut}% + }% + % If the linebreak is at a space, the latter will be displayed as visible + % space at end of first line, and a continuation symbol starts next line. + % Stretch/shrink are however usually zero for typewriter font. + \def\FV@Space {% + \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font + \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak} + {\kern\fontdimen2\font}% + }% + + % Allow breaks at special characters using \PYG... macros. + \Wrappedbreaksatspecials + % Breaks at punctuation characters . , ; ? ! and / need catcode=\active + \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]% + } + \makeatother + + % Exact colors from NB + \definecolor{incolor}{HTML}{303F9F} + \definecolor{outcolor}{HTML}{D84315} + \definecolor{cellborder}{HTML}{CFCFCF} + \definecolor{cellbackground}{HTML}{F7F7F7} + + % prompt + \makeatletter + \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep} + \makeatother + \newcommand{\prompt}[4]{ + \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip} + } + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + +\begin{document} + + \maketitle + + + + + \emph{For this exercise you should have received this text in .ipynb +format. Complete the exercises by modifying this file, and submit the +modified version} + + \textbf{Exercise 1 (6 points)} + +Use Sage to find the intersection points \emph{in the real plane} (that +is, only those points such that \emph{both} coordinates are real +numbers) of the following pairs of geometric objects: + +\begin{itemize} +\tightlist +\item + The circle of equation \(x^2 + y^2 = 4\) and the ellipse of equation + \(\left(\frac x2\right)^2 + (2y)^2 = 4\). +\item + The circle of equation \(x^2 + y^2 = 4\) and the ellipse of equation + \(\left(\frac x2-2\right)^2 + (2y)^2 = 4\). +\item + The curve of equation \(y^2 = x^3 -x +1\) and the horizontal line + \(y=10\). +\item + The \(x\)-axis and the graph of the function + \(f(x)=\log(x) - e^{-x}\). \emph{Hint: \(f(x)\) has only one real + zero.} +\end{itemize} + + +\vspace{0.5cm} + \textbf{Exercise 2 (6 points)} + +\begin{enumerate} +\def\labelenumi{(\alph{enumi})} +\tightlist +\item + Use Sage to compute +\end{enumerate} + +\begin{itemize} +\tightlist +\item + the derivative +\item + a primite (i.e.~integral) +\item + the power series expansion around \(0\) up to order \(4\) +\end{itemize} + +of the following functions: +\begin{itemize} +\item \(f(x) = e^x\) +\item \(f(x) = \sin(x)\) +\item \(f(x) = \cos(x)\) +\item \(f(x) = \tan(x)\) +\item \(f(x) = \log(1+x)\) +\item \(f(x) = \sqrt[3]{1+x}\) +\end{itemize} + +\begin{enumerate} +\def\labelenumi{(\alph{enumi})} +\setcounter{enumi}{1} +\item + Use Sage to get the Latex code that represents the objects you + computed above. +\item + 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. \emph{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.} +\end{enumerate} + + +\vspace{0.5cm} + \textbf{Exercise 3 (4 points)} + +The equation \begin{align*} +y^2+x^{16}=1 +\end{align*} 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. + + +\vspace{0.5cm} + \textbf{Exercise 4 (12 points)} + +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. + +\begin{enumerate} +\def\labelenumi{(\alph{enumi})} +\item + Using Sage, find a solution for the differential equation with initial + conditions \begin{align*} + \begin{cases} + P'(t)&=\frac{P(t)}{10}-b\\ + P(1)&=1000 + \end{cases} + \end{align*} where \(b\) is a generic constant. +\item + The list \texttt{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: +\end{enumerate} + +\begin{itemize} +\tightlist +\item + The data as a bar chart. +\item + A curve that interpolates the data, using one of the methods shown in + class. +\item + The solution of the differential equation for \(b=0\). +\item + 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\). + \emph{(For this last point there is no right or wrong choice, just + pick one that looks good)} +\end{itemize} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{ }{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{]} +\end{Verbatim} +\end{tcolorbox} + +\vspace{0.5cm} + \textbf{Grading} + +This homework assignment is worth \(28\) (\(24+4\)) points, distributed +as described above. + +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 + +\begin{align*} +\operatorname{grade} = \operatorname{min}\left(20, \left\lfloor \frac{\operatorname{total}}{4} + 0.5\right\rfloor\right) +\end{align*} + + + % Add a bibliography block to the postdoc + + + +\end{document} diff --git a/src/Lecture1/live/live.aux b/src/Lecture1/live/live.aux @@ -0,0 +1,9 @@ +\relax +\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {2}Text}{1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3}Math mode}{1}\protected@file@percent } +\newlabel{eq}{{1}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Environments}{1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Lists}{1}\protected@file@percent } +\newlabel{subsectionLists}{{4.1}{1}} +\@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 @@ -0,0 +1,249 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**live.tex +(./live.tex +LaTeX2e <2020-02-02> patch level 2 +L3 programming layer <2020-02-14> +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2019/12/20 v1.4l Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2019/12/20 v1.4l Standard LaTeX file (size option) +) +\c@part=\count167 +\c@section=\count168 +\c@subsection=\count169 +\c@subsubsection=\count170 +\c@paragraph=\count171 +\c@subparagraph=\count172 +\c@figure=\count173 +\c@table=\count174 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen134 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file +\inpenc@prehook=\toks14 +\inpenc@posthook=\toks15 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/01/20 v2.17e AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks16 +\ex@=\dimen135 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen136 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count175 +LaTeX Info: Redefining \frac on input line 227. +\uproot@=\count176 +\leftroot@=\count177 +LaTeX Info: Redefining \overline on input line 389. +\classnum@=\count178 +\DOTSCASE@=\count179 +LaTeX Info: Redefining \ldots on input line 486. +LaTeX Info: Redefining \dots on input line 489. +LaTeX Info: Redefining \cdots on input line 610. +\Mathstrutbox@=\box45 +\strutbox@=\box46 +\big@size=\dimen137 +LaTeX Font Info: Redeclaring font encoding OML on input line 733. +LaTeX Font Info: Redeclaring font encoding OMS on input line 734. +\macc@depth=\count180 +\c@MaxMatrixCols=\count181 +\dotsspace@=\muskip16 +\c@parentequation=\count182 +\dspbrk@lvl=\count183 +\tag@help=\toks17 +\row@=\count184 +\column@=\count185 +\maxfields@=\count186 +\andhelp@=\toks18 +\eqnshift@=\dimen138 +\alignsep@=\dimen139 +\tagshift@=\dimen140 +\tagwidth@=\dimen141 +\totwidth@=\dimen142 +\lineht@=\dimen143 +\@envbody=\toks19 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks20 +LaTeX Info: Redefining \[ on input line 2859. +LaTeX Info: Redefining \] on input line 2860. +) +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2017/10/31 v2.20.4 +\thm@style=\toks21 +\thm@bodyfont=\toks22 +\thm@headfont=\toks23 +\thm@notefont=\toks24 +\thm@headpunct=\toks25 +\thm@preskip=\skip52 +\thm@postskip=\skip53 +\thm@headsep=\skip54 +\dth@everypar=\toks26 +) +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks27 +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2019/11/07 v1.0c TeX engine tests +)) +\Gm@cnth=\count187 +\Gm@cntv=\count188 +\c@Gm@tempcnt=\count189 +\Gm@bindingoffset=\dimen144 +\Gm@wd@mp=\dimen145 +\Gm@odd@mp=\dimen146 +\Gm@even@mp=\dimen147 +\Gm@layoutwidth=\dimen148 +\Gm@layoutheight=\dimen149 +\Gm@layouthoffset=\dimen150 +\Gm@layoutvoffset=\dimen151 +\Gm@dimlist=\toks28 +) +(/usr/share/texlive/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip55 +\enit@outerparindent=\dimen152 +\enit@toks=\toks29 +\enit@inbox=\box47 +\enit@count@id=\count190 +\enitdp@description=\count191 +) +\c@mythm=\count192 + +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode +\l__kernel_color_stack_int=\count193 +\l__pdf_internal_box=\box48 +) +(./live.aux) +\openout1 = `live.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 29. +LaTeX Font Info: ... okay on input line 29. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 29. +LaTeX Font Info: ... okay on input line 29. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 29. +LaTeX Font Info: ... okay on input line 29. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 29. +LaTeX Font Info: ... okay on input line 29. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 29. +LaTeX Font Info: ... okay on input line 29. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 29. +LaTeX Font Info: ... okay on input line 29. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 29. +LaTeX Font Info: ... okay on input line 29. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=483.69687pt +* \textheight=731.23584pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=57.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +LaTeX Font Info: Trying to load font information for U+msa on input line 31. + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 31. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] [2] (./live.aux) ) +Here is how much of TeX's memory you used: + 2503 strings out of 481239 + 33566 string characters out of 5920377 + 277759 words of memory out of 5000000 + 17776 multiletter control sequences out of 15000+600000 + 541181 words of font info for 58 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 30i,9n,27p,221b,289s stack positions out of 5000i,500n,10000p,200000b,80000s + </home/ +sebastiano/.texlive2019/texmf-var/fonts/pk/ljfour/jknappen/ec/tcrm1000.600pk></ +usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/sh +are/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/share/te +xlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/texlive/ +texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texlive/texmf- +dist/fonts/type1/public/amsfonts/cm/cmmi5.pfb></usr/share/texlive/texmf-dist/fo +nts/type1/public/amsfonts/cm/cmmi7.pfb></usr/share/texlive/texmf-dist/fonts/typ +e1/public/amsfonts/cm/cmr10.pfb></usr/share/texlive/texmf-dist/fonts/type1/publ +ic/amsfonts/cm/cmr12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsf +onts/cm/cmr17.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm +/cmr5.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pf +b></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></us +r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr/share +/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/share/texli +ve/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb> +Output written on live.pdf (2 pages, 148821 bytes). +PDF statistics: + 76 PDF objects out of 1000 (max. 8388607) + 55 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture1/live/live.pdf b/src/Lecture1/live/live.pdf Binary files differ. diff --git a/src/Lecture1/live/live.tex b/src/Lecture1/live/live.tex @@ -0,0 +1,168 @@ +\documentclass[10pt,a4paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} + +\usepackage{enumitem} +\title{Latex Example Live} +\author{Sebastiano Tronto} +\date{20-02-2021} + +\newcommand{\reals}{\mathbb{R}} +\DeclareMathOperator{\sinus}{sinus} + + +\newtheorem{mythm}{My Theorem}[section] + +\theoremstyle{definition} +\newtheorem{prop}[mythm]{Proposition} + +\theoremstyle{remark} +\newtheorem*{warning}{Achtung} + + + + +\begin{document} + +\maketitle + +\section{Introduction} + +Hello, world! + +This is a comment + +\section{Text} + +\textbf{This sentence is in boldface} + +\underline{\textit{italicized} maybe in a sentence \textbf{something}} + +\underline{\textit{one inside the other}} + +\emph{also italicized???} + +This 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. + +{\Huge Large words} + +%\appendix + +\section{Math mode} + +This is an inline formula \( \sum_i \frac{i}{22} \), it appears within the text + +This is a displaystyle formula \[ \sum_{\alpha=0}^{2^{10}} \frac2 \alpha{22} \] it appears on its own line + +How sqrt works: \( \sqrt[\phi]{25} \) + + + +\begin{align} +\label{eq} +e^x &= \left(\sum_{i=0}^\infty \frac{x^i}{i!} \right) = \\ +&= \left( 1 + x + \frac{x^2}2 \right)+ \frac{x^3}{6} + \cdots \nonumber +\end{align} + +\[ + \left\{ x \in \reals \quad \text{such that} \quad \frac{ \sinus(x)}{x^2}>0 \right\}\reals +\] + +\[ \sum_i \] + +The first equation we wrote is \eqref{eq} + +\section{Environments} + +\subsection{Lists} +\label{subsectionLists} + +\begin{itemize} + \item One \textbf{item} + \item Another \(2+2=4\) + \item a third one \[\sum_{i=0}^n\] + \item A sublist: + \begin{itemize} + \item[+] First subitem + \item[+] and so on + \end{itemize} + \item Again in the main list +\end{itemize} + +\begin{enumerate}[label=\Roman*] + \item One + \item Two + \item Actually three + \item Three (or not) +\end{enumerate} + +\subsection*{Tables} + +Let's write a table: + +\vspace{1cm} +\begin{tabular}{r||l|c} +\hline +This is a table & second column & third column \\ +\hline +Things & a & \( 2+2 = 4 \)\\ +\hline +more things & b & c +\end{tabular} + +\vspace{1cm} +\[ + \left(\begin{array}{cc} + \int_0^1 e^x & \frac{2}{25} \\ + 0 & 0 \\ + 1111 & 234\alpha + \end{array}\right) +\] + +\[ + \begin{pmatrix} + \int_0^1 e^x & \frac{2}{25} \\ + 0 & 0 \\ + 1111 & 234\alpha + \end{pmatrix} +\] + +\[ +\begin{pmatrix} +1 & 2\\ +3 & 4 +\end{pmatrix} +\overset{L2\rightarrow L2+L3}\longrightarrow +\begin{pmatrix} +1 & 2\\ +4 & 6 +\end{pmatrix} +\] + +\section{Last section} + +In section \ref{subsectionLists} we saw how to write lists + +\begin{mythm}[Gauss] +The equation \(2+x=4\) is true for \(x=2\). +\end{mythm} + +\begin{prop} +A less important fact +\end{prop} + +\setcounter{mythm}{\arabic{mythm}+100} +\begin{mythm} +Another important fact. +\end{mythm} + +\begin{warning} +It is a common mistake to think that \(2+2=5\) +\end{warning} +\[\binom45\] + +\end{document} +\ No newline at end of file diff --git a/src/Lecture1/slides/1-Introduction.aux b/src/Lecture1/slides/1-Introduction.aux @@ -0,0 +1,58 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand{\transparent@use}[1]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}} +\@writefile{toc}{\beamer@sectionintoc {1}{What?}{3}{0}{1}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{2}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{2}}} +\@writefile{nav}{\headcommand {\sectionentry {1}{What?}{3}{What?}{0}}} +\@writefile{nav}{\headcommand {\slideentry {1}{0}{1}{3/3}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}} +\@writefile{toc}{\beamer@subsectionintoc {1}{1}{Latex}{4}{0}{1}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {3}{3}}} +\@writefile{nav}{\headcommand {\beamer@subsectionentry {0}{1}{1}{4}{Latex}}} +\@writefile{nav}{\headcommand {\slideentry {1}{1}{1}{4/4}{Latex}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}} +\@writefile{nav}{\headcommand {\slideentry {1}{1}{2}{5/5}{Latex}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}} +\@writefile{toc}{\beamer@subsectionintoc {1}{2}{Sage}{6}{0}{1}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {4}{5}}} +\@writefile{nav}{\headcommand {\beamer@subsectionentry {0}{1}{2}{6}{Sage}}} +\@writefile{nav}{\headcommand {\slideentry {1}{2}{1}{6/6}{Sage}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}} +\@writefile{toc}{\beamer@sectionintoc {2}{When?}{7}{0}{2}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {3}{6}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {6}{6}}} +\@writefile{nav}{\headcommand {\sectionentry {2}{When?}{7}{When?}{0}}} +\@writefile{nav}{\headcommand {\slideentry {2}{0}{1}{7/7}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}} +\@writefile{toc}{\beamer@sectionintoc {3}{How?}{8}{0}{3}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {7}{7}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {7}{7}}} +\@writefile{nav}{\headcommand {\sectionentry {3}{How?}{8}{How?}{0}}} +\@writefile{nav}{\headcommand {\slideentry {3}{0}{1}{8/8}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}} +\@writefile{nav}{\headcommand {\beamer@partpages {1}{8}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {8}{8}}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {8}{8}}} +\@writefile{nav}{\headcommand {\beamer@documentpages {8}}} +\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {8}}} diff --git a/src/Lecture1/slides/1-Introduction.log b/src/Lecture1/slides/1-Introduction.log @@ -0,0 +1,1126 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**1-Introduction.tex +(./1-Introduction.tex +LaTeX2e <2020-02-02> patch level 2 +L3 programming layer <2020-02-14> +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls +Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty +(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count167 +) +\beamer@tempbox=\box45 +\beamer@tempcount=\count168 +\c@beamerpauses=\count169 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty +\beamer@slideinframe=\count170 +\beamer@minimum=\count171 +\beamer@decode@box=\box46 +) +\beamer@commentbox=\box47 +\beamer@modecount=\count172 +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2019/11/07 v1.0c TeX engine tests +)) +\headdp=\dimen134 +\footheight=\dimen135 +\sidebarheight=\dimen136 +\beamer@tempdim=\dimen137 +\beamer@finalheight=\dimen138 +\beamer@animht=\dimen139 +\beamer@animdp=\dimen140 +\beamer@animwd=\dimen141 +\beamer@leftmargin=\dimen142 +\beamer@rightmargin=\dimen143 +\beamer@leftsidebar=\dimen144 +\beamer@rightsidebar=\dimen145 +\beamer@boxsize=\dimen146 +\beamer@vboxoffset=\dimen147 +\beamer@descdefault=\dimen148 +\beamer@descriptionwidth=\dimen149 +\beamer@lastskip=\skip47 +\beamer@areabox=\box48 +\beamer@animcurrent=\box49 +\beamer@animshowbox=\box50 +\beamer@sectionbox=\box51 +\beamer@logobox=\box52 +\beamer@linebox=\box53 +\beamer@sectioncount=\count173 +\beamer@subsubsectionmax=\count174 +\beamer@subsectionmax=\count175 +\beamer@sectionmax=\count176 +\beamer@totalheads=\count177 +\beamer@headcounter=\count178 +\beamer@partstartpage=\count179 +\beamer@sectionstartpage=\count180 +\beamer@subsectionstartpage=\count181 +\beamer@animationtempa=\count182 +\beamer@animationtempb=\count183 +\beamer@xpos=\count184 +\beamer@ypos=\count185 +\beamer@ypos@offset=\count186 +\beamer@showpartnumber=\count187 +\beamer@currentsubsection=\count188 +\beamer@coveringdepth=\count189 +\beamer@sectionadjust=\count190 +\beamer@tocsectionnumber=\count191 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) +\beamer@paperwidth=\skip48 +\beamer@paperheight=\skip49 + +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count192 +\Gm@cntv=\count193 +\c@Gm@tempcnt=\count194 +\Gm@bindingoffset=\dimen150 +\Gm@wd@mp=\dimen151 +\Gm@odd@mp=\dimen152 +\Gm@even@mp=\dimen153 +\Gm@layoutwidth=\dimen154 +\Gm@layoutheight=\dimen155 +\Gm@layouthoffset=\dimen156 +\Gm@layoutvoffset=\dimen157 +\Gm@dimlist=\toks15 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen158 +\Gin@req@width=\dimen159 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks16 +\pgfutil@tempdima=\dimen160 +\pgfutil@tempdimb=\dimen161 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t +ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box54 +(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty +Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t +ex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen162 +\pgf@y=\dimen163 +\pgf@xa=\dimen164 +\pgf@ya=\dimen165 +\pgf@xb=\dimen166 +\pgf@yb=\dimen167 +\pgf@xc=\dimen168 +\pgf@yc=\dimen169 +\pgf@xd=\dimen170 +\pgf@yd=\dimen171 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count195 +\c@pgf@countb=\count196 +\c@pgf@countc=\count197 +\c@pgf@countd=\count198 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count199 + (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de +f +File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code. +tex +File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfsyssoftpath@smallbuffer@items=\count266 +\pgfsyssoftpath@bigbuffer@items=\count267 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code. +tex +File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen172 +\pgfmath@count=\count268 +\pgfmath@box=\box55 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet +ric.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod +e.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison +.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari +thmetics.code.tex))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count269 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te +x +File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@picminx=\dimen173 +\pgf@picmaxx=\dimen174 +\pgf@picminy=\dimen175 +\pgf@picmaxy=\dimen176 +\pgf@pathminx=\dimen177 +\pgf@pathmaxx=\dimen178 +\pgf@pathminy=\dimen179 +\pgf@pathmaxy=\dimen180 +\pgf@xx=\dimen181 +\pgf@xy=\dimen182 +\pgf@yx=\dimen183 +\pgf@yy=\dimen184 +\pgf@zx=\dimen185 +\pgf@zy=\dimen186 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct. +code.tex +File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@path@lastx=\dimen187 +\pgf@path@lasty=\dimen188 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code +.tex +File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@shorten@end@additional=\dimen189 +\pgf@shorten@start@additional=\dimen190 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te +x +File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfpic=\box56 +\pgf@hbox=\box57 +\pgf@layerbox@main=\box58 +\pgf@picture@serial@count=\count270 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c +ode.tex +File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgflinewidth=\dimen191 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation +s.code.tex +File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@pt@x=\dimen192 +\pgf@pt@y=\dimen193 +\pgf@pt@temp=\dimen194 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t +ex +File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing +.code.tex +File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te +x +File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowsep=\dimen195 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@max=\dimen196 +\pgf@sys@shading@range@num=\count271 +\pgf@shadingcount=\count272 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code. +tex +File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfexternal@startupbox=\box59 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te +x +File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c +ode.tex +File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code. +tex +File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty +Package: xxcolor 2003/10/24 ver 0.1 +\XC@nummixins=\count273 +\XC@countmixins=\count274 +) +(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO) +)) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO) +) +\@linkdim=\dimen197 +\Hy@linkcounter=\count275 +\Hy@pagecounter=\count276 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count277 +\pdfmajorversion=\count278 +Package hyperref Info: Option `bookmarks' set `true' on input line 4421. +Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421. +Package hyperref Info: Option `implicit' set `false' on input line 4421. +Package hyperref Info: Hyper figures OFF on input line 4547. +Package hyperref Info: Link nesting OFF on input line 4552. +Package hyperref Info: Hyper index ON on input line 4555. +Package hyperref Info: Plain pages OFF on input line 4562. +Package hyperref Info: Backreferencing OFF on input line 4567. +Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals. +Package hyperref Info: Bookmarks ON on input line 4800. +\c@Hy@tempcnt=\count279 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5159. +\XeTeXLinkMargin=\dimen198 + +(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count280 +\Field@Width=\dimen199 +\Fld@charsize=\dimen256 +Package hyperref Info: Hyper figures OFF on input line 6430. +Package hyperref Info: Link nesting OFF on input line 6435. +Package hyperref Info: Hyper index ON on input line 6438. +Package hyperref Info: backreferencing OFF on input line 6445. +Package hyperref Info: Link coloring OFF on input line 6450. +Package hyperref Info: Link coloring with OCG OFF on input line 6455. +Package hyperref Info: PDF/A mode OFF on input line 6460. +LaTeX Info: Redefining \ref on input line 6500. +LaTeX Info: Redefining \pageref on input line 6504. +\Hy@abspage=\count281 + + +Package hyperref Message: Stopped early. + +) +Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO) +) +\Fld@listcount=\count282 +\c@bookmark@seq@number=\count283 + +(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks26 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty +Package: sansmathaccent 2020/01/31 + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty +Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files) +))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty +Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty +\beamer@argscount=\count284 +\beamer@lastskipcover=\skip50 +\beamer@trivlistdepth=\count285 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty +\c@lecture=\count286 +\c@part=\count287 +\c@section=\count288 +\c@subsection=\count289 +\c@subsubsection=\count290 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty +\beamer@framebox=\box60 +\beamer@frametitlebox=\box61 +\beamer@zoombox=\box62 +\beamer@zoomcount=\count291 +\beamer@zoomframecount=\count292 +\beamer@frametextheight=\dimen257 +\c@subsectionslide=\count293 +\beamer@frametopskip=\skip51 +\beamer@framebottomskip=\skip52 +\beamer@frametopskipautobreak=\skip53 +\beamer@framebottomskipautobreak=\skip54 +\beamer@envbody=\toks27 +\framewidth=\dimen258 +\c@framenumber=\count294 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty +\beamer@verbatimfileout=\write4 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty +\beamer@splitbox=\box63 +\beamer@autobreakcount=\count295 +\beamer@autobreaklastheight=\dimen259 +\beamer@frametitletoks=\toks28 +\beamer@framesubtitletoks=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty +\beamer@footins=\box64 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty +\beamer@frameboxcopy=\box65 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty +\beamer@sbttoks=\toks30 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty +\bmb@box=\box66 +\bmb@colorbox=\box67 +\bmb@boxshadow=\box68 +\bmb@boxshadowball=\box69 +\bmb@boxshadowballlarge=\box70 +\bmb@temp=\dimen260 +\bmb@dima=\dimen261 +\bmb@dimb=\dimen262 +\bmb@prevheight=\dimen263 +) +\beamer@blockheadheight=\dimen264 +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks31 +) +\c@figure=\count296 +\c@table=\count297 +\abovecaptionskip=\skip55 +\belowcaptionskip=\skip56 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty +\beamer@section@min@dim=\dimen265 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/01/20 v2.17e AMS math features +\@mathmargin=\skip57 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks32 +\ex@=\dimen266 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen267 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count298 +LaTeX Info: Redefining \frac on input line 227. +\uproot@=\count299 +\leftroot@=\count300 +LaTeX Info: Redefining \overline on input line 389. +\classnum@=\count301 +\DOTSCASE@=\count302 +LaTeX Info: Redefining \ldots on input line 486. +LaTeX Info: Redefining \dots on input line 489. +LaTeX Info: Redefining \cdots on input line 610. +\Mathstrutbox@=\box71 +\strutbox@=\box72 +\big@size=\dimen268 +LaTeX Font Info: Redeclaring font encoding OML on input line 733. +LaTeX Font Info: Redeclaring font encoding OMS on input line 734. +\macc@depth=\count303 +\c@MaxMatrixCols=\count304 +\dotsspace@=\muskip17 +\c@parentequation=\count305 +\dspbrk@lvl=\count306 +\tag@help=\toks33 +\row@=\count307 +\column@=\count308 +\maxfields@=\count309 +\andhelp@=\toks34 +\eqnshift@=\dimen269 +\alignsep@=\dimen270 +\tagshift@=\dimen271 +\tagwidth@=\dimen272 +\totwidth@=\dimen273 +\lineht@=\dimen274 +\@envbody=\toks35 +\multlinegap=\skip58 +\multlinetaggap=\skip59 +\mathdisplay@stack=\toks36 +LaTeX Info: Redefining \[ on input line 2859. +LaTeX Info: Redefining \] on input line 2860. +) +(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2017/10/31 v2.20.4 +\thm@style=\toks37 +\thm@bodyfont=\toks38 +\thm@headfont=\toks39 +\thm@notefont=\toks40 +\thm@headpunct=\toks41 +\thm@preskip=\skip60 +\thm@postskip=\skip61 +\thm@headsep=\skip62 +\dth@everypar=\toks42 +) +\c@theorem=\count310 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty +\beamer@dima=\dimen275 +\beamer@dimb=\dimen276 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file +\inpenc@prehook=\toks43 +\inpenc@posthook=\toks44 +) +(/usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty +Package: svg 2020/01/13 v2.02e (include SVG pictures) + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty +Package: scrbase 2020/01/24 v3.29 KOMA-Script package (KOMA-Script-independent +basics and keyval usage) +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty +Package: shellesc 2019/11/08 v1.0c unified shell escape interface for LaTeX +Package shellesc Info: Unrestricted shell escape enabled on input line 75. +) +(/usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\svg@box=\box73 +\c@svg@param@lastpage=\count311 +\c@svg@param@currpage=\count312 + +(/usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty +Package: ifplatform 2017/10/13 v0.4a Testing for the operating system + +(/usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty +Package: catchfile 2019/12/09 v1.8 Catch the contents of a file (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty +Package: ifluatex 2019/10/25 v1.5 ifluatex legacy package. Use iftex instead. +) +runsystem(uname -s > "1-Introduction.w18")...executed. + + +(./1-Introduction.w18) +runsystem(rm -- "1-Introduction.w18")...executed. + +)) +(/usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty +Package: transparent 2019/11/29 v1.4 Transparency via pdfTeX's color stack (HO) + +) +(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty +Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ + +(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +Package: pgf 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfnodeparttextbox=\box74 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65 +.sty +Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b) +\pgf@nodesepstart=\dimen277 +\pgf@nodesepend=\dimen278 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18 +.sty +Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen279 +\pgffor@skip=\dimen280 +\pgffor@stack=\toks45 +\pgffor@toks=\toks46 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers +.code.tex +File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@plot@mark@count=\count313 +\pgfplotmarksize=\dimen281 +) +\tikz@lastx=\dimen282 +\tikz@lasty=\dimen283 +\tikz@lastxsaved=\dimen284 +\tikz@lastysaved=\dimen285 +\tikz@lastmovetox=\dimen286 +\tikz@lastmovetoy=\dimen287 +\tikzleveldistance=\dimen288 +\tikzsiblingdistance=\dimen289 +\tikz@figbox=\box75 +\tikz@figbox@bg=\box76 +\tikz@tempbox=\box77 +\tikz@tempbox@bg=\box78 +\tikztreelevel=\count314 +\tikznumberofchildren=\count315 +\tikznumberofcurrentchild=\count316 +\tikz@fig@count=\count317 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfmatrixcurrentrow=\count318 +\pgfmatrixcurrentcolumn=\count319 +\pgf@matrix@numberofcolumns=\count320 +) +\tikz@expandcount=\count321 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarymatrix.code.tex +File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibraryquotes.code.tex +File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta. +code.tex +File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowinset=\dimen290 +\pgfarrowlength=\dimen291 +\pgfarrowwidth=\dimen292 +\pgfarrowlinewidth=\dimen293 +))) +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode +\l__kernel_color_stack_int=\count322 +\l__pdf_internal_box=\box79 +) +(./1-Introduction.aux) +\openout1 = `1-Introduction.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 16. +LaTeX Font Info: ... okay on input line 16. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: custom +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: includehead includefoot +* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt) +* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt) +* \paperwidth=364.19536pt +* \paperheight=273.14662pt +* \textwidth=342.2953pt +* \textheight=244.6939pt +* \oddsidemargin=-61.31996pt +* \evensidemargin=-61.31996pt +* \topmargin=-72.26999pt +* \headheight=14.22636pt +* \headsep=0.0pt +* \topskip=11.0pt +* \footskip=14.22636pt +* \marginparwidth=4.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count323 +\scratchdimen=\dimen294 +\scratchbox=\box80 +\nofMPsegments=\count324 +\nofMParguments=\count325 +\everyMPshowfont=\toks47 +\MPscratchCnt=\count326 +\MPscratchDim=\dimen295 +\MPnumerator=\count327 +\makeMPintoPDFobject=\count328 +\everyMPtoPDFconversion=\toks48 +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +ABD: EveryShipout initializing macros +\AtBeginShipoutBox=\box81 +Package hyperref Info: Link coloring OFF on input line 16. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count329 +) +LaTeX Info: Redefining \ref on input line 16. +LaTeX Info: Redefining \pageref on input line 16. +LaTeX Info: Redefining \nameref on input line 16. + +(./1-Introduction.out) (./1-Introduction.out) +\@outlinefile=\write5 +\openout5 = `1-Introduction.out'. + +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 16. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 16. +\symnumbers=\mathgroup6 +\sympureletters=\mathgroup7 +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 16. +LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 16. +LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 16. +LaTeX Font Info: Redeclaring math alphabet \mathit on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 16. +LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 16. +LaTeX Font Info: Overwriting symbol font `numbers' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 16. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 16. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 16. +LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 16. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal' +(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 1 +6. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 1 +6. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp +ut line 16. + +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary +-English.dict +Dictionary: translator-basic-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic +tionary-English.dict +Dictionary: translator-bibliography-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict +ionary-English.dict +Dictionary: translator-environment-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar +y-English.dict +Dictionary: translator-months-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona +ry-English.dict +Dictionary: translator-numbers-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona +ry-English.dict +Dictionary: translator-theorem-dictionary, Language: English +) (./1-Introduction.nav) +<img/unilu.jpg, id=40, 645.16031pt x 578.16pt> +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 20. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>] (./1-Int +roduction.toc) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 24. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [2 + +] +LaTeX Font Info: Trying to load font information for U+msa on input line 41. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 41. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp +ut line 41. + +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd +File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma +thkerncmss. +) +<img/latex.png, id=112, 803.0pt x 334.24875pt> +File: img/latex.png Graphic file (type png) +<use img/latex.png> +Package pdftex.def Info: img/latex.png used on input line 41. +(pdftex.def) Requested size: 80.3047pt x 33.42682pt. +Package svg Info: Last page of `./svg-inkscape/sage_svg-tex.pdf' is 1 on input +line 41. + +(./svg-inkscape/sage_svg-tex.pdf_tex +<./svg-inkscape/sage_svg-tex.pdf, id=115, page=1, 376.40625pt x 98.51555pt> +File: ./svg-inkscape/sage_svg-tex.pdf Graphic file (type pdf) +<use ./svg-inkscape/sage_svg-tex.pdf, page 1> +Package pdftex.def Info: ./svg-inkscape/sage_svg-tex.pdf , page1 used on input +line 56. +(pdftex.def) Requested size: 80.92596pt x 21.18042pt. +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 41. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [3 + + <./img/latex.png> <./svg-inkscape/sage_svg-tex.pdf>] +File: img/latex.png Graphic file (type png) +<use img/latex.png> +Package pdftex.def Info: img/latex.png used on input line 54. +(pdftex.def) Requested size: 80.3047pt x 33.42682pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 54. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [4 + +] +\openout4 = `1-Introduction.vrb'. + + (./1-Introduction.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 70. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [5 + +] +Package svg Info: Last page of `./svg-inkscape/sage_svg-tex.pdf' is 1 on input +line 81. + +(./svg-inkscape/sage_svg-tex.pdf_tex +File: ./svg-inkscape/sage_svg-tex.pdf Graphic file (type pdf) +<use ./svg-inkscape/sage_svg-tex.pdf, page 1> +Package pdftex.def Info: ./svg-inkscape/sage_svg-tex.pdf , page1 used on input +line 56. +(pdftex.def) Requested size: 80.92596pt x 21.18042pt. +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 81. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [6 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 102. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [7 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 112. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [8 + +] +\tf@nav=\write6 +\openout6 = `1-Introduction.nav'. + +\tf@toc=\write7 +\openout7 = `1-Introduction.toc'. + +\tf@snm=\write8 +\openout8 = `1-Introduction.snm'. + +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 114. +Package atveryend Info: Empty hook `AfterLastShipout' on input line 114. + (./1-Introduction.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 114. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 114. +Package rerunfilecheck Info: File `1-Introduction.out' has not changed. +(rerunfilecheck) Checksum: 602A5CE8E5D11B5A515CD518C32DC054;226. + ) +Here is how much of TeX's memory you used: + 22715 strings out of 481239 + 461789 string characters out of 5920377 + 724211 words of memory out of 5000000 + 37390 multiletter control sequences out of 15000+600000 + 540074 words of font info for 52 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 58i,15n,89p,798b,701s stack positions out of 5000i,500n,10000p,200000b,80000s +</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></us +r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/shar +e/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texl +ive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/tex +mf-dist/fonts/type1/public/amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-d +ist/fonts/type1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/f +onts/type1/public/amsfonts/cm/cmssi8.pfb></usr/share/texlive/texmf-dist/fonts/t +ype1/public/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/p +ublic/amsfonts/cm/cmsy8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/a +msfonts/cm/cmtt10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfont +s/cm/cmtt8.pfb> +Output written on 1-Introduction.pdf (8 pages, 183246 bytes). +PDF statistics: + 381 PDF objects out of 1000 (max. 8388607) + 320 compressed objects within 4 object streams + 22 named destinations out of 1000 (max. 500000) + 138 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture1/slides/1-Introduction.nav b/src/Lecture1/slides/1-Introduction.nav @@ -0,0 +1,34 @@ +\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}} +\headcommand {\beamer@framepages {1}{1}} +\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}} +\headcommand {\beamer@framepages {2}{2}} +\headcommand {\beamer@sectionpages {1}{2}} +\headcommand {\beamer@subsectionpages {1}{2}} +\headcommand {\sectionentry {1}{What?}{3}{What?}{0}} +\headcommand {\slideentry {1}{0}{1}{3/3}{}{0}} +\headcommand {\beamer@framepages {3}{3}} +\headcommand {\beamer@subsectionpages {3}{3}} +\headcommand {\beamer@subsectionentry {0}{1}{1}{4}{Latex}} +\headcommand {\slideentry {1}{1}{1}{4/4}{Latex}{0}} +\headcommand {\beamer@framepages {4}{4}} +\headcommand {\slideentry {1}{1}{2}{5/5}{Latex}{0}} +\headcommand {\beamer@framepages {5}{5}} +\headcommand {\beamer@subsectionpages {4}{5}} +\headcommand {\beamer@subsectionentry {0}{1}{2}{6}{Sage}} +\headcommand {\slideentry {1}{2}{1}{6/6}{Sage}{0}} +\headcommand {\beamer@framepages {6}{6}} +\headcommand {\beamer@sectionpages {3}{6}} +\headcommand {\beamer@subsectionpages {6}{6}} +\headcommand {\sectionentry {2}{When?}{7}{When?}{0}} +\headcommand {\slideentry {2}{0}{1}{7/7}{}{0}} +\headcommand {\beamer@framepages {7}{7}} +\headcommand {\beamer@sectionpages {7}{7}} +\headcommand {\beamer@subsectionpages {7}{7}} +\headcommand {\sectionentry {3}{How?}{8}{How?}{0}} +\headcommand {\slideentry {3}{0}{1}{8/8}{}{0}} +\headcommand {\beamer@framepages {8}{8}} +\headcommand {\beamer@partpages {1}{8}} +\headcommand {\beamer@subsectionpages {8}{8}} +\headcommand {\beamer@sectionpages {8}{8}} +\headcommand {\beamer@documentpages {8}} +\headcommand {\gdef \inserttotalframenumber {8}} diff --git a/src/Lecture1/slides/1-Introduction.out b/src/Lecture1/slides/1-Introduction.out @@ -0,0 +1,5 @@ +\BOOKMARK [2][]{Outline0.1}{What?}{}% 1 +\BOOKMARK [3][]{Outline0.1.1.4}{Latex}{Outline0.1}% 2 +\BOOKMARK [3][]{Outline0.1.2.6}{Sage}{Outline0.1}% 3 +\BOOKMARK [2][]{Outline0.2}{When?}{}% 4 +\BOOKMARK [2][]{Outline0.3}{How?}{}% 5 diff --git a/src/Lecture1/slides/1-Introduction.pdf 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 diff --git a/src/Lecture1/slides/1-Introduction.tex b/src/Lecture1/slides/1-Introduction.tex @@ -0,0 +1,115 @@ +\documentclass[11pt]{beamer} +\usetheme{Madrid} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{svg} + +\usepackage{tikz-cd} + +\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto} +\title{Mathematical Software - Introduction} +\logo{\includegraphics[scale=0.1]{img/unilu.jpg}} +%\institute{University of Luxembourg} + +\date{2021-02-19} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + +\begin{frame} + \tableofcontents +\end{frame} + +\section{What?} +\begin{frame}{What} + \begin{columns} + \column{0.6\textwidth} + \begin{itemize} + \item {\bf Latex} for writing scientific text + \item {\bf Sage} for computations + \end{itemize} + + \column{0.4\textwidth} + \includegraphics[scale=0.1]{img/latex.png} + \vspace{0.5cm} + + \includesvg[scale=0.215]{img/sage} + \end{columns} +\end{frame} + +\subsection{Latex} +\begin{frame}{Latex} + \includegraphics[scale=0.1]{img/latex.png} + \begin{itemize} + \item A typesetting system, has been around since the 1980s + \item Currently the best way to write scientific texts (Math, Physics...) + \item Can be used for lecture notes, homework, articles, books, graphics + (with TikZ), this presentation...%, shopping list... + \item ``What you get is what you \emph{mean}'', rather than what you + \emph{see} + \end{itemize} +\end{frame} + +\begin{frame}[fragile]{Latex - Example} + An equation like this: + \begin{align*} + e^x =& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\ + =& 1 + x + \frac{x^2}{2} + \frac{x^3}{6} + \cdots + \end{align*} + is written in LaTeX as: + \begin{verbatim} + \begin{align*} + e^x =& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\ + =& 1 + x + \frac{x^2}{2} + + \frac{x^3}{6} + \cdots + \end{align*} + \end{verbatim} +\end{frame} + +\subsection{Sage} +\begin{frame}{Sage} + \includesvg[scale=0.215]{img/sage} + \begin{itemize} + \item Free and open source Mathematical software + \item Basically python with a lot of Math libraries + \item Builds up on existing software such a Pari/GP, NumPy, R... + \item Popular for Computational Algebra (Number Theory, Cryptography...) + \end{itemize} +\end{frame} + +\section{When?} +\begin{frame}{When} + \begin{tabular}{r|c|c} + %Date & Time & Topics \\ + %\hline + February 19 & \texttt{14:00 - 17:30} & Introduction, LaTeX fundamentals \\ + \hline + March 12 & \texttt{14:00 - 17:30} & More advanced LaTeX topics \\ + \hline + March 26 & \texttt{14:00 - 17:30} & LaTeX: presentations, graphics \\ + \hline + April 2 & \texttt{14:00 - 17:30} & ??? (LaTeX or Sage) \\ + \hline + April 23 & \texttt{14:00 - 17:30} & Sage (???) \\ + \hline + May 7 & \texttt{14:00 - {\bf 18:15}} & Sage (???) \\ + \hline + May 21 & \texttt{14:00 - {\bf 18:15}} & Sage (???) + \end{tabular} +\end{frame} + +\section{How?} +\begin{frame}{How} + \begin{itemize} + \item \textbf{Remote teaching} at least until April 2 included (probably + always). + \item \textbf{Learn by doing} graded homework (4-5 assignments), non-graded + exercises, free practice. No final exam. + \end{itemize} +\end{frame} + +\end{document} + diff --git a/src/Lecture1/slides/1-Introduction.toc b/src/Lecture1/slides/1-Introduction.toc @@ -0,0 +1,5 @@ +\beamer@sectionintoc {1}{What?}{3}{0}{1} +\beamer@subsectionintoc {1}{1}{Latex}{4}{0}{1} +\beamer@subsectionintoc {1}{2}{Sage}{6}{0}{1} +\beamer@sectionintoc {2}{When?}{7}{0}{2} +\beamer@sectionintoc {3}{How?}{8}{0}{3} diff --git a/src/Lecture1/slides/1-Introduction.vrb b/src/Lecture1/slides/1-Introduction.vrb @@ -0,0 +1,14 @@ +\frametitle{Latex - Example} +An equation like this: + \begin{align*} + e^x =& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\ + =& 1 + x + \frac{x^2}{2} + \frac{x^3}{6} + \cdots + \end{align*} + is written in LaTeX as: + \begin{verbatim} + \begin{align*} + e^x =& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\ + =& 1 + x + \frac{x^2}{2} + + \frac{x^3}{6} + \cdots + \end{align*} + \end{verbatim} diff --git a/src/Lecture1/slides/2-LatexFundamentals.aux b/src/Lecture1/slides/2-LatexFundamentals.aux @@ -0,0 +1,70 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {22}{22}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {23}{23}}} +\@writefile{nav}{\headcommand {\beamer@partpages {1}{23}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{23}}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{23}}} +\@writefile{nav}{\headcommand {\beamer@documentpages {23}}} +\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {23}}} +\gdef \@abspage@last{23} diff --git a/src/Lecture1/slides/2-LatexFundamentals.log b/src/Lecture1/slides/2-LatexFundamentals.log @@ -0,0 +1,1174 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**2-LatexFundamentals.tex +(./2-LatexFundamentals.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/beamer/beamer.cls +Document Class: beamer 2020/07/22 v3.59 A class for typesetting presentations +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasemodes.sty +(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count177 +) +\beamer@tempbox=\box47 +\beamer@tempcount=\count178 +\c@beamerpauses=\count179 + +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasedecode.sty +\beamer@slideinframe=\count180 +\beamer@minimum=\count181 +\beamer@decode@box=\box48 +) +\beamer@commentbox=\box49 +\beamer@modecount=\count182 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\headdp=\dimen138 +\footheight=\dimen139 +\sidebarheight=\dimen140 +\beamer@tempdim=\dimen141 +\beamer@finalheight=\dimen142 +\beamer@animht=\dimen143 +\beamer@animdp=\dimen144 +\beamer@animwd=\dimen145 +\beamer@leftmargin=\dimen146 +\beamer@rightmargin=\dimen147 +\beamer@leftsidebar=\dimen148 +\beamer@rightsidebar=\dimen149 +\beamer@boxsize=\dimen150 +\beamer@vboxoffset=\dimen151 +\beamer@descdefault=\dimen152 +\beamer@descriptionwidth=\dimen153 +\beamer@lastskip=\skip47 +\beamer@areabox=\box50 +\beamer@animcurrent=\box51 +\beamer@animshowbox=\box52 +\beamer@sectionbox=\box53 +\beamer@logobox=\box54 +\beamer@linebox=\box55 +\beamer@sectioncount=\count183 +\beamer@subsubsectionmax=\count184 +\beamer@subsectionmax=\count185 +\beamer@sectionmax=\count186 +\beamer@totalheads=\count187 +\beamer@headcounter=\count188 +\beamer@partstartpage=\count189 +\beamer@sectionstartpage=\count190 +\beamer@subsectionstartpage=\count191 +\beamer@animationtempa=\count192 +\beamer@animationtempb=\count193 +\beamer@xpos=\count194 +\beamer@ypos=\count195 +\beamer@ypos@offset=\count196 +\beamer@showpartnumber=\count197 +\beamer@currentsubsection=\count198 +\beamer@coveringdepth=\count199 +\beamer@sectionadjust=\count266 +\beamer@tocsectionnumber=\count267 + +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks15 +)) +\beamer@paperwidth=\skip48 +\beamer@paperheight=\skip49 + +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count268 +\Gm@cntv=\count269 +\c@Gm@tempcnt=\count270 +\Gm@bindingoffset=\dimen154 +\Gm@wd@mp=\dimen155 +\Gm@odd@mp=\dimen156 +\Gm@even@mp=\dimen157 +\Gm@layoutwidth=\dimen158 +\Gm@layoutheight=\dimen159 +\Gm@layouthoffset=\dimen160 +\Gm@layoutvoffset=\dimen161 +\Gm@dimlist=\toks16 +) +(/usr/share/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen162 +\Gin@req@width=\dimen163 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks17 +\pgfutil@tempdima=\dimen164 +\pgfutil@tempdimb=\dimen165 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box56 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks18 +\pgfkeys@temptoks=\toks19 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks20 +)) +\pgf@x=\dimen166 +\pgf@y=\dimen167 +\pgf@xa=\dimen168 +\pgf@ya=\dimen169 +\pgf@xb=\dimen170 +\pgf@yb=\dimen171 +\pgf@xc=\dimen172 +\pgf@yc=\dimen173 +\pgf@xd=\dimen174 +\pgf@yd=\dimen175 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count271 +\c@pgf@countb=\count272 +\c@pgf@countc=\count273 +\c@pgf@countd=\count274 +\t@pgf@toka=\toks21 +\t@pgf@tokb=\toks22 +\t@pgf@tokc=\toks23 +\pgf@sys@id@count=\count275 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count276 +\pgfsyssoftpath@bigbuffer@items=\count277 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen176 +\pgfmath@count=\count278 +\pgfmath@box=\box57 +\pgfmath@toks=\toks24 +\pgfmath@stack@operand=\toks25 +\pgfmath@stack@operation=\toks26 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count279 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen177 +\pgf@picmaxx=\dimen178 +\pgf@picminy=\dimen179 +\pgf@picmaxy=\dimen180 +\pgf@pathminx=\dimen181 +\pgf@pathmaxx=\dimen182 +\pgf@pathminy=\dimen183 +\pgf@pathmaxy=\dimen184 +\pgf@xx=\dimen185 +\pgf@xy=\dimen186 +\pgf@yx=\dimen187 +\pgf@yy=\dimen188 +\pgf@zx=\dimen189 +\pgf@zy=\dimen190 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen191 +\pgf@path@lasty=\dimen192 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen193 +\pgf@shorten@start@additional=\dimen194 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box58 +\pgf@hbox=\box59 +\pgf@layerbox@main=\box60 +\pgf@picture@serial@count=\count280 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen195 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen196 +\pgf@pt@y=\dimen197 +\pgf@pt@temp=\dimen198 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen199 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen256 +\pgf@sys@shading@range@num=\count281 +\pgf@shadingcount=\count282 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box61 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty +Package: xxcolor 2003/10/24 ver 0.1 +\XC@nummixins=\count283 +\XC@countmixins=\count284 +) +(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa +ge +with kernel methods +) +(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX + +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) + +(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) +) +\@linkdim=\dimen257 +\Hy@linkcounter=\count285 +\Hy@pagecounter=\count286 + +(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count287 +Package hyperref Info: Option `bookmarks' set `true' on input line 4338. +Package hyperref Info: Option `bookmarksopen' set `true' on input line 4338. +Package hyperref Info: Option `implicit' set `false' on input line 4338. +Package hyperref Info: Hyper figures OFF on input line 4464. +Package hyperref Info: Link nesting OFF on input line 4469. +Package hyperref Info: Hyper index ON on input line 4472. +Package hyperref Info: Plain pages OFF on input line 4479. +Package hyperref Info: Backreferencing OFF on input line 4484. +Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals. +Package hyperref Info: Bookmarks ON on input line 4717. +\c@Hy@tempcnt=\count288 + +(/usr/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5076. +\XeTeXLinkMargin=\dimen258 + +(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count289 +\Field@Width=\dimen259 +\Fld@charsize=\dimen260 +Package hyperref Info: Hyper figures OFF on input line 6347. +Package hyperref Info: Link nesting OFF on input line 6352. +Package hyperref Info: Hyper index ON on input line 6355. +Package hyperref Info: backreferencing OFF on input line 6362. +Package hyperref Info: Link coloring OFF on input line 6367. +Package hyperref Info: Link coloring with OCG OFF on input line 6372. +Package hyperref Info: PDF/A mode OFF on input line 6377. +LaTeX Info: Redefining \ref on input line 6417. +LaTeX Info: Redefining \pageref on input line 6421. +\Hy@abspage=\count290 + + +Package hyperref Message: Stopped early. + +) +Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX + +(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag +e +with kernel methods +) +\Fld@listcount=\count291 +\c@bookmark@seq@number=\count292 + +(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +)) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaserequires.sty +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasefont.sty +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks27 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +))) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty +(/usr/share/texmf-dist/tex/latex/translator/translator.sty +Package: translator 2020-08-03 v1.12c Easy translation of strings in LaTeX +)) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasemisc.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty +\beamer@argscount=\count293 +\beamer@lastskipcover=\skip50 +\beamer@trivlistdepth=\count294 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetitle.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasesection.sty +\c@lecture=\count295 +\c@part=\count296 +\c@section=\count297 +\c@subsection=\count298 +\c@subsubsection=\count299 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframe.sty +\beamer@framebox=\box62 +\beamer@frametitlebox=\box63 +\beamer@zoombox=\box64 +\beamer@zoomcount=\count300 +\beamer@zoomframecount=\count301 +\beamer@frametextheight=\dimen261 +\c@subsectionslide=\count302 +\beamer@frametopskip=\skip51 +\beamer@framebottomskip=\skip52 +\beamer@frametopskipautobreak=\skip53 +\beamer@framebottomskipautobreak=\skip54 +\beamer@envbody=\toks28 +\framewidth=\dimen262 +\c@framenumber=\count303 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty +\beamer@verbatimfileout=\write4 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty +\beamer@splitbox=\box65 +\beamer@autobreakcount=\count304 +\beamer@autobreaklastheight=\dimen263 +\beamer@frametitletoks=\toks29 +\beamer@framesubtitletoks=\toks30 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty +\beamer@footins=\box66 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasecolor.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasenotes.sty +\beamer@frameboxcopy=\box67 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetoc.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty +\beamer@sbttoks=\toks31 + +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty +\bmb@box=\box68 +\bmb@colorbox=\box69 +\bmb@boxshadow=\box70 +\bmb@boxshadowball=\box71 +\bmb@boxshadowballlarge=\box72 +\bmb@temp=\dimen264 +\bmb@dima=\dimen265 +\bmb@dimb=\dimen266 +\bmb@prevheight=\dimen267 +) +\beamer@blockheadheight=\dimen268 +)) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty +(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks32 +) +\c@figure=\count305 +\c@table=\count306 +\abovecaptionskip=\skip55 +\belowcaptionskip=\skip56 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty +\beamer@section@min@dim=\dimen269 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip57 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks33 +\ex@=\dimen270 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen271 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count307 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count308 +\leftroot@=\count309 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count310 +\DOTSCASE@=\count311 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box73 +\strutbox@=\box74 +\big@size=\dimen272 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count312 +\c@MaxMatrixCols=\count313 +\dotsspace@=\muskip17 +\c@parentequation=\count314 +\dspbrk@lvl=\count315 +\tag@help=\toks34 +\row@=\count316 +\column@=\count317 +\maxfields@=\count318 +\andhelp@=\toks35 +\eqnshift@=\dimen273 +\alignsep@=\dimen274 +\tagshift@=\dimen275 +\tagwidth@=\dimen276 +\totwidth@=\dimen277 +\lineht@=\dimen278 +\@envbody=\toks36 +\multlinegap=\skip58 +\multlinetaggap=\skip59 +\mathdisplay@stack=\toks37 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2020/05/29 v2.20.6 +\thm@style=\toks38 +\thm@bodyfont=\toks39 +\thm@headfont=\toks40 +\thm@notefont=\toks41 +\thm@headpunct=\toks42 +\thm@preskip=\skip60 +\thm@postskip=\skip61 +\thm@headsep=\skip62 +\dth@everypar=\toks43 +) +\c@theorem=\count319 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasethemes.sty)) +(/usr/share/texmf-dist/tex/latex/beamer/beamerthemedefault.sty +(/usr/share/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty +\beamer@dima=\dimen279 +\beamer@dimb=\dimen280 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty))) +(/usr/share/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty +(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty)) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks44 +\inpenc@posthook=\toks45 +) +(/usr/share/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty +Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ + +(/usr/share/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +Package: pgf 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfnodeparttextbox=\box75 +) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a) +\pgf@nodesepstart=\dimen281 +\pgf@nodesepend=\dimen282 +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen283 +\pgffor@skip=\dimen284 +\pgffor@stack=\toks46 +\pgffor@toks=\toks47 +)) +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.te +x +File: pgflibraryplothandlers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@plot@mark@count=\count320 +\pgfplotmarksize=\dimen285 +) +\tikz@lastx=\dimen286 +\tikz@lasty=\dimen287 +\tikz@lastxsaved=\dimen288 +\tikz@lastysaved=\dimen289 +\tikz@lastmovetox=\dimen290 +\tikz@lastmovetoy=\dimen291 +\tikzleveldistance=\dimen292 +\tikzsiblingdistance=\dimen293 +\tikz@figbox=\box76 +\tikz@figbox@bg=\box77 +\tikz@tempbox=\box78 +\tikz@tempbox@bg=\box79 +\tikztreelevel=\count321 +\tikznumberofchildren=\count322 +\tikznumberofcurrentchild=\count323 +\tikz@fig@count=\count324 + (/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfmatrixcurrentrow=\count325 +\pgfmatrixcurrentcolumn=\count326 +\pgf@matrix@numberofcolumns=\count327 +) +\tikz@expandcount=\count328 + +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary +topaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary +matrix.code.tex +File: tikzlibrarymatrix.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary +quotes.code.tex +File: tikzlibraryquotes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex +File: pgflibraryarrows.meta.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowinset=\dimen294 +\pgfarrowlength=\dimen295 +\pgfarrowwidth=\dimen296 +\pgfarrowlinewidth=\dimen297 +))) (/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count329 +\l__pdf_internal_box=\box80 +) +(./2-LatexFundamentals.aux) +\openout1 = `2-LatexFundamentals.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: custom +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: includehead includefoot +* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt) +* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt) +* \paperwidth=364.19536pt +* \paperheight=273.14662pt +* \textwidth=342.2953pt +* \textheight=244.6939pt +* \oddsidemargin=-61.31996pt +* \evensidemargin=-61.31996pt +* \topmargin=-72.26999pt +* \headheight=14.22636pt +* \headsep=0.0pt +* \topskip=11.0pt +* \footskip=14.22636pt +* \marginparwidth=4.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count330 +\scratchdimen=\dimen298 +\scratchbox=\box81 +\nofMPsegments=\count331 +\nofMParguments=\count332 +\everyMPshowfont=\toks48 +\MPscratchCnt=\count333 +\MPscratchDim=\dimen299 +\MPnumerator=\count334 +\makeMPintoPDFobject=\count335 +\everyMPtoPDFconversion=\toks49 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package hyperref Info: Link coloring OFF on input line 18. + +(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count336 +) +LaTeX Info: Redefining \ref on input line 18. +LaTeX Info: Redefining \pageref on input line 18. +LaTeX Info: Redefining \nameref on input line 18. + +(./2-LatexFundamentals.out) (./2-LatexFundamentals.out) +\@outlinefile=\write5 +\openout5 = `2-LatexFundamentals.out'. + +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 18. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18. +\symnumbers=\mathgroup6 +\sympureletters=\mathgroup7 +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathit on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18. +LaTeX Font Info: Overwriting symbol font `numbers' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 18. + +(/usr/share/texmf-dist/tex/latex/translator/translator-basic-dictionary-English +.dict +Dictionary: translator-basic-dictionary, Language: English +) +(/usr/share/texmf-dist/tex/latex/translator/translator-bibliography-dictionary- +English.dict +Dictionary: translator-bibliography-dictionary, Language: English +) +(/usr/share/texmf-dist/tex/latex/translator/translator-environment-dictionary-E +nglish.dict +Dictionary: translator-environment-dictionary, Language: English +) +(/usr/share/texmf-dist/tex/latex/translator/translator-months-dictionary-Englis +h.dict +Dictionary: translator-months-dictionary, Language: English +) +(/usr/share/texmf-dist/tex/latex/translator/translator-numbers-dictionary-Engli +sh.dict +Dictionary: translator-numbers-dictionary, Language: English +) +(/usr/share/texmf-dist/tex/latex/translator/translator-theorem-dictionary-Engli +sh.dict +Dictionary: translator-theorem-dictionary, Language: English +) (./2-LatexFundamentals.nav) +<unilu.jpg, id=20, 645.16031pt x 578.16pt> +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 22. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map} <./unilu.jpg>] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 31. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [2 + +] +<img/example2-preamble-edited.png, id=82, 575.14874pt x 307.1475pt> +File: img/example2-preamble-edited.png Graphic file (type png) +<use img/example2-preamble-edited.png> +Package pdftex.def Info: img/example2-preamble-edited.png used on input line 3 +6. +(pdftex.def) Requested size: 287.57367pt x 153.57336pt. +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 36. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [3 + + <./img/example2-preamble-edited.png>] +LaTeX Font Info: Trying to load font information for OMS+cmtt on input line +45. +LaTeX Font Info: No file OMScmtt.fd. on input line 45. + + +LaTeX Font Warning: Font shape `OMS/cmtt/m/n' undefined +(Font) using `OMS/cmsy/m/n' instead +(Font) for symbol `textbackslash' on input line 45. + +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 45. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +[4 + +] +LaTeX Font Info: Trying to load font information for U+msa on input line 66. + + (/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 66. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +Overfull \hbox (6.31702pt too wide) in paragraph at lines 66--66 + [] + [] + +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 66. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +[5 + +] +LaTeX Font Info: Trying to load font information for OMS+cmss on input line +77. +LaTeX Font Info: No file OMScmss.fd. on input line 77. + + +LaTeX Font Warning: Font shape `OMS/cmss/m/n' undefined +(Font) using `OMS/cmsy/m/n' instead +(Font) for symbol `textbraceleft' on input line 77. + +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 77. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +[6 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 93. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [7 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 105. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [8 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 120. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [9 + +] +LaTeX Font Info: Trying to load font information for TS1+cmtt on input line +132. + (/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 132. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [10 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 153. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [11 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 169. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[12 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 184. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [13 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 196. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [14 + +] +LaTeX Font Info: Trying to load font information for U+euf on input line 213 +. + (/usr/share/texmf-dist/tex/latex/amsfonts/ueuf.fd +File: ueuf.fd 2013/01/14 v3.01 Euler Fraktur +) +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 213. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [15 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 224. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [16 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 238. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[17 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 261. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [18 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 289. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [19 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 299. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [20 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 308. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [21 + +] +<img/thm_pre.png, id=604, 493.845pt x 208.78pt> +File: img/thm_pre.png Graphic file (type png) +<use img/thm_pre.png> +Package pdftex.def Info: img/thm_pre.png used on input line 326. +(pdftex.def) Requested size: 148.15463pt x 62.63448pt. +<img/thm_tex.png, id=605, 621.32124pt x 162.6075pt> +File: img/thm_tex.png Graphic file (type png) +<use img/thm_tex.png> +Package pdftex.def Info: img/thm_tex.png used on input line 326. +(pdftex.def) Requested size: 186.39781pt x 48.78262pt. + +Overfull \hbox (15.25017pt too wide) in paragraph at lines 326--326 +[][] + [] + +<img/thm_pdf.png, id=606, 848.16875pt x 474.77374pt> +File: img/thm_pdf.png Graphic file (type png) +<use img/thm_pdf.png> +Package pdftex.def Info: img/thm_pdf.png used on input line 326. +(pdftex.def) Requested size: 169.63074pt x 94.95306pt. +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 326. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +[22 + + <./img/thm_pre.png> <./img/thm_tex.png> <./img/thm_pdf.png>] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 337. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [23 + +] +\tf@nav=\write6 +\openout6 = `2-LatexFundamentals.nav'. + +\tf@toc=\write7 +\openout7 = `2-LatexFundamentals.toc'. + +\tf@snm=\write8 +\openout8 = `2-LatexFundamentals.snm'. + + +(./2-LatexFundamentals.aux) +Package rerunfilecheck Info: File `2-LatexFundamentals.out' has not changed. +(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. + + +LaTeX Font Warning: Some font shapes were not available, defaults substituted. + + ) +Here is how much of TeX's memory you used: + 21817 strings out of 479383 + 440738 string characters out of 5875799 + 736403 words of memory out of 5000000 + 38353 multiletter control sequences out of 15000+600000 + 417921 words of font info for 82 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 107i,15n,111p,440b,626s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/share/ +texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/texmf-dist/fon +ts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texmf-dist/fonts/type1/publi +c/amsfonts/cm/cmmi8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c +mss10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></us +r/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmss17.pfb></usr/share/texmf- +dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texmf-dist/fonts/type +1/public/amsfonts/cm/cmss9.pfb></usr/share/texmf-dist/fonts/type1/public/amsfon +ts/cm/cmssbx10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmssi1 +0.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmssi8.pfb></usr/sh +are/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist +/fonts/type1/public/amsfonts/cm/cmsy8.pfb></usr/share/texmf-dist/fonts/type1/pu +blic/amsfonts/cm/cmtt10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/ +cm/cmtt8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/euler/eufm10.pf +b></usr/share/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb></usr/s +hare/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb> +Output written on 2-LatexFundamentals.pdf (23 pages, 397400 bytes). +PDF statistics: + 728 PDF objects out of 1000 (max. 8388607) + 661 compressed objects within 7 object streams + 47 named destinations out of 1000 (max. 500000) + 92 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture1/slides/2-LatexFundamentals.nav b/src/Lecture1/slides/2-LatexFundamentals.nav @@ -0,0 +1,51 @@ +\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}} +\headcommand {\beamer@framepages {1}{1}} +\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}} +\headcommand {\beamer@framepages {2}{2}} +\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}} +\headcommand {\beamer@framepages {3}{3}} +\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}} +\headcommand {\beamer@framepages {4}{4}} +\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}} +\headcommand {\beamer@framepages {5}{5}} +\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}} +\headcommand {\beamer@framepages {6}{6}} +\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}} +\headcommand {\beamer@framepages {7}{7}} +\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}} +\headcommand {\beamer@framepages {8}{8}} +\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}} +\headcommand {\beamer@framepages {9}{9}} +\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}} +\headcommand {\beamer@framepages {10}{10}} +\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}} +\headcommand {\beamer@framepages {11}{11}} +\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}} +\headcommand {\beamer@framepages {12}{12}} +\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}} +\headcommand {\beamer@framepages {13}{13}} +\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}} +\headcommand {\beamer@framepages {14}{14}} +\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}} +\headcommand {\beamer@framepages {15}{15}} +\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}} +\headcommand {\beamer@framepages {16}{16}} +\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}} +\headcommand {\beamer@framepages {17}{17}} +\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}} +\headcommand {\beamer@framepages {18}{18}} +\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}} +\headcommand {\beamer@framepages {19}{19}} +\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}} +\headcommand {\beamer@framepages {20}{20}} +\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}} +\headcommand {\beamer@framepages {21}{21}} +\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}} +\headcommand {\beamer@framepages {22}{22}} +\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}} +\headcommand {\beamer@framepages {23}{23}} +\headcommand {\beamer@partpages {1}{23}} +\headcommand {\beamer@subsectionpages {1}{23}} +\headcommand {\beamer@sectionpages {1}{23}} +\headcommand {\beamer@documentpages {23}} +\headcommand {\gdef \inserttotalframenumber {23}} diff --git a/src/Lecture1/slides/2-LatexFundamentals.out b/src/Lecture1/slides/2-LatexFundamentals.out diff --git a/src/Lecture1/slides/2-LatexFundamentals.pdf 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 diff --git a/src/Lecture1/slides/2-LatexFundamentals.tex b/src/Lecture1/slides/2-LatexFundamentals.tex @@ -0,0 +1,340 @@ +\documentclass[11pt]{beamer} +\usetheme{Madrid} +\usepackage[utf8]{inputenc} +\usepackage{amsmath, amssymb, amsfonts, amsthm} +\usepackage{xcolor} + +\usepackage{tikz-cd} + +\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto} +\title{Latex Fundamentals} +\logo{\includegraphics[scale=0.1]{img/unilu.jpg}} +%\institute{University of Luxembourg} + +\newcommand{\bs}{\textbackslash} + +\date{2021-02-19} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + +\begin{frame}{Latex} + \begin{enumerate} + \item Write code (like HTML, not like Python) + \item Compile to get a pdf file + \item ??? + \item Profit + \end{enumerate} +\end{frame} + + +\begin{frame}{Document structure} + \includegraphics[scale=0.5]{img/example2-preamble-edited.png} +\end{frame} + +\begin{frame}{Preamble} + \begin{itemize} + \item Include packages with \texttt{\bs usepackage} + \item Define properties of the document (\texttt{\bs documentclass}, + \texttt{\bs author}, ...) + \item Define new commands and environments + \end{itemize} +\end{frame} + +\begin{frame}{Text formatting} + \begin{center} + + \begin{tabular}{ccc} + \texttt{\small \bs textbf\{Hello\}} & + \texttt{\small \bs textit\{Hello\}} or \texttt{\small\bs emph\{Hello\}} & + \texttt{\small \bs underline\{Hello\}} \\ + \textbf{Hello} & \textit{Hello} & \underline{Hello} + \end{tabular} + + \vspace{0.7cm} + \begin{tabular}{ccc} + \texttt{\small \{\bs small Hello\}} & \hspace{1cm} + \texttt{\small \{\bs Large Hello\}} \hspace{1cm} & + \texttt{\small \{\bs huge Hello\}} \\ + {\small Hello} & {\Large Hello} & {\huge Hello} + \end{tabular} + + \end{center} +\end{frame} + +\begin{frame}{Text formatting} + Some technicalities: + \begin{itemize} + \item Blocks are delimited by \{ and \} + \item \texttt{\bs textbf\{...\}} etc. are commands with one argument + \item \texttt{\bs emph\{...\}} is context-aware (when in doubt use this) + \item \texttt{\bs Large} etc. change the text until the end of the block + \item Some people use \texttt{\{\bs bf Hello\}}, but it is deprecated + \end{itemize} +\end{frame} + +\begin{frame}{Text formatting} + \begin{center} + \begin{tabular}{lc} + \texttt{\{\bs tiny Hello\}} & {\tiny Hello} \\ + \texttt{\{\bs scriptsize Hello\}} & {\scriptsize Hello} \\ + \texttt{\{\bs footnotesize Hello\}} & {\footnotesize Hello} \\ + \texttt{\{\bs normalsize Hello\}} & {\normalsize Hello} \\ + \texttt{\{\bs large Hello\}} & {\large Hello} \\ + \texttt{\{\bs Large Hello\}} & {\Large Hello} \\ + \texttt{\{\bs LARGE Hello\}} & {\LARGE Hello} \\ + \texttt{\{\bs huge Hello\}} & {\huge Hello} \\ + \texttt{\{\bs Huge Hello\}} & {\Huge Hello} \\ + \end{tabular} + \end{center} +\end{frame} + +\begin{frame}{Math mode} + \texttt{One can write math inline, like + {\color{red}\bs(} \bs sum\_i\bs frac\{i\}\{2\} {\color{red}\bs)}, + or in displaystyle: + {\color{red}\bs[} \bs sum\_i\bs frac\{i\}\{2\} {\color{red}\bs]} + } + + \vspace{1.5cm} + One can write math inline, like \(\sum_i\frac{i}{2}\) or in displaystyle: + \[\sum_i\frac{i}{2}\] +\end{frame} + +\begin{frame}{Math mode} + \begin{center} + For formulas spanning multiple lines you can use: + + \vspace{0.5cm} + \texttt{\color{red}\bs begin\{align\} (...) \bs end \{align\}} + \begin{align} + e^x =& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\ + =& 1 + x + \frac{x^2}{2} + \frac{x^3}{6} + \cdots + \end{align} + or \texttt{\color{red}\bs begin\{align*\} (...) \bs end\{align*\}} for no + numbers. + \end{center} +\end{frame} + +\begin{frame}{Math mode} + \begin{itemize} + \item Some people use \texttt{\$2+2=4\$} instead of \texttt{\bs(2+2=4\bs)} + \item Some \textbf{evil} people use \texttt{\$\$2+2=4\$\$} instead of + \texttt{\bs[2+2=4\bs]} (don't try this at home!) + \item For \texttt{align} use \texttt{\bs nonumber} to remove one number + and \texttt{\&} to align. + \item For example I always use \texttt{\$2+2=4\$} and the \texttt{align*} + environment. + \end{itemize} +\end{frame} + +\begin{frame}{Math mode} + \begin{itemize} + \item Simple symbols: letters, numbers, $+,-,=,<,>$... + \item Symbols that need a \textbf{command}: + + \vspace{0.6cm} + \begin{tabular}{c|c|c|c|c} + \texttt{\bs alpha, \bs Phi} & \texttt{\bs times, \bs cdot} & + \texttt{\bs sum} & \texttt{\bs leq, \bs geq} & \texttt{\bs infty}\\ + $\alpha,\Phi$ & $\times,\cdot$ & $\sum$ & $\leq,\geq$ & $\infty$ + \end{tabular} + \vspace{0.6cm} + \item Negate symbols with \texttt{\bs not}: + \begin{align*} + \texttt{x \bs not \bs in A} \qquad\to&\qquad x\not\in A\\ + \texttt{x \bs not = y}\quad\text{ or }\quad\texttt{x \bs neq y} + \qquad\to&\qquad x\neq y\\ + \end{align*} + \end{itemize} +\end{frame} + +\begin{frame}{Math mode} + \begin{itemize} + \item Some commands take one or more \textbf{arguments} (like + \texttt{\bs frac}). + + Anything can be an argument: + \begin{align*} + \texttt{\bs frac\{1\}\{\bs sum\_\{n\}\}}\qquad\to\qquad + \frac{1}{\sum_{n} \sqrt n} + \end{align*} + \item A few commands take \textbf{options}: + \texttt{\bs sqrt[3]\{x\}} $\to\,\sqrt[3]{x}$ + %\item Most of these commands work only in Math mode + \end{itemize} +\end{frame} + + +\begin{frame}{Math mode} + \begin{itemize} + \item Every symbol can have a \textbf{subscript} and a \textbf{superscript} + \begin{align*} + \texttt{x\_0\^{}\{23\}} \qquad \to \qquad x_0^{23} + \end{align*} + \item Anything can be a sub/superscript: + \begin{align*} + \texttt{\bs int\_\{\bs phi (y)\}\^{}\{2\^{}\{n\_1\}\}} + \qquad \to \qquad \int_{\phi(y)}^{2^{n_1}} + \end{align*} + \end{itemize} +\end{frame} + + +\begin{frame}{Math mode} + \begin{itemize} + \item Adjust parentheses size with \texttt{\bs left(} and + \texttt{\bs right)}: \[\left(\frac{x+6}{y-2}\right)\] + \item Insert text with \texttt{\bs text} and + spaces with \texttt{\bs ,} and \texttt{\bs quad}: + \[\text{this symbol}\quad \sum_{n=0}^\infty \frac{x^n}{n!} \quad + \text{is in math mode}, this is not text\] + \end{itemize} +\end{frame} + +\begin{frame}{Math mode} + + \begin{itemize} + \item Fancy letters with \texttt{\bs mathcal}, + \texttt{\bs mathbb} and \texttt{\bs mathfrak}: + \begin{align*} + \mathcal{A} \qquad \mathbb R \qquad \mathfrak p + \end{align*} + \item For custom operators use \texttt{\bs operatorname\{oper\}}: + \begin{align*} + \operatorname{oper}(x) + \end{align*} + \item Pro-tip: write \texttt{\bs newcommand\{\bs R\}\{\bs mathbb R\}} and + \texttt{\bs DeclareMathOperator\{\bs lcm\}\{lcm\}} in your preamble! + \end{itemize} +\end{frame} + +\begin{frame}{Math mode} + \begin{itemize} + \item Wikibooks page on Math mode: + {\small\url{https://en.wikibooks.org/wiki/LaTeX/Mathematics}} + \item Advanced stuff: + {\small\url{https://en.wikibooks.org/wiki/LaTeX/Advanced_Mathematics}} + \item List of Mathematical symbols: + {\small\url{https://www.caam.rice.edu/~heinken/latex/symbols.pdf}} + \end{itemize} +\end{frame} + +\begin{frame}{Environments} + \texttt{\color{red}\bs begin\{something\}} + Inside an environment + \texttt{\color{red}\bs end\{something\}} + + \vspace{0.8cm} + \begin{itemize} + \item We have seen \texttt{document} and \texttt{align} + \item Text and symbols appear differently depending on the environment + \item Certain commands are specific to an environment + \item You can define new environments + \end{itemize} +\end{frame} + + +\begin{frame}{Environments} + Lists: \texttt{\color{red}itemize} and \texttt{\color{red}enumerate} + + \vspace{0.8cm} + \begin{columns} + \column{0.5\textwidth} + \begin{itemize} + \item First: \[2+2=4\] + \item Second + \end{itemize} + + \column{0.5\textwidth} + \texttt{\bs begin\{itemize\}} + + \texttt{\qquad \bs item First: \bs[2+2=4\bs]} + + \texttt{\qquad \bs item Second} + + \texttt{\bs end\{itemize\}} + \end{columns} +\end{frame} + +\begin{frame}{Environments} + Tables: \texttt{tabular} (text) and \texttt{array} (Math mode) + + \vspace{0.8cm} + \begin{columns} + \column{0.5\textwidth} + \begin{tabular}{r|cc} + This & is & just \\ + \hline + a & boring & table + \end{tabular} + + \column{0.5\textwidth} + \texttt{\bs begin\{tabular\}\{r|cc\}} + + \texttt{\qquad This \& is \& just \bs\bs} + + \texttt{\qquad \bs hline} + + \texttt{\qquad a \& boring \& table} + + \texttt{\bs end\{tabular\}} + \end{columns} + + \vspace{0.8cm} + Matrices: \texttt{array} with parentheses or \texttt{pmatrix} +\end{frame} + +\begin{frame}{Sections} + \begin{itemize} + \item Use \texttt{\bs section\{Section Name\}} to start a new section + \item Also: \texttt{\bs chapter} (book only), \texttt{\bs subsection}, + \texttt{subsubsection}... + \item \texttt{\bs section*\{Name\}} for no number + \item Sections after \texttt{\bs appendix} are numbered differently + \end{itemize} +\end{frame} + +\begin{frame}{Theorems} + + \begin{itemize} + \item In preamble: \texttt{\bs usepackage\{amsthm\}} + \item Also in preamble \texttt{\bs newtheorem \{envname\}\{Theorem\}} + \item Use \texttt{\bs newtheorem*} for no number + \end{itemize} +\end{frame} + +\begin{frame}{Theorems} + \begin{columns} + \column{0.5\textwidth} + \includegraphics[scale=0.3]{img/thm_pre.png} + + \vspace{0.2cm} + \vdots + \vspace{0.3cm} + + \includegraphics[scale=0.3]{img/thm_tex.png} + + \column{0.5\textwidth} + \includegraphics[scale=0.2]{img/thm_pdf.png} + + \vspace{1cm} + \end{columns} +\end{frame} + +\begin{frame}{End of the lecture} + For next time: + + \vspace{0.8cm} + \begin{itemize} + \item Install Latex on your PC + \item Start writing something in Latex (e.g. homework) + \item Email me if you have any question + \end{itemize} +\end{frame} + +\end{document} + diff --git a/src/Lecture1/slides/2-LatexFundamentals.toc b/src/Lecture1/slides/2-LatexFundamentals.toc diff --git a/src/Lecture1/slides/2-LatexFundamentals.vrb b/src/Lecture1/slides/2-LatexFundamentals.vrb @@ -0,0 +1,18 @@ +\frametitle{Math mode - align and equation} +\begin{center} + For formulas spanning multiple lines you can use: + \begin{columns} + \column{0.5\textwidth} + \texttt{\bs begin\{align\}(...)\bs end \{align\}} + \begin{align} + \sum_{n=1}^\infty n =& 1+2+3+4+5+\cdots=\\ + =& -\frac12 + \end{align} + \column{0.5\textwidth} + \texttt{\bs begin\{equation\}(...)\bs end \{equation\}} + \begin{equation} + \sum_{n=1}^\infty n = 1+2+3+4+5+\cdots=\\ + = -\frac12 + \end{equation} + \end{columns} + \end{center} diff --git a/src/Lecture1/slides/img/example2-preamble-edited.png 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 Binary files differ. diff --git a/src/Lecture1/slides/img/latex.png 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 @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<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"> + <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"/> + <defs id="defs4"/> + <metadata id="metadata7"> + <rdf:RDF> + <cc:Work rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + <dc:title/> + </cc:Work> + </rdf:RDF> + </metadata> + <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(-100.8642,-253.78876)"> + <g id="g3993"> + <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"/> + <g id="g3432" transform="matrix(0.7759764,0,0,0.7759764,-1035.2282,-1486.6449)"> + <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"/> + <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)"/> + <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"/> + <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"/> + <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)"/> + <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"/> + <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)"/> + <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"/> + <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)"/> + <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"/> + <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)"/> + <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)"/> + <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"/> + <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"/> + <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)"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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)"/> + <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"/> + <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"/> + <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"/> + <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"/> + </g> + <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"/> + <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"/> + </g> + </g> + <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)"/> + <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)"/> +</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 Binary files differ. diff --git a/src/Lecture1/slides/img/thm_pre.png 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 Binary files differ. diff --git a/src/Lecture1/slides/img/unilu.jpg 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 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 @@ -0,0 +1,58 @@ +%% Creator: Inkscape 1.0.1 (unknown), www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'sage_svg-tex.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{<filename>.pdf_tex} +%% instead of +%% \includegraphics{<filename>.pdf} +%% To scale the image, write +%% \def\svgwidth{<desired width>} +%% \input{<filename>.pdf_tex} +%% instead of +%% \includegraphics[width=<desired width>]{<filename>.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{<path to file>}{<filename>.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{<path to file>/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \newcommand*\fsize{\dimexpr\f@size pt\relax}% + \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{375bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,0.26172667)% + \lineheight{1}% + \setlength\tabcolsep{0pt}% + \put(0,0){\includegraphics[width=\unitlength,page=1]{sage_svg-tex.pdf}}% + \end{picture}% +\endgroup% diff --git a/src/Lecture2/live/biblio1.aux b/src/Lecture2/live/biblio1.aux @@ -0,0 +1,10 @@ +\relax +\citation{szamuely} +\citation{szamuely} +\citation{knuth68} +\citation{knuth68} +\citation{szamuely} +\bibcite{knuth68}{1} +\bibcite{lang-algebra}{2} +\bibcite{szamuely}{3} +\gdef \@abspage@last{1} diff --git a/src/Lecture2/live/biblio1.log b/src/Lecture2/live/biblio1.log @@ -0,0 +1,203 @@ +This 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 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**biblio1.tex +(./biblio1.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks17 +\ex@=\dimen139 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks18 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks19 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks20 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks21 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks22 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count197 +\Gm@cntv=\count198 +\c@Gm@tempcnt=\count199 +\Gm@bindingoffset=\dimen148 +\Gm@wd@mp=\dimen149 +\Gm@odd@mp=\dimen150 +\Gm@even@mp=\dimen151 +\Gm@layoutwidth=\dimen152 +\Gm@layoutheight=\dimen153 +\Gm@layouthoffset=\dimen154 +\Gm@layoutvoffset=\dimen155 +\Gm@dimlist=\toks23 +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count266 +\l__pdf_internal_box=\box49 +) (./biblio1.aux) +\openout1 = `biblio1.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a5paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt) +* \paperwidth=421.10078pt +* \paperheight=597.50787pt +* \textwidth=307.28978pt +* \textheight=483.69687pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=3.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +[1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./biblio1.aux) ) +Here is how much of TeX's memory you used: + 2068 strings out of 479383 + 27244 string characters out of 5875799 + 304076 words of memory out of 5000000 + 19218 multiletter control sequences out of 15000+600000 + 404381 words of font info for 30 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 66i,4n,72p,224b,147s stack positions out of 5000i,500n,10000p,200000b,80000s +</u +sr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf +-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/fonts/typ +e1/public/amsfonts/cm/cmti10.pfb> +Output written on biblio1.pdf (1 page, 42218 bytes). +PDF statistics: + 20 PDF objects out of 1000 (max. 8388607) + 13 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture2/live/biblio1.pdf 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 Binary files differ. diff --git a/src/Lecture2/live/biblio1.tex b/src/Lecture2/live/biblio1.tex @@ -0,0 +1,34 @@ +\documentclass[10pt,a5paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} +\begin{document} + +The theory of the étale fundamental group of affdssf \cite[Proposition~5]{szamuely} schemes is introduced in \cite[Proposition~5]{szamuely}. + +The book \cite{knuth68} is still unfinished. + +\cite{knuth68, szamuely} + +\begin{thebibliography}{999} + \bibitem{knuth68} + Donald Knuth, + \emph{The Art of Computer Programming}, + Volume I, Addison-Wesley, 1968. + + \bibitem{lang-algebra} + Serge Lang, + \emph{Algebra}, + Springer, + 2002. + + \bibitem{szamuely} + Tamás Szamuely, + \emph{Galois Groups and Fundamental Groups}, + Cambridge University Press, + 2009. +\end{thebibliography} + +\end{document} +\ No newline at end of file diff --git a/src/Lecture2/live/biblio2.aux b/src/Lecture2/live/biblio2.aux @@ -0,0 +1,10 @@ +\relax +\citation{knuth68} +\citation{th} +\citation{rudin} +\bibstyle{alpha} +\bibdata{my_biblio} +\bibcite{knuth68}{Knu68} +\bibcite{rudin}{Rud62} +\bibcite{th}{Tro22} +\gdef \@abspage@last{1} diff --git a/src/Lecture2/live/biblio2.bbl b/src/Lecture2/live/biblio2.bbl @@ -0,0 +1,18 @@ +\begin{thebibliography}{Knu68} + +\bibitem[Knu68]{knuth68} +Donald Knuth. +\newblock {\em The Art of Computer Programming}, volume~I. +\newblock Addison-Wesley, 1968. + +\bibitem[Rud62]{rudin} +Walter Rudin. +\newblock {\em Fourier analysis on groups}, volume 121967. +\newblock Wiley Online Library, 1962. + +\bibitem[Tro22]{th} +Tronto. +\newblock {\em Kummer Theory}. +\newblock PhD thesis, Uni.lu, 2022. + +\end{thebibliography} diff --git a/src/Lecture2/live/biblio2.blg b/src/Lecture2/live/biblio2.blg @@ -0,0 +1,46 @@ +This is BibTeX, Version 0.99d (TeX Live 2020/VoidLinux) +Capacity: max_strings=200000, hash_size=200000, hash_prime=170003 +The top-level auxiliary file: biblio2.aux +The style file: alpha.bst +Database file #1: my_biblio.bib +You've used 3 entries, + 2543 wiz_defined-function locations, + 575 strings with 4616 characters, +and the built_in function-call counts, 846 in all, are: += -- 75 +> -- 24 +< -- 5 ++ -- 7 +- -- 6 +* -- 48 +:= -- 155 +add.period$ -- 9 +call.type$ -- 3 +change.case$ -- 12 +chr.to.int$ -- 3 +cite$ -- 3 +duplicate$ -- 45 +empty$ -- 68 +format.name$ -- 12 +if$ -- 165 +int.to.chr$ -- 1 +int.to.str$ -- 0 +missing$ -- 4 +newline$ -- 18 +num.names$ -- 9 +pop$ -- 20 +preamble$ -- 1 +purify$ -- 18 +quote$ -- 0 +skip$ -- 31 +stack$ -- 0 +substring$ -- 22 +swap$ -- 5 +text.length$ -- 5 +text.prefix$ -- 3 +top$ -- 0 +type$ -- 16 +warning$ -- 0 +while$ -- 6 +width$ -- 6 +write$ -- 41 diff --git a/src/Lecture2/live/biblio2.log b/src/Lecture2/live/biblio2.log @@ -0,0 +1,203 @@ +This 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 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**biblio2.tex +(./biblio2.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks17 +\ex@=\dimen139 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks18 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks19 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks20 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks21 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks22 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count197 +\Gm@cntv=\count198 +\c@Gm@tempcnt=\count199 +\Gm@bindingoffset=\dimen148 +\Gm@wd@mp=\dimen149 +\Gm@odd@mp=\dimen150 +\Gm@even@mp=\dimen151 +\Gm@layoutwidth=\dimen152 +\Gm@layoutheight=\dimen153 +\Gm@layouthoffset=\dimen154 +\Gm@layoutvoffset=\dimen155 +\Gm@dimlist=\toks23 +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count266 +\l__pdf_internal_box=\box49 +) (./biblio2.aux) +\openout1 = `biblio2.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 7. +LaTeX Font Info: ... okay on input line 7. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a5paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt) +* \paperwidth=421.10078pt +* \paperheight=597.50787pt +* \textwidth=307.28978pt +* \textheight=483.69687pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=3.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(./biblio2.bbl) [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +(./biblio2.aux) ) +Here is how much of TeX's memory you used: + 2070 strings out of 479383 + 27254 string characters out of 5875799 + 304088 words of memory out of 5000000 + 19217 multiletter control sequences out of 15000+600000 + 404381 words of font info for 30 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 66i,4n,72p,224b,133s stack positions out of 5000i,500n,10000p,200000b,80000s +</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.p +fb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/ +texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb> +Output written on biblio2.pdf (1 page, 40599 bytes). +PDF statistics: + 20 PDF objects out of 1000 (max. 8388607) + 13 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture2/live/biblio2.pdf 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 Binary files differ. diff --git a/src/Lecture2/live/biblio2.tex b/src/Lecture2/live/biblio2.tex @@ -0,0 +1,18 @@ +\documentclass[10pt,a5paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} +\begin{document} + +\cite{knuth68} + +You can find my results in \cite{th} + +We can also refer to this book \cite{rudin} + +\bibliographystyle{alpha} +\bibliography{my_biblio} + +\end{document} +\ No newline at end of file diff --git a/src/Lecture2/live/commands.aux b/src/Lecture2/live/commands.aux @@ -0,0 +1,2 @@ +\relax +\gdef \@abspage@last{1} diff --git a/src/Lecture2/live/commands.log b/src/Lecture2/live/commands.log @@ -0,0 +1,215 @@ +This 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 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**commands.tex +(./commands.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks17 +\ex@=\dimen139 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks18 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks19 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks20 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks21 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks22 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count197 +\Gm@cntv=\count198 +\c@Gm@tempcnt=\count199 +\Gm@bindingoffset=\dimen148 +\Gm@wd@mp=\dimen149 +\Gm@odd@mp=\dimen150 +\Gm@even@mp=\dimen151 +\Gm@layoutwidth=\dimen152 +\Gm@layoutheight=\dimen153 +\Gm@layouthoffset=\dimen154 +\Gm@layoutvoffset=\dimen155 +\Gm@dimlist=\toks23 +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count266 +\l__pdf_internal_box=\box49 +) +(./commands.aux) +\openout1 = `commands.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a5paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt) +* \paperwidth=421.10078pt +* \paperheight=597.50787pt +* \textwidth=307.28978pt +* \textheight=483.69687pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=3.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +LaTeX Font Info: Trying to load font information for U+msa on input line 17. + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 17. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./commands.aux) ) +Here is how much of TeX's memory you used: + 2090 strings out of 479383 + 27605 string characters out of 5875799 + 303148 words of memory out of 5000000 + 19230 multiletter control sequences out of 15000+600000 + 405129 words of font info for 35 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 66i,4n,72p,225b,104s stack positions out of 5000i,500n,10000p,200000b,80000s +</ +usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texm +f-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/share/texmf-dist/fonts/ty +pe1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/fonts/type1/public/amsf +onts/cm/cmr7.pfb> +Output written on commands.pdf (1 page, 34332 bytes). +PDF statistics: + 24 PDF objects out of 1000 (max. 8388607) + 16 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture2/live/commands.pdf 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 Binary files differ. diff --git a/src/Lecture2/live/commands.tex b/src/Lecture2/live/commands.tex @@ -0,0 +1,27 @@ +\documentclass[10pt,a5paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} + + +\newcommand{\myvec}[2]{({#1}_1,{#1}_2,\dots,{#1}_{#2})} +\newcommand{\myvecn}[1]{\myvec{#1}{n}} + +\newcommand{\myvecopt}[2][n]{({#2}_1,{#2}_2,\dots,{#2}_{#1})} +\providecommand{\vec}[1]{\overleftarrow{#1}} + +\begin{document} + +\[ + \vec{v}=\myvecopt{v} +\] + +later... + +\[ + \vec{w}=\myvecopt[10]{w} +\] + +\end{document} +\ No newline at end of file diff --git a/src/Lecture2/live/me.jpg 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 @@ -0,0 +1,36 @@ +@book{knuth68, + author = "Donald Knuth", + title = "The Art of Computer Programming", + publisher = "Addison-Wesley", + volume = "I", + year = "1968", +} + +@misc{lang-algebra, + title = {Algebra}, + author = {Serge Lang}, + year = {2002}, + publisher = {Springer} +} + +@book{szamuely, + title = {Galois groups and fundamental groups}, + author = {Szamuely, Tam{\'a}s}, + year = {2009}, + publisher = {Cambridge University Press} +} + +@PhdThesis{th, +author = {Tronto}, +title = {Kummer Theory}, +school = {Uni.lu}, +year = {2022}, +} + +@book{rudin1962fourier, + title={Fourier analysis on groups}, + author={Rudin, Walter}, + volume={121967}, + year={1962}, + publisher={Wiley Online Library} +} diff --git a/src/Lecture2/live/new.aux b/src/Lecture2/live/new.aux @@ -0,0 +1,8 @@ +\relax +\@writefile{toc}{\contentsline {section}{\numberline {\S 1}Text}{1}{}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {\S 2}inbetween}{1}{}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {\S 3}Last section}{1}{}\protected@file@percent } +\newlabel{ts}{{\S 3}{1}} +\newlabel{gaussthm}{{3,B}{1}} +\newlabel{eq}{{3.1}{1}} +\gdef \@abspage@last{2} diff --git a/src/Lecture2/live/new.log b/src/Lecture2/live/new.log @@ -0,0 +1,245 @@ +This 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 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**new.tex +(./new.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks17 +\ex@=\dimen139 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks18 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks19 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks20 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks21 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2020/05/29 v2.20.6 +\thm@style=\toks22 +\thm@bodyfont=\toks23 +\thm@headfont=\toks24 +\thm@notefont=\toks25 +\thm@headpunct=\toks26 +\thm@preskip=\skip52 +\thm@postskip=\skip53 +\thm@headsep=\skip54 +\dth@everypar=\toks27 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks28 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count197 +\Gm@cntv=\count198 +\c@Gm@tempcnt=\count199 +\Gm@bindingoffset=\dimen148 +\Gm@wd@mp=\dimen149 +\Gm@odd@mp=\dimen150 +\Gm@even@mp=\dimen151 +\Gm@layoutwidth=\dimen152 +\Gm@layoutheight=\dimen153 +\Gm@layouthoffset=\dimen154 +\Gm@layoutvoffset=\dimen155 +\Gm@dimlist=\toks29 +) +(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip55 +\enit@outerparindent=\dimen156 +\enit@toks=\toks30 +\enit@inbox=\box49 +\enit@count@id=\count266 +\enitdp@description=\count267 +) +\c@mythm=\count268 +\c@defi=\count269 + +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count270 +\l__pdf_internal_box=\box50 +) (./new.aux) +\openout1 = `new.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 34. +LaTeX Font Info: ... okay on input line 34. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 34. +LaTeX Font Info: ... okay on input line 34. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 34. +LaTeX Font Info: ... okay on input line 34. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 34. +LaTeX Font Info: ... okay on input line 34. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 34. +LaTeX Font Info: ... okay on input line 34. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 34. +LaTeX Font Info: ... okay on input line 34. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 34. +LaTeX Font Info: ... okay on input line 34. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a5paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt) +* \paperwidth=421.10078pt +* \paperheight=597.50787pt +* \textwidth=307.28978pt +* \textheight=483.69687pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=3.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +LaTeX Font Info: Trying to load font information for U+msa on input line 36. + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 36. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [2] (./new.aux) ) +Here is how much of TeX's memory you used: + 2540 strings out of 479383 + 34346 string characters out of 5875799 + 316279 words of memory out of 5000000 + 19657 multiletter control sequences out of 15000+600000 + 412008 words of font info for 60 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 66i,8n,72p,220b,216s stack positions out of 5000i,500n,10000p,200000b,80000s +{/u +sr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/share/texmf +-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/share/texmf-dist/fonts/ty +pe1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf-dist/fonts/type1/public/ams +fonts/cm/cmex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi1 +0.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/sha +re/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/f +onts/type1/public/amsfonts/cm/cmr12.pfb></usr/share/texmf-dist/fonts/type1/publ +ic/amsfonts/cm/cmr17.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/ +cmr7.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr +/share/texmf-dist/fonts/type1/public/cm-super/sfbx1440.pfb></usr/share/texmf-di +st/fonts/type1/public/cm-super/sfrm1000.pfb> +Output written on new.pdf (2 pages, 114184 bytes). +PDF statistics: + 60 PDF objects out of 1000 (max. 8388607) + 43 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture2/live/new.pdf 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 Binary files differ. diff --git a/src/Lecture2/live/new.tex b/src/Lecture2/live/new.tex @@ -0,0 +1,99 @@ +\documentclass[10pt,a5paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} + +\usepackage{enumitem} + +\title{Latex Example Live} +\author{Sebastiano Tronto} +\date{12-03-2021} + + + +\newtheorem{mythm}{My Theorem}[section] + +\theoremstyle{definition} +\newtheorem{prop}[mythm]{Proposition} +\newtheorem{defi}{Definition} + +\theoremstyle{remark} +\newtheorem*{warning}{Achtung} + +\renewcommand{\thesection}{\S\arabic{section}} +\renewcommand{\themythm}{\arabic{section},\Alph{mythm}} + + +\numberwithin{equation}{section} + +\renewcommand{\theequation}{\arabic{section}.\arabic{equation}} + +\begin{document} + +\maketitle + + +\section{Text} + +abc + +\begin{align} +1+1=2 +\end{align} + +The section \ref{ts} contains theorems + +\section{inbetween} + +\section{Last section} +\label{ts} + + +\begin{prop} +A less important fact +\end{prop} + +\begin{mythm}[Gauss] +\label{gaussthm} +The equation \(2+x=4\) is true for \(x=2\). +\begin{align} +\label{eq} +\sum_{i=1}^ni +\end{align} +\end{mythm} + +The above equation \eqref{eq} is not an equation + +\arabic{equation} + + +\setcounter{defi}{23} +\begin{defi} +a definition +\end{defi} + +\setcounter{mythm}{10} +\begin{mythm} +Another important fact. +\end{mythm} + +\begin{warning} +It is a common mistake to think that \(2+2=5\) +\end{warning} + + +\vspace{1cm} + +\begin{enumerate}[label=(\Roman*)] + \item an item + \item another one +\end{enumerate} + +\arabic{enumi} + +\ref{gaussthm} is a theorem by gauss + +\end{document} +\ No newline at end of file diff --git a/src/Lecture2/live/old.aux b/src/Lecture2/live/old.aux @@ -0,0 +1,10 @@ +\relax +\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}{}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {2}Text}{1}{}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3}Math mode}{1}{}\protected@file@percent } +\newlabel{eq}{{1}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Environments}{1}{}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Lists}{1}{}\protected@file@percent } +\newlabel{subsectionLists}{{4.1}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {5}Last section}{2}{}\protected@file@percent } +\gdef \@abspage@last{2} diff --git a/src/Lecture2/live/old.log b/src/Lecture2/live/old.log @@ -0,0 +1,284 @@ +This 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 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**old.tex +(./old.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks17 +\ex@=\dimen139 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks18 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks19 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks20 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks21 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2020/05/29 v2.20.6 +\thm@style=\toks22 +\thm@bodyfont=\toks23 +\thm@headfont=\toks24 +\thm@notefont=\toks25 +\thm@headpunct=\toks26 +\thm@preskip=\skip52 +\thm@postskip=\skip53 +\thm@headsep=\skip54 +\dth@everypar=\toks27 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks28 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count197 +\Gm@cntv=\count198 +\c@Gm@tempcnt=\count199 +\Gm@bindingoffset=\dimen148 +\Gm@wd@mp=\dimen149 +\Gm@odd@mp=\dimen150 +\Gm@even@mp=\dimen151 +\Gm@layoutwidth=\dimen152 +\Gm@layoutheight=\dimen153 +\Gm@layouthoffset=\dimen154 +\Gm@layoutvoffset=\dimen155 +\Gm@dimlist=\toks29 +) +(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip55 +\enit@outerparindent=\dimen156 +\enit@toks=\toks30 +\enit@inbox=\box49 +\enit@count@id=\count266 +\enitdp@description=\count267 +) +\c@mythm=\count268 +\c@defi=\count269 + +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +) +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count270 +\l__pdf_internal_box=\box50 +) (./old.aux) +\openout1 = `old.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=483.69687pt +* \textheight=731.23584pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=57.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count271 +\scratchdimen=\dimen157 +\scratchbox=\box51 +\nofMPsegments=\count272 +\nofMParguments=\count273 +\everyMPshowfont=\toks31 +\MPscratchCnt=\count274 +\MPscratchDim=\dimen158 +\MPnumerator=\count275 +\makeMPintoPDFobject=\count276 +\everyMPtoPDFconversion=\toks32 +) +LaTeX Font Info: Trying to load font information for U+msa on input line 32. + + (/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 32. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] [2] (./old.aux) ) +Here is how much of TeX's memory you used: + 3486 strings out of 479383 + 45825 string characters out of 5875799 + 338303 words of memory out of 5000000 + 20587 multiletter control sequences out of 15000+600000 + 412441 words of font info for 62 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 66i,9n,72p,220b,300s stack positions out of 5000i,500n,10000p,200000b,80000s +{/u +sr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}</usr/share/texmf +-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/share/texmf-dist/fonts/ty +pe1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf-dist/fonts/type1/public/ams +fonts/cm/cmex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi1 +0.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi5.pfb></usr/sha +re/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/share/texmf-dist/f +onts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/fonts/type1/publ +ic/amsfonts/cm/cmr12.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/ +cmr17.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr5.pfb></usr/ +share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb></usr/share/texmf-dist +/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type1/p +ublic/amsfonts/cm/cmsy7.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/ +cm/cmti10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb> +</usr/share/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb></usr/sha +re/texmf-dist/fonts/type1/public/cm-super/sfrm1000.pfb> +Output written on old.pdf (2 pages, 165455 bytes). +PDF statistics: + 80 PDF objects out of 1000 (max. 8388607) + 58 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture2/live/old.pdf 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 Binary files differ. diff --git a/src/Lecture2/live/old.tex b/src/Lecture2/live/old.tex @@ -0,0 +1,176 @@ +\documentclass[10pt,a4paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} + +\usepackage{enumitem} +\title{Latex Example Live} +\author{Sebastiano Tronto} +\date{20-02-2021} + +\newcommand{\reals}{\mathbb{R}} +\DeclareMathOperator{\sinus}{sinus} + + +\newtheorem{mythm}{My Theorem}[section] + +\theoremstyle{definition} +\newtheorem{prop}[mythm]{Proposition} +\newtheorem{defi}{Definition} + +\theoremstyle{remark} +\newtheorem*{warning}{Achtung} + +\usepackage{xcolor} + + +\begin{document} + +\maketitle + +\section{Introduction} + +{\color{pink} Hello, world! + +This is a comment} + +\texttt{This looks like computer code} + +\section{Text} + +\textbf{This sentence is in boldface} + +\underline{\textit{italicized} maybe in a sentence \textbf{something}} + +\underline{\textit{one inside the other}} + +\emph{also italicized???} + +This 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. + +{\Huge Large words} + +%\appendix + +\section{Math mode} + +This is an inline formula \( \displaystyle \sum_i \frac{i}{22} \), it appears within the text + +This is a displaystyle formula \[ \textstyle \sum_{\alpha=0}^{2^{10}} \frac2 \alpha{22} \] it appears on its own line + +How sqrt works: \( \sqrt[\phi]{25} \) + + + +\begin{flalign} +\label{eq} +e^x &= \left(\sum_{i=0}^\infty \frac{x^i}{i!} \right) = & \\ +&= \left( 1 + x + \frac{x^2}2 \right)+ \frac{x^3}{6} + \cdots \nonumber +\end{flalign} + +\[ + \left\{ x \in \reals \quad \text{such that} \quad \frac{ \sinus(x)}{x^2}>0 \right\}\reals +\] + +\[ \sum_i \] + +The first equation we wrote is \eqref{eq} + +\section{Environments} + +\subsection{Lists} +\label{subsectionLists} + +\begin{itemize} + \item One \textbf{item} + \item Another \(2+2=4\) + \item a third one \[\sum_{i=0}^n\] + \item A sublist: + \begin{itemize} + \item[+] First subitem + \item[+] and so on + \end{itemize} + \item Again in the main list +\end{itemize} + +\begin{enumerate}[label=\Roman*] + \item One + \item Two + \item Actually three + \item Three (or not) +\end{enumerate} + +\subsection*{Tables} + +Let's write a table: + +\vspace{1cm} +\begin{tabular}{r||l|c} +\hline +This is a table & second column & third column \\ +\hline +Things & a & \( 2+2 = 4 \)\\ +\hline +more things & b & c +\end{tabular} + +\vspace{1cm} +\[ + \left(\begin{array}{cc} + \int_0^1 e^x & \frac{2}{25} \\ + 0 & 0 \\ + 1111 & 234\alpha + \end{array}\right) +\] + +\[ + \begin{pmatrix} + \int_0^1 e^x & \frac{2}{25} \\ + 0 & 0 \\ + 1111 & 234\alpha + \end{pmatrix} +\] + +\[ +\begin{pmatrix} +1 & 2\\ +3 & 4 +\end{pmatrix} +\overset{L2\rightarrow L2+L3}\longrightarrow +\begin{pmatrix} +1 & 2\\ +4 & 6 +\end{pmatrix} +\] + +\section{Last section} + +In section \ref{subsectionLists} we saw how to write lists + +\begin{mythm}[Gauss] +The equation \(2+x=4\) is true for \(x=2\). +\end{mythm} + +\begin{prop} +A less important fact +\end{prop} + +\begin{defi} +a definition +\end{defi} + +\begin{mythm} +Another important fact. +\end{mythm} + +\begin{warning} +It is a common mistake to think that \(2+2=5\) +\end{warning} +\[\binom45\] + +\[ 2 \nmid 10 \] + +\end{document} +\ No newline at end of file diff --git a/src/Lecture2/live/pic.aux b/src/Lecture2/live/pic.aux @@ -0,0 +1,3 @@ +\relax +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Me, upside-down}}{1}{}\protected@file@percent } +\gdef \@abspage@last{5} diff --git a/src/Lecture2/live/pic.log b/src/Lecture2/live/pic.log @@ -0,0 +1,300 @@ +This 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 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**pic.tex +(./pic.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks17 +\ex@=\dimen139 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks18 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks19 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks20 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks21 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks22 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count197 +\Gm@cntv=\count198 +\c@Gm@tempcnt=\count199 +\Gm@bindingoffset=\dimen148 +\Gm@wd@mp=\dimen149 +\Gm@odd@mp=\dimen150 +\Gm@even@mp=\dimen151 +\Gm@layoutwidth=\dimen152 +\Gm@layoutheight=\dimen153 +\Gm@layouthoffset=\dimen154 +\Gm@layoutvoffset=\dimen155 +\Gm@dimlist=\toks23 +) +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen156 +\Gin@req@width=\dimen157 +) +(/usr/share/texmf-dist/tex/latex/lipsum/lipsum.sty +(/usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty +Package: expl3 2020-12-03 L3 programming layer (loader) + +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count266 +\l__pdf_internal_box=\box49 +)) +(/usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty +Package: xparse 2020-10-27 L3 Experimental document command parser + +(/usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse-generic.tex)) +Package: lipsum 2019/01/02 v2.2 150 paragraphs of Lorem Ipsum dummy text + +(/usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex +File: lipsum.ltd.tex 2019/01/02 v2.2 The Lorem ipsum dummy text +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count267 +\float@exts=\toks24 +\float@box=\box50 +\@float@everytoks=\toks25 +\@floatcapt=\box51 +) +(/usr/share/texmf-dist/tex/latex/wrapfig/wrapfig.sty +\wrapoverhang=\dimen158 +\WF@size=\dimen159 +\c@WF@wrappedlines=\count268 +\WF@box=\box52 +\WF@everypar=\toks26 +Package: wrapfig 2003/01/31 v 3.6 +) (./pic.aux) +\openout1 = `pic.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 17. +LaTeX Font Info: ... okay on input line 17. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a5paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt) +* \paperwidth=421.10078pt +* \paperheight=597.50787pt +* \textwidth=307.28978pt +* \textheight=483.69687pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=3.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count269 +\scratchdimen=\dimen160 +\scratchbox=\box53 +\nofMPsegments=\count270 +\nofMParguments=\count271 +\everyMPshowfont=\toks27 +\MPscratchCnt=\count272 +\MPscratchDim=\dimen161 +\MPnumerator=\count273 +\makeMPintoPDFobject=\count274 +\everyMPtoPDFconversion=\toks28 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +<me.jpg, id=1, 722.7pt x 963.6pt> +File: me.jpg Graphic file (type jpg) +<use me.jpg> +Package pdftex.def Info: me.jpg used on input line 21. +(pdftex.def) Requested size: 64.01463pt x 85.35826pt. + +Underfull \hbox (badness 1635) in paragraph at lines 26--26 +\OT1/cmr/m/n/10 rus elit, vestibu-lum ut, plac- + [] + +[1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map} <./me.jpg>] +[2] [3] [4] [5] (./pic.aux) ) +Here is how much of TeX's memory you used: + 3612 strings out of 479383 + 49723 string characters out of 5875799 + 598958 words of memory out of 5000000 + 20706 multiletter control sequences out of 15000+600000 + 403430 words of font info for 27 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 66i,7n,73p,220b,211s stack positions out of 5000i,500n,10000p,200000b,80000s +</usr/share/texmf-dist/fonts/type1/public/amsfonts +/cm/cmr10.pfb> +Output written on pic.pdf (5 pages, 131626 bytes). +PDF statistics: + 25 PDF objects out of 1000 (max. 8388607) + 15 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 6 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture2/live/pic.pdf 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 Binary files differ. diff --git a/src/Lecture2/live/pic.tex b/src/Lecture2/live/pic.tex @@ -0,0 +1,34 @@ +\documentclass[10pt,a5paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} + +\usepackage{graphicx} +\usepackage{lipsum} +\usepackage{xcolor} +\usepackage{float} +\usepackage{wrapfig} + +\setlength{\parindent}{0cm} +\setlength{\parskip}{1cm} + +\begin{document} + +\begin{wrapfigure}{l}{0.5\textwidth} +\centering +\includegraphics[height=3cm,angle=260]{me.jpg} +\caption{Me, upside-down} +\end{wrapfigure} + +\lipsum + +x \hfill y + +Name: \hrulefill \quad Address: \dotfill + +{\color{red} \lipsum } + + +\end{document} +\ No newline at end of file diff --git a/src/Lecture2/live/sentencecounter.aux b/src/Lecture2/live/sentencecounter.aux @@ -0,0 +1,6 @@ +\relax +\@writefile{toc}{\contentsline {section}{\numberline {1}First section}{1}{}\protected@file@percent } +\newlabel{s1}{{[1,2]}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Second section}{1}{}\protected@file@percent } +\newlabel{sanother}{{[2,1]}{1}} +\gdef \@abspage@last{1} diff --git a/src/Lecture2/live/sentencecounter.bbl b/src/Lecture2/live/sentencecounter.bbl diff --git a/src/Lecture2/live/sentencecounter.blg b/src/Lecture2/live/sentencecounter.blg @@ -0,0 +1,48 @@ +This is BibTeX, Version 0.99d (TeX Live 2020/VoidLinux) +Capacity: max_strings=200000, hash_size=200000, hash_prime=170003 +The top-level auxiliary file: sentencecounter.aux +I found no \citation commands---while reading file sentencecounter.aux +I found no \bibdata command---while reading file sentencecounter.aux +I found no \bibstyle command---while reading file sentencecounter.aux +You've used 0 entries, + 0 wiz_defined-function locations, + 83 strings with 504 characters, +and the built_in function-call counts, 0 in all, are: += -- 0 +> -- 0 +< -- 0 ++ -- 0 +- -- 0 +* -- 0 +:= -- 0 +add.period$ -- 0 +call.type$ -- 0 +change.case$ -- 0 +chr.to.int$ -- 0 +cite$ -- 0 +duplicate$ -- 0 +empty$ -- 0 +format.name$ -- 0 +if$ -- 0 +int.to.chr$ -- 0 +int.to.str$ -- 0 +missing$ -- 0 +newline$ -- 0 +num.names$ -- 0 +pop$ -- 0 +preamble$ -- 0 +purify$ -- 0 +quote$ -- 0 +skip$ -- 0 +stack$ -- 0 +substring$ -- 0 +swap$ -- 0 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 0 +while$ -- 0 +width$ -- 0 +write$ -- 0 +(There were 3 error messages) diff --git a/src/Lecture2/live/sentencecounter.log b/src/Lecture2/live/sentencecounter.log @@ -0,0 +1,256 @@ +This 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 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**sentencecounter.tex +(./sentencecounter.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks17 +\ex@=\dimen139 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks18 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks19 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks20 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks21 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks22 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count197 +\Gm@cntv=\count198 +\c@Gm@tempcnt=\count199 +\Gm@bindingoffset=\dimen148 +\Gm@wd@mp=\dimen149 +\Gm@odd@mp=\dimen150 +\Gm@even@mp=\dimen151 +\Gm@layoutwidth=\dimen152 +\Gm@layoutheight=\dimen153 +\Gm@layouthoffset=\dimen154 +\Gm@layoutvoffset=\dimen155 +\Gm@dimlist=\toks23 +) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +) +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +\c@sentence=\count266 + +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count267 +\l__pdf_internal_box=\box49 +) +(./sentencecounter.aux) +\openout1 = `sentencecounter.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 31. +LaTeX Font Info: ... okay on input line 31. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 31. +LaTeX Font Info: ... okay on input line 31. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 31. +LaTeX Font Info: ... okay on input line 31. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 31. +LaTeX Font Info: ... okay on input line 31. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 31. +LaTeX Font Info: ... okay on input line 31. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 31. +LaTeX Font Info: ... okay on input line 31. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 31. +LaTeX Font Info: ... okay on input line 31. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a5paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 307.28978pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 483.69687pt, 56.9055pt) +* \paperwidth=421.10078pt +* \paperheight=597.50787pt +* \textwidth=307.28978pt +* \textheight=483.69687pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=3.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count268 +\scratchdimen=\dimen156 +\scratchbox=\box50 +\nofMPsegments=\count269 +\nofMParguments=\count270 +\everyMPshowfont=\toks24 +\MPscratchCnt=\count271 +\MPscratchDim=\dimen157 +\MPnumerator=\count272 +\makeMPintoPDFobject=\count273 +\everyMPtoPDFconversion=\toks25 +) +LaTeX Font Info: Trying to load font information for U+msa on input line 35. + + (/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 35. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./sentencecounter.a +ux) ) +Here is how much of TeX's memory you used: + 3042 strings out of 479383 + 39191 string characters out of 5875799 + 322429 words of memory out of 5000000 + 20164 multiletter control sequences out of 15000+600000 + 406032 words of font info for 38 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 66i,9n,72p,232b,133s stack positions out of 5000i,500n,10000p,200000b,80000s +</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/sha +re/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/texmf-dist/ +fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texmf-dist/fonts/type1/pu +blic/amsfonts/cm/cmmi7.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/c +m/cmr10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb></u +sr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb></usr/share/texmf-d +ist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type +1/public/amsfonts/symbols/msbm10.pfb> +Output written on sentencecounter.pdf (1 page, 76925 bytes). +PDF statistics: + 44 PDF objects out of 1000 (max. 8388607) + 31 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture2/live/sentencecounter.pdf 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 Binary files differ. diff --git a/src/Lecture2/live/sentencecounter.tex b/src/Lecture2/live/sentencecounter.tex @@ -0,0 +1,66 @@ +\documentclass[10pt,a5paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} + +\usepackage{xcolor} + +\newcounter{sentence}[section] +\renewcommand{\thesentence}{[\thesection,\arabic{sentence}]} + +\newcommand{\R}{\mathbb{R}} +\newcommand{\words}{blah bla blha} + +\newcommand{\todo}[1]{{\color{red}\large TODO: #1}} + +\newcommand{\sent}[1]{\refstepcounter{sentence}#1\textsuperscript{\arabic{sentence}}} + +\newcommand{\mymatrix}[4]{\begin{pmatrix} +#1 & #2 \\ +#3 & #4 +\end{pmatrix}} + +\newcommand{\twocases}[4]{\begin{cases} +#1 & #2 \\ +#3 & #4 +\end{cases}} + + +\begin{document} + +\section{First section} + +\sent{A sentence before the first one} + +\sent{This is a sentence.} +\label{s1} +\sent{This is another sentence.} + +\todo{finish the first section} + +This 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 + +\section{Second section} + +\sent{A sentence in the second section.} +\label{sanother} + +\vspace{2cm} + +In sentence~\ref{s1}... \todo{what did I want to say?} + +\[ \R \] + +\words + +\[ +\mymatrix{x}{a_{2,2}}{0}{f(10)} +\] + +\[ +f(x)=\twocases{x^2}{\text{if }x>0}{-x^3}{\text{otherwise.}} +\] + +\end{document} +\ No newline at end of file diff --git a/src/Lecture2/slides/3-MoreLatex.aux b/src/Lecture2/slides/3-MoreLatex.aux @@ -0,0 +1,69 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {22}{22}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {23}{23}}} +\@writefile{nav}{\headcommand {\beamer@partpages {1}{23}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{23}}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{23}}} +\@writefile{nav}{\headcommand {\beamer@documentpages {23}}} +\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {23}}} diff --git a/src/Lecture2/slides/3-MoreLatex.log b/src/Lecture2/slides/3-MoreLatex.log @@ -0,0 +1,1193 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**3-MoreLatex.tex +(./3-MoreLatex.tex +LaTeX2e <2020-02-02> patch level 2 +L3 programming layer <2020-02-14> +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls +Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty +(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count167 +) +\beamer@tempbox=\box45 +\beamer@tempcount=\count168 +\c@beamerpauses=\count169 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty +\beamer@slideinframe=\count170 +\beamer@minimum=\count171 +\beamer@decode@box=\box46 +) +\beamer@commentbox=\box47 +\beamer@modecount=\count172 +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2019/11/07 v1.0c TeX engine tests +)) +\headdp=\dimen134 +\footheight=\dimen135 +\sidebarheight=\dimen136 +\beamer@tempdim=\dimen137 +\beamer@finalheight=\dimen138 +\beamer@animht=\dimen139 +\beamer@animdp=\dimen140 +\beamer@animwd=\dimen141 +\beamer@leftmargin=\dimen142 +\beamer@rightmargin=\dimen143 +\beamer@leftsidebar=\dimen144 +\beamer@rightsidebar=\dimen145 +\beamer@boxsize=\dimen146 +\beamer@vboxoffset=\dimen147 +\beamer@descdefault=\dimen148 +\beamer@descriptionwidth=\dimen149 +\beamer@lastskip=\skip47 +\beamer@areabox=\box48 +\beamer@animcurrent=\box49 +\beamer@animshowbox=\box50 +\beamer@sectionbox=\box51 +\beamer@logobox=\box52 +\beamer@linebox=\box53 +\beamer@sectioncount=\count173 +\beamer@subsubsectionmax=\count174 +\beamer@subsectionmax=\count175 +\beamer@sectionmax=\count176 +\beamer@totalheads=\count177 +\beamer@headcounter=\count178 +\beamer@partstartpage=\count179 +\beamer@sectionstartpage=\count180 +\beamer@subsectionstartpage=\count181 +\beamer@animationtempa=\count182 +\beamer@animationtempb=\count183 +\beamer@xpos=\count184 +\beamer@ypos=\count185 +\beamer@ypos@offset=\count186 +\beamer@showpartnumber=\count187 +\beamer@currentsubsection=\count188 +\beamer@coveringdepth=\count189 +\beamer@sectionadjust=\count190 +\beamer@tocsectionnumber=\count191 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) +\beamer@paperwidth=\skip48 +\beamer@paperheight=\skip49 + +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count192 +\Gm@cntv=\count193 +\c@Gm@tempcnt=\count194 +\Gm@bindingoffset=\dimen150 +\Gm@wd@mp=\dimen151 +\Gm@odd@mp=\dimen152 +\Gm@even@mp=\dimen153 +\Gm@layoutwidth=\dimen154 +\Gm@layoutheight=\dimen155 +\Gm@layouthoffset=\dimen156 +\Gm@layoutvoffset=\dimen157 +\Gm@dimlist=\toks15 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen158 +\Gin@req@width=\dimen159 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks16 +\pgfutil@tempdima=\dimen160 +\pgfutil@tempdimb=\dimen161 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t +ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box54 +(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty +Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t +ex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen162 +\pgf@y=\dimen163 +\pgf@xa=\dimen164 +\pgf@ya=\dimen165 +\pgf@xb=\dimen166 +\pgf@yb=\dimen167 +\pgf@xc=\dimen168 +\pgf@yc=\dimen169 +\pgf@xd=\dimen170 +\pgf@yd=\dimen171 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count195 +\c@pgf@countb=\count196 +\c@pgf@countc=\count197 +\c@pgf@countd=\count198 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count199 + (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de +f +File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code. +tex +File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfsyssoftpath@smallbuffer@items=\count266 +\pgfsyssoftpath@bigbuffer@items=\count267 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code. +tex +File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen172 +\pgfmath@count=\count268 +\pgfmath@box=\box55 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet +ric.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod +e.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison +.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari +thmetics.code.tex))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count269 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te +x +File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@picminx=\dimen173 +\pgf@picmaxx=\dimen174 +\pgf@picminy=\dimen175 +\pgf@picmaxy=\dimen176 +\pgf@pathminx=\dimen177 +\pgf@pathmaxx=\dimen178 +\pgf@pathminy=\dimen179 +\pgf@pathmaxy=\dimen180 +\pgf@xx=\dimen181 +\pgf@xy=\dimen182 +\pgf@yx=\dimen183 +\pgf@yy=\dimen184 +\pgf@zx=\dimen185 +\pgf@zy=\dimen186 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct. +code.tex +File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@path@lastx=\dimen187 +\pgf@path@lasty=\dimen188 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code +.tex +File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@shorten@end@additional=\dimen189 +\pgf@shorten@start@additional=\dimen190 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te +x +File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfpic=\box56 +\pgf@hbox=\box57 +\pgf@layerbox@main=\box58 +\pgf@picture@serial@count=\count270 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c +ode.tex +File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgflinewidth=\dimen191 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation +s.code.tex +File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@pt@x=\dimen192 +\pgf@pt@y=\dimen193 +\pgf@pt@temp=\dimen194 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t +ex +File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing +.code.tex +File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te +x +File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowsep=\dimen195 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@max=\dimen196 +\pgf@sys@shading@range@num=\count271 +\pgf@shadingcount=\count272 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code. +tex +File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfexternal@startupbox=\box59 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te +x +File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c +ode.tex +File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code. +tex +File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty +Package: xxcolor 2003/10/24 ver 0.1 +\XC@nummixins=\count273 +\XC@countmixins=\count274 +) +(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO) +)) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO) +) +\@linkdim=\dimen197 +\Hy@linkcounter=\count275 +\Hy@pagecounter=\count276 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count277 +\pdfmajorversion=\count278 +Package hyperref Info: Option `bookmarks' set `true' on input line 4421. +Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421. +Package hyperref Info: Option `implicit' set `false' on input line 4421. +Package hyperref Info: Hyper figures OFF on input line 4547. +Package hyperref Info: Link nesting OFF on input line 4552. +Package hyperref Info: Hyper index ON on input line 4555. +Package hyperref Info: Plain pages OFF on input line 4562. +Package hyperref Info: Backreferencing OFF on input line 4567. +Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals. +Package hyperref Info: Bookmarks ON on input line 4800. +\c@Hy@tempcnt=\count279 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5159. +\XeTeXLinkMargin=\dimen198 + +(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count280 +\Field@Width=\dimen199 +\Fld@charsize=\dimen256 +Package hyperref Info: Hyper figures OFF on input line 6430. +Package hyperref Info: Link nesting OFF on input line 6435. +Package hyperref Info: Hyper index ON on input line 6438. +Package hyperref Info: backreferencing OFF on input line 6445. +Package hyperref Info: Link coloring OFF on input line 6450. +Package hyperref Info: Link coloring with OCG OFF on input line 6455. +Package hyperref Info: PDF/A mode OFF on input line 6460. +LaTeX Info: Redefining \ref on input line 6500. +LaTeX Info: Redefining \pageref on input line 6504. +\Hy@abspage=\count281 + + +Package hyperref Message: Stopped early. + +) +Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO) +) +\Fld@listcount=\count282 +\c@bookmark@seq@number=\count283 + +(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks26 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty +Package: sansmathaccent 2020/01/31 + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty +Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files) +))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty +Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty +\beamer@argscount=\count284 +\beamer@lastskipcover=\skip50 +\beamer@trivlistdepth=\count285 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty +\c@lecture=\count286 +\c@part=\count287 +\c@section=\count288 +\c@subsection=\count289 +\c@subsubsection=\count290 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty +\beamer@framebox=\box60 +\beamer@frametitlebox=\box61 +\beamer@zoombox=\box62 +\beamer@zoomcount=\count291 +\beamer@zoomframecount=\count292 +\beamer@frametextheight=\dimen257 +\c@subsectionslide=\count293 +\beamer@frametopskip=\skip51 +\beamer@framebottomskip=\skip52 +\beamer@frametopskipautobreak=\skip53 +\beamer@framebottomskipautobreak=\skip54 +\beamer@envbody=\toks27 +\framewidth=\dimen258 +\c@framenumber=\count294 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty +\beamer@verbatimfileout=\write4 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty +\beamer@splitbox=\box63 +\beamer@autobreakcount=\count295 +\beamer@autobreaklastheight=\dimen259 +\beamer@frametitletoks=\toks28 +\beamer@framesubtitletoks=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty +\beamer@footins=\box64 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty +\beamer@frameboxcopy=\box65 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty +\beamer@sbttoks=\toks30 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty +\bmb@box=\box66 +\bmb@colorbox=\box67 +\bmb@boxshadow=\box68 +\bmb@boxshadowball=\box69 +\bmb@boxshadowballlarge=\box70 +\bmb@temp=\dimen260 +\bmb@dima=\dimen261 +\bmb@dimb=\dimen262 +\bmb@prevheight=\dimen263 +) +\beamer@blockheadheight=\dimen264 +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks31 +) +\c@figure=\count296 +\c@table=\count297 +\abovecaptionskip=\skip55 +\belowcaptionskip=\skip56 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty +\beamer@section@min@dim=\dimen265 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/01/20 v2.17e AMS math features +\@mathmargin=\skip57 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks32 +\ex@=\dimen266 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen267 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count298 +LaTeX Info: Redefining \frac on input line 227. +\uproot@=\count299 +\leftroot@=\count300 +LaTeX Info: Redefining \overline on input line 389. +\classnum@=\count301 +\DOTSCASE@=\count302 +LaTeX Info: Redefining \ldots on input line 486. +LaTeX Info: Redefining \dots on input line 489. +LaTeX Info: Redefining \cdots on input line 610. +\Mathstrutbox@=\box71 +\strutbox@=\box72 +\big@size=\dimen268 +LaTeX Font Info: Redeclaring font encoding OML on input line 733. +LaTeX Font Info: Redeclaring font encoding OMS on input line 734. +\macc@depth=\count303 +\c@MaxMatrixCols=\count304 +\dotsspace@=\muskip17 +\c@parentequation=\count305 +\dspbrk@lvl=\count306 +\tag@help=\toks33 +\row@=\count307 +\column@=\count308 +\maxfields@=\count309 +\andhelp@=\toks34 +\eqnshift@=\dimen269 +\alignsep@=\dimen270 +\tagshift@=\dimen271 +\tagwidth@=\dimen272 +\totwidth@=\dimen273 +\lineht@=\dimen274 +\@envbody=\toks35 +\multlinegap=\skip58 +\multlinetaggap=\skip59 +\mathdisplay@stack=\toks36 +LaTeX Info: Redefining \[ on input line 2859. +LaTeX Info: Redefining \] on input line 2860. +) +(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2017/10/31 v2.20.4 +\thm@style=\toks37 +\thm@bodyfont=\toks38 +\thm@headfont=\toks39 +\thm@notefont=\toks40 +\thm@headpunct=\toks41 +\thm@preskip=\skip60 +\thm@postskip=\skip61 +\thm@headsep=\skip62 +\dth@everypar=\toks42 +) +\c@theorem=\count310 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty +\beamer@dima=\dimen275 +\beamer@dimb=\dimen276 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file +\inpenc@prehook=\toks43 +\inpenc@posthook=\toks44 +) +(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty +Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ + +(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +Package: pgf 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfnodeparttextbox=\box73 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65 +.sty +Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b) +\pgf@nodesepstart=\dimen277 +\pgf@nodesepend=\dimen278 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18 +.sty +Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen279 +\pgffor@skip=\dimen280 +\pgffor@stack=\toks45 +\pgffor@toks=\toks46 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers +.code.tex +File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@plot@mark@count=\count311 +\pgfplotmarksize=\dimen281 +) +\tikz@lastx=\dimen282 +\tikz@lasty=\dimen283 +\tikz@lastxsaved=\dimen284 +\tikz@lastysaved=\dimen285 +\tikz@lastmovetox=\dimen286 +\tikz@lastmovetoy=\dimen287 +\tikzleveldistance=\dimen288 +\tikzsiblingdistance=\dimen289 +\tikz@figbox=\box74 +\tikz@figbox@bg=\box75 +\tikz@tempbox=\box76 +\tikz@tempbox@bg=\box77 +\tikztreelevel=\count312 +\tikznumberofchildren=\count313 +\tikznumberofcurrentchild=\count314 +\tikz@fig@count=\count315 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfmatrixcurrentrow=\count316 +\pgfmatrixcurrentcolumn=\count317 +\pgf@matrix@numberofcolumns=\count318 +) +\tikz@expandcount=\count319 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarymatrix.code.tex +File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibraryquotes.code.tex +File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta. +code.tex +File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowinset=\dimen290 +\pgfarrowlength=\dimen291 +\pgfarrowwidth=\dimen292 +\pgfarrowlinewidth=\dimen293 +))) +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode +\l__kernel_color_stack_int=\count320 +\l__pdf_internal_box=\box78 +) +(./3-MoreLatex.aux) +\openout1 = `3-MoreLatex.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 19. +LaTeX Font Info: ... okay on input line 19. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: custom +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: includehead includefoot +* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt) +* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt) +* \paperwidth=364.19536pt +* \paperheight=273.14662pt +* \textwidth=342.2953pt +* \textheight=244.6939pt +* \oddsidemargin=-61.31996pt +* \evensidemargin=-61.31996pt +* \topmargin=-72.26999pt +* \headheight=14.22636pt +* \headsep=0.0pt +* \topskip=11.0pt +* \footskip=14.22636pt +* \marginparwidth=4.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count321 +\scratchdimen=\dimen294 +\scratchbox=\box79 +\nofMPsegments=\count322 +\nofMParguments=\count323 +\everyMPshowfont=\toks47 +\MPscratchCnt=\count324 +\MPscratchDim=\dimen295 +\MPnumerator=\count325 +\makeMPintoPDFobject=\count326 +\everyMPtoPDFconversion=\toks48 +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +ABD: EveryShipout initializing macros +\AtBeginShipoutBox=\box80 +Package hyperref Info: Link coloring OFF on input line 19. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count327 +) +LaTeX Info: Redefining \ref on input line 19. +LaTeX Info: Redefining \pageref on input line 19. +LaTeX Info: Redefining \nameref on input line 19. + +(./3-MoreLatex.out) (./3-MoreLatex.out) +\@outlinefile=\write5 +\openout5 = `3-MoreLatex.out'. + +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 19. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 19. +\symnumbers=\mathgroup6 +\sympureletters=\mathgroup7 +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 19. +LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 19. +LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 19. +LaTeX Font Info: Redeclaring math alphabet \mathit on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 19. +LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 19. +LaTeX Font Info: Overwriting symbol font `numbers' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 19. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 19. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 19. +LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 19. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal' +(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 1 +9. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 1 +9. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp +ut line 19. + +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary +-English.dict +Dictionary: translator-basic-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic +tionary-English.dict +Dictionary: translator-bibliography-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict +ionary-English.dict +Dictionary: translator-environment-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar +y-English.dict +Dictionary: translator-months-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona +ry-English.dict +Dictionary: translator-numbers-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona +ry-English.dict +Dictionary: translator-theorem-dictionary, Language: English +) (./3-MoreLatex.nav) +<img/unilu.jpg, id=20, 645.16031pt x 578.16pt> +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 23. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>] +LaTeX Font Info: Trying to load font information for OMS+cmtt on input line +42. + +(/usr/share/texmf/tex/latex/R/tex/latex/omscmtt.fd +File: omscmtt.fd +) +LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <12> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 42. +LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <10.95> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 42. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 42. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [2 + +] +<img/thm_pre.png, id=85, 493.845pt x 208.78pt> +File: img/thm_pre.png Graphic file (type png) +<use img/thm_pre.png> +Package pdftex.def Info: img/thm_pre.png used on input line 60. +(pdftex.def) Requested size: 148.15463pt x 62.63448pt. +<img/thm_tex.png, id=86, 621.32124pt x 162.6075pt> +File: img/thm_tex.png Graphic file (type png) +<use img/thm_tex.png> +Package pdftex.def Info: img/thm_tex.png used on input line 60. +(pdftex.def) Requested size: 186.39781pt x 48.78262pt. + +Overfull \hbox (15.25017pt too wide) in paragraph at lines 60--60 +[][] + [] + +LaTeX Font Info: Trying to load font information for U+msa on input line 60. + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 60. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp +ut line 60. + +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd +File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma +thkerncmss. +) +<img/thm_pdf.png, id=87, 848.16875pt x 474.77374pt> +File: img/thm_pdf.png Graphic file (type png) +<use img/thm_pdf.png> +Package pdftex.def Info: img/thm_pdf.png used on input line 60. +(pdftex.def) Requested size: 169.63074pt x 94.95306pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 60. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[3 + + <./img/thm_pre.png> <./img/thm_tex.png> <./img/thm_pdf.png>] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 79. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [4 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 104. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [5 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 151. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[6 + +] +LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <14.4> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 173. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 173. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [7 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 189. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [8 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 206. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [9 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 222. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [10 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 236. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [11 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 253. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [12 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 283. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [13 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 301. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [14 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 323. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [15 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 347. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [16 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 367. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [17 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 381. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [18 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 402. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [19 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 420. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [20 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 433. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [21 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 458. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[22 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 475. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [23 + +] +\tf@nav=\write6 +\openout6 = `3-MoreLatex.nav'. + +\tf@toc=\write7 +\openout7 = `3-MoreLatex.toc'. + +\tf@snm=\write8 +\openout8 = `3-MoreLatex.snm'. + +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 477. +Package atveryend Info: Empty hook `AfterLastShipout' on input line 477. + (./3-MoreLatex.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 477. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 477. +Package rerunfilecheck Info: File `3-MoreLatex.out' has not changed. +(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. + ) +Here is how much of TeX's memory you used: + 22004 strings out of 481239 + 446635 string characters out of 5920377 + 685823 words of memory out of 5000000 + 36692 multiletter control sequences out of 15000+600000 + 541233 words of font info for 57 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 58i,18n,89p,795b,653s stack positions out of 5000i,500n,10000p,200000b,80000s +</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></us +r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/shar +e/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/texl +ive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texlive/te +xmf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/texmf-dis +t/fonts/type1/public/amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-dist/fo +nts/type1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/fonts/t +ype1/public/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/p +ublic/amsfonts/cm/cmtt10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/ +amsfonts/cm/cmtt12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfon +ts/cm/cmtt8.pfb> +Output written on 3-MoreLatex.pdf (23 pages, 331145 bytes). +PDF statistics: + 701 PDF objects out of 1000 (max. 8388607) + 643 compressed objects within 7 object streams + 47 named destinations out of 1000 (max. 500000) + 87 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture2/slides/3-MoreLatex.nav b/src/Lecture2/slides/3-MoreLatex.nav @@ -0,0 +1,51 @@ +\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}} +\headcommand {\beamer@framepages {1}{1}} +\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}} +\headcommand {\beamer@framepages {2}{2}} +\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}} +\headcommand {\beamer@framepages {3}{3}} +\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}} +\headcommand {\beamer@framepages {4}{4}} +\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}} +\headcommand {\beamer@framepages {5}{5}} +\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}} +\headcommand {\beamer@framepages {6}{6}} +\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}} +\headcommand {\beamer@framepages {7}{7}} +\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}} +\headcommand {\beamer@framepages {8}{8}} +\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}} +\headcommand {\beamer@framepages {9}{9}} +\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}} +\headcommand {\beamer@framepages {10}{10}} +\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}} +\headcommand {\beamer@framepages {11}{11}} +\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}} +\headcommand {\beamer@framepages {12}{12}} +\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}} +\headcommand {\beamer@framepages {13}{13}} +\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}} +\headcommand {\beamer@framepages {14}{14}} +\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}} +\headcommand {\beamer@framepages {15}{15}} +\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}} +\headcommand {\beamer@framepages {16}{16}} +\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}} +\headcommand {\beamer@framepages {17}{17}} +\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}} +\headcommand {\beamer@framepages {18}{18}} +\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}} +\headcommand {\beamer@framepages {19}{19}} +\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}} +\headcommand {\beamer@framepages {20}{20}} +\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}} +\headcommand {\beamer@framepages {21}{21}} +\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}} +\headcommand {\beamer@framepages {22}{22}} +\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}} +\headcommand {\beamer@framepages {23}{23}} +\headcommand {\beamer@partpages {1}{23}} +\headcommand {\beamer@subsectionpages {1}{23}} +\headcommand {\beamer@sectionpages {1}{23}} +\headcommand {\beamer@documentpages {23}} +\headcommand {\gdef \inserttotalframenumber {23}} diff --git a/src/Lecture2/slides/3-MoreLatex.out b/src/Lecture2/slides/3-MoreLatex.out diff --git a/src/Lecture2/slides/3-MoreLatex.pdf 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 diff --git a/src/Lecture2/slides/3-MoreLatex.tex b/src/Lecture2/slides/3-MoreLatex.tex @@ -0,0 +1,478 @@ +\documentclass[11pt]{beamer} +\usetheme{Madrid} +\usepackage[utf8]{inputenc} +\usepackage{amsmath, amssymb, amsfonts, amsthm} +\usepackage{xcolor} + +\usepackage{tikz-cd} +%\usepackage{enumitem} + +\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto} +\title{More Latex} +\logo{\includegraphics[scale=0.1]{img/unilu.jpg}} +%\institute{University of Luxembourg} + +\newcommand{\bs}{\textbackslash} + +\date{2021-03-12} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + +\begin{frame}{Theorems (review)} + \begin{center} + \large + \texttt{\bs newtheorem\{env-name\}{\color{red}[number-with]}\{Text\}{\color{red}[number-parent]}} + \end{center} + + \vspace{0.4cm} + \begin{itemize} + \item \texttt{env-name}: Environment name (use + \texttt{\bs begin\{env-name\}...}) + \item \texttt{Text}: Theorem name to be displayed + \item \texttt{[number-with]} for ``shared counter'' + \item \texttt{[number-parent]} adds x.1 + \item {\color{red} At most one of \texttt{[number-with]} + and \texttt{[number-parent]}} + \end{itemize} + +\end{frame} + +\begin{frame}{Theorems (review)} + \begin{columns} + \column{0.5\textwidth} + \includegraphics[scale=0.3]{img/thm_pre.png} + + \vspace{0.2cm} + \vdots + \vspace{0.3cm} + + \includegraphics[scale=0.3]{img/thm_tex.png} + + \column{0.5\textwidth} + \includegraphics[scale=0.2]{img/thm_pdf.png} + + \vspace{1cm} + \end{columns} +\end{frame} + + +\begin{frame}{Counters} + Reference: \url{https://en.wikibooks.org/wiki/LaTeX/Counters} + + \vspace{0.5cm} + \begin{itemize} + \item Sections, theorems etc have an associated \emph{counter} + + \vspace{0.2cm} + \item Common usage: + + \vspace{0.1cm} + \texttt{\bs setcounter\{counter-name\}\{n\} \quad \%Set counter to n} + + \vspace{0.1cm} + \texttt{\bs addtocounter\{counter-name\}\{n\}\quad\%Add n to counter} + \end{itemize} +\end{frame} + + +\begin{frame}{Counters} + + \begin{itemize} + \item Define a counter with \texttt{\bs newcounter\{name\}[number-parent]} + + \vspace{0.2cm} + \item Change sub-numbering of defined counters: + + \vspace{0.15cm} + \begin{center} + \begin{tabular}{l} + \texttt{\bs numberwithin\{equation\}\{section\}} + %\texttt{\bs numberwithout\{subsection\}\{section\}} + \end{tabular} + \end{center} + + \vspace{0.2cm} + \item Print formatted counter with \texttt{\bs{\color{red}the}name} + or just number with \texttt{\bs arabic\{name\}} + (or \texttt{\bs alph}, \texttt{\bs Alph}, \texttt{\bs roman}, + \texttt{\bs Roman}, \texttt{\bs fnsymbol}) + \end{itemize} +\end{frame} + + +\begin{frame}{Counters} + + \begin{columns} + + \column{0.5\textwidth} + \begin{center} + {\large\textbf{Default counters}} + + \vspace{0.3cm} + \begin{tabular}{l} + %part \\ + chapter \\ + section \\ + subsection \\ + subsubsection \\ + paragraph \\ + %subparagraph \\ + page \\ + figure \\ + %table \\ + footnote \\ + %mpfootnote \\ + equation \\ + enumi \\ + enumii \\ + ... + %enumiii \\ + %enumiv \\ + \end{tabular} + \end{center} + + \column{0.5\textwidth} + {\large\textbf{Counter styles}} + + \vspace{0.3cm} + \begin{tabular}{ll} + \texttt{arabic} & 1, 2, 3, 4... \\ + \texttt{alph} & a, b, c, d... \\ + \texttt{Alph} & A, B, C, D... \\ + \texttt{roman} & i, ii, iii, iv... \\ + \texttt{Roman} & I, II, III, IV... \\ + \texttt{fnsymbol} & $\ast$, $\dagger$, $\ddagger$, $\S$ ... + \end{tabular} + \end{columns} +\end{frame} + +\begin{frame}{Counters: change \texttt{\bs thecounter}} + \begin{itemize} + \item Change how counter is displayed by default, for example: + + \vspace{0.2cm} + \begin{center} + \texttt{\bs renewcommand\{\bs thesection\}\{\bs alph\{section\}\}} + \end{center} + + \vspace{0.3cm} + \item For enumerate: + + \vspace{0.2cm} + \begin{center} + \begin{tabular}{l} + \texttt{\bs usepackage\{enumitem\}} \\ + \texttt{\bs begin\{enumerate\}[label=\bs alph*]} + \end{tabular} + \end{center} + \end{itemize} +\end{frame} + +\begin{frame}{\texttt{label} and \texttt{ref}} + \begin{itemize} + \item Put \texttt{\bs label\{mark\}} immediately after the thing you want + to refer to (after \texttt{\bs refstepcounter\{countername\}} for + counters you define) + + \vspace{0.3cm} + \item Use \texttt{\bs ref\{mark\}} or \texttt{\bs eqref\{mark\}} to refer + %(or \texttt{\bs eqref\{mark\}} = \texttt{(\bs ref\{mark\})}) + + (Pro tip: write \texttt{Proposition$\sim$\bs ref\{mark\}}) + \vspace{0.3cm} + \item Compile twice! + \end{itemize} +\end{frame} + + +\begin{frame}{The \texttt{hyperref} package} + \texttt{\bs usepackage\{hyperref\}} + + \vspace{1cm} + \begin{itemize} + \item Now all \texttt{\bs ref\{mark\}} become clickable! + + \vspace{0.3cm} + \item \texttt{\bs hyperref[mark]\{text\}} for internal links + + \vspace{0.3cm} + \item \texttt{\bs url\{www.google.com\}} or + \texttt{\bs href\{www.google.com\}\{Google\}} for web links + \end{itemize} +\end{frame} + +\begin{frame}{New commands} + \begin{itemize} + \item We have seen \texttt{\bs newcommand\{\bs command\}\{output\}} + + \vspace{0.3cm} + \item Arguments: use \texttt{\bs newcommand\{\bs command\}[n]\{output\}} + and use the arguments in \texttt{output} with + \texttt{\#1, \#2, ... \#n} \hspace{0.4cm}(\texttt n$\leq 9$) + + \vspace{0.3cm} + \item If \texttt{\bs command} is already defined: + \texttt{\bs renewcommand} (overwrite) or + \texttt{\bs providecommand} (use old definition, if it exists) + \end{itemize} +\end{frame} + +\begin{frame}{New commands - examples} + + \begin{tabular}{l|c} + \texttt{\bs newcommand\{hi\}\{Hello, World!\}} \\ + \texttt{\bs hi} & Hello, world! \\ + \\ + \texttt{\bs newcommand\{hello\}[1]\{Hello, \#1!\}} \\ + \texttt{\bs hello\{my friend\}} & Hello, my friend! \\ + \\ + \texttt{\bs renewcommand\{binom\}[2]\{bin(\#1,\#2)\}} \\ + \texttt{\bs( \bs binom\{10\}2 \bs)} & \(bin(10,2)\) + \end{tabular} +\end{frame} + + +\begin{frame}{New commands - optional argument} + \texttt{\bs newcommand\{\bs com\}[n][default1]\{output\}} + + \texttt{\bs com[first]\{other,args\}} or \texttt{\bs com\{without,first\}} + + \vspace{1cm} + \begin{itemize} + \item At most one optional argument, must be \texttt{\# 1} + + \vspace{0.3cm} + \item More complex things: use TeX primitives such as + \texttt{\bs ifthenelse} or see + \url{https://www.ctan.org/tex-archive/support/newcommand/} + \end{itemize} +\end{frame} + +\begin{frame}{Exercises} + \begin{enumerate}%[label=(\arabic*)] + \item Write a command \texttt{\bs mat} which takes $4$ arguments and + outputs a $2\times 2$ matrix with those arguments as entries + (use \texttt{pmatrix}). + + \vspace{0.5cm} + \item Write a command to define a function case-by-case ($2$ cases, + $4$ arguments). Use the \texttt{cases} environment: + + \vspace{0.2cm} + \begin{columns} + \column{0.45\textwidth} + \begin{center}\begin{tabular}{l} + \texttt{\bs begin\{cases\}} \\ + \texttt{\quad 1 \& 2 \bs\bs \quad3 \& 4} \\ + \texttt{\bs end\{cases\}} + \end{tabular}\end{center} + + \column{0.09\textwidth} + \begin{center} $\implies$ \end{center} + + \column{0.45\textwidth} + \begin{align*} + \begin{cases} 1 & 2 \\ 3 & 4 \end{cases} + \end{align*} + \end{columns} + \end{enumerate} +\end{frame} + + +\begin{frame}{Pictures} + \texttt{\bs usepackage\{graphicx\}} + + \texttt{\bs includegraphics[options]\{picture.jpg\}} + + \vspace{1cm} + Options (comma-separated) include: + + \vspace{0.2cm} + \begin{itemize} + \item \texttt{scale=x} (scale by a factor of x) + \item \texttt{width=x} and \texttt{height=y} (if both specified picture + is distorted) + \item \texttt{angle=$\alpha$} (rotate) + \end{itemize} +\end{frame} + + +\begin{frame}{Figures} + \texttt{\bs begin\{figure\}[place]} + + \vspace{1cm} + \begin{itemize} + \item Figure outside normal text flow. + \item \texttt{place}: \texttt{h} (here), \texttt{t} (top) or \texttt{b} + (bottom). + \item Can add \emph{caption} + \end{itemize} + + \vspace{0.3cm} + \begin{center} \begin{tabular}{l} + \texttt{\bs begin\{figure\}[h]} \\ + \texttt{\qquad\bs centering \qquad \% recommended} \\ + \texttt{\qquad \bs includegraphics\{picture.jpg\}} \\ + \texttt{\qquad \bs caption\{Description of the picture\}} \\ + \texttt{\bs end\{figure\}} + \end{tabular} \end{center} +\end{frame} + + +\begin{frame}{Wrapping text around figures} + + \texttt{\bs usepackage\{{\color{red}wrapfig}\}} + + \texttt{\bs begin\{wrapfigure\}{\color{red}\{alignment\}\{width\}}} + + \vspace{1cm} + \begin{itemize} + \item \texttt{alignment}: \texttt{l} (left) or \texttt{r} (right) + \item Must specify \texttt{width} + \item Works the same as \texttt{figure} + \end{itemize} + + \vspace{0.3cm} + \begin{center} \begin{tabular}{l} + \texttt{\bs begin\{wrapfigure\}{\color{red}\{l\}\{0.5\bs textwidth\}}} \\ + \texttt{\qquad\bs centering} \\ + \texttt{\qquad \bs includegraphics\{picture.jpg\}} \\ + \texttt{\qquad \bs caption\{Description of the picture\}} \\ + \texttt{\bs end\{wrapfigure\}} + \end{tabular} \end{center} +\end{frame} + + +\begin{frame}{Lengths} + Reference: \url{https://en.wikibooks.org/wiki/LaTeX/Lengths} + + \vspace{0.5cm} + \begin{itemize} + \item Similar to counters: + + \vspace{0.3cm} + \begin{center}\begin{tabular}{l} + \texttt{\bs newlength\{\bs lengthname\}}\\ + \texttt{\bs setlength\{\bs lengthname\}\{value\}} + \end{tabular}\end{center} + + \vspace{0.3cm} + \item \texttt{value}: number followed by unit + (\texttt{12pt}, \texttt{1.2cm}, \texttt{65mm}, \dots) + \end{itemize} +\end{frame} + +\begin{frame}{Lengths} + Default lengths: + + \vspace{0.5cm} + \begin{itemize} + \item \texttt{\bs textwidth}: width of text in a page + \item \texttt{\bs textheight}: height of text in a page + \item \texttt{\bs baselineskip}: space between lines in same paragraph + \item \texttt{\bs parskip}: space between paragraphs + \item \texttt{\bs parindent}: indentation of first line of a paragraph + \item \dots + \end{itemize} +\end{frame} + +\begin{frame}{Manual spacing} + \begin{itemize} + \item \texttt{\bs vspace\{length\}} and \texttt{\bs hspace\{length\}} + + \vspace{0.2cm} + \item Fill space: \texttt{\bs vfill} and \texttt{\bs hfill} + + \vspace{0.2cm} + \item Fill line with ``decoration'': + \texttt{\bs hrulefill} and \texttt{\bs dotfill} + + \vspace{0.2cm} + \item Example: + + \vspace{0.2cm} + \begin{center} + \texttt{First name: \bs hrulefill \bs quad Last name: \bs hrulefill} + \end{center} + \end{itemize} +\end{frame} + + + +\begin{frame}{Bibliography} + Simple bibliography with \texttt{thebibliography} environment: + + \vspace{0.5cm} + \begin{center}\begin{tabular}{l} + \texttt{\bs begin\{thebibliography\}\{99\}} \\ + \texttt{\qquad\bs bibitem\{knuth68\}} \\ + \texttt{\qquad\qquad Donald Knuth, The Art of Computer Programming,} \\ + \texttt{\qquad\qquad Volume I, 1968, Addison-Wesley}\\ + \texttt{\bs end\{thebibliography\}} + \end{tabular}\end{center} + + %\vspace{0.5cm} + %And cite with \texttt{\bs cite\{knuth68\}} +\end{frame} + + +\begin{frame}{Bibligraphy} + \begin{itemize} + \item Simple citation: \texttt{\bs cite\{knuth68\}} + + \vspace{0.3cm} + \item Cite multiple sources: \texttt{\bs cite\{source1, source2\}} + + \vspace{0.3cm} + \item Cite specific part with \texttt{\bs cite[p.$\sim$42]\{source\}} + \end{itemize} +\end{frame} + + +\begin{frame}{Bibliography: BibTeX} + \begin{itemize} + \item Separate file \texttt{mybib.bib}, different syntax: + + \begin{center}\begin{tabular}{l} + \texttt{@book\{knuth68,} \\ + \texttt{\qquad author = "Donald Knuth",}\\ + \texttt{\qquad title = "The Art of Computer Programming",}\\ + \texttt{\qquad publisher = "Addison-Wesley",}\\ + \texttt{\qquad volume = "I",}\\ + \texttt{\qquad year = "1968",} \\ + \texttt{\}} + \end{tabular}\end{center} + + \vspace{0.3cm} + \item Include bibliography in your \texttt{.tex} file: + + \begin{center}\begin{tabular}{l} + \texttt{\bs bibliographystyle\{plain\}}\\ + \texttt{\bs bibliography\{mybib\}} + \end{tabular}\end{center} + \end{itemize} +\end{frame} + + +\begin{frame}{Bibliography: BibTeX} + \begin{itemize} + \item Compile, generate bibliography, compile, compile + + \vspace{0.3cm} + \item Books in \texttt{.bib} file but not cited do not appear + + \vspace{0.3cm} + \item Citing articles and other: see \url{https://en.wikibooks.org/wiki/% + LaTeX/Bibliography\_Management\#Standard\_templates} + + \vspace{0.3cm} + \item Find BibTeX citations on \url{https://scholar.google.com} + \end{itemize} +\end{frame} + +\end{document} + diff --git a/src/Lecture2/slides/3-MoreLatex.toc 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 Binary files differ. diff --git a/src/Lecture2/slides/img/thm_pre.png 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 Binary files differ. diff --git a/src/Lecture2/slides/img/unilu.jpg b/src/Lecture2/slides/img/unilu.jpg Binary files differ. diff --git a/src/Lecture3/live/beamer.aux b/src/Lecture3/live/beamer.aux @@ -0,0 +1,36 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}} +\@writefile{toc}{\beamer@sectionintoc {1}{This is the first section}{2}{0}{1}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{1}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{1}}} +\@writefile{nav}{\headcommand {\sectionentry {1}{this}{2}{This is the first section}{0}}} +\@writefile{nav}{\headcommand {\slideentry {1}{0}{1}{2/5}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {2}{5}}} +\@writefile{nav}{\headcommand {\slideentry {1}{0}{2}{6/6}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}} +\@writefile{nav}{\headcommand {\slideentry {1}{0}{3}{7/10}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {7}{10}}} +\@writefile{nav}{\headcommand {\beamer@partpages {1}{10}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {2}{10}}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {2}{10}}} +\@writefile{nav}{\headcommand {\beamer@documentpages {10}}} +\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {4}}} +\gdef \@abspage@last{10} diff --git a/src/Lecture3/live/beamer.log b/src/Lecture3/live/beamer.log @@ -0,0 +1,944 @@ +This 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 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**beamer.tex +(./beamer.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/beamer/beamer.cls +Document Class: beamer 2020/07/22 v3.59 A class for typesetting presentations +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasemodes.sty +(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count177 +) +\beamer@tempbox=\box47 +\beamer@tempcount=\count178 +\c@beamerpauses=\count179 + +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasedecode.sty +\beamer@slideinframe=\count180 +\beamer@minimum=\count181 +\beamer@decode@box=\box48 +) +\beamer@commentbox=\box49 +\beamer@modecount=\count182 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\headdp=\dimen138 +\footheight=\dimen139 +\sidebarheight=\dimen140 +\beamer@tempdim=\dimen141 +\beamer@finalheight=\dimen142 +\beamer@animht=\dimen143 +\beamer@animdp=\dimen144 +\beamer@animwd=\dimen145 +\beamer@leftmargin=\dimen146 +\beamer@rightmargin=\dimen147 +\beamer@leftsidebar=\dimen148 +\beamer@rightsidebar=\dimen149 +\beamer@boxsize=\dimen150 +\beamer@vboxoffset=\dimen151 +\beamer@descdefault=\dimen152 +\beamer@descriptionwidth=\dimen153 +\beamer@lastskip=\skip47 +\beamer@areabox=\box50 +\beamer@animcurrent=\box51 +\beamer@animshowbox=\box52 +\beamer@sectionbox=\box53 +\beamer@logobox=\box54 +\beamer@linebox=\box55 +\beamer@sectioncount=\count183 +\beamer@subsubsectionmax=\count184 +\beamer@subsectionmax=\count185 +\beamer@sectionmax=\count186 +\beamer@totalheads=\count187 +\beamer@headcounter=\count188 +\beamer@partstartpage=\count189 +\beamer@sectionstartpage=\count190 +\beamer@subsectionstartpage=\count191 +\beamer@animationtempa=\count192 +\beamer@animationtempb=\count193 +\beamer@xpos=\count194 +\beamer@ypos=\count195 +\beamer@ypos@offset=\count196 +\beamer@showpartnumber=\count197 +\beamer@currentsubsection=\count198 +\beamer@coveringdepth=\count199 +\beamer@sectionadjust=\count266 +\beamer@tocsectionnumber=\count267 + +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks15 +)) +\beamer@paperwidth=\skip48 +\beamer@paperheight=\skip49 + +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count268 +\Gm@cntv=\count269 +\c@Gm@tempcnt=\count270 +\Gm@bindingoffset=\dimen154 +\Gm@wd@mp=\dimen155 +\Gm@odd@mp=\dimen156 +\Gm@even@mp=\dimen157 +\Gm@layoutwidth=\dimen158 +\Gm@layoutheight=\dimen159 +\Gm@layouthoffset=\dimen160 +\Gm@layoutvoffset=\dimen161 +\Gm@dimlist=\toks16 +) +(/usr/share/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen162 +\Gin@req@width=\dimen163 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks17 +\pgfutil@tempdima=\dimen164 +\pgfutil@tempdimb=\dimen165 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box56 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks18 +\pgfkeys@temptoks=\toks19 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks20 +)) +\pgf@x=\dimen166 +\pgf@y=\dimen167 +\pgf@xa=\dimen168 +\pgf@ya=\dimen169 +\pgf@xb=\dimen170 +\pgf@yb=\dimen171 +\pgf@xc=\dimen172 +\pgf@yc=\dimen173 +\pgf@xd=\dimen174 +\pgf@yd=\dimen175 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count271 +\c@pgf@countb=\count272 +\c@pgf@countc=\count273 +\c@pgf@countd=\count274 +\t@pgf@toka=\toks21 +\t@pgf@tokb=\toks22 +\t@pgf@tokc=\toks23 +\pgf@sys@id@count=\count275 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count276 +\pgfsyssoftpath@bigbuffer@items=\count277 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen176 +\pgfmath@count=\count278 +\pgfmath@box=\box57 +\pgfmath@toks=\toks24 +\pgfmath@stack@operand=\toks25 +\pgfmath@stack@operation=\toks26 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count279 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen177 +\pgf@picmaxx=\dimen178 +\pgf@picminy=\dimen179 +\pgf@picmaxy=\dimen180 +\pgf@pathminx=\dimen181 +\pgf@pathmaxx=\dimen182 +\pgf@pathminy=\dimen183 +\pgf@pathmaxy=\dimen184 +\pgf@xx=\dimen185 +\pgf@xy=\dimen186 +\pgf@yx=\dimen187 +\pgf@yy=\dimen188 +\pgf@zx=\dimen189 +\pgf@zy=\dimen190 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen191 +\pgf@path@lasty=\dimen192 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen193 +\pgf@shorten@start@additional=\dimen194 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box58 +\pgf@hbox=\box59 +\pgf@layerbox@main=\box60 +\pgf@picture@serial@count=\count280 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen195 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen196 +\pgf@pt@y=\dimen197 +\pgf@pt@temp=\dimen198 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen199 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen256 +\pgf@sys@shading@range@num=\count281 +\pgf@shadingcount=\count282 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box61 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty +Package: xxcolor 2003/10/24 ver 0.1 +\XC@nummixins=\count283 +\XC@countmixins=\count284 +) +(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa +ge +with kernel methods +) +(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX + +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) + +(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) +) +\@linkdim=\dimen257 +\Hy@linkcounter=\count285 +\Hy@pagecounter=\count286 + +(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count287 +Package hyperref Info: Option `bookmarks' set `true' on input line 4338. +Package hyperref Info: Option `bookmarksopen' set `true' on input line 4338. +Package hyperref Info: Option `implicit' set `false' on input line 4338. +Package hyperref Info: Hyper figures OFF on input line 4464. +Package hyperref Info: Link nesting OFF on input line 4469. +Package hyperref Info: Hyper index ON on input line 4472. +Package hyperref Info: Plain pages OFF on input line 4479. +Package hyperref Info: Backreferencing OFF on input line 4484. +Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals. +Package hyperref Info: Bookmarks ON on input line 4717. +\c@Hy@tempcnt=\count288 + +(/usr/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5076. +\XeTeXLinkMargin=\dimen258 + +(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count289 +\Field@Width=\dimen259 +\Fld@charsize=\dimen260 +Package hyperref Info: Hyper figures OFF on input line 6347. +Package hyperref Info: Link nesting OFF on input line 6352. +Package hyperref Info: Hyper index ON on input line 6355. +Package hyperref Info: backreferencing OFF on input line 6362. +Package hyperref Info: Link coloring OFF on input line 6367. +Package hyperref Info: Link coloring with OCG OFF on input line 6372. +Package hyperref Info: PDF/A mode OFF on input line 6377. +LaTeX Info: Redefining \ref on input line 6417. +LaTeX Info: Redefining \pageref on input line 6421. +\Hy@abspage=\count290 + + +Package hyperref Message: Stopped early. + +) +Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX + +(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag +e +with kernel methods +) +\Fld@listcount=\count291 +\c@bookmark@seq@number=\count292 + +(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +)) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaserequires.sty +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasefont.sty +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks27 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +))) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty +(/usr/share/texmf-dist/tex/latex/translator/translator.sty +Package: translator 2020-08-03 v1.12c Easy translation of strings in LaTeX +)) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasemisc.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty +\beamer@argscount=\count293 +\beamer@lastskipcover=\skip50 +\beamer@trivlistdepth=\count294 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetitle.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasesection.sty +\c@lecture=\count295 +\c@part=\count296 +\c@section=\count297 +\c@subsection=\count298 +\c@subsubsection=\count299 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframe.sty +\beamer@framebox=\box62 +\beamer@frametitlebox=\box63 +\beamer@zoombox=\box64 +\beamer@zoomcount=\count300 +\beamer@zoomframecount=\count301 +\beamer@frametextheight=\dimen261 +\c@subsectionslide=\count302 +\beamer@frametopskip=\skip51 +\beamer@framebottomskip=\skip52 +\beamer@frametopskipautobreak=\skip53 +\beamer@framebottomskipautobreak=\skip54 +\beamer@envbody=\toks28 +\framewidth=\dimen262 +\c@framenumber=\count303 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty +\beamer@verbatimfileout=\write4 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty +\beamer@splitbox=\box65 +\beamer@autobreakcount=\count304 +\beamer@autobreaklastheight=\dimen263 +\beamer@frametitletoks=\toks29 +\beamer@framesubtitletoks=\toks30 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty +\beamer@footins=\box66 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasecolor.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasenotes.sty +\beamer@frameboxcopy=\box67 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetoc.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty +\beamer@sbttoks=\toks31 + +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty +\bmb@box=\box68 +\bmb@colorbox=\box69 +\bmb@boxshadow=\box70 +\bmb@boxshadowball=\box71 +\bmb@boxshadowballlarge=\box72 +\bmb@temp=\dimen264 +\bmb@dima=\dimen265 +\bmb@dimb=\dimen266 +\bmb@prevheight=\dimen267 +) +\beamer@blockheadheight=\dimen268 +)) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty +(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks32 +) +\c@figure=\count305 +\c@table=\count306 +\abovecaptionskip=\skip55 +\belowcaptionskip=\skip56 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty +\beamer@section@min@dim=\dimen269 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip57 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks33 +\ex@=\dimen270 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen271 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count307 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count308 +\leftroot@=\count309 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count310 +\DOTSCASE@=\count311 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box73 +\strutbox@=\box74 +\big@size=\dimen272 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count312 +\c@MaxMatrixCols=\count313 +\dotsspace@=\muskip17 +\c@parentequation=\count314 +\dspbrk@lvl=\count315 +\tag@help=\toks34 +\row@=\count316 +\column@=\count317 +\maxfields@=\count318 +\andhelp@=\toks35 +\eqnshift@=\dimen273 +\alignsep@=\dimen274 +\tagshift@=\dimen275 +\tagwidth@=\dimen276 +\totwidth@=\dimen277 +\lineht@=\dimen278 +\@envbody=\toks36 +\multlinegap=\skip58 +\multlinetaggap=\skip59 +\mathdisplay@stack=\toks37 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2020/05/29 v2.20.6 +\thm@style=\toks38 +\thm@bodyfont=\toks39 +\thm@headfont=\toks40 +\thm@notefont=\toks41 +\thm@headpunct=\toks42 +\thm@preskip=\skip60 +\thm@postskip=\skip61 +\thm@headsep=\skip62 +\dth@everypar=\toks43 +) +\c@theorem=\count319 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerbasethemes.sty)) +(/usr/share/texmf-dist/tex/latex/beamer/beamerthemedefault.sty +(/usr/share/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty +\beamer@dima=\dimen279 +\beamer@dimb=\dimen280 +) +(/usr/share/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty))) +(/usr/share/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty +(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty) +(/usr/share/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty)) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks44 +\inpenc@posthook=\toks45 +) +\c@prop=\count320 + +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count321 +\l__pdf_internal_box=\box75 +) (./beamer.aux) +\openout1 = `beamer.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 20. +LaTeX Font Info: ... okay on input line 20. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 20. +LaTeX Font Info: ... okay on input line 20. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 20. +LaTeX Font Info: ... okay on input line 20. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 20. +LaTeX Font Info: ... okay on input line 20. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 20. +LaTeX Font Info: ... okay on input line 20. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 20. +LaTeX Font Info: ... okay on input line 20. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 20. +LaTeX Font Info: ... okay on input line 20. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 20. +LaTeX Font Info: ... okay on input line 20. +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: custom +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: includehead includefoot +* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt) +* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt) +* \paperwidth=364.19536pt +* \paperheight=273.14662pt +* \textwidth=342.2953pt +* \textheight=244.6939pt +* \oddsidemargin=-61.31996pt +* \evensidemargin=-61.31996pt +* \topmargin=-72.26999pt +* \headheight=14.22636pt +* \headsep=0.0pt +* \topskip=11.0pt +* \footskip=14.22636pt +* \marginparwidth=4.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count322 +\scratchdimen=\dimen281 +\scratchbox=\box76 +\nofMPsegments=\count323 +\nofMParguments=\count324 +\everyMPshowfont=\toks46 +\MPscratchCnt=\count325 +\MPscratchDim=\dimen282 +\MPnumerator=\count326 +\makeMPintoPDFobject=\count327 +\everyMPtoPDFconversion=\toks47 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf + +(/usr/share/texmf-dist/tex/latex/grfext/grfext.sty +Package: grfext 2019/12/03 v1.3 Manage graphics extensions (HO) +) +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. +Package grfext Info: Graphics extension search list: +(grfext) [.pdf,.png,.jpg,.mps,.jpeg,.jbig2,.jb2,.PDF,.PNG,.JPG,.JPE +G,.JBIG2,.JB2,.eps] +(grfext) \AppendGraphicsExtensions on input line 504. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package hyperref Info: Link coloring OFF on input line 20. + +(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count328 +) +LaTeX Info: Redefining \ref on input line 20. +LaTeX Info: Redefining \pageref on input line 20. +LaTeX Info: Redefining \nameref on input line 20. + +(./beamer.out) (./beamer.out) +\@outlinefile=\write5 +\openout5 = `beamer.out'. + +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 20. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 20. +\symnumbers=\mathgroup6 +\sympureletters=\mathgroup7 +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 20. +LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 20. +LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 20. +LaTeX Font Info: Redeclaring math alphabet \mathit on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 20. +LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 20. +LaTeX Font Info: Overwriting symbol font `numbers' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 20. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 20. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 20. + +(/usr/share/texmf-dist/tex/latex/translator/translator-basic-dictionary-English +.dict +Dictionary: translator-basic-dictionary, Language: English +) +(/usr/share/texmf-dist/tex/latex/translator/translator-bibliography-dictionary- +English.dict +Dictionary: translator-bibliography-dictionary, Language: English +) +(/usr/share/texmf-dist/tex/latex/translator/translator-environment-dictionary-E +nglish.dict +Dictionary: translator-environment-dictionary, Language: English +) +(/usr/share/texmf-dist/tex/latex/translator/translator-months-dictionary-Englis +h.dict +Dictionary: translator-months-dictionary, Language: English +) +(/usr/share/texmf-dist/tex/latex/translator/translator-numbers-dictionary-Engli +sh.dict +Dictionary: translator-numbers-dictionary, Language: English +) +(/usr/share/texmf-dist/tex/latex/translator/translator-theorem-dictionary-Engli +sh.dict +Dictionary: translator-theorem-dictionary, Language: English +) (./beamer.nav) +<unilu.jpg, id=24, 645.16031pt x 578.16pt> +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 24. +(pdftex.def) Requested size: 32.2599pt x 28.90968pt. + [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map} <./unilu.jpg>] +LaTeX Font Info: Trying to load font information for U+msa on input line 45. + + (/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 45. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 45. +(pdftex.def) Requested size: 32.2599pt x 28.90968pt. + [2 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 45. +(pdftex.def) Requested size: 32.2599pt x 28.90968pt. + [3 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 45. +(pdftex.def) Requested size: 32.2599pt x 28.90968pt. + [4 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 45. +(pdftex.def) Requested size: 32.2599pt x 28.90968pt. + [5 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 64. +(pdftex.def) Requested size: 32.2599pt x 28.90968pt. + [6 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 82. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 82. +(pdftex.def) Requested size: 32.2599pt x 28.90968pt. + [7 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 82. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 82. +(pdftex.def) Requested size: 32.2599pt x 28.90968pt. + +[8 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 82. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 82. +(pdftex.def) Requested size: 32.2599pt x 28.90968pt. + [9 + +] +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 82. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +File: unilu.jpg Graphic file (type jpg) +<use unilu.jpg> +Package pdftex.def Info: unilu.jpg used on input line 82. +(pdftex.def) Requested size: 32.2599pt x 28.90968pt. + [10 + +] +\tf@nav=\write6 +\openout6 = `beamer.nav'. + +\tf@toc=\write7 +\openout7 = `beamer.toc'. + +\tf@snm=\write8 +\openout8 = `beamer.snm'. + + (./beamer.aux) +Package rerunfilecheck Info: File `beamer.out' has not changed. +(rerunfilecheck) Checksum: 8EA766F5AA06B3504ADD0C5571DBBFEF;60. + ) +Here is how much of TeX's memory you used: + 17825 strings out of 479383 + 340227 string characters out of 5875799 + 644974 words of memory out of 5000000 + 34481 multiletter control sequences out of 15000+600000 + 410355 words of font info for 52 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 107i,15n,111p,427b,707s stack positions out of 5000i,500n,10000p,200000b,80000s +</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/ +texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/texmf-dist/fon +ts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texmf-dist/fonts/type1/publi +c/amsfonts/cm/cmss8.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c +mssi10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmssi8.pfb> +Output written on beamer.pdf (10 pages, 110030 bytes). +PDF statistics: + 129 PDF objects out of 1000 (max. 8388607) + 95 compressed objects within 1 object stream + 22 named destinations out of 1000 (max. 500000) + 98 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture3/live/beamer.nav b/src/Lecture3/live/beamer.nav @@ -0,0 +1,16 @@ +\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}} +\headcommand {\beamer@framepages {1}{1}} +\headcommand {\beamer@sectionpages {1}{1}} +\headcommand {\beamer@subsectionpages {1}{1}} +\headcommand {\sectionentry {1}{this}{2}{This is the first section}{0}} +\headcommand {\slideentry {1}{0}{1}{2/5}{}{0}} +\headcommand {\beamer@framepages {2}{5}} +\headcommand {\slideentry {1}{0}{2}{6/6}{}{0}} +\headcommand {\beamer@framepages {6}{6}} +\headcommand {\slideentry {1}{0}{3}{7/10}{}{0}} +\headcommand {\beamer@framepages {7}{10}} +\headcommand {\beamer@partpages {1}{10}} +\headcommand {\beamer@subsectionpages {2}{10}} +\headcommand {\beamer@sectionpages {2}{10}} +\headcommand {\beamer@documentpages {10}} +\headcommand {\gdef \inserttotalframenumber {4}} diff --git a/src/Lecture3/live/beamer.out 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 Binary files differ. diff --git a/src/Lecture3/live/beamer.snm b/src/Lecture3/live/beamer.snm diff --git a/src/Lecture3/live/beamer.synctex.gz b/src/Lecture3/live/beamer.synctex.gz Binary files differ. diff --git a/src/Lecture3/live/beamer.tex b/src/Lecture3/live/beamer.tex @@ -0,0 +1,84 @@ +\documentclass[11pt]{beamer} +\usetheme{Madrid} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} + +\author[Tronto]{Sebastiano Tronto} +\title[Example]{Example presentation} + +\newtheorem{prop}{Proposition} + +\setbeamercovered{transparent} +\setbeamertemplate{navigation symbols}{} +\logo{\includegraphics[scale=0.05]{unilu.jpg}} + +%\date{} + + +\begin{document} + +\begin{frame} +\titlepage +\end{frame} + +%\begin{frame} +%\tableofcontents +%\end{frame} + +\section[this]{This is the first section} + +\begin{frame}{Frame number one} +\uncover<2->{ +\begin{align*} + \sum_{i=1}^n\frac{i}{2} +\end{align*} +} + +\begin{itemize}[<+->] +\item One item +\item another random things +\item third line +\item fourth element +\end{itemize} +\end{frame} + +\begin{frame}{A second frame} +\begin{theorem} +A theorem +\end{theorem} + +{ + +\setbeamercolor{block body}{fg=red,bg=gray} +\begin{prop} +My proposition +\end{prop} +} + +\begin{block}{Title of the block} +this is my custom block +\end{block} + +\end{frame} + +\begin{frame}{Columns} +\begin{columns} + \column{0.5\textwidth} + \begin{itemize}[<+->] + \item One item + \item another random things + \item third line + \item fourth element + \end{itemize} + + \column{0.2\textwidth} + hello + + \column{0.3\textwidth} + \includegraphics[scale=0.1]{unilu.jpg} +\end{columns} +\end{frame} + +\end{document} +\ No newline at end of file diff --git a/src/Lecture3/live/beamer.toc 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 @@ -0,0 +1,2 @@ +\relax +\gdef \@abspage@last{4} diff --git a/src/Lecture3/live/tikz.bbl b/src/Lecture3/live/tikz.bbl diff --git a/src/Lecture3/live/tikz.blg b/src/Lecture3/live/tikz.blg @@ -0,0 +1,48 @@ +This is BibTeX, Version 0.99d (TeX Live 2020/VoidLinux) +Capacity: max_strings=200000, hash_size=200000, hash_prime=170003 +The top-level auxiliary file: tikz.aux +I found no \citation commands---while reading file tikz.aux +I found no \bibdata command---while reading file tikz.aux +I found no \bibstyle command---while reading file tikz.aux +You've used 0 entries, + 0 wiz_defined-function locations, + 83 strings with 482 characters, +and the built_in function-call counts, 0 in all, are: += -- 0 +> -- 0 +< -- 0 ++ -- 0 +- -- 0 +* -- 0 +:= -- 0 +add.period$ -- 0 +call.type$ -- 0 +change.case$ -- 0 +chr.to.int$ -- 0 +cite$ -- 0 +duplicate$ -- 0 +empty$ -- 0 +format.name$ -- 0 +if$ -- 0 +int.to.chr$ -- 0 +int.to.str$ -- 0 +missing$ -- 0 +newline$ -- 0 +num.names$ -- 0 +pop$ -- 0 +preamble$ -- 0 +purify$ -- 0 +quote$ -- 0 +skip$ -- 0 +stack$ -- 0 +substring$ -- 0 +swap$ -- 0 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 0 +while$ -- 0 +width$ -- 0 +write$ -- 0 +(There were 3 error messages) diff --git a/src/Lecture3/live/tikz.log b/src/Lecture3/live/tikz.log @@ -0,0 +1,544 @@ +This 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 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**tikz.tex +(./tikz.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2020/08/01 v1.3d Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks17 +\ex@=\dimen139 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks18 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks19 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks20 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks21 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks22 +) +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count197 +\Gm@cntv=\count198 +\c@Gm@tempcnt=\count199 +\Gm@bindingoffset=\dimen148 +\Gm@wd@mp=\dimen149 +\Gm@odd@mp=\dimen150 +\Gm@even@mp=\dimen151 +\Gm@layoutwidth=\dimen152 +\Gm@layoutheight=\dimen153 +\Gm@layouthoffset=\dimen154 +\Gm@layoutvoffset=\dimen155 +\Gm@dimlist=\toks23 +) +(/usr/share/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks24 +\pgfutil@tempdima=\dimen156 +\pgfutil@tempdimb=\dimen157 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box49 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +Package: pgf 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen158 +\Gin@req@width=\dimen159 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks25 +\pgfkeys@temptoks=\toks26 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks27 +)) +\pgf@x=\dimen160 +\pgf@y=\dimen161 +\pgf@xa=\dimen162 +\pgf@ya=\dimen163 +\pgf@xb=\dimen164 +\pgf@yb=\dimen165 +\pgf@xc=\dimen166 +\pgf@yc=\dimen167 +\pgf@xd=\dimen168 +\pgf@yd=\dimen169 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count266 +\c@pgf@countb=\count267 +\c@pgf@countc=\count268 +\c@pgf@countd=\count269 +\t@pgf@toka=\toks28 +\t@pgf@tokb=\toks29 +\t@pgf@tokc=\toks30 +\pgf@sys@id@count=\count270 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count271 +\pgfsyssoftpath@bigbuffer@items=\count272 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen170 +\pgfmath@count=\count273 +\pgfmath@box=\box50 +\pgfmath@toks=\toks31 +\pgfmath@stack@operand=\toks32 +\pgfmath@stack@operation=\toks33 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count274 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen171 +\pgf@picmaxx=\dimen172 +\pgf@picminy=\dimen173 +\pgf@picmaxy=\dimen174 +\pgf@pathminx=\dimen175 +\pgf@pathmaxx=\dimen176 +\pgf@pathminy=\dimen177 +\pgf@pathmaxy=\dimen178 +\pgf@xx=\dimen179 +\pgf@xy=\dimen180 +\pgf@yx=\dimen181 +\pgf@yy=\dimen182 +\pgf@zx=\dimen183 +\pgf@zy=\dimen184 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen185 +\pgf@path@lasty=\dimen186 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen187 +\pgf@shorten@start@additional=\dimen188 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box51 +\pgf@hbox=\box52 +\pgf@layerbox@main=\box53 +\pgf@picture@serial@count=\count275 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen189 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen190 +\pgf@pt@y=\dimen191 +\pgf@pt@temp=\dimen192 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen193 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen194 +\pgf@sys@shading@range@num=\count276 +\pgf@shadingcount=\count277 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box54 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfnodeparttextbox=\box55 +) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a) +\pgf@nodesepstart=\dimen195 +\pgf@nodesepend=\dimen196 +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen197 +\pgffor@skip=\dimen198 +\pgffor@stack=\toks34 +\pgffor@toks=\toks35 +)) +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.te +x +File: pgflibraryplothandlers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@plot@mark@count=\count278 +\pgfplotmarksize=\dimen199 +) +\tikz@lastx=\dimen256 +\tikz@lasty=\dimen257 +\tikz@lastxsaved=\dimen258 +\tikz@lastysaved=\dimen259 +\tikz@lastmovetox=\dimen260 +\tikz@lastmovetoy=\dimen261 +\tikzleveldistance=\dimen262 +\tikzsiblingdistance=\dimen263 +\tikz@figbox=\box56 +\tikz@figbox@bg=\box57 +\tikz@tempbox=\box58 +\tikz@tempbox@bg=\box59 +\tikztreelevel=\count279 +\tikznumberofchildren=\count280 +\tikznumberofcurrentchild=\count281 +\tikz@fig@count=\count282 + (/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfmatrixcurrentrow=\count283 +\pgfmatrixcurrentcolumn=\count284 +\pgf@matrix@numberofcolumns=\count285 +) +\tikz@expandcount=\count286 + +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary +topaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) (/usr/share/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty +Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ + +(/usr/share/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary +matrix.code.tex +File: tikzlibrarymatrix.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrary +quotes.code.tex +File: tikzlibraryquotes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex +File: pgflibraryarrows.meta.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowinset=\dimen264 +\pgfarrowlength=\dimen265 +\pgfarrowwidth=\dimen266 +\pgfarrowlinewidth=\dimen267 +))) (/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count287 +\l__pdf_internal_box=\box60 +) +(./tikz.aux) +\openout1 = `tikz.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(56.9055pt, 483.69687pt, 56.9055pt) +* v-part:(T,H,B)=(56.9055pt, 731.23584pt, 56.9055pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=483.69687pt +* \textheight=731.23584pt +* \oddsidemargin=-15.36449pt +* \evensidemargin=-15.36449pt +* \topmargin=-52.36449pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=57.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count288 +\scratchdimen=\dimen268 +\scratchbox=\box61 +\nofMPsegments=\count289 +\nofMParguments=\count290 +\everyMPshowfont=\toks36 +\MPscratchCnt=\count291 +\MPscratchDim=\dimen269 +\MPnumerator=\count292 +\makeMPintoPDFobject=\count293 +\everyMPtoPDFconversion=\toks37 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +LaTeX Font Info: Trying to load font information for U+msa on input line 14. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 14. + + +(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +Missing character: There is no ; in font nullfont! +Missing character: There is no ; in font nullfont! +Missing character: There is no ; in font nullfont! +Missing character: There is no ; in font nullfont! +Missing character: There is no ; in font nullfont! +Missing character: There is no ; in font nullfont! +Missing character: There is no ; in font nullfont! + [2] [3] [4] (./tikz.aux) ) +Here is how much of TeX's memory you used: + 14361 strings out of 479383 + 293642 string characters out of 5875799 + 548100 words of memory out of 5000000 + 31241 multiletter control sequences out of 15000+600000 + 405129 words of font info for 35 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 108i,14n,111p,405b,942s stack positions out of 5000i,500n,10000p,200000b,80000s +</usr/share/texmf-dist/fonts/type1/public/amsfonts/c +m/cmmi10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></ +usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf +-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb></usr/share/texmf-dist/fonts/type +1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfo +nts/cm/cmsy7.pfb> +Output written on tikz.pdf (4 pages, 55498 bytes). +PDF statistics: + 44 PDF objects out of 1000 (max. 8388607) + 31 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 13 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture3/live/tikz.pdf 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 Binary files differ. diff --git a/src/Lecture3/live/tikz.tex b/src/Lecture3/live/tikz.tex @@ -0,0 +1,84 @@ +\documentclass[10pt,a4paper]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} + +\usepackage{tikz} +\usepackage{tikz-cd} + +\begin{document} + +\begin{tikzcd} +T \arrow[dr,dotted,"{(x,y)}" description] + \arrow[drr,"x",out=60, in=120] + \arrow[ddr,"y"',bend right]\\ +& X\times_Z Y \arrow[r,"p"]\arrow[d,"q"'] & X \arrow[d,"f"]\\ +& Y \arrow[r,"g"',hook,two heads] & Z +\end{tikzcd} + + +\newpage + + +\begin{tikzpicture}[scale=2] + + \foreach \x in {0,1,...,5} { + \foreach \y in {0,...,3} { + \filldraw[fill=blue] (\x,\y) circle[radius=0.4]; + }; + }; +\end{tikzpicture} + +\begin{tikzpicture}[scale=3] + \draw[very thick] (0,0) \foreach \i in {0.3,0.6,...,1.5} + {-- (\i,\i^2) }; +\end{tikzpicture} + + +\newpage + +\begin{tikzpicture} + + \pgfmathsetmacro{\angle}{120} + + \colorlet{coscolor}{blue!60} + \colorlet{sincolor}{red!60} + \tikzset{structureline/.style={black,thin}} + + \draw[lightgray] (-5,-5) grid (5,5); + + + \filldraw[thick,fill=green!20,draw=green] +(0,0) -- (1/3*4,0) arc[radius=1/3*4, start angle=0, end angle=\angle] node[below=0.5cm] {\(\angle^\circ\)} -- cycle; + + \draw[->,structureline] (0,-5) -- (0,5); + \draw[->,structureline] (-5,0) -- (5,0); + \draw[structureline] (0,0) circle[radius=4]; + + \draw[structureline] (0,0) -- (\angle:4); + \draw[coscolor] (0,0) -- node[below] {\(\cos(\angle^\circ)\)} (4*cos{\angle},0); + \draw[thick,sincolor] (4*cos{\angle},0) -- node[right] {\(\sin(\angle^\circ)\)} (\angle:4); + +\end{tikzpicture} + +\newpage +\begin{tikzpicture}[scale=3] + \coordinate (A) at (1,1); + \coordinate (B) at (3,1.5); + + \draw[blue!20!red,line width=4pt] (0,0) -- (A) -- (2,0) -- cycle; + + + \draw[very thick,green!60,dotted] (B) circle[x radius = 0.7cm, y radius = 1.2cm]; + + \filldraw[fill=purple,draw=blue,line width=2pt] (B) arc[radius = 1cm, start angle=0, end angle=90] -- (A) --cycle; + + \filldraw[fill=pink, line width=3pt] (0,0) rectangle (2,-1); + + \draw[line width=2pt,>->] (1,0.5) -- (3,0); + +\end{tikzpicture} + +\end{document} +\ No newline at end of file diff --git a/src/Lecture3/live/unilu.jpg 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 @@ -0,0 +1,65 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}} +\@writefile{nav}{\headcommand {\beamer@partpages {1}{21}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{21}}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{21}}} +\@writefile{nav}{\headcommand {\beamer@documentpages {21}}} +\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {21}}} diff --git a/src/Lecture3/slides/4-TikZ.bbl b/src/Lecture3/slides/4-TikZ.bbl diff --git a/src/Lecture3/slides/4-TikZ.blg b/src/Lecture3/slides/4-TikZ.blg @@ -0,0 +1,48 @@ +This is BibTeX, Version 0.99d (TeX Live 2020/VoidLinux) +Capacity: max_strings=200000, hash_size=200000, hash_prime=170003 +The top-level auxiliary file: 3-MoreLatex.aux +I found no \citation commands---while reading file 3-MoreLatex.aux +I found no \bibdata command---while reading file 3-MoreLatex.aux +I found no \bibstyle command---while reading file 3-MoreLatex.aux +You've used 0 entries, + 0 wiz_defined-function locations, + 83 strings with 496 characters, +and the built_in function-call counts, 0 in all, are: += -- 0 +> -- 0 +< -- 0 ++ -- 0 +- -- 0 +* -- 0 +:= -- 0 +add.period$ -- 0 +call.type$ -- 0 +change.case$ -- 0 +chr.to.int$ -- 0 +cite$ -- 0 +duplicate$ -- 0 +empty$ -- 0 +format.name$ -- 0 +if$ -- 0 +int.to.chr$ -- 0 +int.to.str$ -- 0 +missing$ -- 0 +newline$ -- 0 +num.names$ -- 0 +pop$ -- 0 +preamble$ -- 0 +purify$ -- 0 +quote$ -- 0 +skip$ -- 0 +stack$ -- 0 +substring$ -- 0 +swap$ -- 0 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 0 +while$ -- 0 +width$ -- 0 +write$ -- 0 +(There were 3 error messages) diff --git a/src/Lecture3/slides/4-TikZ.log b/src/Lecture3/slides/4-TikZ.log @@ -0,0 +1,1201 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**4-TikZ.tex +(./4-TikZ.tex +LaTeX2e <2020-02-02> patch level 2 +L3 programming layer <2020-02-14> +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls +Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty +(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count167 +) +\beamer@tempbox=\box45 +\beamer@tempcount=\count168 +\c@beamerpauses=\count169 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty +\beamer@slideinframe=\count170 +\beamer@minimum=\count171 +\beamer@decode@box=\box46 +) +\beamer@commentbox=\box47 +\beamer@modecount=\count172 +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2019/11/07 v1.0c TeX engine tests +)) +\headdp=\dimen134 +\footheight=\dimen135 +\sidebarheight=\dimen136 +\beamer@tempdim=\dimen137 +\beamer@finalheight=\dimen138 +\beamer@animht=\dimen139 +\beamer@animdp=\dimen140 +\beamer@animwd=\dimen141 +\beamer@leftmargin=\dimen142 +\beamer@rightmargin=\dimen143 +\beamer@leftsidebar=\dimen144 +\beamer@rightsidebar=\dimen145 +\beamer@boxsize=\dimen146 +\beamer@vboxoffset=\dimen147 +\beamer@descdefault=\dimen148 +\beamer@descriptionwidth=\dimen149 +\beamer@lastskip=\skip47 +\beamer@areabox=\box48 +\beamer@animcurrent=\box49 +\beamer@animshowbox=\box50 +\beamer@sectionbox=\box51 +\beamer@logobox=\box52 +\beamer@linebox=\box53 +\beamer@sectioncount=\count173 +\beamer@subsubsectionmax=\count174 +\beamer@subsectionmax=\count175 +\beamer@sectionmax=\count176 +\beamer@totalheads=\count177 +\beamer@headcounter=\count178 +\beamer@partstartpage=\count179 +\beamer@sectionstartpage=\count180 +\beamer@subsectionstartpage=\count181 +\beamer@animationtempa=\count182 +\beamer@animationtempb=\count183 +\beamer@xpos=\count184 +\beamer@ypos=\count185 +\beamer@ypos@offset=\count186 +\beamer@showpartnumber=\count187 +\beamer@currentsubsection=\count188 +\beamer@coveringdepth=\count189 +\beamer@sectionadjust=\count190 +\beamer@tocsectionnumber=\count191 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) +\beamer@paperwidth=\skip48 +\beamer@paperheight=\skip49 + +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count192 +\Gm@cntv=\count193 +\c@Gm@tempcnt=\count194 +\Gm@bindingoffset=\dimen150 +\Gm@wd@mp=\dimen151 +\Gm@odd@mp=\dimen152 +\Gm@even@mp=\dimen153 +\Gm@layoutwidth=\dimen154 +\Gm@layoutheight=\dimen155 +\Gm@layouthoffset=\dimen156 +\Gm@layoutvoffset=\dimen157 +\Gm@dimlist=\toks15 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen158 +\Gin@req@width=\dimen159 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks16 +\pgfutil@tempdima=\dimen160 +\pgfutil@tempdimb=\dimen161 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t +ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box54 +(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty +Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t +ex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen162 +\pgf@y=\dimen163 +\pgf@xa=\dimen164 +\pgf@ya=\dimen165 +\pgf@xb=\dimen166 +\pgf@yb=\dimen167 +\pgf@xc=\dimen168 +\pgf@yc=\dimen169 +\pgf@xd=\dimen170 +\pgf@yd=\dimen171 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count195 +\c@pgf@countb=\count196 +\c@pgf@countc=\count197 +\c@pgf@countd=\count198 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count199 + (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de +f +File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code. +tex +File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfsyssoftpath@smallbuffer@items=\count266 +\pgfsyssoftpath@bigbuffer@items=\count267 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code. +tex +File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen172 +\pgfmath@count=\count268 +\pgfmath@box=\box55 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet +ric.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod +e.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison +.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari +thmetics.code.tex))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count269 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te +x +File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@picminx=\dimen173 +\pgf@picmaxx=\dimen174 +\pgf@picminy=\dimen175 +\pgf@picmaxy=\dimen176 +\pgf@pathminx=\dimen177 +\pgf@pathmaxx=\dimen178 +\pgf@pathminy=\dimen179 +\pgf@pathmaxy=\dimen180 +\pgf@xx=\dimen181 +\pgf@xy=\dimen182 +\pgf@yx=\dimen183 +\pgf@yy=\dimen184 +\pgf@zx=\dimen185 +\pgf@zy=\dimen186 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct. +code.tex +File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@path@lastx=\dimen187 +\pgf@path@lasty=\dimen188 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code +.tex +File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@shorten@end@additional=\dimen189 +\pgf@shorten@start@additional=\dimen190 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te +x +File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfpic=\box56 +\pgf@hbox=\box57 +\pgf@layerbox@main=\box58 +\pgf@picture@serial@count=\count270 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c +ode.tex +File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgflinewidth=\dimen191 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation +s.code.tex +File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@pt@x=\dimen192 +\pgf@pt@y=\dimen193 +\pgf@pt@temp=\dimen194 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t +ex +File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing +.code.tex +File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te +x +File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowsep=\dimen195 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@max=\dimen196 +\pgf@sys@shading@range@num=\count271 +\pgf@shadingcount=\count272 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code. +tex +File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfexternal@startupbox=\box59 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te +x +File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c +ode.tex +File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code. +tex +File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty +Package: xxcolor 2003/10/24 ver 0.1 +\XC@nummixins=\count273 +\XC@countmixins=\count274 +) +(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO) +)) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO) +) +\@linkdim=\dimen197 +\Hy@linkcounter=\count275 +\Hy@pagecounter=\count276 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count277 +\pdfmajorversion=\count278 +Package hyperref Info: Option `bookmarks' set `true' on input line 4421. +Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421. +Package hyperref Info: Option `implicit' set `false' on input line 4421. +Package hyperref Info: Hyper figures OFF on input line 4547. +Package hyperref Info: Link nesting OFF on input line 4552. +Package hyperref Info: Hyper index ON on input line 4555. +Package hyperref Info: Plain pages OFF on input line 4562. +Package hyperref Info: Backreferencing OFF on input line 4567. +Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals. +Package hyperref Info: Bookmarks ON on input line 4800. +\c@Hy@tempcnt=\count279 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5159. +\XeTeXLinkMargin=\dimen198 + +(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count280 +\Field@Width=\dimen199 +\Fld@charsize=\dimen256 +Package hyperref Info: Hyper figures OFF on input line 6430. +Package hyperref Info: Link nesting OFF on input line 6435. +Package hyperref Info: Hyper index ON on input line 6438. +Package hyperref Info: backreferencing OFF on input line 6445. +Package hyperref Info: Link coloring OFF on input line 6450. +Package hyperref Info: Link coloring with OCG OFF on input line 6455. +Package hyperref Info: PDF/A mode OFF on input line 6460. +LaTeX Info: Redefining \ref on input line 6500. +LaTeX Info: Redefining \pageref on input line 6504. +\Hy@abspage=\count281 + + +Package hyperref Message: Stopped early. + +) +Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO) +) +\Fld@listcount=\count282 +\c@bookmark@seq@number=\count283 + +(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks26 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty +Package: sansmathaccent 2020/01/31 + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty +Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files) +))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty +Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty +\beamer@argscount=\count284 +\beamer@lastskipcover=\skip50 +\beamer@trivlistdepth=\count285 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty +\c@lecture=\count286 +\c@part=\count287 +\c@section=\count288 +\c@subsection=\count289 +\c@subsubsection=\count290 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty +\beamer@framebox=\box60 +\beamer@frametitlebox=\box61 +\beamer@zoombox=\box62 +\beamer@zoomcount=\count291 +\beamer@zoomframecount=\count292 +\beamer@frametextheight=\dimen257 +\c@subsectionslide=\count293 +\beamer@frametopskip=\skip51 +\beamer@framebottomskip=\skip52 +\beamer@frametopskipautobreak=\skip53 +\beamer@framebottomskipautobreak=\skip54 +\beamer@envbody=\toks27 +\framewidth=\dimen258 +\c@framenumber=\count294 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty +\beamer@verbatimfileout=\write4 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty +\beamer@splitbox=\box63 +\beamer@autobreakcount=\count295 +\beamer@autobreaklastheight=\dimen259 +\beamer@frametitletoks=\toks28 +\beamer@framesubtitletoks=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty +\beamer@footins=\box64 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty +\beamer@frameboxcopy=\box65 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty +\beamer@sbttoks=\toks30 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty +\bmb@box=\box66 +\bmb@colorbox=\box67 +\bmb@boxshadow=\box68 +\bmb@boxshadowball=\box69 +\bmb@boxshadowballlarge=\box70 +\bmb@temp=\dimen260 +\bmb@dima=\dimen261 +\bmb@dimb=\dimen262 +\bmb@prevheight=\dimen263 +) +\beamer@blockheadheight=\dimen264 +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks31 +) +\c@figure=\count296 +\c@table=\count297 +\abovecaptionskip=\skip55 +\belowcaptionskip=\skip56 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty +\beamer@section@min@dim=\dimen265 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/01/20 v2.17e AMS math features +\@mathmargin=\skip57 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks32 +\ex@=\dimen266 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen267 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count298 +LaTeX Info: Redefining \frac on input line 227. +\uproot@=\count299 +\leftroot@=\count300 +LaTeX Info: Redefining \overline on input line 389. +\classnum@=\count301 +\DOTSCASE@=\count302 +LaTeX Info: Redefining \ldots on input line 486. +LaTeX Info: Redefining \dots on input line 489. +LaTeX Info: Redefining \cdots on input line 610. +\Mathstrutbox@=\box71 +\strutbox@=\box72 +\big@size=\dimen268 +LaTeX Font Info: Redeclaring font encoding OML on input line 733. +LaTeX Font Info: Redeclaring font encoding OMS on input line 734. +\macc@depth=\count303 +\c@MaxMatrixCols=\count304 +\dotsspace@=\muskip17 +\c@parentequation=\count305 +\dspbrk@lvl=\count306 +\tag@help=\toks33 +\row@=\count307 +\column@=\count308 +\maxfields@=\count309 +\andhelp@=\toks34 +\eqnshift@=\dimen269 +\alignsep@=\dimen270 +\tagshift@=\dimen271 +\tagwidth@=\dimen272 +\totwidth@=\dimen273 +\lineht@=\dimen274 +\@envbody=\toks35 +\multlinegap=\skip58 +\multlinetaggap=\skip59 +\mathdisplay@stack=\toks36 +LaTeX Info: Redefining \[ on input line 2859. +LaTeX Info: Redefining \] on input line 2860. +) +(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2017/10/31 v2.20.4 +\thm@style=\toks37 +\thm@bodyfont=\toks38 +\thm@headfont=\toks39 +\thm@notefont=\toks40 +\thm@headpunct=\toks41 +\thm@preskip=\skip60 +\thm@postskip=\skip61 +\thm@headsep=\skip62 +\dth@everypar=\toks42 +) +\c@theorem=\count310 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty +\beamer@dima=\dimen275 +\beamer@dimb=\dimen276 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file +\inpenc@prehook=\toks43 +\inpenc@posthook=\toks44 +) +(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty +Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ + +(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +Package: pgf 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfnodeparttextbox=\box73 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65 +.sty +Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b) +\pgf@nodesepstart=\dimen277 +\pgf@nodesepend=\dimen278 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18 +.sty +Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen279 +\pgffor@skip=\dimen280 +\pgffor@stack=\toks45 +\pgffor@toks=\toks46 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers +.code.tex +File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@plot@mark@count=\count311 +\pgfplotmarksize=\dimen281 +) +\tikz@lastx=\dimen282 +\tikz@lasty=\dimen283 +\tikz@lastxsaved=\dimen284 +\tikz@lastysaved=\dimen285 +\tikz@lastmovetox=\dimen286 +\tikz@lastmovetoy=\dimen287 +\tikzleveldistance=\dimen288 +\tikzsiblingdistance=\dimen289 +\tikz@figbox=\box74 +\tikz@figbox@bg=\box75 +\tikz@tempbox=\box76 +\tikz@tempbox@bg=\box77 +\tikztreelevel=\count312 +\tikznumberofchildren=\count313 +\tikznumberofcurrentchild=\count314 +\tikz@fig@count=\count315 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfmatrixcurrentrow=\count316 +\pgfmatrixcurrentcolumn=\count317 +\pgf@matrix@numberofcolumns=\count318 +) +\tikz@expandcount=\count319 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarymatrix.code.tex +File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibraryquotes.code.tex +File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta. +code.tex +File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowinset=\dimen290 +\pgfarrowlength=\dimen291 +\pgfarrowwidth=\dimen292 +\pgfarrowlinewidth=\dimen293 +))) +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode +\l__kernel_color_stack_int=\count320 +\l__pdf_internal_box=\box78 +) +(./4-TikZ.aux) +\openout1 = `4-TikZ.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 21. +LaTeX Font Info: ... okay on input line 21. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: custom +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: includehead includefoot +* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt) +* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt) +* \paperwidth=364.19536pt +* \paperheight=273.14662pt +* \textwidth=342.2953pt +* \textheight=244.6939pt +* \oddsidemargin=-61.31996pt +* \evensidemargin=-61.31996pt +* \topmargin=-72.26999pt +* \headheight=14.22636pt +* \headsep=0.0pt +* \topskip=11.0pt +* \footskip=14.22636pt +* \marginparwidth=4.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count321 +\scratchdimen=\dimen294 +\scratchbox=\box79 +\nofMPsegments=\count322 +\nofMParguments=\count323 +\everyMPshowfont=\toks47 +\MPscratchCnt=\count324 +\MPscratchDim=\dimen295 +\MPnumerator=\count325 +\makeMPintoPDFobject=\count326 +\everyMPtoPDFconversion=\toks48 +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +ABD: EveryShipout initializing macros +\AtBeginShipoutBox=\box80 +Package hyperref Info: Link coloring OFF on input line 21. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count327 +) +LaTeX Info: Redefining \ref on input line 21. +LaTeX Info: Redefining \pageref on input line 21. +LaTeX Info: Redefining \nameref on input line 21. + +(./4-TikZ.out) (./4-TikZ.out) +\@outlinefile=\write5 +\openout5 = `4-TikZ.out'. + +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 21. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 21. +\symnumbers=\mathgroup6 +\sympureletters=\mathgroup7 +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 21. +LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 21. +LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 21. +LaTeX Font Info: Redeclaring math alphabet \mathit on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 21. +LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 21. +LaTeX Font Info: Overwriting symbol font `numbers' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 21. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 21. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 21. +LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 21. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal' +(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 2 +1. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 2 +1. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp +ut line 21. + +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary +-English.dict +Dictionary: translator-basic-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic +tionary-English.dict +Dictionary: translator-bibliography-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict +ionary-English.dict +Dictionary: translator-environment-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar +y-English.dict +Dictionary: translator-months-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona +ry-English.dict +Dictionary: translator-numbers-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona +ry-English.dict +Dictionary: translator-theorem-dictionary, Language: English +) (./4-TikZ.nav) +<img/unilu.jpg, id=20, 645.16031pt x 578.16pt> +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 25. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>] +LaTeX Font Info: Trying to load font information for U+msa on input line 42. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 42. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp +ut line 42. + +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd +File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma +thkerncmss. +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 42. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[2 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 59. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [3 + +] +LaTeX Font Info: Trying to load font information for OMS+cmtt on input line +80. + (/usr/share/texmf/tex/latex/R/tex/latex/omscmtt.fd +File: omscmtt.fd +) +LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <10.95> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 80. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 80. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [4 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 107. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [5 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 119. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [6 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 147. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[7 + +] +\openout4 = `4-TikZ.vrb'. + + (./4-TikZ.vrb +Missing character: There is no ; in font nullfont! +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 176. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [8 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 196. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [9 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 216. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [10 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 242. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [11 + +] +LaTeX Font Info: Trying to load font information for TS1+cmtt on input line +259. + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 259. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [12 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 273. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [13 + +] +\openout4 = `4-TikZ.vrb'. + + +(./4-TikZ.vrb +Overfull \hbox (77.3589pt too wide) in paragraph at lines 22--22 +[] \OT1/cmtt/m/n/10.95 (\r/3,0) arc [start angle=0,end angle=\a,radius +=\r/3] -- cycle;[] + [] + +) + +Class beamer Warning: Frame text is shrunk by a factor of 20.6665 percent inste +ad of 0 percent on input line 297. + +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 297. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +[14 + +] +LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <14.4> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 311. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 311. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [15 + +] +Missing character: There is no ; in font nullfont! + +Overfull \hbox (2.33415pt too wide) in paragraph at lines 326--326 +[][] + [] + +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 326. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +[16 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 339. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [17 + +] +\openout4 = `4-TikZ.vrb'. + + (./4-TikZ.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 350. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [18 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 370. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [19 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 391. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [20 + +] +\openout4 = `4-TikZ.vrb'. + + (./4-TikZ.vrb) +Overfull \hbox (16.63608pt too wide) in paragraph at lines 2--417 +[][] + [] + +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 417. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +[21 + +] +\tf@nav=\write6 +\openout6 = `4-TikZ.nav'. + +\tf@toc=\write7 +\openout7 = `4-TikZ.toc'. + +\tf@snm=\write8 +\openout8 = `4-TikZ.snm'. + +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 419. +Package atveryend Info: Empty hook `AfterLastShipout' on input line 419. + (./4-TikZ.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 419. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 419. +Package rerunfilecheck Info: File `4-TikZ.out' has not changed. +(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. + ) +Here is how much of TeX's memory you used: + 22504 strings out of 481239 + 458377 string characters out of 5920377 + 692835 words of memory out of 5000000 + 37177 multiletter control sequences out of 15000+600000 + 547815 words of font info for 81 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 58i,22n,89p,790b,1084s stack positions out of 5000i,500n,10000p,200000b,80000s + </home/sebastiano/.texlive2019/texmf-var/fonts/pk/ljfour/jknappen/ec/tctt109 +5.600pk></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmitt10.p +fb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb></us +r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share +/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/texli +ve/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texlive/tex +mf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/texmf-dist +/fonts/type1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/font +s/type1/public/amsfonts/cm/cmssi12.pfb></usr/share/texlive/texmf-dist/fonts/typ +e1/public/amsfonts/cm/cmssi8.pfb></usr/share/texlive/texmf-dist/fonts/type1/pub +lic/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/am +sfonts/cm/cmsy8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/ +cm/cmtt10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmt +t12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt8.pfb +></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt9.pfb> +Output written on 4-TikZ.pdf (21 pages, 224630 bytes). +PDF statistics: + 671 PDF objects out of 1000 (max. 8388607) + 612 compressed objects within 7 object streams + 43 named destinations out of 1000 (max. 500000) + 78 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture3/slides/4-TikZ.nav b/src/Lecture3/slides/4-TikZ.nav @@ -0,0 +1,47 @@ +\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}} +\headcommand {\beamer@framepages {1}{1}} +\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}} +\headcommand {\beamer@framepages {2}{2}} +\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}} +\headcommand {\beamer@framepages {3}{3}} +\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}} +\headcommand {\beamer@framepages {4}{4}} +\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}} +\headcommand {\beamer@framepages {5}{5}} +\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}} +\headcommand {\beamer@framepages {6}{6}} +\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}} +\headcommand {\beamer@framepages {7}{7}} +\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}} +\headcommand {\beamer@framepages {8}{8}} +\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}} +\headcommand {\beamer@framepages {9}{9}} +\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}} +\headcommand {\beamer@framepages {10}{10}} +\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}} +\headcommand {\beamer@framepages {11}{11}} +\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}} +\headcommand {\beamer@framepages {12}{12}} +\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}} +\headcommand {\beamer@framepages {13}{13}} +\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}} +\headcommand {\beamer@framepages {14}{14}} +\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}} +\headcommand {\beamer@framepages {15}{15}} +\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}} +\headcommand {\beamer@framepages {16}{16}} +\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}} +\headcommand {\beamer@framepages {17}{17}} +\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}} +\headcommand {\beamer@framepages {18}{18}} +\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}} +\headcommand {\beamer@framepages {19}{19}} +\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}} +\headcommand {\beamer@framepages {20}{20}} +\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}} +\headcommand {\beamer@framepages {21}{21}} +\headcommand {\beamer@partpages {1}{21}} +\headcommand {\beamer@subsectionpages {1}{21}} +\headcommand {\beamer@sectionpages {1}{21}} +\headcommand {\beamer@documentpages {21}} +\headcommand {\gdef \inserttotalframenumber {21}} diff --git a/src/Lecture3/slides/4-TikZ.out b/src/Lecture3/slides/4-TikZ.out diff --git a/src/Lecture3/slides/4-TikZ.pdf 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 diff --git a/src/Lecture3/slides/4-TikZ.tex b/src/Lecture3/slides/4-TikZ.tex @@ -0,0 +1,420 @@ +\documentclass[11pt]{beamer} +\usetheme{Madrid} +\usepackage[utf8]{inputenc} +\usepackage{amsmath, amssymb, amsfonts, amsthm} +\usepackage{xcolor} + +\usepackage{tikz-cd} +%\usepackage{enumitem} + +\newcommand{\ti}{Ti\emph{k}Z} + +\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto} +\title{The {\ti } graphics package} +\logo{\includegraphics[scale=0.1]{img/unilu.jpg}} +%\institute{University of Luxembourg} + +\newcommand{\bs}{\textbackslash} + +\date{2021-03-26} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + + +\begin{frame}{\ti} + \begin{center} + ``{\ti } ist \emph{kein} Zeichenprogramm'' + \end{center} + + \vspace{1cm} + \begin{itemize} + \item ``Writing'' graphics as you write text and formulas in LaTeX + \begin{align*} + \text{\ti} : \text{graphics} = \text{LaTeX} : \text{text} + \end{align*} + \item Draw shapes, paths, diagrams... + \item Countless extension packages + \end{itemize} +\end{frame} + +\begin{frame}{References} + \begin{itemize} + \item Wikibooks, short introduction: + \url{https://en.wikibooks.org/wiki/LaTeX/PGF/TikZ} + + \vspace{0.2cm} + \item Official manual: + {\small\url{http://ctan.cs.uu.nl/graphics/pgf/base/doc/pgfmanual.pdf}} + + (Too long, but nice examples in part \textrm{I}) + + \vspace{0.2cm} + \item Extension packages and their documentation: + \url{https://www.ctan.org/topic/pgf-tikz} + \end{itemize} +\end{frame} + +\begin{frame}{Using {\ti}} + \begin{itemize} + \item In preamble: + + \vspace{0.2cm} + \texttt{\bs usepackage\{tikz\}} + + \texttt{\bs usetikzlibrary\{something\} \% if needed} + + \vspace{0.2cm} + \item In document body: + + \vspace{0.2cm} + \texttt{\bs begin\{tikzpicture\} (\dots) \bs end\{tikzpicture\}} + + \vspace{0.2cm} + \item Use \texttt{[scale=\emph{n},rotate=\emph{angle}]} to scale or rotate + the whole picture. + \end{itemize} +\end{frame} + + +\begin{frame}{Coordinates} + \begin{itemize} + \item $3$ ways to express coordinates: + + \vspace{0.2cm} + \begin{itemize} + \item Cartesian, no unit = cm + + Example: \texttt{(2cm,11pt)} + + \vspace{0.2cm} + \item Polar + + Example: \texttt{(180:7cm)} + + \vspace{0.2cm} + \item Intersection of vertical line through $p_1$ and horizontal line + through $p_2$, points expressed as above (no parenthesis) + + Example: \texttt{(0,1 |- 30:2)} + \end{itemize} + \item More intersections: \texttt{\bs usetikzlibrary\{intersections\}} + \item Give names to points: \texttt{\bs coordinate (X) at (1,-4);} + \end{itemize} +\end{frame} + +\begin{frame}{Drawing straight lines} + \begin{center} + \texttt{\bs draw (P1) -- (P2) -- ... -- (Pn);} + \end{center} + + \vspace{0.5cm} + \begin{itemize} + \item Points expressed in coordinates as before. + \item Add \texttt{-- cycle} to close the path. + \end{itemize} +\end{frame} + +\begin{frame}{Curved lines and other shapes} + \begin{tabular}{c|l} + \tikz \draw (0,0) arc [start angle=30, end angle=120, radius=2cm]; + & \begin{tabular}{c} + \texttt{\bs draw (0,0) arc [start angle=30,} \\ + \texttt{end angle=120, radius=2cm];} + \end{tabular} \\ + \hline + \begin{tikzpicture} + \draw[white] (2,1) -- (2,1.2); % Just for spacing the table + \draw (0,0) rectangle (2,1); + \end{tikzpicture} & + \texttt{\bs draw (0,0) rectangle (2,1);} \\ + \hline + \begin{tikzpicture} + \draw[white] (0,0) -- (0,0.7); % Just for spacing the table + \draw (0,0) circle [radius=0.5]; + \end{tikzpicture} & + \texttt{\bs draw (0,0) circle [radius=0.5];} \\ + \hline + \begin{tikzpicture} + \draw[white] (0,0) -- (0,0.7); % Just for spacing the table + \draw (0,0) circle [x radius=1,y radius=0.5]; + \end{tikzpicture} & + \texttt{\dots [x radius=1,y radius=0.5];} \\ + \end{tabular} +\end{frame} + +\begin{frame}[fragile]{Bezier curves} + \texttt{\bs draw (P1) ..controls (C1) and (C2).. (P2);} + + \vspace{0.5cm} + \begin{columns} + \column{0.6\textwidth} + A curve from \texttt{P1} to \texttt{P2}, starting in direction of + \texttt{C1} and arriving from the direction of \texttt{C2} (usually not + touching the control points). + + \vspace{0.5cm} + \href{https://en.wikipedia.org/wiki/B\%C3\%A9zier\_curve} + {https://en.wikipedia.org/wiki/Bézier\_curve} + \column{0.4\textwidth} + \begin{tikzpicture} + \coordinate (P1) at (0,0); + \coordinate (P2) at (4,1); + \coordinate (C1) at (0,3); + \coordinate (C2) at (3,2); + + \draw[lightgray] (P1) foreach \p in {P1,C1,C2,P2} {-- (\p)}; + \foreach \p in {P1,C1,C2,P2} { + \fill[blue] (\p) circle[radius=0.1] node[label=\p] {}; + }; + \draw[thick] (P1) ..controls (C1) and (C2).. (P2); + \end{tikzpicture} + \end{columns} +\end{frame} + +\begin{frame}{Colors} + \begin{itemize} + \item Color names already defined: \texttt{red, green, blue, yellow,} + \texttt{black, white, gray, darkgray, lightgray, brown, pink\dots} + + \vspace{0.2cm} + \item Specify intensity: \texttt{color!n} with $0\leq n \leq 100$. + + \vspace{0.2cm} + \item Mix colors: \texttt{color1!n1!color2!n2!\dots} + + \vspace{0.2cm} + \item Example: + \begin{center} + \texttt{blue!50!red!50!green} + \end{center} + is 50\% blue, 25\% red and 25\% green. + \end{itemize} +\end{frame} + +\begin{frame}{Filldraw, change color and line style} + \begin{itemize} + \item \texttt{\bs draw[\emph{colorname}]} to specify color. + + \vspace{0.2cm} + \item \texttt{\bs filldraw[fill=\emph{fillcolor}, draw=\emph{bordercolor}]} + to fill path or \texttt{\bs fill} for no border. + + \vspace{0.2cm} + \item Line width: \texttt{\bs draw[\emph{thickness}]}, where + \texttt{\emph{thickness}} can be \texttt{very thin, thin, thick, very + thick\dots} or \texttt{\bs draw[line width=\emph{length}]} where + \texttt{\emph{length}} can be \texttt{3pt, 0.1mm\dots} + + \vspace{0.2cm} + \item Line style: \texttt{[dashed]} for dashed, + \texttt{[->]} or \texttt{[<-]} for arrow. + \end{itemize} +\end{frame} + + +\begin{frame}{Example} + \begin{center} + \begin{tikzpicture}[scale=0.6] + \colorlet{coscolor}{blue} + \colorlet{sincolor}{red} + \tikzset{anglefill/.style={draw=green,fill=green!30}} + + \pgfmathsetmacro{\r}{4} + \pgfmathsetmacro{\a}{60} + + \draw[lightgray!30] (-5,-5) grid[step=1] (5,5); + \draw[thick,->] (0,-5) -- (0,5); + \draw[thick,->] (-5,0) -- (5,0); + + \filldraw[anglefill] (0,0) -- node[above]{$\a^\circ$} + (\r/3,0) arc [start angle=0,end angle=\a,radius=\r/3] -- cycle; + \draw[thick] (0,0) circle[radius=\r] -- (\a:\r); + \draw[very thick,coscolor] (0,0) -- + node[below]{$\cos(\a^\circ)$} (\r*cos{\a},0); + \draw[very thick,sincolor] (\r*cos{\a},0) -- + node[right]{$\sin\a^\circ$}(\a:\r); + \end{tikzpicture} + \end{center} +\end{frame} + +\begin{frame}{Adding text: nodes} + \texttt{\bs draw (P1) {\color{red}--} node[\emph{position}] + \{\emph{text}\} (P2) \dots} + + \vspace{0.5cm} + \texttt{\bs draw {\color{red}(P1)} node[\emph{position}] + \{\emph{text}\} -- (P2) \dots} + + \vspace{0.5cm} + \begin{itemize} + \item A node can refer to a line or to a point + \item \texttt{\emph{position}} can be \texttt{above, below, left} or + \texttt{right} + \item \texttt{\emph{text}} can also be \texttt{\$math\$} + \end{itemize} +\end{frame} + +\begin{frame}{Macros} + \texttt{\bs pgfmathsetmacro\{\bs x\}\{\emph{value}\}} + + %\texttt{\bs colorlet\{\emph{colorname}\}\{\emph{color}\}} + + \vspace{0.5cm} + Examples: + + \vspace{0.2cm} + \texttt{\bs pgfmathsetmacro\{\bs r\}\{4\}} + + \texttt{\bs pgfmathsetmacro\{\bs a\}\{30\}} +\end{frame} + +\begin{frame}[fragile,shrink]{Example - {\ti } code} + \begin{verbatim} + \begin{tikzpicture} + \colorlet{coscolor}{blue} + \colorlet{sincolor}{red} + \tikzset{anglefill/.style={draw=green,fill=green!30}} + \pgfmathsetmacro{\r}{4} + \pgfmathsetmacro{\a}{60} + + \draw[lightgray!30] (-5,-5) grid[step=1] (5,5); + \draw[thick,->] (0,-5) -- (0,5); + \draw[thick,->] (-5,0) -- (5,0); + + \filldraw[anglefill] (0,0) -- node[above]{$\a^\circ$} + (\r/3,0) arc [start angle=0,end angle=\a,radius=\r/3] -- cycle; + \draw[thick] (0,0) circle[radius=\r] -- (\a:\r); + \draw[very thick,coscolor] (0,0) -- + node[below]{$\cos(\a^\circ)$} (\r*cos{\a},0); + \draw[very thick,sincolor] (\r*cos{\a},0) -- + node[right]{$\sin\a^\circ$}(\a:\r); + \end{tikzpicture} + \end{verbatim} +\end{frame} + +\begin{frame}{The \texttt{\bs foreach} command} + \texttt{\bs foreach \bs i in \{\emph{list}\} \{ \emph{commands} \};} + + \vspace{0.5cm} + \begin{itemize} + \item \texttt{\emph{list}} can be fully explicit (like + \texttt{\{1,7.2,-42\}}) or partially implicit + (like \texttt{\{1.5,1.6,\dots,5.0\}}) + \item \texttt{\emph{commands}} will be repeated with \texttt{\bs i} + varying in \texttt{\emph{list}} + \item One can use \texttt{foreach} inside a \texttt{\bs draw} + \end{itemize} +\end{frame} + +\begin{frame}{\texttt{\bs foreach} examples} + \begin{tabular}{c|l} + \tikz \foreach \i in {1,2,3,4} {\draw (\i,0) circle [radius=0.4];}; & + \begin{tabular}{l} + \texttt{\bs foreach \bs i in \{1,2,3,4\}} \\ + \texttt{\{\bs draw (\bs i,0) circle [radius=0.4];\}} + \end{tabular} \\ + \tikz[scale=2]\draw (0,0) \foreach\i in {0.0,0.3,...,1.5} {-- (\i,\i^2)}; & + \begin{tabular}{l} + \texttt{\bs draw (0,0) \bs foreach \bs i in} \\ + \texttt{ \{0.0,0.3,...,1.5\} \{-- (\bs i,\bs i\^{}2)\};} + \end{tabular} + \end{tabular} +\end{frame} + +\begin{frame}{External packages} + Many external packages, include with \texttt{\bs usepackage}: + \url{https://www.ctan.org/topic/pgf-tikz} + + \vspace{0.3cm} + \begin{itemize} + \item Graphs and similar: \texttt{tikz-cd, adigraph, binarytree\dots} + \item Diagrams: \texttt{pgf-pie, bchart, venndiagram\dots} + \item Other sciences: \texttt{chemfig, CircuiTikZ\dots} + \item Fun: \texttt{battleship, TikZducks, tikz-among-us\dots} + \end{itemize} +\end{frame} + +\begin{frame}[fragile]{Commutative diagrams} + \begin{center} + \begin{tikzcd} + T \arrow[drr, bend left, "x"] \arrow[ddr, bend right, "y"'] + \arrow[dr, dotted, "{(x,y)}" description] & & \\ + & X \times_Z Y \arrow[r, "p"] \arrow[d, "q"] & X \arrow[d, "f"] \\ + & Y \arrow[r, "g"] & Z + \end{tikzcd} + \end{center} +\end{frame} + +\begin{frame}{tikz-cd} + + Reference: + {\footnotesize + \url{http://ctan.cs.uu.nl/graphics/pgf/contrib/tikz-cd/tikz-cd-doc.pdf}} + + \vspace{0.7cm} + \texttt{\bs usepackage\{tikz-cd\}} + + \vspace{0.2cm} + \texttt{\bs begin\{tikzcd\}\dots \bs end\{tikzcd\}} + + \vspace{0.5cm} + \begin{itemize} + \item Works as a \texttt{tabular} or \texttt{matrix} (with \texttt{\&} and + \texttt{\bs\bs}) + \item Everything is in math mode by default + \end{itemize} +\end{frame} + +\begin{frame}{Arrows} + \texttt{\bs arrow[\emph{direction},"label",other options]} + + \vspace{0.5cm} + \begin{itemize} + \item \texttt{\emph{direction}} can be any combination of the letters + \texttt r (right), \texttt l (left), \texttt d (down) and + \texttt u (up) + \item The target must exist: + \begin{center} + \begin{tabular}{ll} + \texttt{X \bs arrow[r] \& Y} & \texttt{\% Ok} \\ + \texttt{X \bs arrow[r] } & \texttt{\% Error} \\ + \texttt{X \bs arrow[r] \& \{\}} & \texttt{\% Ok} + \end{tabular} + \end{center} + \item Other options describe the shape and style of the arrow + + \end{itemize} +\end{frame} + +\begin{frame}[fragile]{Examples} + \begin{tabular}{c|l} + \begin{tikzcd} X\arrow[r,dashed,"f"] & Y \end{tikzcd} & + \begin{tabular}{l} + \texttt{X \bs arrow[r,dashed,"f"] \& Y} + \end{tabular} \\ + & \quad \\ + \begin{tikzcd} + A\arrow[r,bend right,"\pi^2"] & B\arrow[r,bend left,tail] & C + \end{tikzcd} & + \begin{tabular}{l} + \texttt{A \bs arrow[r,bend right,"\bs pi\^{}2"] \&} \\ + \texttt{B \bs arrow[r,bend left,tail] \& C} + \end{tabular} \\ + & \quad \\ + \begin{tikzcd} + A \arrow[d,"1"'] \arrow[dr,"2"] & B \\ + C & D \arrow[l] \arrow[u,out=45,in=0] + \end{tikzcd} & + \begin{tabular}{l} + \texttt{A \bs arrow[d,"1"'] \bs arrow[dr,"2"] \& B \bs\bs} \\ + \texttt{C \& D \bs arrow[l] \bs arrow[u,out=45,in=0]} + \end{tabular} + \end{tabular} +\end{frame} + +\end{document} + diff --git a/src/Lecture3/slides/4-TikZ.toc b/src/Lecture3/slides/4-TikZ.toc diff --git a/src/Lecture3/slides/4-TikZ.vrb b/src/Lecture3/slides/4-TikZ.vrb @@ -0,0 +1,24 @@ +\frametitle{Examples} +\begin{tabular}{c|l} + \begin{tikzcd} X\arrow[r,dashed,"f"] & Y \end{tikzcd} & + \begin{tabular}{l} + \texttt{X \bs arrow[r,dashed,"f"] \& Y} + \end{tabular} \\ + & \quad \\ + \begin{tikzcd} + A\arrow[r,bend right,"\pi^2"] & B\arrow[r,bend left,tail] & C + \end{tikzcd} & + \begin{tabular}{l} + \texttt{A \bs arrow[r,bend right,"\bs pi\^{}2"] \&} \\ + \texttt{B \bs arrow[r,bend left,tail] \& C} + \end{tabular} \\ + & \quad \\ + \begin{tikzcd} + A \arrow[d,"1"'] \arrow[dr,"2"] & B \\ + C & D \arrow[l] \arrow[u,out=45,in=0] + \end{tikzcd} & + \begin{tabular}{l} + \texttt{A \bs arrow[d,"1"'] \bs arrow[dr,"2"] \& B \bs\bs} \\ + \texttt{C \& D \bs arrow[l] \bs arrow[u,out=45,in=0]} + \end{tabular} + \end{tabular} diff --git a/src/Lecture3/slides/5-Beamer.aux b/src/Lecture3/slides/5-Beamer.aux @@ -0,0 +1,49 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/15}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {13}{15}}} +\@writefile{nav}{\headcommand {\beamer@partpages {1}{15}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{15}}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{15}}} +\@writefile{nav}{\headcommand {\beamer@documentpages {15}}} +\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {13}}} diff --git a/src/Lecture3/slides/5-Beamer.log b/src/Lecture3/slides/5-Beamer.log @@ -0,0 +1,1132 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**5-Beamer.tex +(./5-Beamer.tex +LaTeX2e <2020-02-02> patch level 2 +L3 programming layer <2020-02-14> +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls +Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty +(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count167 +) +\beamer@tempbox=\box45 +\beamer@tempcount=\count168 +\c@beamerpauses=\count169 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty +\beamer@slideinframe=\count170 +\beamer@minimum=\count171 +\beamer@decode@box=\box46 +) +\beamer@commentbox=\box47 +\beamer@modecount=\count172 +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2019/11/07 v1.0c TeX engine tests +)) +\headdp=\dimen134 +\footheight=\dimen135 +\sidebarheight=\dimen136 +\beamer@tempdim=\dimen137 +\beamer@finalheight=\dimen138 +\beamer@animht=\dimen139 +\beamer@animdp=\dimen140 +\beamer@animwd=\dimen141 +\beamer@leftmargin=\dimen142 +\beamer@rightmargin=\dimen143 +\beamer@leftsidebar=\dimen144 +\beamer@rightsidebar=\dimen145 +\beamer@boxsize=\dimen146 +\beamer@vboxoffset=\dimen147 +\beamer@descdefault=\dimen148 +\beamer@descriptionwidth=\dimen149 +\beamer@lastskip=\skip47 +\beamer@areabox=\box48 +\beamer@animcurrent=\box49 +\beamer@animshowbox=\box50 +\beamer@sectionbox=\box51 +\beamer@logobox=\box52 +\beamer@linebox=\box53 +\beamer@sectioncount=\count173 +\beamer@subsubsectionmax=\count174 +\beamer@subsectionmax=\count175 +\beamer@sectionmax=\count176 +\beamer@totalheads=\count177 +\beamer@headcounter=\count178 +\beamer@partstartpage=\count179 +\beamer@sectionstartpage=\count180 +\beamer@subsectionstartpage=\count181 +\beamer@animationtempa=\count182 +\beamer@animationtempb=\count183 +\beamer@xpos=\count184 +\beamer@ypos=\count185 +\beamer@ypos@offset=\count186 +\beamer@showpartnumber=\count187 +\beamer@currentsubsection=\count188 +\beamer@coveringdepth=\count189 +\beamer@sectionadjust=\count190 +\beamer@tocsectionnumber=\count191 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) +\beamer@paperwidth=\skip48 +\beamer@paperheight=\skip49 + +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count192 +\Gm@cntv=\count193 +\c@Gm@tempcnt=\count194 +\Gm@bindingoffset=\dimen150 +\Gm@wd@mp=\dimen151 +\Gm@odd@mp=\dimen152 +\Gm@even@mp=\dimen153 +\Gm@layoutwidth=\dimen154 +\Gm@layoutheight=\dimen155 +\Gm@layouthoffset=\dimen156 +\Gm@layoutvoffset=\dimen157 +\Gm@dimlist=\toks15 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen158 +\Gin@req@width=\dimen159 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks16 +\pgfutil@tempdima=\dimen160 +\pgfutil@tempdimb=\dimen161 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t +ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box54 +(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty +Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t +ex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen162 +\pgf@y=\dimen163 +\pgf@xa=\dimen164 +\pgf@ya=\dimen165 +\pgf@xb=\dimen166 +\pgf@yb=\dimen167 +\pgf@xc=\dimen168 +\pgf@yc=\dimen169 +\pgf@xd=\dimen170 +\pgf@yd=\dimen171 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count195 +\c@pgf@countb=\count196 +\c@pgf@countc=\count197 +\c@pgf@countd=\count198 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count199 + (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de +f +File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code. +tex +File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfsyssoftpath@smallbuffer@items=\count266 +\pgfsyssoftpath@bigbuffer@items=\count267 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code. +tex +File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen172 +\pgfmath@count=\count268 +\pgfmath@box=\box55 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet +ric.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod +e.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison +.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari +thmetics.code.tex))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count269 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te +x +File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@picminx=\dimen173 +\pgf@picmaxx=\dimen174 +\pgf@picminy=\dimen175 +\pgf@picmaxy=\dimen176 +\pgf@pathminx=\dimen177 +\pgf@pathmaxx=\dimen178 +\pgf@pathminy=\dimen179 +\pgf@pathmaxy=\dimen180 +\pgf@xx=\dimen181 +\pgf@xy=\dimen182 +\pgf@yx=\dimen183 +\pgf@yy=\dimen184 +\pgf@zx=\dimen185 +\pgf@zy=\dimen186 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct. +code.tex +File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@path@lastx=\dimen187 +\pgf@path@lasty=\dimen188 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code +.tex +File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@shorten@end@additional=\dimen189 +\pgf@shorten@start@additional=\dimen190 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te +x +File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfpic=\box56 +\pgf@hbox=\box57 +\pgf@layerbox@main=\box58 +\pgf@picture@serial@count=\count270 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c +ode.tex +File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgflinewidth=\dimen191 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation +s.code.tex +File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@pt@x=\dimen192 +\pgf@pt@y=\dimen193 +\pgf@pt@temp=\dimen194 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t +ex +File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing +.code.tex +File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te +x +File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowsep=\dimen195 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@max=\dimen196 +\pgf@sys@shading@range@num=\count271 +\pgf@shadingcount=\count272 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code. +tex +File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfexternal@startupbox=\box59 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te +x +File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c +ode.tex +File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code. +tex +File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty +Package: xxcolor 2003/10/24 ver 0.1 +\XC@nummixins=\count273 +\XC@countmixins=\count274 +) +(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO) +)) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO) +) +\@linkdim=\dimen197 +\Hy@linkcounter=\count275 +\Hy@pagecounter=\count276 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count277 +\pdfmajorversion=\count278 +Package hyperref Info: Option `bookmarks' set `true' on input line 4421. +Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421. +Package hyperref Info: Option `implicit' set `false' on input line 4421. +Package hyperref Info: Hyper figures OFF on input line 4547. +Package hyperref Info: Link nesting OFF on input line 4552. +Package hyperref Info: Hyper index ON on input line 4555. +Package hyperref Info: Plain pages OFF on input line 4562. +Package hyperref Info: Backreferencing OFF on input line 4567. +Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals. +Package hyperref Info: Bookmarks ON on input line 4800. +\c@Hy@tempcnt=\count279 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5159. +\XeTeXLinkMargin=\dimen198 + +(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count280 +\Field@Width=\dimen199 +\Fld@charsize=\dimen256 +Package hyperref Info: Hyper figures OFF on input line 6430. +Package hyperref Info: Link nesting OFF on input line 6435. +Package hyperref Info: Hyper index ON on input line 6438. +Package hyperref Info: backreferencing OFF on input line 6445. +Package hyperref Info: Link coloring OFF on input line 6450. +Package hyperref Info: Link coloring with OCG OFF on input line 6455. +Package hyperref Info: PDF/A mode OFF on input line 6460. +LaTeX Info: Redefining \ref on input line 6500. +LaTeX Info: Redefining \pageref on input line 6504. +\Hy@abspage=\count281 + + +Package hyperref Message: Stopped early. + +) +Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO) +) +\Fld@listcount=\count282 +\c@bookmark@seq@number=\count283 + +(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks26 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty +Package: sansmathaccent 2020/01/31 + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty +Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files) +))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty +Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty +\beamer@argscount=\count284 +\beamer@lastskipcover=\skip50 +\beamer@trivlistdepth=\count285 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty +\c@lecture=\count286 +\c@part=\count287 +\c@section=\count288 +\c@subsection=\count289 +\c@subsubsection=\count290 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty +\beamer@framebox=\box60 +\beamer@frametitlebox=\box61 +\beamer@zoombox=\box62 +\beamer@zoomcount=\count291 +\beamer@zoomframecount=\count292 +\beamer@frametextheight=\dimen257 +\c@subsectionslide=\count293 +\beamer@frametopskip=\skip51 +\beamer@framebottomskip=\skip52 +\beamer@frametopskipautobreak=\skip53 +\beamer@framebottomskipautobreak=\skip54 +\beamer@envbody=\toks27 +\framewidth=\dimen258 +\c@framenumber=\count294 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty +\beamer@verbatimfileout=\write4 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty +\beamer@splitbox=\box63 +\beamer@autobreakcount=\count295 +\beamer@autobreaklastheight=\dimen259 +\beamer@frametitletoks=\toks28 +\beamer@framesubtitletoks=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty +\beamer@footins=\box64 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty +\beamer@frameboxcopy=\box65 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty +\beamer@sbttoks=\toks30 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty +\bmb@box=\box66 +\bmb@colorbox=\box67 +\bmb@boxshadow=\box68 +\bmb@boxshadowball=\box69 +\bmb@boxshadowballlarge=\box70 +\bmb@temp=\dimen260 +\bmb@dima=\dimen261 +\bmb@dimb=\dimen262 +\bmb@prevheight=\dimen263 +) +\beamer@blockheadheight=\dimen264 +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks31 +) +\c@figure=\count296 +\c@table=\count297 +\abovecaptionskip=\skip55 +\belowcaptionskip=\skip56 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty +\beamer@section@min@dim=\dimen265 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/01/20 v2.17e AMS math features +\@mathmargin=\skip57 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks32 +\ex@=\dimen266 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen267 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count298 +LaTeX Info: Redefining \frac on input line 227. +\uproot@=\count299 +\leftroot@=\count300 +LaTeX Info: Redefining \overline on input line 389. +\classnum@=\count301 +\DOTSCASE@=\count302 +LaTeX Info: Redefining \ldots on input line 486. +LaTeX Info: Redefining \dots on input line 489. +LaTeX Info: Redefining \cdots on input line 610. +\Mathstrutbox@=\box71 +\strutbox@=\box72 +\big@size=\dimen268 +LaTeX Font Info: Redeclaring font encoding OML on input line 733. +LaTeX Font Info: Redeclaring font encoding OMS on input line 734. +\macc@depth=\count303 +\c@MaxMatrixCols=\count304 +\dotsspace@=\muskip17 +\c@parentequation=\count305 +\dspbrk@lvl=\count306 +\tag@help=\toks33 +\row@=\count307 +\column@=\count308 +\maxfields@=\count309 +\andhelp@=\toks34 +\eqnshift@=\dimen269 +\alignsep@=\dimen270 +\tagshift@=\dimen271 +\tagwidth@=\dimen272 +\totwidth@=\dimen273 +\lineht@=\dimen274 +\@envbody=\toks35 +\multlinegap=\skip58 +\multlinetaggap=\skip59 +\mathdisplay@stack=\toks36 +LaTeX Info: Redefining \[ on input line 2859. +LaTeX Info: Redefining \] on input line 2860. +) +(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2017/10/31 v2.20.4 +\thm@style=\toks37 +\thm@bodyfont=\toks38 +\thm@headfont=\toks39 +\thm@notefont=\toks40 +\thm@headpunct=\toks41 +\thm@preskip=\skip60 +\thm@postskip=\skip61 +\thm@headsep=\skip62 +\dth@everypar=\toks42 +) +\c@theorem=\count310 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty +\beamer@dima=\dimen275 +\beamer@dimb=\dimen276 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file +\inpenc@prehook=\toks43 +\inpenc@posthook=\toks44 +) +(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty +Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ + +(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +Package: pgf 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfnodeparttextbox=\box73 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65 +.sty +Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b) +\pgf@nodesepstart=\dimen277 +\pgf@nodesepend=\dimen278 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18 +.sty +Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen279 +\pgffor@skip=\dimen280 +\pgffor@stack=\toks45 +\pgffor@toks=\toks46 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers +.code.tex +File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@plot@mark@count=\count311 +\pgfplotmarksize=\dimen281 +) +\tikz@lastx=\dimen282 +\tikz@lasty=\dimen283 +\tikz@lastxsaved=\dimen284 +\tikz@lastysaved=\dimen285 +\tikz@lastmovetox=\dimen286 +\tikz@lastmovetoy=\dimen287 +\tikzleveldistance=\dimen288 +\tikzsiblingdistance=\dimen289 +\tikz@figbox=\box74 +\tikz@figbox@bg=\box75 +\tikz@tempbox=\box76 +\tikz@tempbox@bg=\box77 +\tikztreelevel=\count312 +\tikznumberofchildren=\count313 +\tikznumberofcurrentchild=\count314 +\tikz@fig@count=\count315 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfmatrixcurrentrow=\count316 +\pgfmatrixcurrentcolumn=\count317 +\pgf@matrix@numberofcolumns=\count318 +) +\tikz@expandcount=\count319 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarymatrix.code.tex +File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibraryquotes.code.tex +File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta. +code.tex +File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowinset=\dimen290 +\pgfarrowlength=\dimen291 +\pgfarrowwidth=\dimen292 +\pgfarrowlinewidth=\dimen293 +))) +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode +\l__kernel_color_stack_int=\count320 +\l__pdf_internal_box=\box78 +) +(./5-Beamer.aux) +\openout1 = `5-Beamer.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: custom +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: includehead includefoot +* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt) +* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt) +* \paperwidth=364.19536pt +* \paperheight=273.14662pt +* \textwidth=342.2953pt +* \textheight=244.6939pt +* \oddsidemargin=-61.31996pt +* \evensidemargin=-61.31996pt +* \topmargin=-72.26999pt +* \headheight=14.22636pt +* \headsep=0.0pt +* \topskip=11.0pt +* \footskip=14.22636pt +* \marginparwidth=4.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count321 +\scratchdimen=\dimen294 +\scratchbox=\box79 +\nofMPsegments=\count322 +\nofMParguments=\count323 +\everyMPshowfont=\toks47 +\MPscratchCnt=\count324 +\MPscratchDim=\dimen295 +\MPnumerator=\count325 +\makeMPintoPDFobject=\count326 +\everyMPtoPDFconversion=\toks48 +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +ABD: EveryShipout initializing macros +\AtBeginShipoutBox=\box80 +Package hyperref Info: Link coloring OFF on input line 18. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count327 +) +LaTeX Info: Redefining \ref on input line 18. +LaTeX Info: Redefining \pageref on input line 18. +LaTeX Info: Redefining \nameref on input line 18. + +(./5-Beamer.out) (./5-Beamer.out) +\@outlinefile=\write5 +\openout5 = `5-Beamer.out'. + +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 18. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18. +\symnumbers=\mathgroup6 +\sympureletters=\mathgroup7 +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathit on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18. +LaTeX Font Info: Overwriting symbol font `numbers' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 18. +LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 18. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal' +(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 1 +8. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 1 +8. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp +ut line 18. + +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary +-English.dict +Dictionary: translator-basic-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic +tionary-English.dict +Dictionary: translator-bibliography-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict +ionary-English.dict +Dictionary: translator-environment-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar +y-English.dict +Dictionary: translator-months-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona +ry-English.dict +Dictionary: translator-numbers-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona +ry-English.dict +Dictionary: translator-theorem-dictionary, Language: English +) (./5-Beamer.nav) +<img/unilu.jpg, id=20, 645.16031pt x 578.16pt> +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 22. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 42. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [2 + +] +<img/beamer.png, id=84, 595.22375pt x 609.27625pt> +File: img/beamer.png Graphic file (type png) +<use img/beamer.png> +Package pdftex.def Info: img/beamer.png used on input line 46. +(pdftex.def) Requested size: 208.33144pt x 213.24988pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 46. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [3 + + <./img/beamer.png>] +LaTeX Font Info: Trying to load font information for OMS+cmtt on input line +59. + +(/usr/share/texmf/tex/latex/R/tex/latex/omscmtt.fd +File: omscmtt.fd +) +LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <10.95> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 59. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 59. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [4 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 79. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [5 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 90. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [6 + +] +\openout4 = `5-Beamer.vrb'. + + (./5-Beamer.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 110. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [7 + +] +LaTeX Font Info: Trying to load font information for U+msa on input line 139 +. + (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 139 +. + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp +ut line 139. + +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd +File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma +thkerncmss. +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 139. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[8 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 148. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [9 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 157. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [10 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 168. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [11 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 181. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [12 + +] +<img/diophantus.jpg, id=357, 617.30624pt x 727.71875pt> +File: img/diophantus.jpg Graphic file (type jpg) +<use img/diophantus.jpg> +Package pdftex.def Info: img/diophantus.jpg used on input line 200. +(pdftex.def) Requested size: 123.45906pt x 145.54117pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 200. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [13 + + <./img/diophantus.jpg>] +File: img/diophantus.jpg Graphic file (type jpg) +<use img/diophantus.jpg> +Package pdftex.def Info: img/diophantus.jpg used on input line 200. +(pdftex.def) Requested size: 123.45906pt x 145.54117pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 200. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [14 + +] +File: img/diophantus.jpg Graphic file (type jpg) +<use img/diophantus.jpg> +Package pdftex.def Info: img/diophantus.jpg used on input line 200. +(pdftex.def) Requested size: 123.45906pt x 145.54117pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 200. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [15 + +] +\tf@nav=\write6 +\openout6 = `5-Beamer.nav'. + +\tf@toc=\write7 +\openout7 = `5-Beamer.toc'. + +\tf@snm=\write8 +\openout8 = `5-Beamer.snm'. + +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 203. +Package atveryend Info: Empty hook `AfterLastShipout' on input line 203. + (./5-Beamer.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 203. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 203. +Package rerunfilecheck Info: File `5-Beamer.out' has not changed. +(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. + ) +Here is how much of TeX's memory you used: + 21979 strings out of 481239 + 446491 string characters out of 5920377 + 688897 words of memory out of 5000000 + 36680 multiletter control sequences out of 15000+600000 + 541024 words of font info for 56 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 58i,15n,89p,792b,780s stack positions out of 5000i,500n,10000p,200000b,80000s +</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmitt10.pfb></u +sr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/sha +re/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/tex +live/texmf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/te +xmf-dist/fonts/type1/public/amsfonts/cm/cmss9.pfb></usr/share/texlive/texmf-dis +t/fonts/type1/public/amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-dist/fo +nts/type1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/fonts/t +ype1/public/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/p +ublic/amsfonts/cm/cmtt10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/ +amsfonts/cm/cmtt12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfon +ts/cm/cmtt8.pfb> +Output written on 5-Beamer.pdf (15 pages, 326492 bytes). +PDF statistics: + 483 PDF objects out of 1000 (max. 8388607) + 433 compressed objects within 5 object streams + 31 named destinations out of 1000 (max. 500000) + 100 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture3/slides/5-Beamer.nav b/src/Lecture3/slides/5-Beamer.nav @@ -0,0 +1,31 @@ +\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}} +\headcommand {\beamer@framepages {1}{1}} +\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}} +\headcommand {\beamer@framepages {2}{2}} +\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}} +\headcommand {\beamer@framepages {3}{3}} +\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}} +\headcommand {\beamer@framepages {4}{4}} +\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}} +\headcommand {\beamer@framepages {5}{5}} +\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}} +\headcommand {\beamer@framepages {6}{6}} +\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}} +\headcommand {\beamer@framepages {7}{7}} +\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}} +\headcommand {\beamer@framepages {8}{8}} +\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}} +\headcommand {\beamer@framepages {9}{9}} +\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}} +\headcommand {\beamer@framepages {10}{10}} +\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}} +\headcommand {\beamer@framepages {11}{11}} +\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}} +\headcommand {\beamer@framepages {12}{12}} +\headcommand {\slideentry {0}{0}{13}{13/15}{}{0}} +\headcommand {\beamer@framepages {13}{15}} +\headcommand {\beamer@partpages {1}{15}} +\headcommand {\beamer@subsectionpages {1}{15}} +\headcommand {\beamer@sectionpages {1}{15}} +\headcommand {\beamer@documentpages {15}} +\headcommand {\gdef \inserttotalframenumber {13}} diff --git a/src/Lecture3/slides/5-Beamer.out b/src/Lecture3/slides/5-Beamer.out diff --git a/src/Lecture3/slides/5-Beamer.pdf 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 diff --git a/src/Lecture3/slides/5-Beamer.tex b/src/Lecture3/slides/5-Beamer.tex @@ -0,0 +1,203 @@ +\documentclass[11pt]{beamer} +\usetheme{Madrid} +\usepackage[utf8]{inputenc} +\usepackage{amsmath, amssymb, amsfonts, amsthm} +\usepackage{xcolor} + +\usepackage{tikz-cd} + +\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto} +\title{Presentations in LaTeX with Beamer} +\logo{\includegraphics[scale=0.1]{img/unilu.jpg}} +%\institute{University of Luxembourg} + +\newcommand{\bs}{\textbackslash} + +\date{2021-03-26} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + +\begin{frame}{Why presentation with LaTeX?} + Pros: + + \vspace{0.2cm} + \begin{itemize} + \item Easy to include formulas and theorems + \item Portability: \texttt{pdf} = \textbf{portable} document format + \item Very fast to get ``good enough'' results (subjective) + \end{itemize} + + \vspace{0.5cm} + Cons: + + \vspace{0.2cm} + \begin{itemize} + \item Advanced animations not possible with pdf + \item Lack of other presentation-specific features + \end{itemize} +\end{frame} + +\begin{frame}{Structure of a Beamer document} + \includegraphics[scale=0.35]{img/beamer.png} +\end{frame} + +\begin{frame}{The \texttt{frame} environment} + \texttt{\bs begin\{frame\}[options]\{Title\} \,\dots\, \bs end\{frame\}} + + \vspace{0.5cm} + Useful options: + \begin{itemize} + \item \texttt{plain}: no bars on bottom or side + \item \texttt{shrink}: content is shrunk to fit in the slide + \item \texttt{fragile}: when you have \texttt{tikzpicture}, + \texttt{listings} or similar + \end{itemize} +\end{frame} + +\begin{frame}{Basic animations} + \begin{itemize} + \item \texttt{\bs pause} for a simple break + + \vspace{0.3cm} + \item \texttt{\bs only<start-(end)>\{\emph{stuff}\}} to show + \emph{\texttt{stuff}} only on some slides + + Shortcut for lists: \texttt{\bs item<\dots>} or + \texttt{\bs begin\{itemize\}[<+->]} + + \vspace{0.3cm} + \item Optional: + \texttt{\bs setbeamercovered\{transparent\}} (see end of slides) + + \vspace{0.3cm} + \item \texttt{\bs uncover<\dots>} does not take space when invisible + \end{itemize} +\end{frame} + +\begin{frame}{Theorems and lists} + \begin{theorem} This is a Theorem \end{theorem} + \begin{proof} With proof \end{proof} + + \begin{itemize} + \item \texttt{theorem}, \texttt{proof} and \texttt{definition} already + included with beamer. + \item Define new theorems as usual (they get a box automatically) + \end{itemize} +\end{frame} + +\begin{frame}[fragile]{Custom blocks} + + { + \setbeamercolor{block title}{fg=blue,bg=green} + \setbeamercolor{block body}{fg=black,bg=pink!50} + \begin{block}{A custom block, with ugly colors} + \begin{verbatim} +{ + \setbeamercolor{block title}{fg=blue,bg=green} + \setbeamercolor{block body}{fg=black,bg=pink!50} + + \begin{block}{A custom block, with ugly colors} + ... + \end{block} +} + \end{verbatim} + \end{block} + } +\end{frame} + + +\begin{frame}{Multiple columns} + \begin{columns} + \column{0.3\textwidth} + \texttt{\bs begin\{columns\}} + + \texttt{\qquad\bs column\{\emph{width}\}} + + \texttt{\qquad(stuff)} + + \texttt{\qquad\bs column\{\emph{width}\}} + + \texttt{\qquad(more stuff)} + + \texttt{\qquad\qquad\vdots} + + \texttt{\bs end\{columns\}} + \column{0.7\textwidth} + \begin{itemize} + \item \texttt{\emph{width}} is a length (example: + \texttt{0.7\bs textwidth}) + \item Example: picture on the left, text on the right + \item Not specific to Beamer + \item Alternative: \texttt{tabular} + \end{itemize} + \end{columns} + +\end{frame} + +\begin{frame}{Some advice} + \begin{itemize} + \item Do not prepare too many slides (1-2 minutes per slide) + \item Do not write too much in each slide (split if necessary) + \item Pictures and \texttt{itemize}s are great, sentences are not + \item Animations are ok (but are they worth the effort?) + \end{itemize} +\end{frame} + +\begin{frame}{Examples} + Three examples will follow: + \begin{itemize} + \item A horrible slide + \item A better slide with the same content + \item A better better slide that took a little more time to write + \end{itemize} +\end{frame} + +\begin{frame}{Diophantine equations (bad)} + Diophantine equations are a very old problem, dating back to Diophantus of + Alexandria (III century A.D.). + + Despite this, they are still today a very hard problem, and there is + no general method or algorithm to solve them. + + A notable example is \emph{Fermat's Last Theorem}, stated for the first time + in 1637 but proved to be true only in 1995, after more than 350 years! +\end{frame} + + +\begin{frame}{Diophantine Equations (better)} + \begin{itemize} + \item Very old problem + + \vspace{0.3cm} + \item Very simple formulation, but very hard to solve! + + \vspace{0.3cm} + \item ``Fermat's Last Theorem'': stated in 1637 - proved in 1995 + \end{itemize} +\end{frame} + +\setbeamercovered{transparent} +\begin{frame}{Diophantine Equations (better better)} + \begin{columns} + \column{0.45\textwidth} + \begin{figure} + \begin{center} + \includegraphics[scale=0.2]{img/diophantus.jpg} + {\footnotesize Diophantus of Alexandria\\ (III century A.D.)} + \end{center} + \end{figure} + \column{0.55\textwidth} + \begin{itemize} + \item<1-> Very old problem + \item<2-> Very simple formulation, but very hard to solve! + \item<3-> \emph{Fermat's Last Theorem}: stated in 1637 - proved in 1995 + \end{itemize} + \end{columns} +\end{frame} + + +\end{document} diff --git a/src/Lecture3/slides/5-Beamer.toc b/src/Lecture3/slides/5-Beamer.toc diff --git a/src/Lecture3/slides/5-Beamer.vrb b/src/Lecture3/slides/5-Beamer.vrb @@ -0,0 +1,18 @@ +\frametitle{Custom blocks} + + { + \setbeamercolor{block title}{fg=blue,bg=green} + \setbeamercolor{block body}{fg=black,bg=pink!50} + \begin{block}{A custom block, with ugly colors} + \begin{verbatim} +{ + \setbeamercolor{block title}{fg=blue,bg=green} + \setbeamercolor{block body}{fg=black,bg=pink!50} + + \begin{block}{A custom block, with ugly colors} + ... + \end{block} +} + \end{verbatim} + \end{block} + } diff --git a/src/Lecture3/slides/img/beamer.png 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 Binary files differ. diff --git a/src/Lecture3/slides/img/unilu.jpg b/src/Lecture3/slides/img/unilu.jpg Binary files differ. diff --git a/src/Lecture4/live/live.zip b/src/Lecture4/live/live.zip Binary files differ. diff --git a/src/Lecture4/live/live1.py b/src/Lecture4/live/live1.py @@ -0,0 +1,17 @@ +print(2+2) + +x = input("Input something: ") +print("Your input was:", x, "of type", type(x)) + +x_number = int(x) +print("Converted to a number:", x_number, "of type", type(x_number)) + +if x_number > 10: + print("Your number was large!") + print("It was larger than 10") + z = x_number-10 + print("This is a smaller number:", z) +else: + print("Your number was small") + +print("Bye") diff --git a/src/Lecture4/live/live2.py b/src/Lecture4/live/live2.py @@ -0,0 +1,7 @@ +x = int(input("Input something: ")) + +while x > 10: + print("Large number!", x) + x = x - 1 + +print("Bye") diff --git a/src/Lecture4/live/live3.py b/src/Lecture4/live/live3.py @@ -0,0 +1,9 @@ +x = int(input("Input something: ")) + +A = [1,2,3] + +for i in range(2,9): + z = 10**i + print("A power of 10:", z) + +print("Bye") diff --git a/src/Lecture4/live/live4.py b/src/Lecture4/live/live4.py @@ -0,0 +1,39 @@ + +def fun(a, b): + print("This is function fun") + print("I am executing!") + print("Your parameter a:", a) + z = a + b + if z > 10: + print("Your sum is large!", z) + while z > 5: + print("Decreasing sum:", z-1) + z = z - 1 + +#fun(2, 11) +#print("..") +#fun(0, 7) + +def g(x, y): + #print("This is function g") + return (x**2 +1)*y + +print(g(10,2)-100) + + +def fibo(n): + if n == 0: + return 0 + if n == 1: + return 1 + return fibo(n-1) + fibo(n-2) + + + +print(fibo(5)) +F = [fibo(x) for x in range(6)] +print(F) + + + + diff --git a/src/Lecture4/live/live_interactive.py b/src/Lecture4/live/live_interactive.py @@ -0,0 +1,172 @@ +2+2 +3*5 +3/5 +3 // 5 +2.5 + (456 - 0.3) +2 ** 10 +13 // 5 +13 % 5 +sqrt(3) +import math +sqrt(3) +math.sqrt(3) +help() +math +asfdads +2+2 +help("import") +sqrt(10) +math.sqrt(10) +from math import * +sqrt(10) +10 - _ +_ +x = 10 + sqrt(3) +x +abc_3 = 45+3*(2-1.4) +abc_3 +x / (abc_3+2) +x +x = 3*abc_3 +x +abc_3 = 0 +abc_3 +x +1 = 1 +1 == 1 +1 == 3 +x +type(x) +abc_3 +type(abc_3) +type(3/2) +type(3/1) +3/1 +type(1 == 1) +y = False +z = (2 == 2) +y +z +type(z) +type(y) +y and z +True and True +y or z +not True +3 >= 4 +3 >= 3 +3 > 3 +3 != 4 +hello +"hello" +type("hello") +st = "Hello, World!" +st +type(st) +len(st) +"hello" + ", world" +"abc" + "abc" +2 * "abc" +10 * "abc" +"hello" * "abc" +True + False +[1,2,3,1,-1.5] +[1,True,"hello"] +L = [1,True,"hello"] +type(L) +{1,2,3,1,-1.5} +{12, 25, 10, -1} +len(L) +len({1,1,1}) +{1,1,1} +1 in L +-42 in L +1.5 in {2,3.1,1.5} +S = {-2, 0, 10, 25} +max(S) +min(S) +sum(S) +sum([10,2,45]) +L +min(L) +L2 = [1,2, 1, -2, 0, 2] +set(L2) +list({1,2,1,3,-2}) +S +list(S) +[x**2 for x in [-1,4,1,0] if x < 3] +{x**2 for x in [-1,4,1,0] if x < 3} +{x+2 for x in [-1,4,1,0] if x < 3} +{x+2 for x in {-1,4,1,0} if x < 3} +[x+2 for x in {-1,4,1,0} if x < 3] +[x+2 for x in {-1,4,1,0} if True] +[x+2 for x in {-1,4,1,0}] +[x+2 for x in {-1,4,1,0} if x+10-3.24 < x^2] +[i*j for i in [0,1,2,3] for j in {-1,1}] +range(0,4) +type(range(0,4)) +[i*j for i in range(0,4) for j in {-1,1}] +list(range(0,4)) +list(range(3,4)) +list(range(3,10)) +list(range(10)) +list(range(1,10,2)) +list(range(10,1,-1)) +L +L[0] +L[1] +L[2] +L[10] +L[-1] +L[len(L)-1] +L[len(L)-3] +L[-3] +L2 +L[1:4] +L2[1:4] +L2[1:4:2] +R=range(10) +R +R=list(range(10)) +R +R[2:8:2] +R[9:3:-1] +R +type(R) +R[3] +R[3] = 3.14 +R +R.append(10) +R +R.insert(3,3.0) +R +R[3] +del R[4] +R +L +R +L + R +L +R +L * 3 +3 * L +S +type(S) +S.add(3) +S +S.add(10) +S +S.remove(25) +S +T = {3, -2, 27, 99} +{3, -2} < T +{3, -2} < S +S >= {3, -2} +S >= S +S > S +S | T +S & T +S - T +2+3 +import readline +readline.write_history_file('live_interactive.py') diff --git a/src/Lecture4/slides/6-PythonIntroduction.aux b/src/Lecture4/slides/6-PythonIntroduction.aux @@ -0,0 +1,76 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand{\transparent@use}[1]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {22}{22}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {23}{23}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{24}{24/24}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {24}{24}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{25}{25/25}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {25}{25}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{26}{26/26}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {26}{26}}} +\@writefile{nav}{\headcommand {\beamer@partpages {1}{26}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{26}}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{26}}} +\@writefile{nav}{\headcommand {\beamer@documentpages {26}}} +\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {26}}} diff --git a/src/Lecture4/slides/6-PythonIntroduction.log b/src/Lecture4/slides/6-PythonIntroduction.log @@ -0,0 +1,1283 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**6-PythonIntroduction.tex +(./6-PythonIntroduction.tex +LaTeX2e <2020-02-02> patch level 2 +L3 programming layer <2020-02-14> +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls +Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty +(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count167 +) +\beamer@tempbox=\box45 +\beamer@tempcount=\count168 +\c@beamerpauses=\count169 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty +\beamer@slideinframe=\count170 +\beamer@minimum=\count171 +\beamer@decode@box=\box46 +) +\beamer@commentbox=\box47 +\beamer@modecount=\count172 +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2019/11/07 v1.0c TeX engine tests +)) +\headdp=\dimen134 +\footheight=\dimen135 +\sidebarheight=\dimen136 +\beamer@tempdim=\dimen137 +\beamer@finalheight=\dimen138 +\beamer@animht=\dimen139 +\beamer@animdp=\dimen140 +\beamer@animwd=\dimen141 +\beamer@leftmargin=\dimen142 +\beamer@rightmargin=\dimen143 +\beamer@leftsidebar=\dimen144 +\beamer@rightsidebar=\dimen145 +\beamer@boxsize=\dimen146 +\beamer@vboxoffset=\dimen147 +\beamer@descdefault=\dimen148 +\beamer@descriptionwidth=\dimen149 +\beamer@lastskip=\skip47 +\beamer@areabox=\box48 +\beamer@animcurrent=\box49 +\beamer@animshowbox=\box50 +\beamer@sectionbox=\box51 +\beamer@logobox=\box52 +\beamer@linebox=\box53 +\beamer@sectioncount=\count173 +\beamer@subsubsectionmax=\count174 +\beamer@subsectionmax=\count175 +\beamer@sectionmax=\count176 +\beamer@totalheads=\count177 +\beamer@headcounter=\count178 +\beamer@partstartpage=\count179 +\beamer@sectionstartpage=\count180 +\beamer@subsectionstartpage=\count181 +\beamer@animationtempa=\count182 +\beamer@animationtempb=\count183 +\beamer@xpos=\count184 +\beamer@ypos=\count185 +\beamer@ypos@offset=\count186 +\beamer@showpartnumber=\count187 +\beamer@currentsubsection=\count188 +\beamer@coveringdepth=\count189 +\beamer@sectionadjust=\count190 +\beamer@tocsectionnumber=\count191 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) +\beamer@paperwidth=\skip48 +\beamer@paperheight=\skip49 + +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count192 +\Gm@cntv=\count193 +\c@Gm@tempcnt=\count194 +\Gm@bindingoffset=\dimen150 +\Gm@wd@mp=\dimen151 +\Gm@odd@mp=\dimen152 +\Gm@even@mp=\dimen153 +\Gm@layoutwidth=\dimen154 +\Gm@layoutheight=\dimen155 +\Gm@layouthoffset=\dimen156 +\Gm@layoutvoffset=\dimen157 +\Gm@dimlist=\toks15 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen158 +\Gin@req@width=\dimen159 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks16 +\pgfutil@tempdima=\dimen160 +\pgfutil@tempdimb=\dimen161 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t +ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box54 +(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty +Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t +ex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen162 +\pgf@y=\dimen163 +\pgf@xa=\dimen164 +\pgf@ya=\dimen165 +\pgf@xb=\dimen166 +\pgf@yb=\dimen167 +\pgf@xc=\dimen168 +\pgf@yc=\dimen169 +\pgf@xd=\dimen170 +\pgf@yd=\dimen171 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count195 +\c@pgf@countb=\count196 +\c@pgf@countc=\count197 +\c@pgf@countd=\count198 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count199 + (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de +f +File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code. +tex +File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfsyssoftpath@smallbuffer@items=\count266 +\pgfsyssoftpath@bigbuffer@items=\count267 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code. +tex +File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen172 +\pgfmath@count=\count268 +\pgfmath@box=\box55 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet +ric.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod +e.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison +.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari +thmetics.code.tex))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count269 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te +x +File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@picminx=\dimen173 +\pgf@picmaxx=\dimen174 +\pgf@picminy=\dimen175 +\pgf@picmaxy=\dimen176 +\pgf@pathminx=\dimen177 +\pgf@pathmaxx=\dimen178 +\pgf@pathminy=\dimen179 +\pgf@pathmaxy=\dimen180 +\pgf@xx=\dimen181 +\pgf@xy=\dimen182 +\pgf@yx=\dimen183 +\pgf@yy=\dimen184 +\pgf@zx=\dimen185 +\pgf@zy=\dimen186 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct. +code.tex +File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@path@lastx=\dimen187 +\pgf@path@lasty=\dimen188 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code +.tex +File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@shorten@end@additional=\dimen189 +\pgf@shorten@start@additional=\dimen190 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te +x +File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfpic=\box56 +\pgf@hbox=\box57 +\pgf@layerbox@main=\box58 +\pgf@picture@serial@count=\count270 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c +ode.tex +File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgflinewidth=\dimen191 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation +s.code.tex +File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@pt@x=\dimen192 +\pgf@pt@y=\dimen193 +\pgf@pt@temp=\dimen194 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t +ex +File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing +.code.tex +File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te +x +File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowsep=\dimen195 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@max=\dimen196 +\pgf@sys@shading@range@num=\count271 +\pgf@shadingcount=\count272 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code. +tex +File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfexternal@startupbox=\box59 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te +x +File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c +ode.tex +File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code. +tex +File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty +Package: xxcolor 2003/10/24 ver 0.1 +\XC@nummixins=\count273 +\XC@countmixins=\count274 +) +(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO) +)) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO) +) +\@linkdim=\dimen197 +\Hy@linkcounter=\count275 +\Hy@pagecounter=\count276 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count277 +\pdfmajorversion=\count278 +Package hyperref Info: Option `bookmarks' set `true' on input line 4421. +Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421. +Package hyperref Info: Option `implicit' set `false' on input line 4421. +Package hyperref Info: Hyper figures OFF on input line 4547. +Package hyperref Info: Link nesting OFF on input line 4552. +Package hyperref Info: Hyper index ON on input line 4555. +Package hyperref Info: Plain pages OFF on input line 4562. +Package hyperref Info: Backreferencing OFF on input line 4567. +Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals. +Package hyperref Info: Bookmarks ON on input line 4800. +\c@Hy@tempcnt=\count279 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5159. +\XeTeXLinkMargin=\dimen198 + +(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count280 +\Field@Width=\dimen199 +\Fld@charsize=\dimen256 +Package hyperref Info: Hyper figures OFF on input line 6430. +Package hyperref Info: Link nesting OFF on input line 6435. +Package hyperref Info: Hyper index ON on input line 6438. +Package hyperref Info: backreferencing OFF on input line 6445. +Package hyperref Info: Link coloring OFF on input line 6450. +Package hyperref Info: Link coloring with OCG OFF on input line 6455. +Package hyperref Info: PDF/A mode OFF on input line 6460. +LaTeX Info: Redefining \ref on input line 6500. +LaTeX Info: Redefining \pageref on input line 6504. +\Hy@abspage=\count281 + + +Package hyperref Message: Stopped early. + +) +Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO) +) +\Fld@listcount=\count282 +\c@bookmark@seq@number=\count283 + +(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks26 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty +Package: sansmathaccent 2020/01/31 + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty +Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files) +))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty +Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty +\beamer@argscount=\count284 +\beamer@lastskipcover=\skip50 +\beamer@trivlistdepth=\count285 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty +\c@lecture=\count286 +\c@part=\count287 +\c@section=\count288 +\c@subsection=\count289 +\c@subsubsection=\count290 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty +\beamer@framebox=\box60 +\beamer@frametitlebox=\box61 +\beamer@zoombox=\box62 +\beamer@zoomcount=\count291 +\beamer@zoomframecount=\count292 +\beamer@frametextheight=\dimen257 +\c@subsectionslide=\count293 +\beamer@frametopskip=\skip51 +\beamer@framebottomskip=\skip52 +\beamer@frametopskipautobreak=\skip53 +\beamer@framebottomskipautobreak=\skip54 +\beamer@envbody=\toks27 +\framewidth=\dimen258 +\c@framenumber=\count294 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty +\beamer@verbatimfileout=\write4 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty +\beamer@splitbox=\box63 +\beamer@autobreakcount=\count295 +\beamer@autobreaklastheight=\dimen259 +\beamer@frametitletoks=\toks28 +\beamer@framesubtitletoks=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty +\beamer@footins=\box64 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty +\beamer@frameboxcopy=\box65 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty +\beamer@sbttoks=\toks30 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty +\bmb@box=\box66 +\bmb@colorbox=\box67 +\bmb@boxshadow=\box68 +\bmb@boxshadowball=\box69 +\bmb@boxshadowballlarge=\box70 +\bmb@temp=\dimen260 +\bmb@dima=\dimen261 +\bmb@dimb=\dimen262 +\bmb@prevheight=\dimen263 +) +\beamer@blockheadheight=\dimen264 +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks31 +) +\c@figure=\count296 +\c@table=\count297 +\abovecaptionskip=\skip55 +\belowcaptionskip=\skip56 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty +\beamer@section@min@dim=\dimen265 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/01/20 v2.17e AMS math features +\@mathmargin=\skip57 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks32 +\ex@=\dimen266 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen267 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count298 +LaTeX Info: Redefining \frac on input line 227. +\uproot@=\count299 +\leftroot@=\count300 +LaTeX Info: Redefining \overline on input line 389. +\classnum@=\count301 +\DOTSCASE@=\count302 +LaTeX Info: Redefining \ldots on input line 486. +LaTeX Info: Redefining \dots on input line 489. +LaTeX Info: Redefining \cdots on input line 610. +\Mathstrutbox@=\box71 +\strutbox@=\box72 +\big@size=\dimen268 +LaTeX Font Info: Redeclaring font encoding OML on input line 733. +LaTeX Font Info: Redeclaring font encoding OMS on input line 734. +\macc@depth=\count303 +\c@MaxMatrixCols=\count304 +\dotsspace@=\muskip17 +\c@parentequation=\count305 +\dspbrk@lvl=\count306 +\tag@help=\toks33 +\row@=\count307 +\column@=\count308 +\maxfields@=\count309 +\andhelp@=\toks34 +\eqnshift@=\dimen269 +\alignsep@=\dimen270 +\tagshift@=\dimen271 +\tagwidth@=\dimen272 +\totwidth@=\dimen273 +\lineht@=\dimen274 +\@envbody=\toks35 +\multlinegap=\skip58 +\multlinetaggap=\skip59 +\mathdisplay@stack=\toks36 +LaTeX Info: Redefining \[ on input line 2859. +LaTeX Info: Redefining \] on input line 2860. +) +(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2017/10/31 v2.20.4 +\thm@style=\toks37 +\thm@bodyfont=\toks38 +\thm@headfont=\toks39 +\thm@notefont=\toks40 +\thm@headpunct=\toks41 +\thm@preskip=\skip60 +\thm@postskip=\skip61 +\thm@headsep=\skip62 +\dth@everypar=\toks42 +) +\c@theorem=\count310 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty +\beamer@dima=\dimen275 +\beamer@dimb=\dimen276 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file +\inpenc@prehook=\toks43 +\inpenc@posthook=\toks44 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +Package: pgf 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfnodeparttextbox=\box73 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65 +.sty +Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b) +\pgf@nodesepstart=\dimen277 +\pgf@nodesepend=\dimen278 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18 +.sty +Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen279 +\pgffor@skip=\dimen280 +\pgffor@stack=\toks45 +\pgffor@toks=\toks46 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers +.code.tex +File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@plot@mark@count=\count311 +\pgfplotmarksize=\dimen281 +) +\tikz@lastx=\dimen282 +\tikz@lasty=\dimen283 +\tikz@lastxsaved=\dimen284 +\tikz@lastysaved=\dimen285 +\tikz@lastmovetox=\dimen286 +\tikz@lastmovetoy=\dimen287 +\tikzleveldistance=\dimen288 +\tikzsiblingdistance=\dimen289 +\tikz@figbox=\box74 +\tikz@figbox@bg=\box75 +\tikz@tempbox=\box76 +\tikz@tempbox@bg=\box77 +\tikztreelevel=\count312 +\tikznumberofchildren=\count313 +\tikznumberofcurrentchild=\count314 +\tikz@fig@count=\count315 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfmatrixcurrentrow=\count316 +\pgfmatrixcurrentcolumn=\count317 +\pgf@matrix@numberofcolumns=\count318 +) +\tikz@expandcount=\count319 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarycalc.code.tex +File: tikzlibrarycalc.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) (/usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty +Package: svg 2020/01/13 v2.02e (include SVG pictures) + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty +Package: scrbase 2020/01/24 v3.29 KOMA-Script package (KOMA-Script-independent +basics and keyval usage) +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty +Package: shellesc 2019/11/08 v1.0c unified shell escape interface for LaTeX +Package shellesc Info: Unrestricted shell escape enabled on input line 75. +) +(/usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\svg@box=\box78 +\c@svg@param@lastpage=\count320 +\c@svg@param@currpage=\count321 + +(/usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty +Package: ifplatform 2017/10/13 v0.4a Testing for the operating system + +(/usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty +Package: catchfile 2019/12/09 v1.8 Catch the contents of a file (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty +Package: ifluatex 2019/10/25 v1.5 ifluatex legacy package. Use iftex instead. +) +runsystem(uname -s > "6-PythonIntroduction.w18")...executed. + + +(./6-PythonIntroduction.w18) +runsystem(rm -- "6-PythonIntroduction.w18")...executed. + +)) +(/usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty +Package: transparent 2019/11/29 v1.4 Transparency via pdfTeX's color stack (HO) + +) +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode +\l__kernel_color_stack_int=\count322 +\l__pdf_internal_box=\box79 +) +(./6-PythonIntroduction.aux) +\openout1 = `6-PythonIntroduction.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 18. +LaTeX Font Info: ... okay on input line 18. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: custom +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: includehead includefoot +* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt) +* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt) +* \paperwidth=364.19536pt +* \paperheight=273.14662pt +* \textwidth=342.2953pt +* \textheight=244.6939pt +* \oddsidemargin=-61.31996pt +* \evensidemargin=-61.31996pt +* \topmargin=-72.26999pt +* \headheight=14.22636pt +* \headsep=0.0pt +* \topskip=11.0pt +* \footskip=14.22636pt +* \marginparwidth=4.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count323 +\scratchdimen=\dimen290 +\scratchbox=\box80 +\nofMPsegments=\count324 +\nofMParguments=\count325 +\everyMPshowfont=\toks47 +\MPscratchCnt=\count326 +\MPscratchDim=\dimen291 +\MPnumerator=\count327 +\makeMPintoPDFobject=\count328 +\everyMPtoPDFconversion=\toks48 +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +ABD: EveryShipout initializing macros +\AtBeginShipoutBox=\box81 +Package hyperref Info: Link coloring OFF on input line 18. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count329 +) +LaTeX Info: Redefining \ref on input line 18. +LaTeX Info: Redefining \pageref on input line 18. +LaTeX Info: Redefining \nameref on input line 18. + +(./6-PythonIntroduction.out) (./6-PythonIntroduction.out) +\@outlinefile=\write5 +\openout5 = `6-PythonIntroduction.out'. + +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 18. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18. +\symnumbers=\mathgroup6 +\sympureletters=\mathgroup7 +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathit on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 18. +LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 18. +LaTeX Font Info: Overwriting symbol font `numbers' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 18. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 18. +LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 18. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal' +(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 1 +8. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 1 +8. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp +ut line 18. + +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary +-English.dict +Dictionary: translator-basic-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic +tionary-English.dict +Dictionary: translator-bibliography-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict +ionary-English.dict +Dictionary: translator-environment-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar +y-English.dict +Dictionary: translator-months-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona +ry-English.dict +Dictionary: translator-numbers-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona +ry-English.dict +Dictionary: translator-theorem-dictionary, Language: English +) (./6-PythonIntroduction.nav) +<img/unilu.jpg, id=20, 645.16031pt x 578.16pt> +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 22. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>] +LaTeX Font Info: Trying to load font information for U+msa on input line 36. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 36. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp +ut line 36. + +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd +File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma +thkerncmss. +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 36. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[2 + +] +<img/laptop.png, id=81, 1079.03125pt x 1079.03125pt> +File: img/laptop.png Graphic file (type png) +<use img/laptop.png> +Package pdftex.def Info: img/laptop.png used on input line 54. +(pdftex.def) Requested size: 129.47816pt x 129.47816pt. + +Overfull \hbox (9.67273pt too wide) in paragraph at lines 54--54 +[][] + [] + +<img/equal.png, id=82, 401.5pt x 401.5pt> +File: img/equal.png Graphic file (type png) +<use img/equal.png> +Package pdftex.def Info: img/equal.png used on input line 54. +(pdftex.def) Requested size: 48.17792pt x 48.17792pt. + +Overfull \hbox (13.9463pt too wide) in paragraph at lines 54--54 + [] + [] + +<img/calc.jpg, id=84, 144.54pt x 144.54pt> +File: img/calc.jpg Graphic file (type jpg) +<use img/calc.jpg> +Package pdftex.def Info: img/calc.jpg used on input line 54. +(pdftex.def) Requested size: 130.08478pt x 130.08478pt. + +Overfull \hbox (10.27934pt too wide) in paragraph at lines 54--54 +[][] + [] + +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 54. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +[3 + + <./img/laptop.png> <./img/equal.png> <./img/calc.jpg>] +<img/python.png, id=117, 602.25pt x 602.25pt> +File: img/python.png Graphic file (type png) +<use img/python.png> +Package pdftex.def Info: img/python.png used on input line 72. +(pdftex.def) Requested size: 96.36195pt x 96.36195pt. + +Overfull \hbox (10.78813pt too wide) in paragraph at lines 72--72 +[][] + [] + +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 72. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +[4 + + <./img/python.png>] +<img/term.png, id=147, 860.21375pt x 482.80376pt> +File: img/term.png Graphic file (type png) +<use img/term.png> +Package pdftex.def Info: img/term.png used on input line 78. +(pdftex.def) Requested size: 258.06612pt x 144.84224pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 78. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [5 + + <./img/term.png>] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 97. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [6 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 108. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [7 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 119. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [8 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 131. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [9 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 159. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [10 + +] +LaTeX Font Info: Trying to load font information for OMS+cmtt on input line +175. + +(/usr/share/texmf/tex/latex/R/tex/latex/omscmtt.fd +File: omscmtt.fd +) +LaTeX Font Info: Font shape `OMS/cmtt/m/n' in size <10.95> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 175. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 175. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [11 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 192. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [12 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 219. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [13 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 231. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [14 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 246. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[15 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 268. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [16 + +] +<img/geany.png, id=472, 1274.7625pt x 680.5425pt> +File: img/geany.png Graphic file (type png) +<use img/geany.png> +Package pdftex.def Info: img/geany.png used on input line 272. +(pdftex.def) Requested size: 318.68985pt x 170.13521pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 272. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [17 + + <./img/geany.png>] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 282. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [18 + +] +\openout4 = `6-PythonIntroduction.vrb'. + + (./6-PythonIntroduction.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 322. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [19 + +] +\openout4 = `6-PythonIntroduction.vrb'. + + +(./6-PythonIntroduction.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 357. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [20 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 374. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [21 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 393. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [22 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 413. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [23 + +] +Package svg Info: Last page of `./svg-inkscape/sage_svg-tex.pdf' is 1 on input +line 429. + +(./svg-inkscape/sage_svg-tex.pdf_tex +<./svg-inkscape/sage_svg-tex.pdf, id=660, page=1, 376.40625pt x 98.51555pt> +File: ./svg-inkscape/sage_svg-tex.pdf Graphic file (type pdf) +<use ./svg-inkscape/sage_svg-tex.pdf, page 1> +Package pdftex.def Info: ./svg-inkscape/sage_svg-tex.pdf , page1 used on input +line 56. +(pdftex.def) Requested size: 188.20313pt x 49.25914pt. +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 429. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [24 + + <./svg-inkscape/sage_svg-tex.pdf>] +Overfull \hbox (7.7703pt too wide) in paragraph at lines 452--452 +[][] + [] + +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 452. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. +[25 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 462. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [26 + +] +\tf@nav=\write6 +\openout6 = `6-PythonIntroduction.nav'. + +\tf@toc=\write7 +\openout7 = `6-PythonIntroduction.toc'. + +\tf@snm=\write8 +\openout8 = `6-PythonIntroduction.snm'. + +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 465. +Package atveryend Info: Empty hook `AfterLastShipout' on input line 465. + (./6-PythonIntroduction.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 465. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 465. +Package rerunfilecheck Info: File `6-PythonIntroduction.out' has not changed. +(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. + ) +Here is how much of TeX's memory you used: + 22094 strings out of 481239 + 437179 string characters out of 5920377 + 700483 words of memory out of 5000000 + 36741 multiletter control sequences out of 15000+600000 + 544835 words of font info for 71 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 58i,15n,67p,804b,1064s stack positions out of 5000i,500n,10000p,200000b,80000s +</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmitt10.pfb></u +sr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/sha +re/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/tex +live/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texlive/t +exmf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/texmf-di +st/fonts/type1/public/amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-dist/f +onts/type1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/fonts/ +type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/ +public/amsfonts/cm/cmtt10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public +/amsfonts/cm/cmtt12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfo +nts/cm/cmtt8.pfb> +Output written on 6-PythonIntroduction.pdf (26 pages, 771892 bytes). +PDF statistics: + 851 PDF objects out of 1000 (max. 8388607) + 762 compressed objects within 8 object streams + 53 named destinations out of 1000 (max. 500000) + 118 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture4/slides/6-PythonIntroduction.nav b/src/Lecture4/slides/6-PythonIntroduction.nav @@ -0,0 +1,57 @@ +\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}} +\headcommand {\beamer@framepages {1}{1}} +\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}} +\headcommand {\beamer@framepages {2}{2}} +\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}} +\headcommand {\beamer@framepages {3}{3}} +\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}} +\headcommand {\beamer@framepages {4}{4}} +\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}} +\headcommand {\beamer@framepages {5}{5}} +\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}} +\headcommand {\beamer@framepages {6}{6}} +\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}} +\headcommand {\beamer@framepages {7}{7}} +\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}} +\headcommand {\beamer@framepages {8}{8}} +\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}} +\headcommand {\beamer@framepages {9}{9}} +\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}} +\headcommand {\beamer@framepages {10}{10}} +\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}} +\headcommand {\beamer@framepages {11}{11}} +\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}} +\headcommand {\beamer@framepages {12}{12}} +\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}} +\headcommand {\beamer@framepages {13}{13}} +\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}} +\headcommand {\beamer@framepages {14}{14}} +\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}} +\headcommand {\beamer@framepages {15}{15}} +\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}} +\headcommand {\beamer@framepages {16}{16}} +\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}} +\headcommand {\beamer@framepages {17}{17}} +\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}} +\headcommand {\beamer@framepages {18}{18}} +\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}} +\headcommand {\beamer@framepages {19}{19}} +\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}} +\headcommand {\beamer@framepages {20}{20}} +\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}} +\headcommand {\beamer@framepages {21}{21}} +\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}} +\headcommand {\beamer@framepages {22}{22}} +\headcommand {\slideentry {0}{0}{23}{23/23}{}{0}} +\headcommand {\beamer@framepages {23}{23}} +\headcommand {\slideentry {0}{0}{24}{24/24}{}{0}} +\headcommand {\beamer@framepages {24}{24}} +\headcommand {\slideentry {0}{0}{25}{25/25}{}{0}} +\headcommand {\beamer@framepages {25}{25}} +\headcommand {\slideentry {0}{0}{26}{26/26}{}{0}} +\headcommand {\beamer@framepages {26}{26}} +\headcommand {\beamer@partpages {1}{26}} +\headcommand {\beamer@subsectionpages {1}{26}} +\headcommand {\beamer@sectionpages {1}{26}} +\headcommand {\beamer@documentpages {26}} +\headcommand {\gdef \inserttotalframenumber {26}} diff --git a/src/Lecture4/slides/6-PythonIntroduction.out b/src/Lecture4/slides/6-PythonIntroduction.out diff --git a/src/Lecture4/slides/6-PythonIntroduction.pdf 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 diff --git a/src/Lecture4/slides/6-PythonIntroduction.tex b/src/Lecture4/slides/6-PythonIntroduction.tex @@ -0,0 +1,466 @@ +\documentclass[11pt]{beamer} +\usetheme{Madrid} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} + +\usepackage{tikz} +\usetikzlibrary{calc} +\usepackage{svg} + +\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto} +\title[Python Intro and a bit of Sage]% +{A Practical Introduction to Python (and a bit of Sage)} +\logo{\includegraphics[scale=0.1]{img/unilu.jpg}} +%\institute{University of Luxembourg} + +\date{2021-04-02} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + +\begin{frame}{Second part - schedule} + \begin{tabular}{l|c|c|l} + \textbf{Date} & \textbf{Topics} & \textbf{Homework} & \textbf{Deadline} \\ + \hline + April 2 & Python ``review'', a bit of Sage & (see March 26) & April 18 \\ + \hline + April 23 & Sage: Algebra and Crypto & Homework 3 & May 9 \\ + \hline + May 7 & Sage: Analysis and Statistics & Homework 4 & May 30 \\ + \hline + May 21 & Fast code, other software & + \end{tabular} +\end{frame} + + +\begin{frame}{What is programming?} + \begin{columns} + \column{0.35\textwidth} + \includegraphics[scale=0.12]{img/laptop.png} + \column{0.1\textwidth} + \begin{center}\includegraphics[scale=0.12]{img/equal.png}\end{center} + \column{0.35\textwidth} + \includegraphics[scale=0.9]{img/calc.jpg} + \end{columns} + \begin{itemize} + \item Software (apps): commands written in a \emph{programming language} + \item Programming language: mix of English and symbols + \item The code is \emph{compiled} to machine language (C, C++) or\\ + \emph{interpreted} by some software in the middle (Python) + \end{itemize} +\end{frame} + + +\begin{frame}{Python} + \begin{columns} + \column{0.7\textwidth} + \url{https://www.python.org} + + \vspace{0.3cm} + \begin{itemize} + \item Interpreted: slower than C, usable interactively + \item Simple syntax, easy to learn + \item Very popular + \item Sage is based on Python + \end{itemize} + \column{0.25\textwidth} + \includegraphics[scale=0.16]{img/python.png} + \end{columns} +\end{frame} + +\begin{frame}{The interpreter - Python as a calculator} + \begin{center} + \includegraphics[scale=0.3]{img/term.png} + \end{center} +\end{frame} + +\begin{frame}{The interpreter - Python as a calculator} + \url{https://www.python.org/shell} + + \vspace{0.3cm} + \begin{itemize} + \item Each line executed as you enter it, result is printed + \item Usual math operations work: try them! + \begin{center} + \texttt{a+b, a-b, a*b, a/b}\\ + \texttt{a**b (power), a//b (integer division), a\%b (remainder)} + \end{center} + \item More math functions: + \begin{center} \begin{tabular}{l} + \texttt{import math} \\ + \texttt{math.sqrt(3)} + \end{tabular} \end{center} + \end{itemize} +\end{frame} + + +\begin{frame}{Help!} + \begin{itemize} + \item Type \texttt{help()} for interactive help + \item Try \texttt{help("math")} and \texttt{help("import")} + \item What does + \begin{center} \texttt{from math import *} \end{center} + do? + \end{itemize} +\end{frame} + +\begin{frame}{Variables} + \texttt{variable\_name = value \qquad \# This is an assignment} + + \vspace{0.3cm} + \begin{itemize} + \item Save results, use them later + \item \texttt{variable\_name}: combination of letters, numbers, underscores + \item \texttt{=} always means \emph{assignment}, never \emph{equality} + \end{itemize} +\end{frame} + +\begin{frame}{Types} + \texttt{type(variable\_name) \qquad \# Get the type of a variable} + + \vspace{0.3cm} + \begin{itemize} + %\item Tells the computer how to read a variable + \item In other languages you must specify the type of a variable + \item Python figures out automatically (\emph{dynamic typing}) + \item Each type allows different operations + \end{itemize} +\end{frame} + + +\begin{frame}{Other types: Boolean and String} + \texttt{my\_bool = True} + + \texttt{s1 = "hello!" \qquad \# Same as 'hello!'} + + \vspace{0.3cm} + \begin{itemize} + \item \texttt{bool}: \texttt{True} or \texttt{False} + \begin{itemize} + \item Operations on \texttt{bool}: + \texttt{and}, \texttt{or}, \texttt{not} + \item Operations with boolean result: \texttt{==}, \texttt{!=}, + \texttt{>}, \texttt{<}, \texttt{>=}, \texttt{<=} + \end{itemize} + \item \texttt{str}: a string of characters + \begin{itemize} + \item Useful operations: + + \begin{tabular}{ll} + \texttt{len({\bf str})} & \texttt{\# Length, integer value} \\ + \texttt{{\bf str} + {\bf str}} & \texttt{\# Concatenation} \\ + \texttt{{\bf int} * {\bf str}} & \texttt{\# Repetition} + \end{tabular} + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame}{Lists and sets} + %\texttt{(2.5, True, "hello") \qquad \# Tuple} + + \texttt{[2.5, True, "hello"] \qquad \# List} + + \texttt{\{2.5, True, "hello"\} \qquad \# Set} + + \vspace{0.3cm} + \begin{itemize} + %\item Different collections of objects + %\item Tuple: immutable + \item Lists: keep order and duplicates + \item Sets: disregard order and duplicates, allow set operations + \end{itemize} +\end{frame} + + +\begin{frame}{Lists and sets} + Things in common (\emph{\texttt{A} is a list or a set}): + + \vspace{0.3cm} + \begin{itemize} + \item \texttt{len(A)}: number of elements (\texttt{\bf int}) + \item \texttt{x in A}: check if \texttt{x} is in \texttt{A} + (\texttt{\bf bool}) + \item If \texttt{A} contains numbers: \texttt{max(A)}, \texttt{min(A)}, + \texttt{sum(A)} + \end{itemize} + + \vspace{0.3cm} + Pass from one type to the other: \texttt{set(A)} and \texttt{list(A)} +\end{frame} + +\begin{frame}{List (and set) comprehension} + \texttt{[x**2 {\bf for} x {\bf in} [-1,4,1,0] {\bf if} x < 3] + \quad\# Result: [1,1,0]} + + \texttt{\{x**2 {\bf for} x {\bf in} [-1,4,1,0] {\bf if} x < 3\} + \quad\# Result: \{0,1\}} + + \vspace{0.3cm} + \begin{itemize} + \item Mathematical way to define lists and sets + \item Complete syntax: + + \vspace{0.2cm} + \texttt{[f(x,y,\dots) {\bf for} x {\bf in} L {\bf for} y {\bf in} M + \dots \quad {\bf if} cond(x,y,\dots)]} + + \vspace{0.2cm} + \begin{itemize} + \item Use as many variables \texttt{x, y, \dots} as you want + \item \texttt{L, M, \dots} are lists or sets or other collections + \item \texttt{f(x,y,\dots)} is any expression depending on the + variables + \item \texttt{cond(x,y,\dots)} has Boolean value + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame}{Lists: access elements and sublists} + \begin{tabular}{ll} + \texttt{A[i]} & + \texttt{\# i-th element of A ($i\in \{0,\dots,\texttt{len(A)}-1\}$)} \\ + \texttt{A[i] = value} & \texttt{\# Change i-th element of A} \\ + \texttt{A[i:j:k]} & \texttt{\# Sublist from A[i] to A[j] with step k} \\ + \texttt{A[i:j]} & \texttt{\# Same as A[i:j:1]} \\ + \texttt{A[i:]} & \texttt{\# Same as A[i:len(A):1]} \\ + \texttt{A[:j]} & \texttt{\# Same as A[0:j:1]} + \end{tabular} +\end{frame} + +\begin{frame}{List operations} + \begin{tabular}{ll} + \texttt{A.append(x)} & \texttt{\# Append x to A ({\bf change A})} \\ + \texttt{A.insert(i,x)} & + \texttt{\# Insert x in position i ({\bf change A})} \\ + \texttt{del A[i]} & \texttt{\# Remove i-th element of A ({\bf change A})}\\ + \end{tabular} + + \vspace{1cm} + \begin{tabular}{ll} + \texttt{A+B} & \texttt{\# Concatenation of A and B ({\bf list})} \\ + \texttt{A*n} & \texttt{\# Repetition of A ({\bf list})} \\ + \end{tabular} +\end{frame} + +\begin{frame}{Set operations} + \begin{tabular}{ll} + \texttt{A.add(x)} & \texttt{\# Add x to A ({\bf change A})} \\ + \texttt{A.remove(x)} & \texttt{\# Remove x from A ({\bf change A})}\\ + \end{tabular} + + \vspace{0.5cm} + \begin{tabular}{ll} + \texttt{A < B} (or \texttt{A <= B}) & + \texttt{\# A contained in (or equal to) B ({\bf bool})} \\ + \texttt{A > B} (or \texttt{A >= B}) & + \texttt{\# A containes (or is equal to) B ({\bf bool})} \\ + \end{tabular} + + \vspace{0.5cm} + \begin{tabular}{ll} + \texttt{A | B} & \texttt{\# Union ({\bf set})} \\ + \texttt{A \& B} & \texttt{\# Intersection ({\bf set})}\\ + \texttt{A - B} & \texttt{\# Set difference ({\bf set})} \\ + \end{tabular} +\end{frame} + +\begin{frame}{Writing more complex programs} + \begin{center}\includegraphics[scale=0.25]{img/geany.png}\end{center} +\end{frame} + +\begin{frame}{Non-interactive Python} + \begin{itemize} + \item You can write a file (for example with \url{https://www.geany.org}) + \item Output results with \texttt{print("string", or, other, values)} + \item Get input (\texttt{str}) with \texttt{x = input("Prompt: ")}, + convert with \texttt{int(x)} or \texttt{float(x)}\dots + \item Blocks of code: use \emph{indentation} (see next slides) + \end{itemize} +\end{frame} + +\begin{frame}[fragile]{\texttt{if} statement} + \begin{columns} + \column{0.45\textwidth} + \texttt{{\bf if} \emph{condition}:} + + \texttt{\qquad instruction1} + + \texttt{\qquad instruction2} + + \texttt{\qquad \dots} + + \texttt{{\bf else}: \# This is optional} + + \texttt{\qquad other inst} + \column{0.55\textwidth} + \begin{tikzpicture} + \tikzstyle{s} = [rectangle, rounded corners, text centered, + draw=black, fill=red!30] + \tikzstyle{p} = [rectangle, text centered, draw=black, fill=orange!30] + \tikzstyle{d} = [rectangle, text centered, draw=black, fill=green!30] + + \node(start) [s] {Start}; + \node(cond) [d, below of=start] {\texttt{\emph{condition}}?}; + \node(inst1) [p, right of=cond, xshift=2.7cm] {\texttt{instruction1}}; + \node(inst2) [p, below of=inst1] {\texttt{instruction2}}; + \node(dots) [p, below of=inst2] {\texttt{\dots}}; + \node(other) [p, below of=cond, yshift=-0.5cm] {\texttt{other inst}}; + \node(end) [s, below of=other, yshift=-0.5cm] {End}; + + \draw[->] (start) -- (cond); + \draw[->] (cond) -- node[anchor=south] {\texttt{True}} (inst1); + \draw[->] (inst1) -- (inst2); + \draw[->] (inst2) -- (dots); + \draw[->] (cond) -- node[anchor=east] {\texttt{False}} (other); + \draw[->] (dots) |- (end); + \draw[->] (other) -- (end); + \end{tikzpicture} + \end{columns} +\end{frame} + + +\begin{frame}[fragile]{\texttt{while} loop} + \begin{columns} + \column{0.45\textwidth} + \texttt{{\bf while} \emph{condition}:} + + \texttt{\qquad instruction1} + + \texttt{\qquad instruction2} + + \texttt{\qquad \dots} + \column{0.55\textwidth} + \begin{tikzpicture} + \tikzstyle{s} = [rectangle, rounded corners, text centered, + draw=black, fill=red!30] + \tikzstyle{p} = [rectangle, text centered, draw=black, fill=orange!30] + \tikzstyle{d} = [rectangle, text centered, draw=black, fill=green!30] + + \node(start) [s] {Start}; + \node(cond) [d, below of=start] {\texttt{\emph{condition}}?}; + \node(inst1) [p, right of=cond, xshift=2.7cm] {\texttt{instruction1}}; + \node(inst2) [p, below of=inst1] {\texttt{instruction2}}; + \node(dots) [p, below of=inst2] {\texttt{\dots}}; + \node(end) [s, below of=other, yshift=-0.5cm] {End}; + + \draw[->] (start) -- (cond); + \draw[->] (cond) -- node[anchor=south] {\texttt{True}} (inst1); + \draw[->] (inst1) -- (inst2); + \draw[->] (inst2) -- (dots); + \draw[->] (cond) -- node[anchor=east] {\texttt{False}} (end); + \draw[->] (dots) -| ($(cond.south)+(0.4,0)$); + \end{tikzpicture} + \end{columns} +\end{frame} + +\begin{frame}{\texttt{for} loop} + \texttt{{\bf for} i {\bf in} A:} + + \texttt{\qquad instruction1} + + \texttt{\qquad instruction2} + + \texttt{\qquad \dots} + + \vspace{0.3cm} + \begin{itemize} + \item Repeats instructions as \texttt{i} varies in \texttt{A} + \item \texttt{A} can be list, set or other collection + \item Example: \texttt{A} can be \texttt{range(\emph{a,b,step})} + \end{itemize} +\end{frame} + + +\begin{frame}{Functions} + \texttt{{\bf def} f(x, y, \dots): } + + \texttt{\qquad instruction1} + + \texttt{\qquad instruction2} + + \texttt{\qquad \dots} + + \texttt{\qquad {\bf return} some\_value} + + \vspace{0.3cm} + \begin{itemize} + \item Useful to divide programs into ``pieces'' + \item The result of \texttt{f(x,y,\dots)} is given by \texttt{return \dots} + \end{itemize} +\end{frame} + +\begin{frame}{An example of function (with recursion)} + \texttt{def fibonacci(n):} + + \texttt{\qquad if n == 0:} + + \texttt{\qquad \qquad return 0} + + \texttt{\qquad if n == 1:} + + \texttt{\qquad \qquad return 1} + + \texttt{\qquad return fibonacci(n-1) + fibonacci(n-2)} + + \vspace{0.3cm} + \begin{itemize} + \item Elegant, but slow (in this case) + \item Can get stuck in infinite loop: when? + \end{itemize} +\end{frame} + +\begin{frame}{Sage} + \begin{center} + \includesvg[scale=0.5]{img/sage} + + \url{https://www.sagemath.org} + \end{center} + + \vspace{0.3cm} + \begin{itemize} + \item Mathematical software, uses Python as a language + \item Use it interactively or with Jupyter notebook + \item Try it online: \url{https://sagecell.sagemath.org} or + \url{https://cocalc.com/app} + \end{itemize} +\end{frame} + +\begin{frame}{Differences with Python} + \begin{tabular}{l|l} + \textbf{Python} & \textbf{Sage} \\ + \texttt{{\color{gray}>>>} {\color{blue}type(5)}} & + \texttt{{\color{gray}sage:} {\color{blue}type(5)}} \\ + \texttt{<class 'int'>} & \texttt{<class 'sage.rings.integer.Integer'>} \\ + \texttt{{\color{gray}>>>} {\color{blue}5/2}} & + \texttt{{\color{gray}sage:} {\color{blue}5/2}} \\ + \texttt{2.5} & \texttt{5/2} \\ + \texttt{{\color{gray}>>>} {\color{blue}type(5/2)}} & + \texttt{{\color{gray}sage:} {\color{blue}type(5/2)}} \\ + \texttt{<class 'float'>} & + \texttt{<class 'sage.rings.rational.Rational'>} \\ + \texttt{{\color{gray}>>>} {\color{blue}type(2.5)}} & + \texttt{{\color{gray}sage:} {\color{blue}type(2.5)}} \\ + \texttt{<class 'float'>} & + \texttt{<class 'sage.rings.real\_mpfr.RealLiteral'>} \\ + \texttt{{\color{gray}>>>} {\color{blue}5**3}} & + \texttt{{\color{gray}sage:} {\color{blue}5\^{}3}} \\ + \texttt{125} & \texttt{125} + \end{tabular} +\end{frame} + +\begin{frame}{Sage Documentation} + \begin{itemize} + \item Tutorial (guided examples): type \texttt{tutorial()} or visit + \url{https://doc.sagemath.org/html/en/tutorial} + \item \texttt{help()}: works as in Python + \item Reference manual (detailed technical information): + \url{https://doc.sagemath.org/html/en/reference} + \end{itemize} +\end{frame} + + +\end{document} + diff --git a/src/Lecture4/slides/6-PythonIntroduction.toc b/src/Lecture4/slides/6-PythonIntroduction.toc diff --git a/src/Lecture4/slides/6-PythonIntroduction.vrb b/src/Lecture4/slides/6-PythonIntroduction.vrb @@ -0,0 +1,32 @@ +\frametitle{\texttt {while} loop} +\begin{columns} + \column{0.45\textwidth} + \texttt{{\bf while} \emph{condition}:} + + \texttt{\qquad instruction1} + + \texttt{\qquad instruction2} + + \texttt{\qquad \dots} + \column{0.55\textwidth} + \begin{tikzpicture} + \tikzstyle{s} = [rectangle, rounded corners, text centered, + draw=black, fill=red!30] + \tikzstyle{p} = [rectangle, text centered, draw=black, fill=orange!30] + \tikzstyle{d} = [rectangle, text centered, draw=black, fill=green!30] + + \node(start) [s] {Start}; + \node(cond) [d, below of=start] {\texttt{\emph{condition}}?}; + \node(inst1) [p, right of=cond, xshift=2.7cm] {\texttt{instruction1}}; + \node(inst2) [p, below of=inst1] {\texttt{instruction2}}; + \node(dots) [p, below of=inst2] {\texttt{\dots}}; + \node(end) [s, below of=other, yshift=-0.5cm] {End}; + + \draw[->] (start) -- (cond); + \draw[->] (cond) -- node[anchor=south] {\texttt{True}} (inst1); + \draw[->] (inst1) -- (inst2); + \draw[->] (inst2) -- (dots); + \draw[->] (cond) -- node[anchor=east] {\texttt{False}} (end); + \draw[->] (dots) -| ($(cond.south)+(0.4,0)$); + \end{tikzpicture} + \end{columns} diff --git a/src/Lecture4/slides/img/calc.jpg 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 Binary files differ. diff --git a/src/Lecture4/slides/img/geany.png 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 Binary files differ. diff --git a/src/Lecture4/slides/img/python.png 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 @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<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"> + <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"/> + <defs id="defs4"/> + <metadata id="metadata7"> + <rdf:RDF> + <cc:Work rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + <dc:title/> + </cc:Work> + </rdf:RDF> + </metadata> + <g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1" transform="translate(-100.8642,-253.78876)"> + <g id="g3993"> + <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"/> + <g id="g3432" transform="matrix(0.7759764,0,0,0.7759764,-1035.2282,-1486.6449)"> + <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"/> + <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)"/> + <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"/> + <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"/> + <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)"/> + <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"/> + <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)"/> + <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"/> + <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)"/> + <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"/> + <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)"/> + <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)"/> + <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"/> + <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"/> + <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)"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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)"/> + <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"/> + <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"/> + <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"/> + <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"/> + </g> + <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"/> + <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"/> + </g> + </g> + <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)"/> + <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)"/> +</svg> +\ No newline at end of file diff --git a/src/Lecture4/slides/img/term.png 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 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 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 @@ -0,0 +1,58 @@ +%% Creator: Inkscape 1.0.2 (e86c870879, 2021-01-15), www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'sage_svg-tex.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{<filename>.pdf_tex} +%% instead of +%% \includegraphics{<filename>.pdf} +%% To scale the image, write +%% \def\svgwidth{<desired width>} +%% \input{<filename>.pdf_tex} +%% instead of +%% \includegraphics[width=<desired width>]{<filename>.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{<path to file>}{<filename>.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{<path to file>/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \newcommand*\fsize{\dimexpr\f@size pt\relax}% + \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{375bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,0.26172667)% + \lineheight{1}% + \setlength\tabcolsep{0pt}% + \put(0,0){\includegraphics[width=\unitlength,page=1]{sage_svg-tex.pdf}}% + \end{picture}% +\endgroup% diff --git a/src/Lecture5/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb b/src/Lecture5/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb @@ -0,0 +1,1067 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "# The Jupyter Notebook\n", + "**Reference:** [[1](https://jupyter.org/documentation)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "## Cells\n", + "\n", + "The notebook contains one or more *interactive cells* that you can run, like this one below:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1/27" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "2+2\n", + "2/5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2/5" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Exercise: modify this cell to use the print() command\n", + "2+2\n", + "2/5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Markdown\n", + "\n", + "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n", + "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n", + "\n", + "You can also include some LaTeX code in Markdown cells, with the usual `\\(` and `\\)`, or even more complex things:\n", + "\n", + "\\begin{align*}\n", + "\\frac{(x+y)^2}{x+1} = \\frac{x^2+y^2}{x+1}\n", + "\\end{align*}\n", + "\n", + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[x == -sqrt(6) - 1, x == sqrt(6) - 1]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = x^2 + 2*x - 5 == 0\n", + "solve(f,x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mathematical variables\n", + "\n", + "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", + "\n", + "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[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]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('y')\n", + "solve(y^2 + (x+1)*y - 2 == 0, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try removing the first line in the cell above and see what error you get!\n", + "\n", + "Here is another example:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[x == -1/2*a - 1/2*sqrt(a^2 - 4*b), x == -1/2*a + 1/2*sqrt(a^2 - 4*b)]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('a', 'b')\n", + "f = x^2+a*x+b\n", + "solve(f,x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "e^(pi*I)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will study symbolic expressions more in detail next time, in the context of calculus/analysis." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic rings and fields\n", + "\n", + "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n", + "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n", + "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n", + "\n", + "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", + "\n", + "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n", + "\n", + "|Mathematical object|Math symbol|Sage name|\n", + "|------------------:|:---------:|:--------|\n", + "|Integers|$\\mathbb Z$|`ZZ`|\n", + "|Rational numbers|$\\mathbb Q$|`QQ`|\n", + "|Real numbers|$\\mathbb R$|`RR`|\n", + "|Complex numbers|$\\mathbb C$|`CC`|\n", + "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n", + "|Finite fields|$\\mathbb F_p$|GF(p)|\n", + "|$\\dots$|$\\dots$|$\\dots$|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parents and coercion\n", + "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Rational Field" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Edit this cell to find out the type of other objects that we used\n", + "parent(3/5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Symbolic Ring\n", + "Integer Ring\n" + ] + } + ], + "source": [ + "minus_one = e^(pi*I)\n", + "minus_one_coerced = ZZ(e^(pi*I))\n", + "print(parent(minus_one))\n", + "print(parent(minus_one_coerced))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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*." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "3.00000000000000\n" + ] + } + ], + "source": [ + "print(QQ(3))\n", + "print(RR(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also choose the precision of this approximation using the alternative name `RealField`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Real Field with 53 bits of precision\n", + "Real Field with 1000 bits of precision\n" + ] + } + ], + "source": [ + "print(RR)\n", + "print(RealField(prec=1000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Polynomial rings\n", + "\n", + "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n", + "\n", + "If you want to work with polynomials over a certain ring it is better to use this specific construction." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of precision" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Alternative notation: polring.<x,y,z> = PolynomialRing(RR)\n", + "polring.<x,y,z> = RR[]\n", + "polring" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "## Operations on polynomials\n", + "\n", + "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", + "\n", + "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n", + "\n", + "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x + 1\n", + "-4\n", + "(x^2 + 2*x - 3)/(x + 1)\n" + ] + } + ], + "source": [ + "polring.<x> = QQ[]\n", + "p = x^2 + 2*x - 3 # Always remember * for multiplication\n", + "q = p // (x+1)\n", + "r = p % (x+1)\n", + "f = p / (x+1)\n", + "print(q)\n", + "print(r)\n", + "print(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n", + "\n", + "**Remark.** Notice how the result can change substantially if you change the base ring.\n", + "\n", + "**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))`." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(t + 1) * (t^2 - 3) * (t^2 + 1)\n", + "[(-1, 1)]\n" + ] + }, + { + "data": { + "text/plain": [ + "(y + 1) * x" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring_onevar.<t> = QQ[]\n", + "\n", + "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n", + "print(factor(f))\n", + "print(f.roots()) # Result: list of pairs (root,multiplicity)\n", + "\n", + "polring_manyvar.<x,y,z> = QQ[]\n", + "factor(x*y+x)\n", + "\n", + "# The following line gives an error, because the polynomial\n", + "# is understood to possibly have many variables:\n", + "#(x^2-1).roots()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Matrices and vectors\n", + "\n", + "**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", + "\n", + "In Sage you can easily manipulate matrices and vectors" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 0 0 1]\n", + "[ 4 -3 22/7] \n", + "\n", + "[1/2 0 0]\n", + "[ 7 0 0]\n", + "[ 1 1 1] \n", + "\n", + "(3/2, 21, 6) \n", + "\n", + "[ -7/2 -10 80/7]\n", + "[ 17 -4 15/7]\n", + "[ 241/7 -18/7 869/49] \n", + "\n", + "Rank of A = 3\n", + "Rank of B = 2\n" + ] + } + ], + "source": [ + "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n", + "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n", + "v = vector([3,4,-1])\n", + "\n", + "print(A, \"\\n\") # \\n just means \"newline\"\n", + "print(B, \"\\n\")\n", + "print(B*v, \"\\n\")\n", + "print(A^2 + 2*B - A*B, \"\\n\")\n", + "\n", + "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n", + "print(\"Rank of B =\", rank(B))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "As for polynomials, you can specify where a matrix or a vector lives" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "M = matrix(CC, [[0,1],[1,0]])\n", + "parent(M)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n", + "\n", + "**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$." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.289916349448506, 0.0241596957873755)" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n", + "v = vector(RR, [3,0])\n", + "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + "(-0.3722813232690144?, Vector space of degree 2 and dimension 1 over Algebraic Field\n", + "User basis matrix:\n", + "[ 1 -0.6861406616345072?]),\n", + "(5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic Field\n", + "User basis matrix:\n", + "[ 1 2.186140661634508?])\n", + "]" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix(QQ, [[1,2],[3,4]])\n", + "A.eigenspaces_right() # Also: A.eigenvalues(), A.eigenvectors_right()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-14 2 0 -1 1 -2 -1]\n", + "[ 0 -8 0 9 -2 11 1]\n", + "[ 0 3 1 -1 1 1 221]\n", + "[ -1 2 1 -25 -10 4 0]\n", + "[ -3 0 0 2 16 -1 -2]\n", + "[ 1 -3 3 -41 1 0 0]\n", + "[ -2 1 0 0 -6 2 12] \n", + "\n", + "[ 0 9 -2]\n", + "[ 1 -1 1] \n", + "\n", + "[-14 2 0 -1 1 -2 -1] \n", + "\n", + "[-14 2 0 -1 1]\n", + "[ 1 -3 3 -41 1]\n", + "[ 0 3 1 -1 1]\n" + ] + } + ], + "source": [ + "A = MatrixSpace(ZZ, 7).random_element()\n", + "print(A, \"\\n\")\n", + "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n", + "print(A[0,0:], \"\\n\") # First row, all columns\n", + "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\\begin{align*}\n", + " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n", + "\\end{align*}\n", + "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$." + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "def my_det(A):\n", + " if not A.is_square():\n", + " print(\"Error: matrix is not square\")\n", + " \n", + " n = A.nrows() # size of the matrix\n", + " \n", + " # Continue from here!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Number Theory\n", + "\n", + "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n", + "\n", + "Sage includes a large library of functions for computing with the integers, see the link above." + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3^2 * 3607 * 3803\n", + "True\n", + "True\n", + "619703040\n", + "9\n", + "13548070123626141\n" + ] + } + ], + "source": [ + "n = 123456789\n", + "m = 987654321\n", + "p = 3607\n", + "\n", + "print(factor(n))\n", + "print(is_prime(p))\n", + "print(p.divides(n))\n", + "print(euler_phi(m))\n", + "print(gcd(n, m))\n", + "print(lcm(n, m))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Primes\n", + "\n", + "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Set of all prime numbers: 2, 3, 5, 7, ...\n", + "31 15485867\n", + "47\n", + "[79, 83, 89, 97]\n" + ] + } + ], + "source": [ + "PP = Primes()\n", + "print(PP)\n", + "print(PP[10], PP[10^6])\n", + "print(PP.next(44))\n", + "\n", + "First_Thousand_Primes = PP[0:1000]\n", + "print([p for p in First_Thousand_Primes if p < 100 and p > 75])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Chinese remainder theorem (CRT)\n", + "\n", + "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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a \\pmod n\\\\\n", + " x \\equiv b \\pmod m\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "74306 2 798\n" + ] + } + ], + "source": [ + "a = 2\n", + "b = -1\n", + "n = 172\n", + "m = 799\n", + "\n", + "if gcd(n,m) != 1:\n", + " print(\"The numbers are not comprime, you will get an error!\")\n", + " \n", + "x = crt(a, b, n, m)\n", + "print(x, x%n, x%m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a_0 \\pmod n_0\\\\\n", + " x \\equiv a_1 \\pmod n_1\\\\\n", + " \\dots \\\\\n", + " x \\equiv a_k \\pmod n_k\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n", + "*Hint: start by running the command `help(crt)`*" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "#help(crt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cryptography: RSA\n", + "\n", + "[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", + "\n", + "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", + "\n", + "## Public-key cryptography\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "Let's see how we can do this in practice, using number theory!\n", + "\n", + "## RSA\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True True False\n" + ] + } + ], + "source": [ + "p = 100003100019100043100057100069\n", + "q = 100144655312449572059845328443\n", + "n = p*q\n", + "print(is_prime(p), is_prime(q), is_prime(p*q))\n", + "\n", + "# Use the command below to see how long it takes\n", + "#timeit(\"factor(n)\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "Of course, she does all of this using Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(419199544978969, 235530823946467, 80799425863927)" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def two_large_primes():\n", + " p, q = 0, 0\n", + " # We make sure that they are different\n", + " while p == q:\n", + " p = Primes()[randint(10^6, 2*10^6)]\n", + " q = Primes()[randint(10^6, 2*10^6)]\n", + " return p, q\n", + "\n", + "def random_unit_mod(N):\n", + " R = Integers(N)\n", + " d = R(0)\n", + " # We make sure that it is invertible\n", + " while not d.is_unit():\n", + " d = R.random_element()\n", + " return d\n", + "\n", + "def Alice_generate_keys():\n", + " p, q = two_large_primes()\n", + " n = p*q\n", + " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n", + " \n", + " d = random_unit_mod(phi_n)\n", + " e = d^-1\n", + " return n, d, e\n", + "\n", + "Alice_generate_keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "149461597163501" + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Bob_encrypt(m, n, d):\n", + " R = Integers(n)\n", + " return R(m)^d # Assume that n is large enough\n", + " \n", + "Bob_encrypt(42424242, 419199544978969, 235530823946467)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "42424242" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Alice_decrypt(m_encrypted, n, e):\n", + " R = Integers(n)\n", + " return R(m_encrypted)^e\n", + "\n", + "Alice_decrypt(149461597163501, 419199544978969, 80799425863927)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture5/live/7-SageAlgebra-modified+solutions.ipynb b/src/Lecture5/live/7-SageAlgebra-modified+solutions.ipynb @@ -0,0 +1,1099 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "# The Jupyter Notebook\n", + "**Reference:** [[1](https://jupyter.org/documentation)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "## Cells\n", + "\n", + "The notebook contains one or more *interactive cells* that you can run, like this one below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: modify this cell to use the print() command\n", + "\n", + "a = 34*102\n", + "\n", + "print(2+2)\n", + "print(\"hello\")\n", + "print(a-1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "text *hello*\n", + "* this\n", + "* is\n", + "* a list" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Markdown\n", + "\n", + "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n", + "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n", + "\n", + "You can also include some LaTeX code in Markdown cells, with dollar signs $ or align environments:\n", + "\n", + "\\begin{align*}\n", + "\\frac{(x+y)^2}{x+1} = \\frac{x^2+2xy+y^2}{x+1}\n", + "\\end{align*}\n", + "\n", + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "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", + "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", + "x == (1/2*I*sqrt(3) - 1/2)^(1/3) + 1/(1/2*I*sqrt(3) - 1/2)^(1/3) - 1\n", + "]\n" + ] + } + ], + "source": [ + "f = (x^2 + 2*x - 5 >= 0)\n", + "solve(f,x)\n", + "\n", + "g = x^3 + 3*x^2-1\n", + "print(solve(g==0, x))\n", + "\n", + "h = x^2 +3*x -1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mathematical variables\n", + "\n", + "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", + "\n", + "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "var('z')\n", + "solve(z^2 + z - 2 == 0, z)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try removing the first line in the cell above and see what error you get!\n", + "\n", + "Here is another example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "var('a', 'b')\n", + "f = x^2+a*x+b == 0\n", + "solve(f,a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "e^(pi*I)\n", + "print(N(pi), N(e))\n", + "e = 42\n", + "print(e)\n", + "reset('e')\n", + "print(N(e))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will study symbolic expressions more in detail next time, in the context of calculus/analysis." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic rings and fields\n", + "\n", + "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n", + "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n", + "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n", + "\n", + "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", + "\n", + "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n", + "\n", + "|Mathematical object|Math symbol|Sage name|\n", + "|------------------:|:---------:|:--------|\n", + "|Integers|$\\mathbb Z$|`ZZ`|\n", + "|Rational numbers|$\\mathbb Q$|`QQ`|\n", + "|Real numbers|$\\mathbb R$|`RR`|\n", + "|Complex numbers|$\\mathbb C$|`CC`|\n", + "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n", + "|Finite fields|$\\mathbb F_p$|GF(p)|\n", + "|$\\dots$|$\\dots$|$\\dots$|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parents and coercion\n", + "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Edit this cell to find out the type of other objects that we used\n", + "print(parent(3/5))\n", + "print(QQ)\n", + "print(type(3/5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "minus_one = e^(pi*I)\n", + "print(minus_one)\n", + "minus_one_coerced = ZZ(e^(pi*I)) # coercion\n", + "#print(ZZ(1/2))\n", + "print(parent(minus_one))\n", + "print(parent(x^2))\n", + "print(parent(minus_one_coerced))\n", + "print(parent(5.2))\n", + "print(parent(QQ(5.2)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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*." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(QQ(3))\n", + "print(RR(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also choose the precision of this approximation using the alternative name `RealField`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(RR)\n", + "print(RealField(prec=1000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Polynomial rings\n", + "\n", + "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Univariate Polynomial Ring in x over Rational Field\n", + "[]\n", + "[(-2, 2)]\n" + ] + } + ], + "source": [ + "polring.<x> = QQ[] # Alternative: polring.<x,y,z> = PolynomialRing(RR)\n", + "polring\n", + "print(parent(x))\n", + "g = x^3 + 3*x^2-1\n", + "print(g.roots())\n", + "print((x^2+4*x+4).roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "## Operations on polynomials\n", + "\n", + "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", + "\n", + "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n", + "\n", + "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x + 1\n", + "-4\n", + "(x^2 + 2*x - 3)/(x + 1)\n", + "Fraction Field of Univariate Polynomial Ring in x over Rational Field\n" + ] + }, + { + "data": { + "text/plain": [ + "x^4 + 2*x^3 - 4*x^2 - 2*x + 3" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring.<x> = QQ[]\n", + "p = x^2 + 2*x - 3 # Don't forget * for multiplication!\n", + "q = p // (x+1)\n", + "r = p % (x+1)\n", + "f = p / (x+1)\n", + "print(q)\n", + "print(r)\n", + "print(f)\n", + "print(parent(f))\n", + "p*(x^2-1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n", + "\n", + "**Remark.** Notice how the result can change substantially if you change the base ring.\n", + "\n", + "**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))`." + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(t + 1) * (t^2 - 3) * (t^2 + 1)\n", + "[(t + 1, 1), (t^2 - 3, 1), (t^2 + 1, 1)]\n", + "t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n", + "t^2 - 1\n", + "[(-1, 1)]\n", + "Multivariate Polynomial Ring in x, y, z over Rational Field\n" + ] + }, + { + "data": { + "text/plain": [ + "Multivariate Polynomial Ring in x, y, z over Rational Field" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring_onevar.<t> = QQ[]\n", + "\n", + "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n", + "fact = factor(f)\n", + "print(factor(f))\n", + "print(list(fact))\n", + "print((t + 1) * (t^2 - 3) * (t^2 + 1))\n", + "print((t+1)*(t-1))\n", + "print(f.roots()) # Result: list of pairs (root,multiplicity)\n", + "\n", + "polring_manyvar.<x,y,z> = QQ[]\n", + "factor(x*y+x)\n", + "\n", + "# The following line gives an error, because the polynomial\n", + "# is understood to possibly have many variables:\n", + "print(parent(x))\n", + "(QQ['x'](x^2-1)).roots()\n", + "parent(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Matrices and vectors\n", + "\n", + "**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", + "\n", + "In Sage you can easily manipulate matrices and vectors" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 0 0 1]\n", + "[ 4 -3 22/7] \n", + "\n", + "[1/2 0 0]\n", + "[ 7 0 0]\n", + "[ 1 1 1] \n", + "\n", + "[1 0]\n", + "[0 1] \n", + "\n", + "(3/2, 21, 6) \n", + "\n", + "[ -7/2 -10 80/7]\n", + "[ 17 -4 15/7]\n", + "[ 241/7 -18/7 869/49] \n", + "\n", + "Rank of A = 3\n", + "Rank of B = 2\n" + ] + }, + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n", + "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n", + "C = matrix([[1,0],[0,1]])\n", + "v = vector([3,4,-1])\n", + "\n", + "print(A, \"\\n\") # \\n just means \"newline\"\n", + "print(B, \"\\n\")\n", + "print(C, \"\\n\")\n", + "#print(A*C) Error!\n", + "print(B*v, \"\\n\")\n", + "print(A^2 + 2*B - A*B, \"\\n\")\n", + "\n", + "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n", + "print(\"Rank of B =\", rank(B))\n", + "A.determinant()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "As for polynomials, you can specify where a matrix or a vector lives" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "M = matrix(CC, [[0,1/2],[1,0]])\n", + "parent(M)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n", + "\n", + "**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$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n", + "v = vector(RR, [3,0])\n", + "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "<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", + " A.eigenvalues() # Also: A.eigenvalues(), A.eigenvectors_right()\n" + ] + }, + { + "data": { + "text/plain": [ + "[5.37228132326901, -0.372281323269014]" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix(RR, [[1,2],[3,4]])\n", + "A.eigenvalues() # Also: A.eigenvalues(), A.eigenvectors_right()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ -3 -25 -5 -3 61 0 -1]\n", + "[ 23 0 -1 1 0 1 -1]\n", + "[286 2 7 0 -21 -1 0]\n", + "[ 2 -1 -2 0 -1 4 0]\n", + "[ 1 -1 1 0 2 -2 7]\n", + "[ 0 15 -1 0 -3 1 -1]\n", + "[ -1 1 -2 0 2 1 1] \n", + "\n", + "[ -1 1 0]\n", + "[ 7 0 -21] \n", + "\n", + "[ -3 -25 -5 -3 61 0 -1] \n", + "\n", + "[ -3 -25 -5 -3 61]\n", + "[ 0 15 -1 0 -3]\n", + "[286 2 7 0 -21]\n", + "-25\n" + ] + } + ], + "source": [ + "A = MatrixSpace(ZZ, 7).random_element()\n", + "print(A, \"\\n\")\n", + "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n", + "print(A[0,0:], \"\\n\") # First row, all columns\n", + "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5\n", + "print(A[0,1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\\begin{align*}\n", + " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n", + "\\end{align*}\n", + "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$." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ -1 -3 -1 11 2 -1 -5]\n", + "[ 1 0 0 -6 -1 0 1]\n", + "[ 1 0 -1 0 1 -1 0]\n", + "[-24 1 -2 -7 4 0 1]\n", + "[ -3 0 -1 0 6 -1 0]\n", + "[-17 -1 1 0 28 1 0]\n", + "[ 1 -4 1 1 -2 -6 -2]\n", + "Sage determinant: 13578\n", + "my_det: 13578\n" + ] + } + ], + "source": [ + "def my_det(A):\n", + " if not A.is_square():\n", + " print(\"Error: matrix is not square\")\n", + " \n", + " n = A.nrows() # size of the matrix\n", + " \n", + " if n == 1:\n", + " return A[0,0]\n", + " \n", + " my_sum = 0\n", + " for j in range(0,n):\n", + " rows = range(1,n)\n", + " columns = [element for element in range(0,n) if element != j]\n", + " submatrix = A[rows,columns]\n", + " my_sum += (-1)^j * A[0,j] * my_det(submatrix)\n", + " \n", + " return my_sum\n", + "\n", + "A = MatrixSpace(ZZ, 7).random_element()\n", + "print(A)\n", + "print(\"Sage determinant: \", A.determinant())\n", + "print(\"my_det: \", my_det(A))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Number Theory\n", + "\n", + "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n", + "\n", + "Sage includes a large library of functions for computing with the integers, see the link above." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3^2 * 3607 * 3803\n", + "[(3, 2), (3607, 1), (3803, 1)]\n", + "True\n", + "True\n", + "619703040\n", + "9\n", + "13548070123626141\n" + ] + } + ], + "source": [ + "n = 123456789\n", + "m = 987654321\n", + "p = 3607\n", + "\n", + "print(factor(n))\n", + "print(list(factor(n)))\n", + "print(is_prime(p))\n", + "print(p.divides(n))\n", + "print(euler_phi(m))\n", + "print(gcd(n, m))\n", + "print(lcm(n, m))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Primes\n", + "\n", + "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Set of all prime numbers: 2, 3, 5, 7, ...\n", + "31 252097800629\n", + "47\n", + "[79, 83, 89, 97]\n" + ] + } + ], + "source": [ + "PP = Primes()\n", + "print(PP)\n", + "print(PP[10], PP[10^10])\n", + "print(PP.next(44))\n", + "\n", + "First_Thousand_Primes = PP[0:1000]\n", + "print([p for p in First_Thousand_Primes if p < 100 and p > 75])\n", + "#print([p for p in PP if p < 100 and p > 75])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Chinese remainder theorem (CRT)\n", + "\n", + "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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a \\pmod n\\\\\n", + " x \\equiv b \\pmod m\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "\n", + "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", + "\n", + "\n", + "For example:\n", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv 1 \\pmod 3\\\\\n", + " x \\equiv 2 \\pmod 5\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "Solution: $x=7$ (any other solution is congruent to $7$ modulo $15$; for example $22=15+7$ is also a solution).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "74306 2 798\n" + ] + } + ], + "source": [ + "a = 2\n", + "b = -1\n", + "n = 172\n", + "m = 799\n", + "\n", + "if gcd(n,m) != 1:\n", + " print(\"The numbers are not comprime, I can't solve this!\")\n", + "else:\n", + " x = crt(a, b, n, m)\n", + " print(x, x%n, x%m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a_0 \\pmod {n_0}\\\\\n", + " x \\equiv a_1 \\pmod {n_1}\\\\\n", + " \\dots \\\\\n", + " x \\equiv a_k \\pmod {n_k}\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n", + "*Hint: start by running the command `help(crt)`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "#help(crt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cryptography: RSA\n", + "\n", + "[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", + "\n", + "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", + "\n", + "## Public-key cryptography\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "Let's see how we can do this in practice, using number theory!\n", + "\n", + "## RSA\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True True False\n" + ] + }, + { + "data": { + "text/plain": [ + "1 loop, best of 1: 9.06 s per loop" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = 100003100019100043100057100069\n", + "q = 100144655312449572059845328443\n", + "n = p*q\n", + "print(is_prime(p), is_prime(q), is_prime(p*q))\n", + "\n", + "# Use the command below to see how long it takes\n", + "timeit(\"factor(n)\", number=1, repeat=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "Of course, she does all of this using Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(338547806707501, 141995674537431, 107165393087271)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def two_large_primes():\n", + " p, q = 0, 0\n", + " # We make sure that they are different\n", + " while p == q:\n", + " p = Primes()[randint(10^6, 2*10^6)]\n", + " q = Primes()[randint(10^6, 2*10^6)]\n", + " return p, q\n", + "\n", + "def random_unit_mod(N):\n", + " R = Integers(N)\n", + " d = R(0)\n", + " # We make sure that it is invertible\n", + " while not d.is_unit():\n", + " d = R.random_element()\n", + " return d\n", + "\n", + "def Alice_generate_keys():\n", + " p, q = two_large_primes()\n", + " n = p*q\n", + " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n", + " \n", + " d = random_unit_mod(phi_n)\n", + " e = d^-1\n", + " return n, d, e\n", + "\n", + "Alice_generate_keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "Now he computes $m^d\\pmod n$ and sends it back to Alice." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "177776139844621" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Bob_encrypt(m, n, d):\n", + " R = Integers(n)\n", + " return R(m)^d # Assume that n is large enough\n", + " \n", + "message = 42424242\n", + "Bob_encrypt(message, 338547806707501, 141995674537431)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "42424242" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Alice_decrypt(m_encrypted, n, e):\n", + " R = Integers(n)\n", + " return R(m_encrypted)^e\n", + "\n", + "Alice_decrypt(177776139844621, 338547806707501, 107165393087271)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb b/src/Lecture5/notebook/.ipynb_checkpoints/7-SageAlgebra-checkpoint.ipynb @@ -0,0 +1,1046 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "# The Jupyter Notebook\n", + "**Reference:** [[1](https://jupyter.org/documentation)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "## Cells\n", + "\n", + "The notebook contains one or more *interactive cells* that you can run, like this one below:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2/5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Exercise: modify this cell to use the print() command\n", + "2+2\n", + "2/5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Markdown\n", + "\n", + "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n", + "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n", + "\n", + "You can also include some LaTeX code in Markdown cells, with dollar signs $ or align environments:\n", + "\n", + "\\begin{align*}\n", + "\\frac{(x+y)^2}{x+1} = \\frac{x^2+y^2}{x+1}\n", + "\\end{align*}\n", + "\n", + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[x == -sqrt(6) - 1, x == sqrt(6) - 1]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = x^2 + 2*x - 5 == 0\n", + "solve(f,x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mathematical variables\n", + "\n", + "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", + "\n", + "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[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]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('y')\n", + "solve(y^2 + (x+1)*y - 2 == 0, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try removing the first line in the cell above and see what error you get!\n", + "\n", + "Here is another example:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[x == -1/2*a - 1/2*sqrt(a^2 - 4*b), x == -1/2*a + 1/2*sqrt(a^2 - 4*b)]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('a', 'b')\n", + "f = x^2+a*x+b\n", + "solve(f,x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "e^(pi*I)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will study symbolic expressions more in detail next time, in the context of calculus/analysis." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic rings and fields\n", + "\n", + "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n", + "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n", + "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n", + "\n", + "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", + "\n", + "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n", + "\n", + "|Mathematical object|Math symbol|Sage name|\n", + "|------------------:|:---------:|:--------|\n", + "|Integers|$\\mathbb Z$|`ZZ`|\n", + "|Rational numbers|$\\mathbb Q$|`QQ`|\n", + "|Real numbers|$\\mathbb R$|`RR`|\n", + "|Complex numbers|$\\mathbb C$|`CC`|\n", + "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n", + "|Finite fields|$\\mathbb F_p$|GF(p)|\n", + "|$\\dots$|$\\dots$|$\\dots$|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parents and coercion\n", + "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Rational Field" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Edit this cell to find out the type of other objects that we used\n", + "parent(3/5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Symbolic Ring\n", + "Integer Ring\n" + ] + } + ], + "source": [ + "minus_one = e^(pi*I)\n", + "minus_one_coerced = ZZ(e^(pi*I)) # coercion\n", + "print(parent(minus_one))\n", + "print(parent(minus_one_coerced))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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*." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "3.00000000000000\n" + ] + } + ], + "source": [ + "print(QQ(3))\n", + "print(RR(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also choose the precision of this approximation using the alternative name `RealField`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Real Field with 53 bits of precision\n", + "Real Field with 1000 bits of precision\n" + ] + } + ], + "source": [ + "print(RR)\n", + "print(RealField(prec=1000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Polynomial rings\n", + "\n", + "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of precision" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring.<x,y,z> = RR[] # Alternative: polring.<x,y,z> = PolynomialRing(RR)\n", + "polring" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "## Operations on polynomials\n", + "\n", + "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", + "\n", + "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n", + "\n", + "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x + 1\n", + "-4\n", + "(x^2 + 2*x - 3)/(x + 1)\n" + ] + } + ], + "source": [ + "polring.<x> = QQ[]\n", + "p = x^2 + 2*x - 3 # Don't forget * for multiplication!\n", + "q = p // (x+1)\n", + "r = p % (x+1)\n", + "f = p / (x+1)\n", + "print(q)\n", + "print(r)\n", + "print(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n", + "\n", + "**Remark.** Notice how the result can change substantially if you change the base ring.\n", + "\n", + "**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))`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(t + 1) * (t^2 - 3) * (t^2 + 1)\n", + "[(-1, 1)]\n" + ] + }, + { + "data": { + "text/plain": [ + "(y + 1) * x" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring_onevar.<t> = QQ[]\n", + "\n", + "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n", + "print(factor(f))\n", + "print(f.roots()) # Result: list of pairs (root,multiplicity)\n", + "\n", + "polring_manyvar.<x,y,z> = QQ[]\n", + "factor(x*y+x)\n", + "\n", + "# The following line gives an error, because the polynomial\n", + "# is understood to possibly have many variables:\n", + "#(x^2-1).roots()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Matrices and vectors\n", + "\n", + "**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", + "\n", + "In Sage you can easily manipulate matrices and vectors" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 0 0 1]\n", + "[ 4 -3 22/7] \n", + "\n", + "[1/2 0 0]\n", + "[ 7 0 0]\n", + "[ 1 1 1] \n", + "\n", + "(3/2, 21, 6) \n", + "\n", + "[ -7/2 -10 80/7]\n", + "[ 17 -4 15/7]\n", + "[ 241/7 -18/7 869/49] \n", + "\n", + "Rank of A = 3\n", + "Rank of B = 2\n" + ] + } + ], + "source": [ + "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n", + "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n", + "v = vector([3,4,-1])\n", + "\n", + "print(A, \"\\n\") # \\n just means \"newline\"\n", + "print(B, \"\\n\")\n", + "print(B*v, \"\\n\")\n", + "print(A^2 + 2*B - A*B, \"\\n\")\n", + "\n", + "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n", + "print(\"Rank of B =\", rank(B))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "As for polynomials, you can specify where a matrix or a vector lives" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "M = matrix(CC, [[0,1],[1,0]])\n", + "parent(M)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n", + "\n", + "**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$." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.289916349448506, 0.0241596957873755)" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n", + "v = vector(RR, [3,0])\n", + "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + "(-0.3722813232690144?, Vector space of degree 2 and dimension 1 over Algebraic Field\n", + "User basis matrix:\n", + "[ 1 -0.6861406616345072?]),\n", + "(5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic Field\n", + "User basis matrix:\n", + "[ 1 2.186140661634508?])\n", + "]" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix(QQ, [[1,2],[3,4]])\n", + "A.eigenspaces_right() # Also: A.eigenvalues(), A.eigenvectors_right()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-14 2 0 -1 1 -2 -1]\n", + "[ 0 -8 0 9 -2 11 1]\n", + "[ 0 3 1 -1 1 1 221]\n", + "[ -1 2 1 -25 -10 4 0]\n", + "[ -3 0 0 2 16 -1 -2]\n", + "[ 1 -3 3 -41 1 0 0]\n", + "[ -2 1 0 0 -6 2 12] \n", + "\n", + "[ 0 9 -2]\n", + "[ 1 -1 1] \n", + "\n", + "[-14 2 0 -1 1 -2 -1] \n", + "\n", + "[-14 2 0 -1 1]\n", + "[ 1 -3 3 -41 1]\n", + "[ 0 3 1 -1 1]\n" + ] + } + ], + "source": [ + "A = MatrixSpace(ZZ, 7).random_element()\n", + "print(A, \"\\n\")\n", + "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n", + "print(A[0,0:], \"\\n\") # First row, all columns\n", + "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\\begin{align*}\n", + " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n", + "\\end{align*}\n", + "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$." + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "def my_det(A):\n", + " if not A.is_square():\n", + " print(\"Error: matrix is not square\")\n", + " \n", + " n = A.nrows() # size of the matrix\n", + " \n", + " # Continue from here!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Number Theory\n", + "\n", + "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n", + "\n", + "Sage includes a large library of functions for computing with the integers, see the link above." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3^2 * 3607 * 3803\n", + "True\n", + "True\n", + "619703040\n", + "9\n", + "13548070123626141\n" + ] + } + ], + "source": [ + "n = 123456789\n", + "m = 987654321\n", + "p = 3607\n", + "\n", + "print(factor(n))\n", + "print(is_prime(p))\n", + "print(p.divides(n))\n", + "print(euler_phi(m))\n", + "print(gcd(n, m))\n", + "print(lcm(n, m))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Primes\n", + "\n", + "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Set of all prime numbers: 2, 3, 5, 7, ...\n", + "31 15485867\n", + "47\n", + "[79, 83, 89, 97]\n" + ] + } + ], + "source": [ + "PP = Primes()\n", + "print(PP)\n", + "print(PP[10], PP[10^6])\n", + "print(PP.next(44))\n", + "\n", + "First_Thousand_Primes = PP[0:1000]\n", + "print([p for p in First_Thousand_Primes if p < 100 and p > 75])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Chinese remainder theorem (CRT)\n", + "\n", + "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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a \\pmod n\\\\\n", + " x \\equiv b \\pmod m\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "74306 2 798\n" + ] + } + ], + "source": [ + "a = 2\n", + "b = -1\n", + "n = 172\n", + "m = 799\n", + "\n", + "if gcd(n,m) != 1:\n", + " print(\"The numbers are not comprime, I can't solve this!\")\n", + "else:\n", + " x = crt(a, b, n, m)\n", + " print(x, x%n, x%m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a_0 \\pmod {n_0}\\\\\n", + " x \\equiv a_1 \\pmod {n_1}\\\\\n", + " \\dots \\\\\n", + " x \\equiv a_k \\pmod {n_k}\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n", + "*Hint: start by running the command `help(crt)`." + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "#help(crt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cryptography: RSA\n", + "\n", + "[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", + "\n", + "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", + "\n", + "## Public-key cryptography\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "Let's see how we can do this in practice, using number theory!\n", + "\n", + "## RSA\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True True False\n" + ] + } + ], + "source": [ + "p = 100003100019100043100057100069\n", + "q = 100144655312449572059845328443\n", + "n = p*q\n", + "print(is_prime(p), is_prime(q), is_prime(p*q))\n", + "\n", + "# Use the command below to see how long it takes\n", + "#timeit(\"factor(n)\", number=1, repeat=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "Of course, she does all of this using Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(419199544978969, 235530823946467, 80799425863927)" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def two_large_primes():\n", + " p, q = 0, 0\n", + " # We make sure that they are different\n", + " while p == q:\n", + " p = Primes()[randint(10^6, 2*10^6)]\n", + " q = Primes()[randint(10^6, 2*10^6)]\n", + " return p, q\n", + "\n", + "def random_unit_mod(N):\n", + " R = Integers(N)\n", + " d = R(0)\n", + " # We make sure that it is invertible\n", + " while not d.is_unit():\n", + " d = R.random_element()\n", + " return d\n", + "\n", + "def Alice_generate_keys():\n", + " p, q = two_large_primes()\n", + " n = p*q\n", + " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n", + " \n", + " d = random_unit_mod(phi_n)\n", + " e = d^-1\n", + " return n, d, e\n", + "\n", + "Alice_generate_keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "Now he computes $m^d\\pmod n$ and sends it back to Alice." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "149461597163501" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Bob_encrypt(m, n, d):\n", + " R = Integers(n)\n", + " return R(m)^d # Assume that n is large enough\n", + " \n", + "message = 42424242\n", + "Bob_encrypt(message, 419199544978969, 235530823946467)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "42424242" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Alice_decrypt(m_encrypted, n, e):\n", + " R = Integers(n)\n", + " return R(m_encrypted)^e\n", + "\n", + "Alice_decrypt(149461597163501, 419199544978969, 80799425863927)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} 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 @@ -0,0 +1,1099 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "# The Jupyter Notebook\n", + "**Reference:** [[1](https://jupyter.org/documentation)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "## Cells\n", + "\n", + "The notebook contains one or more *interactive cells* that you can run, like this one below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: modify this cell to use the print() command\n", + "\n", + "a = 34*102\n", + "\n", + "print(2+2)\n", + "print(\"hello\")\n", + "print(a-1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "text *hello*\n", + "* this\n", + "* is\n", + "* a list" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Markdown\n", + "\n", + "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n", + "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n", + "\n", + "You can also include some LaTeX code in Markdown cells, with dollar signs $ or align environments:\n", + "\n", + "\\begin{align*}\n", + "\\frac{(x+y)^2}{x+1} = \\frac{x^2+2xy+y^2}{x+1}\n", + "\\end{align*}\n", + "\n", + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "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", + "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", + "x == (1/2*I*sqrt(3) - 1/2)^(1/3) + 1/(1/2*I*sqrt(3) - 1/2)^(1/3) - 1\n", + "]\n" + ] + } + ], + "source": [ + "f = (x^2 + 2*x - 5 >= 0)\n", + "solve(f,x)\n", + "\n", + "g = x^3 + 3*x^2-1\n", + "print(solve(g==0, x))\n", + "\n", + "h = x^2 +3*x -1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mathematical variables\n", + "\n", + "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", + "\n", + "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "var('z')\n", + "solve(z^2 + z - 2 == 0, z)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try removing the first line in the cell above and see what error you get!\n", + "\n", + "Here is another example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "var('a', 'b')\n", + "f = x^2+a*x+b == 0\n", + "solve(f,a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "e^(pi*I)\n", + "print(N(pi), N(e))\n", + "e = 42\n", + "print(e)\n", + "reset('e')\n", + "print(N(e))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will study symbolic expressions more in detail next time, in the context of calculus/analysis." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic rings and fields\n", + "\n", + "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n", + "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n", + "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n", + "\n", + "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", + "\n", + "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n", + "\n", + "|Mathematical object|Math symbol|Sage name|\n", + "|------------------:|:---------:|:--------|\n", + "|Integers|$\\mathbb Z$|`ZZ`|\n", + "|Rational numbers|$\\mathbb Q$|`QQ`|\n", + "|Real numbers|$\\mathbb R$|`RR`|\n", + "|Complex numbers|$\\mathbb C$|`CC`|\n", + "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n", + "|Finite fields|$\\mathbb F_p$|GF(p)|\n", + "|$\\dots$|$\\dots$|$\\dots$|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parents and coercion\n", + "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Edit this cell to find out the type of other objects that we used\n", + "print(parent(3/5))\n", + "print(QQ)\n", + "print(type(3/5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "minus_one = e^(pi*I)\n", + "print(minus_one)\n", + "minus_one_coerced = ZZ(e^(pi*I)) # coercion\n", + "#print(ZZ(1/2))\n", + "print(parent(minus_one))\n", + "print(parent(x^2))\n", + "print(parent(minus_one_coerced))\n", + "print(parent(5.2))\n", + "print(parent(QQ(5.2)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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*." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(QQ(3))\n", + "print(RR(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also choose the precision of this approximation using the alternative name `RealField`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(RR)\n", + "print(RealField(prec=1000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Polynomial rings\n", + "\n", + "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Univariate Polynomial Ring in x over Rational Field\n", + "[]\n", + "[(-2, 2)]\n" + ] + } + ], + "source": [ + "polring.<x> = QQ[] # Alternative: polring.<x,y,z> = PolynomialRing(RR)\n", + "polring\n", + "print(parent(x))\n", + "g = x^3 + 3*x^2-1\n", + "print(g.roots())\n", + "print((x^2+4*x+4).roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "## Operations on polynomials\n", + "\n", + "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", + "\n", + "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n", + "\n", + "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x + 1\n", + "-4\n", + "(x^2 + 2*x - 3)/(x + 1)\n", + "Fraction Field of Univariate Polynomial Ring in x over Rational Field\n" + ] + }, + { + "data": { + "text/plain": [ + "x^4 + 2*x^3 - 4*x^2 - 2*x + 3" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring.<x> = QQ[]\n", + "p = x^2 + 2*x - 3 # Don't forget * for multiplication!\n", + "q = p // (x+1)\n", + "r = p % (x+1)\n", + "f = p / (x+1)\n", + "print(q)\n", + "print(r)\n", + "print(f)\n", + "print(parent(f))\n", + "p*(x^2-1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n", + "\n", + "**Remark.** Notice how the result can change substantially if you change the base ring.\n", + "\n", + "**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))`." + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(t + 1) * (t^2 - 3) * (t^2 + 1)\n", + "[(t + 1, 1), (t^2 - 3, 1), (t^2 + 1, 1)]\n", + "t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n", + "t^2 - 1\n", + "[(-1, 1)]\n", + "Multivariate Polynomial Ring in x, y, z over Rational Field\n" + ] + }, + { + "data": { + "text/plain": [ + "Multivariate Polynomial Ring in x, y, z over Rational Field" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring_onevar.<t> = QQ[]\n", + "\n", + "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n", + "fact = factor(f)\n", + "print(factor(f))\n", + "print(list(fact))\n", + "print((t + 1) * (t^2 - 3) * (t^2 + 1))\n", + "print((t+1)*(t-1))\n", + "print(f.roots()) # Result: list of pairs (root,multiplicity)\n", + "\n", + "polring_manyvar.<x,y,z> = QQ[]\n", + "factor(x*y+x)\n", + "\n", + "# The following line gives an error, because the polynomial\n", + "# is understood to possibly have many variables:\n", + "print(parent(x))\n", + "(QQ['x'](x^2-1)).roots()\n", + "parent(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Matrices and vectors\n", + "\n", + "**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", + "\n", + "In Sage you can easily manipulate matrices and vectors" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 0 0 1]\n", + "[ 4 -3 22/7] \n", + "\n", + "[1/2 0 0]\n", + "[ 7 0 0]\n", + "[ 1 1 1] \n", + "\n", + "[1 0]\n", + "[0 1] \n", + "\n", + "(3/2, 21, 6) \n", + "\n", + "[ -7/2 -10 80/7]\n", + "[ 17 -4 15/7]\n", + "[ 241/7 -18/7 869/49] \n", + "\n", + "Rank of A = 3\n", + "Rank of B = 2\n" + ] + }, + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n", + "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n", + "C = matrix([[1,0],[0,1]])\n", + "v = vector([3,4,-1])\n", + "\n", + "print(A, \"\\n\") # \\n just means \"newline\"\n", + "print(B, \"\\n\")\n", + "print(C, \"\\n\")\n", + "#print(A*C) Error!\n", + "print(B*v, \"\\n\")\n", + "print(A^2 + 2*B - A*B, \"\\n\")\n", + "\n", + "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n", + "print(\"Rank of B =\", rank(B))\n", + "A.determinant()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "As for polynomials, you can specify where a matrix or a vector lives" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "M = matrix(CC, [[0,1/2],[1,0]])\n", + "parent(M)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n", + "\n", + "**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$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n", + "v = vector(RR, [3,0])\n", + "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "<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", + " A.eigenvalues() # Also: A.eigenvalues(), A.eigenvectors_right()\n" + ] + }, + { + "data": { + "text/plain": [ + "[5.37228132326901, -0.372281323269014]" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix(RR, [[1,2],[3,4]])\n", + "A.eigenvalues() # Also: A.eigenvalues(), A.eigenvectors_right()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ -3 -25 -5 -3 61 0 -1]\n", + "[ 23 0 -1 1 0 1 -1]\n", + "[286 2 7 0 -21 -1 0]\n", + "[ 2 -1 -2 0 -1 4 0]\n", + "[ 1 -1 1 0 2 -2 7]\n", + "[ 0 15 -1 0 -3 1 -1]\n", + "[ -1 1 -2 0 2 1 1] \n", + "\n", + "[ -1 1 0]\n", + "[ 7 0 -21] \n", + "\n", + "[ -3 -25 -5 -3 61 0 -1] \n", + "\n", + "[ -3 -25 -5 -3 61]\n", + "[ 0 15 -1 0 -3]\n", + "[286 2 7 0 -21]\n", + "-25\n" + ] + } + ], + "source": [ + "A = MatrixSpace(ZZ, 7).random_element()\n", + "print(A, \"\\n\")\n", + "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n", + "print(A[0,0:], \"\\n\") # First row, all columns\n", + "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5\n", + "print(A[0,1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\\begin{align*}\n", + " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n", + "\\end{align*}\n", + "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$." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ -1 -3 -1 11 2 -1 -5]\n", + "[ 1 0 0 -6 -1 0 1]\n", + "[ 1 0 -1 0 1 -1 0]\n", + "[-24 1 -2 -7 4 0 1]\n", + "[ -3 0 -1 0 6 -1 0]\n", + "[-17 -1 1 0 28 1 0]\n", + "[ 1 -4 1 1 -2 -6 -2]\n", + "Sage determinant: 13578\n", + "my_det: 13578\n" + ] + } + ], + "source": [ + "def my_det(A):\n", + " if not A.is_square():\n", + " print(\"Error: matrix is not square\")\n", + " \n", + " n = A.nrows() # size of the matrix\n", + " \n", + " if n == 1:\n", + " return A[0,0]\n", + " \n", + " my_sum = 0\n", + " for j in range(0,n):\n", + " rows = range(1,n)\n", + " columns = [element for element in range(0,n) if element != j]\n", + " submatrix = A[rows,columns]\n", + " my_sum += (-1)^j * A[0,j] * my_det(submatrix)\n", + " \n", + " return my_sum\n", + "\n", + "A = MatrixSpace(ZZ, 7).random_element()\n", + "print(A)\n", + "print(\"Sage determinant: \", A.determinant())\n", + "print(\"my_det: \", my_det(A))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Number Theory\n", + "\n", + "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n", + "\n", + "Sage includes a large library of functions for computing with the integers, see the link above." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3^2 * 3607 * 3803\n", + "[(3, 2), (3607, 1), (3803, 1)]\n", + "True\n", + "True\n", + "619703040\n", + "9\n", + "13548070123626141\n" + ] + } + ], + "source": [ + "n = 123456789\n", + "m = 987654321\n", + "p = 3607\n", + "\n", + "print(factor(n))\n", + "print(list(factor(n)))\n", + "print(is_prime(p))\n", + "print(p.divides(n))\n", + "print(euler_phi(m))\n", + "print(gcd(n, m))\n", + "print(lcm(n, m))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Primes\n", + "\n", + "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Set of all prime numbers: 2, 3, 5, 7, ...\n", + "31 252097800629\n", + "47\n", + "[79, 83, 89, 97]\n" + ] + } + ], + "source": [ + "PP = Primes()\n", + "print(PP)\n", + "print(PP[10], PP[10^10])\n", + "print(PP.next(44))\n", + "\n", + "First_Thousand_Primes = PP[0:1000]\n", + "print([p for p in First_Thousand_Primes if p < 100 and p > 75])\n", + "#print([p for p in PP if p < 100 and p > 75])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Chinese remainder theorem (CRT)\n", + "\n", + "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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a \\pmod n\\\\\n", + " x \\equiv b \\pmod m\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "\n", + "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", + "\n", + "\n", + "For example:\n", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv 1 \\pmod 3\\\\\n", + " x \\equiv 2 \\pmod 5\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "Solution: $x=7$ (any other solution is congruent to $7$ modulo $15$; for example $22=15+7$ is also a solution).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "74306 2 798\n" + ] + } + ], + "source": [ + "a = 2\n", + "b = -1\n", + "n = 172\n", + "m = 799\n", + "\n", + "if gcd(n,m) != 1:\n", + " print(\"The numbers are not comprime, I can't solve this!\")\n", + "else:\n", + " x = crt(a, b, n, m)\n", + " print(x, x%n, x%m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a_0 \\pmod {n_0}\\\\\n", + " x \\equiv a_1 \\pmod {n_1}\\\\\n", + " \\dots \\\\\n", + " x \\equiv a_k \\pmod {n_k}\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n", + "*Hint: start by running the command `help(crt)`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "#help(crt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cryptography: RSA\n", + "\n", + "[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", + "\n", + "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", + "\n", + "## Public-key cryptography\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "Let's see how we can do this in practice, using number theory!\n", + "\n", + "## RSA\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True True False\n" + ] + }, + { + "data": { + "text/plain": [ + "1 loop, best of 1: 9.06 s per loop" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = 100003100019100043100057100069\n", + "q = 100144655312449572059845328443\n", + "n = p*q\n", + "print(is_prime(p), is_prime(q), is_prime(p*q))\n", + "\n", + "# Use the command below to see how long it takes\n", + "timeit(\"factor(n)\", number=1, repeat=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "Of course, she does all of this using Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(338547806707501, 141995674537431, 107165393087271)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def two_large_primes():\n", + " p, q = 0, 0\n", + " # We make sure that they are different\n", + " while p == q:\n", + " p = Primes()[randint(10^6, 2*10^6)]\n", + " q = Primes()[randint(10^6, 2*10^6)]\n", + " return p, q\n", + "\n", + "def random_unit_mod(N):\n", + " R = Integers(N)\n", + " d = R(0)\n", + " # We make sure that it is invertible\n", + " while not d.is_unit():\n", + " d = R.random_element()\n", + " return d\n", + "\n", + "def Alice_generate_keys():\n", + " p, q = two_large_primes()\n", + " n = p*q\n", + " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n", + " \n", + " d = random_unit_mod(phi_n)\n", + " e = d^-1\n", + " return n, d, e\n", + "\n", + "Alice_generate_keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "Now he computes $m^d\\pmod n$ and sends it back to Alice." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "177776139844621" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Bob_encrypt(m, n, d):\n", + " R = Integers(n)\n", + " return R(m)^d # Assume that n is large enough\n", + " \n", + "message = 42424242\n", + "Bob_encrypt(message, 338547806707501, 141995674537431)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "42424242" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Alice_decrypt(m_encrypted, n, e):\n", + " R = Integers(n)\n", + " return R(m_encrypted)^e\n", + "\n", + "Alice_decrypt(177776139844621, 338547806707501, 107165393087271)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture5/notebook/.ipynb_checkpoints/scratchpad-checkpoint.ipynb b/src/Lecture5/notebook/.ipynb_checkpoints/scratchpad-checkpoint.ipynb @@ -0,0 +1,52 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gcd(36,27)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture5/notebook/7-SageAlgebra.aux b/src/Lecture5/notebook/7-SageAlgebra.aux @@ -0,0 +1,56 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{toc}{\contentsline {section}{\numberline {1}The Jupyter Notebook}{1}{section.1}\protected@file@percent } +\newlabel{the-jupyter-notebook}{{1}{1}{The Jupyter Notebook}{section.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Cells}{1}{subsection.1.1}\protected@file@percent } +\newlabel{cells}{{1.1}{1}{Cells}{subsection.1.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Markdown}{1}{subsection.1.2}\protected@file@percent } +\newlabel{markdown}{{1.2}{1}{Markdown}{subsection.1.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Symbolic expressions}{2}{section.2}\protected@file@percent } +\newlabel{symbolic-expressions}{{2}{2}{Symbolic expressions}{section.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Mathematical variables}{2}{subsection.2.1}\protected@file@percent } +\newlabel{mathematical-variables}{{2.1}{2}{Mathematical variables}{subsection.2.1}{}} +\gdef \LT@i {\LT@entry + {1}{103.45363pt}\LT@entry + {1}{76.13344pt}\LT@entry + {2}{68.2421pt}} +\@writefile{toc}{\contentsline {section}{\numberline {3}Basic rings and fields}{3}{section.3}\protected@file@percent } +\newlabel{basic-rings-and-fields}{{3}{3}{Basic rings and fields}{section.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Parents and coercion}{3}{subsection.3.1}\protected@file@percent } +\newlabel{parents-and-coercion}{{3.1}{3}{Parents and coercion}{subsection.3.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Polynomial rings}{4}{section.4}\protected@file@percent } +\newlabel{polynomial-rings}{{4}{4}{Polynomial rings}{section.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Operations on polynomials}{4}{subsection.4.1}\protected@file@percent } +\newlabel{operations-on-polynomials}{{4.1}{4}{Operations on polynomials}{subsection.4.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5}Matrices and vectors}{5}{section.5}\protected@file@percent } +\newlabel{matrices-and-vectors}{{5}{5}{Matrices and vectors}{section.5}{}} +\@writefile{toc}{\contentsline {section}{\numberline {6}Number Theory}{8}{section.6}\protected@file@percent } +\newlabel{number-theory}{{6}{8}{Number Theory}{section.6}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1}Primes}{8}{subsection.6.1}\protected@file@percent } +\newlabel{primes}{{6.1}{8}{Primes}{subsection.6.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2}The Chinese remainder theorem (CRT)}{9}{subsection.6.2}\protected@file@percent } +\newlabel{the-chinese-remainder-theorem-crt}{{6.2}{9}{The Chinese remainder theorem (CRT)}{subsection.6.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {7}Cryptography: RSA}{10}{section.7}\protected@file@percent } +\newlabel{cryptography-rsa}{{7}{10}{Cryptography: RSA}{section.7}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {7.1}Public-key cryptography}{10}{subsection.7.1}\protected@file@percent } +\newlabel{public-key-cryptography}{{7.1}{10}{Public-key cryptography}{subsection.7.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {7.2}RSA}{10}{subsection.7.2}\protected@file@percent } +\newlabel{rsa}{{7.2}{10}{RSA}{subsection.7.2}{}} +\gdef \@abspage@last{12} diff --git a/src/Lecture5/notebook/7-SageAlgebra.ipynb b/src/Lecture5/notebook/7-SageAlgebra.ipynb @@ -0,0 +1,1046 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "# The Jupyter Notebook\n", + "**Reference:** [[1](https://jupyter.org/documentation)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "## Cells\n", + "\n", + "The notebook contains one or more *interactive cells* that you can run, like this one below:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2/5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Exercise: modify this cell to use the print() command\n", + "2+2\n", + "2/5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Markdown\n", + "\n", + "[Markdown](https://en.wikipedia.org/wiki/Markdown) is a simple markup language - think of LaTeX or html, but much simpler.\n", + "You can add text to your notebook with Markdown cells by selecting `Cell > Cell Type > Markdown`.\n", + "\n", + "You can also include some LaTeX code in Markdown cells, with dollar signs $ or align environments:\n", + "\n", + "\\begin{align*}\n", + "\\frac{(x+y)^2}{x+1} = \\frac{x^2+y^2}{x+1}\n", + "\\end{align*}\n", + "\n", + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Now, let's get started with Sage. One thing you might want to do is manipulating symbolic expressions, like the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[x == -sqrt(6) - 1, x == sqrt(6) - 1]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = x^2 + 2*x - 5 == 0\n", + "solve(f,x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "**Exercise:** change the code above to solve the corresponding inequality $x^2+2x-5\\geq 0$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mathematical variables\n", + "\n", + "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", + "\n", + "If you want to use Mathematical variables other than `x`, you first need to *declare* them with the `var()` command:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[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]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('y')\n", + "solve(y^2 + (x+1)*y - 2 == 0, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try removing the first line in the cell above and see what error you get!\n", + "\n", + "Here is another example:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[x == -1/2*a - 1/2*sqrt(a^2 - 4*b), x == -1/2*a + 1/2*sqrt(a^2 - 4*b)]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('a', 'b')\n", + "f = x^2+a*x+b\n", + "solve(f,x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some common constants are [already defined](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html) in Sage:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "e^(pi*I)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will study symbolic expressions more in detail next time, in the context of calculus/analysis." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic rings and fields\n", + "\n", + "**References:** [[3](https://doc.sagemath.org/html/en/reference/rings_standard/index.html)]\n", + "[[4](https://doc.sagemath.org/html/en/reference/rings_numerical/index.html)]\n", + "[[5](https://doc.sagemath.org/html/en/reference/finite_rings/index.html)]\n", + "\n", + "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", + "\n", + "These structures are already implemented in Sage. Some of the most common are listed in the following table:\n", + "\n", + "|Mathematical object|Math symbol|Sage name|\n", + "|------------------:|:---------:|:--------|\n", + "|Integers|$\\mathbb Z$|`ZZ`|\n", + "|Rational numbers|$\\mathbb Q$|`QQ`|\n", + "|Real numbers|$\\mathbb R$|`RR`|\n", + "|Complex numbers|$\\mathbb C$|`CC`|\n", + "|Integers modulo $n$|$\\mathbb Z/n\\mathbb Z$|`Integers(n)`|\n", + "|Finite fields|$\\mathbb F_p$|GF(p)|\n", + "|$\\dots$|$\\dots$|$\\dots$|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parents and coercion\n", + "**Reference:** [[6](https://doc.sagemath.org/html/en/tutorial/tour_coercion.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Rational Field" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Edit this cell to find out the type of other objects that we used\n", + "parent(3/5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Symbolic Ring\n", + "Integer Ring\n" + ] + } + ], + "source": [ + "minus_one = e^(pi*I)\n", + "minus_one_coerced = ZZ(e^(pi*I)) # coercion\n", + "print(parent(minus_one))\n", + "print(parent(minus_one_coerced))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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*." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "3.00000000000000\n" + ] + } + ], + "source": [ + "print(QQ(3))\n", + "print(RR(3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also choose the precision of this approximation using the alternative name `RealField`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Real Field with 53 bits of precision\n", + "Real Field with 1000 bits of precision\n" + ] + } + ], + "source": [ + "print(RR)\n", + "print(RealField(prec=1000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Polynomial rings\n", + "\n", + "**Reference:** [[7](https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of precision" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring.<x,y,z> = RR[] # Alternative: polring.<x,y,z> = PolynomialRing(RR)\n", + "polring" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "## Operations on polynomials\n", + "\n", + "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", + "\n", + "**Exercise:** use the `parent()` command to find out what the quotient of two polynomials is.\n", + "\n", + "**Question:** what happens if you remove the first line in the cell below? What if we used the variable `y` instead of `x`?" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x + 1\n", + "-4\n", + "(x^2 + 2*x - 3)/(x + 1)\n" + ] + } + ], + "source": [ + "polring.<x> = QQ[]\n", + "p = x^2 + 2*x - 3 # Don't forget * for multiplication!\n", + "q = p // (x+1)\n", + "r = p % (x+1)\n", + "f = p / (x+1)\n", + "print(q)\n", + "print(r)\n", + "print(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can do more complex operations. Try out `roots()` and `factor` in the cell below.\n", + "\n", + "**Remark.** Notice how the result can change substantially if you change the base ring.\n", + "\n", + "**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))`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(t + 1) * (t^2 - 3) * (t^2 + 1)\n", + "[(-1, 1)]\n" + ] + }, + { + "data": { + "text/plain": [ + "(y + 1) * x" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "polring_onevar.<t> = QQ[]\n", + "\n", + "f = t^5 + t^4 - 2*t^3 - 2*t^2 - 3*t - 3\n", + "print(factor(f))\n", + "print(f.roots()) # Result: list of pairs (root,multiplicity)\n", + "\n", + "polring_manyvar.<x,y,z> = QQ[]\n", + "factor(x*y+x)\n", + "\n", + "# The following line gives an error, because the polynomial\n", + "# is understood to possibly have many variables:\n", + "#(x^2-1).roots()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Matrices and vectors\n", + "\n", + "**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", + "\n", + "In Sage you can easily manipulate matrices and vectors" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 0 0 1]\n", + "[ 4 -3 22/7] \n", + "\n", + "[1/2 0 0]\n", + "[ 7 0 0]\n", + "[ 1 1 1] \n", + "\n", + "(3/2, 21, 6) \n", + "\n", + "[ -7/2 -10 80/7]\n", + "[ 17 -4 15/7]\n", + "[ 241/7 -18/7 869/49] \n", + "\n", + "Rank of A = 3\n", + "Rank of B = 2\n" + ] + } + ], + "source": [ + "A = matrix([[1,2,3],[0,0,1],[4,-3,22/7]])\n", + "B = matrix([[1/2,0,0],[7,0,0],[1,1,1]])\n", + "v = vector([3,4,-1])\n", + "\n", + "print(A, \"\\n\") # \\n just means \"newline\"\n", + "print(B, \"\\n\")\n", + "print(B*v, \"\\n\")\n", + "print(A^2 + 2*B - A*B, \"\\n\")\n", + "\n", + "print(\"Rank of A =\", rank(A)) # You can also use A.rank()\n", + "print(\"Rank of B =\", rank(B))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "As for polynomials, you can specify where a matrix or a vector lives" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of precision" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "M = matrix(CC, [[0,1],[1,0]])\n", + "parent(M)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also solve linear systems and compute eigenvalues and eigenvectors of a matrix\n", + "\n", + "**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$." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.289916349448506, 0.0241596957873755)" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix(RR, [[sqrt(59),32],[-1/4,3]])\n", + "v = vector(RR, [3,0])\n", + "A.solve_right(v) # Solve Ax=v. Alternative: A \\ v" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\n", + "(-0.3722813232690144?, Vector space of degree 2 and dimension 1 over Algebraic Field\n", + "User basis matrix:\n", + "[ 1 -0.6861406616345072?]),\n", + "(5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic Field\n", + "User basis matrix:\n", + "[ 1 2.186140661634508?])\n", + "]" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix(QQ, [[1,2],[3,4]])\n", + "A.eigenspaces_right() # Also: A.eigenvalues(), A.eigenvectors_right()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-14 2 0 -1 1 -2 -1]\n", + "[ 0 -8 0 9 -2 11 1]\n", + "[ 0 3 1 -1 1 1 221]\n", + "[ -1 2 1 -25 -10 4 0]\n", + "[ -3 0 0 2 16 -1 -2]\n", + "[ 1 -3 3 -41 1 0 0]\n", + "[ -2 1 0 0 -6 2 12] \n", + "\n", + "[ 0 9 -2]\n", + "[ 1 -1 1] \n", + "\n", + "[-14 2 0 -1 1 -2 -1] \n", + "\n", + "[-14 2 0 -1 1]\n", + "[ 1 -3 3 -41 1]\n", + "[ 0 3 1 -1 1]\n" + ] + } + ], + "source": [ + "A = MatrixSpace(ZZ, 7).random_element()\n", + "print(A, \"\\n\")\n", + "print(A[1:3,2:5], \"\\n\") # Rows from 1 to 3, columns from 2 to 5\n", + "print(A[0,0:], \"\\n\") # First row, all columns\n", + "print(A[[0,5,2],0:5]) # Rows 0, 5 and 2 (in this order) and columns 0 to 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\\begin{align*}\n", + " \\operatorname{det}A = \\sum_{j=1}^n (-1)^ja_{0j}M_{0j}\n", + "\\end{align*}\n", + "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$." + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "def my_det(A):\n", + " if not A.is_square():\n", + " print(\"Error: matrix is not square\")\n", + " \n", + " n = A.nrows() # size of the matrix\n", + " \n", + " # Continue from here!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Number Theory\n", + "\n", + "**Reference:** [[11](https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html)]\n", + "\n", + "Sage includes a large library of functions for computing with the integers, see the link above." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3^2 * 3607 * 3803\n", + "True\n", + "True\n", + "619703040\n", + "9\n", + "13548070123626141\n" + ] + } + ], + "source": [ + "n = 123456789\n", + "m = 987654321\n", + "p = 3607\n", + "\n", + "print(factor(n))\n", + "print(is_prime(p))\n", + "print(p.divides(n))\n", + "print(euler_phi(m))\n", + "print(gcd(n, m))\n", + "print(lcm(n, m))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Primes\n", + "\n", + "**Reference:** [[12](https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html)]\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Set of all prime numbers: 2, 3, 5, 7, ...\n", + "31 15485867\n", + "47\n", + "[79, 83, 89, 97]\n" + ] + } + ], + "source": [ + "PP = Primes()\n", + "print(PP)\n", + "print(PP[10], PP[10^6])\n", + "print(PP.next(44))\n", + "\n", + "First_Thousand_Primes = PP[0:1000]\n", + "print([p for p in First_Thousand_Primes if p < 100 and p > 75])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Chinese remainder theorem (CRT)\n", + "\n", + "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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a \\pmod n\\\\\n", + " x \\equiv b \\pmod m\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "74306 2 798\n" + ] + } + ], + "source": [ + "a = 2\n", + "b = -1\n", + "n = 172\n", + "m = 799\n", + "\n", + "if gcd(n,m) != 1:\n", + " print(\"The numbers are not comprime, I can't solve this!\")\n", + "else:\n", + " x = crt(a, b, n, m)\n", + " print(x, x%n, x%m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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", + "\n", + "\\begin{align*}\n", + "\\begin{cases}\n", + " x \\equiv a_0 \\pmod {n_0}\\\\\n", + " x \\equiv a_1 \\pmod {n_1}\\\\\n", + " \\dots \\\\\n", + " x \\equiv a_k \\pmod {n_k}\n", + "\\end{cases}\n", + "\\end{align*}\n", + "\n", + "has exactly one solution modulo $\\prod_{i=0}^kn_i$. Use the `crt()` function to find a solution to such a system.\n", + "*Hint: start by running the command `help(crt)`." + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "#help(crt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cryptography: RSA\n", + "\n", + "[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", + "\n", + "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", + "\n", + "## Public-key cryptography\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "Let's see how we can do this in practice, using number theory!\n", + "\n", + "## RSA\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True True False\n" + ] + } + ], + "source": [ + "p = 100003100019100043100057100069\n", + "q = 100144655312449572059845328443\n", + "n = p*q\n", + "print(is_prime(p), is_prime(q), is_prime(p*q))\n", + "\n", + "# Use the command below to see how long it takes\n", + "#timeit(\"factor(n)\", number=1, repeat=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "Of course, she does all of this using Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(419199544978969, 235530823946467, 80799425863927)" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def two_large_primes():\n", + " p, q = 0, 0\n", + " # We make sure that they are different\n", + " while p == q:\n", + " p = Primes()[randint(10^6, 2*10^6)]\n", + " q = Primes()[randint(10^6, 2*10^6)]\n", + " return p, q\n", + "\n", + "def random_unit_mod(N):\n", + " R = Integers(N)\n", + " d = R(0)\n", + " # We make sure that it is invertible\n", + " while not d.is_unit():\n", + " d = R.random_element()\n", + " return d\n", + "\n", + "def Alice_generate_keys():\n", + " p, q = two_large_primes()\n", + " n = p*q\n", + " phi_n = (p-1)*(q-1) # euler_phi(n) is slow!\n", + " \n", + " d = random_unit_mod(phi_n)\n", + " e = d^-1\n", + " return n, d, e\n", + "\n", + "Alice_generate_keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "Now he computes $m^d\\pmod n$ and sends it back to Alice." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "149461597163501" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Bob_encrypt(m, n, d):\n", + " R = Integers(n)\n", + " return R(m)^d # Assume that n is large enough\n", + " \n", + "message = 42424242\n", + "Bob_encrypt(message, 419199544978969, 235530823946467)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "42424242" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def Alice_decrypt(m_encrypted, n, e):\n", + " R = Integers(n)\n", + " return R(m_encrypted)^e\n", + "\n", + "Alice_decrypt(149461597163501, 419199544978969, 80799425863927)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "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", + "\n", + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture5/notebook/7-SageAlgebra.log b/src/Lecture5/notebook/7-SageAlgebra.log @@ -0,0 +1,967 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**7-SageAlgebra.tex +(./7-SageAlgebra.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty +Package: tcolorbox 2020/10/09 version 4.42 text color boxes + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks15 +\pgfutil@tempdima=\dimen139 +\pgfutil@tempdimb=\dimen140 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box47 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +Package: pgf 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen141 +\Gin@req@width=\dimen142 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen143 +\pgf@y=\dimen144 +\pgf@xa=\dimen145 +\pgf@ya=\dimen146 +\pgf@xb=\dimen147 +\pgf@yb=\dimen148 +\pgf@xc=\dimen149 +\pgf@yc=\dimen150 +\pgf@xd=\dimen151 +\pgf@yd=\dimen152 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count185 +\c@pgf@countb=\count186 +\c@pgf@countc=\count187 +\c@pgf@countd=\count188 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count189 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count190 +\pgfsyssoftpath@bigbuffer@items=\count191 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen153 +\pgfmath@count=\count192 +\pgfmath@box=\box48 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count193 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen154 +\pgf@picmaxx=\dimen155 +\pgf@picminy=\dimen156 +\pgf@picmaxy=\dimen157 +\pgf@pathminx=\dimen158 +\pgf@pathmaxx=\dimen159 +\pgf@pathminy=\dimen160 +\pgf@pathmaxy=\dimen161 +\pgf@xx=\dimen162 +\pgf@xy=\dimen163 +\pgf@yx=\dimen164 +\pgf@yy=\dimen165 +\pgf@zx=\dimen166 +\pgf@zy=\dimen167 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen168 +\pgf@path@lasty=\dimen169 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen170 +\pgf@shorten@start@additional=\dimen171 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box49 +\pgf@hbox=\box50 +\pgf@layerbox@main=\box51 +\pgf@picture@serial@count=\count194 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen172 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen173 +\pgf@pt@y=\dimen174 +\pgf@pt@temp=\dimen175 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen176 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen177 +\pgf@sys@shading@range@num=\count195 +\pgf@shadingcount=\count196 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box52 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfnodeparttextbox=\box53 +) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a) +\pgf@nodesepstart=\dimen178 +\pgf@nodesepend=\dimen179 +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements +\every@verbatim=\toks26 +\verbatim@line=\toks27 +\verbatim@in@stream=\read3 +) +(/usr/share/texmf-dist/tex/latex/environ/environ.sty +Package: environ 2014/05/04 v0.3 A new way to define environments + +(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\@envbody=\toks28 +) +(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count197 +) +\tcb@titlebox=\box54 +\tcb@upperbox=\box55 +\tcb@lowerbox=\box56 +\tcb@phantombox=\box57 +\c@tcbbreakpart=\count198 +\c@tcblayer=\count199 +\c@tcolorbox@number=\count266 +\tcb@temp=\box58 +\tcb@temp=\box59 +\tcb@temp=\box60 +\tcb@temp=\box61 +\tcb@out=\write4 +\tcb@record@out=\write5 + +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex +Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42' +(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty +Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO) + +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23. +\tcb@testbox=\box62 +\tcb@totalupperbox=\box63 +\tcb@totallowerbox=\box64 +)) +(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty +Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments + +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) + +(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +))) +(/usr/share/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2020/08/10 v2.0s Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2020/10/26 v3.5g Customizing captions (AR) + +(/usr/share/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2020/10/21 v2.2e caption3 kernel (AR) +\captionmargin=\dimen180 +\captionmargin@=\dimen181 +\captionwidth=\dimen182 +\caption@tempdima=\dimen183 +\caption@indent=\dimen184 +\caption@parindent=\dimen185 +\caption@hangindent=\dimen186 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count267 +\c@continuedfloat=\count268 +) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2020/11/20 v2.8 package option processing (HA) + +(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks29 +\XKV@tempa@toks=\toks30 +) +\XKV@depth=\count269 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material + +(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box65 +) +\tc@llx=\dimen187 +\tc@lly=\dimen188 +\tc@urx=\dimen189 +\tc@ury=\dimen190 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex +)) +\adjbox@Width=\dimen191 +\adjbox@Height=\dimen192 +\adjbox@Depth=\dimen193 +\adjbox@Totalheight=\dimen194 +\adjbox@pwidth=\dimen195 +\adjbox@pheight=\dimen196 +\adjbox@pdepth=\dimen197 +\adjbox@ptotalheight=\dimen198 + +(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection +\c@checkoddpage=\count270 +) +(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box66 +\sift@deathcycles=\count271 +\@vwid@loff=\dimen199 +\@vwid@roff=\dimen256 +)) +(/usr/share/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count272 +\float@exts=\toks31 +\float@box=\box67 +\@float@everytoks=\toks32 +\@floatcapt=\box68 +) +(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks33 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count273 +\Gm@cntv=\count274 +\c@Gm@tempcnt=\count275 +\Gm@bindingoffset=\dimen257 +\Gm@wd@mp=\dimen258 +\Gm@odd@mp=\dimen259 +\Gm@even@mp=\dimen260 +\Gm@layoutwidth=\dimen261 +\Gm@layoutheight=\dimen262 +\Gm@layouthoffset=\dimen263 +\Gm@layoutvoffset=\dimen264 +\Gm@dimlist=\toks34 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks35 +\ex@=\dimen265 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen266 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count276 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count277 +\leftroot@=\count278 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count279 +\DOTSCASE@=\count280 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box69 +\strutbox@=\box70 +\big@size=\dimen267 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count281 +\c@MaxMatrixCols=\count282 +\dotsspace@=\muskip16 +\c@parentequation=\count283 +\dspbrk@lvl=\count284 +\tag@help=\toks36 +\row@=\count285 +\column@=\count286 +\maxfields@=\count287 +\andhelp@=\toks37 +\eqnshift@=\dimen268 +\alignsep@=\dimen269 +\tagshift@=\dimen270 +\tagwidth@=\dimen271 +\totwidth@=\dimen272 +\lineht@=\dimen273 +\@envbody=\toks38 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks39 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box71 +) +(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count288 +\uc@combtoks=\toks40 +\uc@combtoksb=\toks41 +\uc@temptokena=\toks42 +) +(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv) +\FV@CodeLineNo=\count289 +\FV@InFile=\read4 +\FV@TabBox=\box72 +\c@FancyVerbLine=\count290 +\FV@StepNumber=\count291 +\FV@OutFile=\write6 +) +(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty +Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac +y) +Package grffile Info: This package is an empty stub for compatibility on input +line 40. +) +(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX + +(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen274 +\Hy@linkcounter=\count292 +\Hy@pagecounter=\count293 + +(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count294 +Package hyperref Info: Hyper figures OFF on input line 4464. +Package hyperref Info: Link nesting OFF on input line 4469. +Package hyperref Info: Hyper index ON on input line 4472. +Package hyperref Info: Plain pages OFF on input line 4479. +Package hyperref Info: Backreferencing OFF on input line 4484. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4717. +\c@Hy@tempcnt=\count295 + +(/usr/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5076. +\XeTeXLinkMargin=\dimen275 + +(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count296 +\Field@Width=\dimen276 +\Fld@charsize=\dimen277 +Package hyperref Info: Hyper figures OFF on input line 6347. +Package hyperref Info: Link nesting OFF on input line 6352. +Package hyperref Info: Hyper index ON on input line 6355. +Package hyperref Info: backreferencing OFF on input line 6362. +Package hyperref Info: Link coloring OFF on input line 6367. +Package hyperref Info: Link coloring with OCG OFF on input line 6372. +Package hyperref Info: PDF/A mode OFF on input line 6377. +LaTeX Info: Redefining \ref on input line 6417. +LaTeX Info: Redefining \pageref on input line 6421. + +(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa +ge +with kernel methods +) +\Hy@abspage=\count297 +\c@Item=\count298 +\c@Hfootnote=\count299 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX + +(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag +e +with kernel methods +) +\Fld@listcount=\count300 +\c@bookmark@seq@number=\count301 + +(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +) +\Hy@SectionHShift=\skip52 +) +(/usr/share/texmf-dist/tex/latex/titling/titling.sty +Package: titling 2009/09/04 v2.1d maketitle typesetting +\thanksmarkwidth=\skip53 +\thanksmargin=\skip54 +\droptitle=\skip55 +) +(/usr/share/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC) +\LTleft=\skip56 +\LTright=\skip57 +\LTpre=\skip58 +\LTpost=\skip59 +\LTchunksize=\count302 +\LTcapwidth=\dimen278 +\LT@head=\box73 +\LT@firsthead=\box74 +\LT@foot=\box75 +\LT@lastfoot=\box76 +\LT@cols=\count303 +\LT@rows=\count304 +\c@LT@tables=\count305 +\c@LT@chunks=\count306 +\LT@p@ftn=\toks43 +) +(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen279 +\lightrulewidth=\dimen280 +\cmidrulewidth=\dimen281 +\belowrulesep=\dimen282 +\belowbottomsep=\dimen283 +\aboverulesep=\dimen284 +\abovetopsep=\dimen285 +\cmidrulesep=\dimen286 +\cmidrulekern=\dimen287 +\defaultaddspace=\dimen288 +\@cmidla=\count307 +\@cmidlb=\count308 +\@aboverulesep=\dimen289 +\@belowrulesep=\dimen290 +\@thisruleclass=\count309 +\@lastruleclass=\count310 +\@thisrulewidth=\dimen291 +) +(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip60 +\enit@outerparindent=\dimen292 +\enit@toks=\toks44 +\enit@inbox=\box77 +\enit@count@id=\count311 +\enitdp@description=\count312 +) +(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box78 +\UL@hyphenbox=\box79 +\UL@skip=\skip61 +\UL@hook=\toks45 +\UL@height=\dimen293 +\UL@pe=\count313 +\UL@pixel=\dimen294 +\ULC@box=\box80 +Package: ulem 2019/11/18 +\ULdepth=\dimen295 +) +(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty +Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk) +\symrsfs=\mathgroup7 +) +\Wrappedcontinuationbox=\box81 +\Wrappedvisiblespacebox=\box82 +Package hyperref Info: Option `breaklinks' set `true' on input line 361. +Package hyperref Info: Option `colorlinks' set `true' on input line 361. +LaTeX Font Info: Trying to load font information for T1+ppl on input line 36 +8. + +(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count314 +\l__pdf_internal_box=\box83 +) +No file 7-SageAlgebra.aux. +\openout1 = `7-SageAlgebra.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count315 +\scratchdimen=\dimen296 +\scratchbox=\box84 +\nofMPsegments=\count316 +\nofMParguments=\count317 +\everyMPshowfont=\toks46 +\MPscratchCnt=\count318 +\MPscratchDim=\dimen297 +\MPnumerator=\count319 +\makeMPintoPDFobject=\count320 +\everyMPtoPDFconversion=\toks47 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: float package is loaded. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2020/05/30 v1.4b longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: <default> +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +Package hyperref Info: Link coloring ON on input line 368. + +(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count321 +) +LaTeX Info: Redefining \ref on input line 368. +LaTeX Info: Redefining \pageref on input line 368. +LaTeX Info: Redefining \nameref on input line 368. +\@outlinefile=\write7 +\openout7 = `7-SageAlgebra.out'. + +LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3 +70. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Trying to load font information for OML+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Trying to load font information for OMS+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Trying to load font information for OMX+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Trying to load font information for OT1+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 370. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 370. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 370. +LaTeX Font Info: Trying to load font information for U+rsfs on input line 37 +0. + +(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd +File: ursfs.fd 1998/03/24 rsfs font definition file (jk) +) +LaTeX Font Info: Trying to load font information for T1+cmtt on input line 3 +70. + +(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 376. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 376. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 376. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 376. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 376. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 376. + [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +LaTeX Font Info: Trying to load font information for TS1+cmtt on input line +496. + (/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) [2] +LaTeX Font Info: Trying to load font information for U+fplmbb on input line +562. + (/usr/share/texmf-dist/tex/latex/psnfss/ufplmbb.fd +File: ufplmbb.fd 2003/10/30 Fontinst v1.914 font definitions for U/fplmbb. +) + +Package longtable Warning: Column widths have changed +(longtable) in table 1 on input line 587. + +[3] [4] +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 798. + [5] [6] [7] [8] [9] [10] [11] [12] + +Package longtable Warning: Table widths have changed. Rerun LaTeX. + +(./7-SageAlgebra.aux) + +Package rerunfilecheck Warning: File `7-SageAlgebra.out' has changed. +(rerunfilecheck) Rerun to get outlines right +(rerunfilecheck) or use package `bookmark'. + +Package rerunfilecheck Info: Checksums for `7-SageAlgebra.out': +(rerunfilecheck) Before: <no file> +(rerunfilecheck) After: 961D93ACE9582C324C6D1EA7B5DE7C92;970. + +LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. + + ) +Here is how much of TeX's memory you used: + 21321 strings out of 479383 + 388521 string characters out of 5875798 + 751012 words of memory out of 5000000 + 37920 multiletter control sequences out of 15000+600000 + 445530 words of font info for 135 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 107i,14n,111p,506b,616s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/ +texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/usr/share/texmf-dist/font +s/enc/dvips/base/8r.enc}</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c +mex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></us +r/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-d +ist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type +1/public/mathpazo/fplmbb.pfb></usr/share/texmf-dist/fonts/type1/public/mathpazo +/fplmr.pfb></usr/share/texmf-dist/fonts/type1/public/mathpazo/fplmri.pfb></usr/ +share/texmf-dist/fonts/type1/public/cm-super/sfit1095.pfb></usr/share/texmf-dis +t/fonts/type1/public/cm-super/sftt1095.pfb></usr/share/texmf-dist/fonts/type1/p +ublic/cm-super/sftt1200.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/upl +b8a.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplr8a.pfb></usr/share/ +texmf-dist/fonts/type1/urw/palatino/uplri8a.pfb> +Output written on 7-SageAlgebra.pdf (12 pages, 226346 bytes). +PDF statistics: + 184 PDF objects out of 1000 (max. 8388607) + 155 compressed objects within 2 object streams + 46 named destinations out of 1000 (max. 500000) + 13 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture5/notebook/7-SageAlgebra.out b/src/Lecture5/notebook/7-SageAlgebra.out @@ -0,0 +1,16 @@ +\BOOKMARK [1][-]{section.1}{The Jupyter Notebook}{}% 1 +\BOOKMARK [2][-]{subsection.1.1}{Cells}{section.1}% 2 +\BOOKMARK [2][-]{subsection.1.2}{Markdown}{section.1}% 3 +\BOOKMARK [1][-]{section.2}{Symbolic expressions}{}% 4 +\BOOKMARK [2][-]{subsection.2.1}{Mathematical variables}{section.2}% 5 +\BOOKMARK [1][-]{section.3}{Basic rings and fields}{}% 6 +\BOOKMARK [2][-]{subsection.3.1}{Parents and coercion}{section.3}% 7 +\BOOKMARK [1][-]{section.4}{Polynomial rings}{}% 8 +\BOOKMARK [2][-]{subsection.4.1}{Operations on polynomials}{section.4}% 9 +\BOOKMARK [1][-]{section.5}{Matrices and vectors}{}% 10 +\BOOKMARK [1][-]{section.6}{Number Theory}{}% 11 +\BOOKMARK [2][-]{subsection.6.1}{Primes}{section.6}% 12 +\BOOKMARK [2][-]{subsection.6.2}{The Chinese remainder theorem \(CRT\)}{section.6}% 13 +\BOOKMARK [1][-]{section.7}{Cryptography: RSA}{}% 14 +\BOOKMARK [2][-]{subsection.7.1}{Public-key cryptography}{section.7}% 15 +\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 Binary files differ. diff --git a/src/Lecture5/notebook/7-SageAlgebra.tex b/src/Lecture5/notebook/7-SageAlgebra.tex @@ -0,0 +1,1297 @@ +\documentclass[11pt]{article} + + \usepackage[breakable]{tcolorbox} + \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour) + + \usepackage{iftex} + \ifPDFTeX + \usepackage[T1]{fontenc} + \usepackage{mathpazo} + \else + \usepackage{fontspec} + \fi + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % Maintain compatibility with old templates. Remove in nbconvert 6.0 + \let\Oldincludegraphics\includegraphics + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionFormat{nocaption}{} + \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt} + + \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size + \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}} + \usepackage{float} + \floatplacement{figure}{H} % forces figures to be placed at the correct location + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + \makeatletter % fix for grffile with XeLaTeX + \def\Gread@@xetex#1{% + \IfFileExists{"\Gin@base".bb}% + {\Gread@eps{\Gin@base.bb}}% + {\Gread@@xetex@aux#1}% + } + \makeatother + + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + % The default LaTeX title has an obnoxious amount of whitespace. By default, + % titling removes some of it. It also provides customization options. + \usepackage{titling} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + \usepackage{mathrsfs} + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF} + \definecolor{ansi-default-inverse-bg}{HTML}{000000} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatibility definitions + \def\gt{>} + \def\lt{<} + \let\Oldtex\TeX + \let\Oldlatex\LaTeX + \renewcommand{\TeX}{\textrm{\Oldtex}} + \renewcommand{\LaTeX}{\textrm{\Oldlatex}} + % Document parameters + % Document title + \title{Algebra and Cryptography with SageMath} + \date{2021-04-23} + \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}} + + + + + +% Pygments definitions +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\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}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % For linebreaks inside Verbatim environment from package fancyvrb. + \makeatletter + \newbox\Wrappedcontinuationbox + \newbox\Wrappedvisiblespacebox + \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}} + \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}} + \newcommand*\Wrappedcontinuationindent {3ex } + \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox} + % Take advantage of the already applied Pygments mark-up to insert + % potential linebreaks for TeX processing. + % {, <, #, %, $, ' and ": go to next line. + % _, }, ^, &, >, - and ~: stay at end of broken line. + % Use of \textquotesingle for straight quote. + \newcommand*\Wrappedbreaksatspecials {% + \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}% + \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}% + \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}% + \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}% + \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}% + \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}% + \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}% + \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}% + \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}% + \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}% + \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}% + \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}% + \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}% + \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}% + } + % Some characters . , ; ? ! / are not pygmentized. + % This macro makes them "active" and they will insert potential linebreaks + \newcommand*\Wrappedbreaksatpunct {% + \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}% + \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}% + \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}% + \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}% + \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}% + \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}% + \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}% + \catcode`\.\active + \catcode`\,\active + \catcode`\;\active + \catcode`\:\active + \catcode`\?\active + \catcode`\!\active + \catcode`\/\active + \lccode`\~`\~ + } + \makeatother + + \let\OriginalVerbatim=\Verbatim + \makeatletter + \renewcommand{\Verbatim}[1][1]{% + %\parskip\z@skip + \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}% + \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}% + \def\FancyVerbFormatLine ##1{\hsize\linewidth + \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ + \strut ##1\strut}% + }% + % If the linebreak is at a space, the latter will be displayed as visible + % space at end of first line, and a continuation symbol starts next line. + % Stretch/shrink are however usually zero for typewriter font. + \def\FV@Space {% + \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font + \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak} + {\kern\fontdimen2\font}% + }% + + % Allow breaks at special characters using \PYG... macros. + \Wrappedbreaksatspecials + % Breaks at punctuation characters . , ; ? ! and / need catcode=\active + \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]% + } + \makeatother + + % Exact colors from NB + \definecolor{incolor}{HTML}{303F9F} + \definecolor{outcolor}{HTML}{D84315} + \definecolor{cellborder}{HTML}{CFCFCF} + \definecolor{cellbackground}{HTML}{F7F7F7} + + % prompt + \makeatletter + \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep} + \makeatother + \newcommand{\prompt}[4]{ + \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip} + } + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + +\begin{document} + + \maketitle + + + + + 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 \href{https://jupyter.org/}{Jupyter Notebook}. + +\hypertarget{the-jupyter-notebook}{% +\section{The Jupyter Notebook}\label{the-jupyter-notebook}} + +\textbf{Reference:} {[}\href{https://jupyter.org/documentation}{1}{]} + +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: \texttt{http://localhost:8888/notebooks...}). + +You can create a new notebook by clicking on +\texttt{New\ \textgreater{}\ SageMath\ 9.2}. You can also create a +Python 3 notebook to write Python code. + +Jupyter saves and reads files in the \texttt{.ipynb} format. If you +download the file for this lecture you can open it and follow the +examples interactively. + +\hypertarget{cells}{% +\subsection{Cells}\label{cells}} + +The notebook contains one or more \emph{interactive cells} that you can +run, like this one below: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{2}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{c+c1}{\PYZsh{} Exercise: modify this cell to use the print() command} +\PY{l+m+mi}{2}\PY{o}{+}\PY{l+m+mi}{2} +\PY{l+m+mi}{2}\PY{o}{/}\PY{l+m+mi}{5} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{2}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +2/5 +\end{Verbatim} +\end{tcolorbox} + + 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 \texttt{Insert} from the menu bar. + +Notice that only the last statement produces an output. You can force +anything to be written as output with the \texttt{print()} command, +which works like in Python. As an exercise, try to modify the cell above +to provide more output! + + \hypertarget{markdown}{% +\subsection{Markdown}\label{markdown}} + +\href{https://en.wikipedia.org/wiki/Markdown}{Markdown} is a simple +markup language - think of LaTeX or html, but much simpler. You can add +text to your notebook with Markdown cells by selecting +\texttt{Cell\ \textgreater{}\ Cell\ Type\ \textgreater{}\ Markdown}. + +You can also include some LaTeX code in Markdown cells, with dollar +signs \$ or align environments: + +\begin{align*} +\frac{(x+y)^2}{x+1} = \frac{x^2+y^2}{x+1} +\end{align*} + +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! + + \hypertarget{symbolic-expressions}{% +\section{Symbolic expressions}\label{symbolic-expressions}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{2}{]} + +Now, let's get started with Sage. One thing you might want to do is +manipulating symbolic expressions, like the following: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{3}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} +\PY{n}{solve}\PY{p}{(}\PY{n}{f}\PY{p}{,}\PY{n}{x}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{3}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +[x == -sqrt(6) - 1, x == sqrt(6) - 1] +\end{Verbatim} +\end{tcolorbox} + + Notice that the single \texttt{=} is part of an assignment, as in +Python: we are \emph{assigning} to the variable \texttt{f} the value +\texttt{x\^{}2\ +\ 2*x\ -\ 5\ \textgreater{}=\ 0}, which in this case is +an equation, so it contains the symbol \texttt{==}. Keep in mind the +difference between the two! + +\textbf{Exercise:} change the code above to solve the corresponding +inequality \(x^2+2x-5\geq 0\). + + \hypertarget{mathematical-variables}{% +\subsection{Mathematical variables}\label{mathematical-variables}} + +Last time we saw what \emph{variables} are in Python, and that they are +a little bit different from the \emph{Mathematical variables} that you +use in Mathematics. In Sage, both concepts are present, but they are +still distinct. For example in the cell above \texttt{f} is a variable +in the sense of computer science, while \texttt{x} is a Mathematical +variable. + +If you want to use Mathematical variables other than \texttt{x}, you +first need to \emph{declare} them with the \texttt{var()} command: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{14}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{14}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +[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] +\end{Verbatim} +\end{tcolorbox} + + Try removing the first line in the cell above and see what error you +get! + +Here is another example: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{16}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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{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} +\PY{n}{solve}\PY{p}{(}\PY{n}{f}\PY{p}{,}\PY{n}{x}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{16}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +[x == -1/2*a - 1/2*sqrt(a\^{}2 - 4*b), x == -1/2*a + 1/2*sqrt(a\^{}2 - 4*b)] +\end{Verbatim} +\end{tcolorbox} + + Some common constants are +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{already +defined} in Sage: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{17}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{n}{pi}\PY{o}{*}\PY{n}{I}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{17}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +-1 +\end{Verbatim} +\end{tcolorbox} + + We will study symbolic expressions more in detail next time, in the +context of calculus/analysis. + + \hypertarget{basic-rings-and-fields}{% +\section{Basic rings and fields}\label{basic-rings-and-fields}} + +\textbf{References:} +{[}\href{https://doc.sagemath.org/html/en/reference/rings_standard/index.html}{3}{]} +{[}\href{https://doc.sagemath.org/html/en/reference/rings_numerical/index.html}{4}{]} +{[}\href{https://doc.sagemath.org/html/en/reference/finite_rings/index.html}{5}{]} + +As you should know, a \emph{field} is a Mathematical structure with two +operations, addition and multiplication, which respect certain rules +(distributivity, associativity, commutativity\ldots). 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 \emph{(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. + +These structures are already implemented in Sage. Some of the most +common are listed in the following table: + +\begin{longtable}[]{@{}rcl@{}} +\toprule +Mathematical object & Math symbol & Sage name \\ +\midrule +\endhead +Integers & \(\mathbb Z\) & \texttt{ZZ} \\ +Rational numbers & \(\mathbb Q\) & \texttt{QQ} \\ +Real numbers & \(\mathbb R\) & \texttt{RR} \\ +Complex numbers & \(\mathbb C\) & \texttt{CC} \\ +Integers modulo \(n\) & \(\mathbb Z/n\mathbb Z\) & +\texttt{Integers(n)} \\ +Finite fields & \(\mathbb F_p\) & GF(p) \\ +\(\dots\) & \(\dots\) & \(\dots\) \\ +\bottomrule +\end{longtable} + + If you write a number or an expression, Sage will figure out where it +``lives'', choosing the most restrictive interpretation possible. For +example \texttt{3} will be interpreted to be an integer, even if it is +also a rational number, a real number and a complex number. + + \hypertarget{parents-and-coercion}{% +\subsection{Parents and coercion}\label{parents-and-coercion}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/tutorial/tour_coercion.html}{6}{]} + +You can check where an object ``lives'' with the \texttt{parent()} +command. It works more or less like the Python command \texttt{type()}, +but it gives a more Mathematically inclined answer. Check the reference +link {[}6{]} above if you want more details. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{18}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{c+c1}{\PYZsh{}Edit this cell to find out the type of other objects that we used} +\PY{n}{parent}\PY{p}{(}\PY{l+m+mi}{3}\PY{o}{/}\PY{l+m+mi}{5}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{18}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +Rational Field +\end{Verbatim} +\end{tcolorbox} + + 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: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{4}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{parent}\PY{p}{(}\PY{n}{minus\PYZus{}one}\PY{p}{)}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{parent}\PY{p}{(}\PY{n}{minus\PYZus{}one\PYZus{}coerced}\PY{p}{)}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +Symbolic Ring +Integer Ring + \end{Verbatim} + + \textbf{Remark.} Notice that there is a fundamental difference between +the rings \texttt{RR} and \texttt{CC} and all the others in the table +above: the real and complex numbers are \emph{approximated}. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{1}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n+nb}{print}\PY{p}{(}\PY{n}{QQ}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{RR}\PY{p}{(}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +3 +3.00000000000000 + \end{Verbatim} + + You can also choose the precision of this approximation using the +alternative name \texttt{RealField}. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{4}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n+nb}{print}\PY{p}{(}\PY{n}{RR}\PY{p}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +Real Field with 53 bits of precision +Real Field with 1000 bits of precision + \end{Verbatim} + + \hypertarget{polynomial-rings}{% +\section{Polynomial rings}\label{polynomial-rings}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/polynomial_rings/index.html}{7}{]} + +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. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{5}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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)} +\PY{n}{polring} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{5}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of +precision +\end{Verbatim} +\end{tcolorbox} + + You can use as many variables as you like, and you can replace +\texttt{RR} with any ring. In the example above \texttt{polring} is just +the name of the variable (in the computer science sense) associated with +this polynomial ring. + +\hypertarget{operations-on-polynomials}{% +\subsection{Operations on polynomials}\label{operations-on-polynomials}} + +The usual Mathematical operations are available on polynomial rings, +including Euclidean division \texttt{//} and remainder \texttt{\%}. +There is also the single-slash division \texttt{/}, but the result may +not be a polynomial anymore. + +\textbf{Exercise:} use the \texttt{parent()} command to find out what +the quotient of two polynomials is. + +\textbf{Question:} what happens if you remove the first line in the cell +below? What if we used the variable \texttt{y} instead of \texttt{x}? + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{6}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{QQ}\PY{p}{[}\PY{p}{]} +\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!} +\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}{)} +\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}{)} +\PY{n}{f} \PY{o}{=} \PY{n}{p} \PY{o}{/} \PY{p}{(}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{q}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{r}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +x + 1 +-4 +(x\^{}2 + 2*x - 3)/(x + 1) + \end{Verbatim} + + You can do more complex operations. Try out \texttt{roots()} and +\texttt{factor} in the cell below. + +\textbf{Remark.} Notice how the result can change substantially if you +change the base ring. + +\textbf{Remark.} +\href{https://doc.sagemath.org/html/en/reference/structure/sage/structure/factorization.html}{Factorizations} +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 +\texttt{list(factor(f))}. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{7}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{]} + +\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} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{factor}\PY{p}{(}\PY{n}{f}\PY{p}{)}\PY{p}{)} +\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)} + +\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}{]} +\PY{n}{factor}\PY{p}{(}\PY{n}{x}\PY{o}{*}\PY{n}{y}\PY{o}{+}\PY{n}{x}\PY{p}{)} + +\PY{c+c1}{\PYZsh{} The following line gives an error, because the polynomial} +\PY{c+c1}{\PYZsh{} is understood to possibly have many variables:} +\PY{c+c1}{\PYZsh{}(x\PYZca{}2\PYZhy{}1).roots()} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +(t + 1) * (t\^{}2 - 3) * (t\^{}2 + 1) +[(-1, 1)] + \end{Verbatim} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{7}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +(y + 1) * x +\end{Verbatim} +\end{tcolorbox} + + \hypertarget{matrices-and-vectors}{% +\section{Matrices and vectors}\label{matrices-and-vectors}} + +\textbf{References:} +{[}\href{https://doc.sagemath.org/html/en/reference/matrices/index.html}{8}{]}, +but in particular the subections +{[}\href{https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/docs.html}{9}{]} +and +{[}\href{https://doc.sagemath.org/html/en/reference/matrices/sage/matrix/matrix2.html}{10}{]} + +In Sage you can easily manipulate matrices and vectors + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{77}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} +\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}{)} + +\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{}} +\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}{)} +\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}{)} +\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}{)} + +\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()} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +[ 1 2 3] +[ 0 0 1] +[ 4 -3 22/7] + +[1/2 0 0] +[ 7 0 0] +[ 1 1 1] + +(3/2, 21, 6) + +[ -7/2 -10 80/7] +[ 17 -4 15/7] +[ 241/7 -18/7 869/49] + +Rank of A = 3 +Rank of B = 2 + \end{Verbatim} + + \textbf{Exercise:} in the cell above, compute the determinant, inverse +and characteristic polynomial of the matrix \texttt{A}. \emph{Hint: look +at the reference {[}10{]} above (the functions are listed in alphabetic +order).} + +As for polynomials, you can specify where a matrix or a vector lives + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{57}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\PY{n}{parent}\PY{p}{(}\PY{n}{M}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{57}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +Full MatrixSpace of 2 by 2 dense matrices over Complex Field with 53 bits of +precision +\end{Verbatim} +\end{tcolorbox} + + You can also solve linear systems and compute eigenvalues and +eigenvectors of a matrix + +\textbf{Warning.} In linear algebra there are distinct concepts of +\emph{left} and \emph{right} eigenvalues (and eigenvector). The one you +know is probably that of \textbf{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\). + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{60}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} +\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} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{60}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +(0.289916349448506, 0.0241596957873755) +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{64}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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()} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{64}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +[ +(-0.3722813232690144?, Vector space of degree 2 and dimension 1 over Algebraic +Field +User basis matrix: +[ 1 -0.6861406616345072?]), +(5.372281323269015?, Vector space of degree 2 and dimension 1 over Algebraic +Field +User basis matrix: +[ 1 2.186140661634508?]) +] +\end{Verbatim} +\end{tcolorbox} + + 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. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{94}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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{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} +\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} +\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} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +[-14 2 0 -1 1 -2 -1] +[ 0 -8 0 9 -2 11 1] +[ 0 3 1 -1 1 1 221] +[ -1 2 1 -25 -10 4 0] +[ -3 0 0 2 16 -1 -2] +[ 1 -3 3 -41 1 0 0] +[ -2 1 0 0 -6 2 12] + +[ 0 9 -2] +[ 1 -1 1] + +[-14 2 0 -1 1 -2 -1] + +[-14 2 0 -1 1] +[ 1 -3 3 -41 1] +[ 0 3 1 -1 1] + \end{Verbatim} + + \textbf{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 \begin{align*} + \operatorname{det}A = \sum_{j=1}^n (-1)^ja_{0j}M_{0j} +\end{align*} 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\). + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{91}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{k}{def} \PY{n+nf}{my\PYZus{}det}\PY{p}{(}\PY{n}{A}\PY{p}{)}\PY{p}{:} + \PY{k}{if} \PY{o+ow}{not} \PY{n}{A}\PY{o}{.}\PY{n}{is\PYZus{}square}\PY{p}{(}\PY{p}{)}\PY{p}{:} + \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}{)} + + \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} + + \PY{c+c1}{\PYZsh{} Continue from here!} +\end{Verbatim} +\end{tcolorbox} + + \hypertarget{number-theory}{% +\section{Number Theory}\label{number-theory}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/rings_standard/sage/rings/integer.html}{11}{]} + +Sage includes a large library of functions for computing with the +integers, see the link above. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{8}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{n} \PY{o}{=} \PY{l+m+mi}{123456789} +\PY{n}{m} \PY{o}{=} \PY{l+m+mi}{987654321} +\PY{n}{p} \PY{o}{=} \PY{l+m+mi}{3607} + +\PY{n+nb}{print}\PY{p}{(}\PY{n}{factor}\PY{p}{(}\PY{n}{n}\PY{p}{)}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{is\PYZus{}prime}\PY{p}{(}\PY{n}{p}\PY{p}{)}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{p}\PY{o}{.}\PY{n}{divides}\PY{p}{(}\PY{n}{n}\PY{p}{)}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{euler\PYZus{}phi}\PY{p}{(}\PY{n}{m}\PY{p}{)}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{gcd}\PY{p}{(}\PY{n}{n}\PY{p}{,} \PY{n}{m}\PY{p}{)}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{lcm}\PY{p}{(}\PY{n}{n}\PY{p}{,} \PY{n}{m}\PY{p}{)}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +3\^{}2 * 3607 * 3803 +True +True +619703040 +9 +13548070123626141 + \end{Verbatim} + + \hypertarget{primes}{% +\subsection{Primes}\label{primes}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/sets/sage/sets/primes.html}{12}{]} + +The set of prime numbers is called \texttt{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. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{9}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{PP} \PY{o}{=} \PY{n}{Primes}\PY{p}{(}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{PP}\PY{p}{)} +\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}{)} +\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}{)} + +\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}{]} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +Set of all prime numbers: 2, 3, 5, 7, {\ldots} +31 15485867 +47 +[79, 83, 89, 97] + \end{Verbatim} + + \hypertarget{the-chinese-remainder-theorem-crt}{% +\subsection{The Chinese remainder theorem +(CRT)}\label{the-chinese-remainder-theorem-crt}} + +We say that two integers \(a\) and \(b\) are \emph{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 +\texttt{a\ \%\ n\ ==\ b\ \%\ n}. + +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 + +\begin{align*} +\begin{cases} + x \equiv a \pmod n\\ + x \equiv b \pmod m +\end{cases} +\end{align*} + +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\). + +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: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{10}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{a} \PY{o}{=} \PY{l+m+mi}{2} +\PY{n}{b} \PY{o}{=} \PY{o}{\PYZhy{}}\PY{l+m+mi}{1} +\PY{n}{n} \PY{o}{=} \PY{l+m+mi}{172} +\PY{n}{m} \PY{o}{=} \PY{l+m+mi}{799} + +\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}{:} + \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}{)} +\PY{k}{else}\PY{p}{:} + \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}{)} + \PY{n+nb}{print}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{x}\PY{o}{\PYZpc{}}\PY{k}{n}, x\PYZpc{}m) +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +74306 2 798 + \end{Verbatim} + + \textbf{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 + +\begin{align*} +\begin{cases} + x \equiv a_0 \pmod {n_0}\\ + x \equiv a_1 \pmod {n_1}\\ + \dots \\ + x \equiv a_k \pmod {n_k} +\end{cases} +\end{align*} + +has exactly one solution modulo \(\prod_{i=0}^kn_i\). Use the +\texttt{crt()} function to find a solution to such a system. *Hint: +start by running the command \texttt{help(crt)}. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{127}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{c+c1}{\PYZsh{}help(crt)} +\end{Verbatim} +\end{tcolorbox} + + \hypertarget{cryptography-rsa}{% +\section{Cryptography: RSA}\label{cryptography-rsa}} + +\href{https://en.wikipedia.org/wiki/Cryptography}{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. + +A simple cryptographic protocol could be changing every letter of your +text following a fixed scheme (or \emph{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. + +\hypertarget{public-key-cryptography}{% +\subsection{Public-key cryptography}\label{public-key-cryptography}} + +Public-key cryptographic protocols, such as RSA, work like this: there +are two keys, a \emph{private} key that is only known to person A +(traditionally called Alice in every example), and a \emph{public} key +that does not need to be secret. + +The public key is used to \emph{encrypt} the message (that is to +``lock'' it, or ``hyde'' it), but one needs the private key to +\emph{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. + +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 \emph{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! + +Notice that such a protocol is \emph{asymmetric}: if Alice wanted to +send a secret to Bob in reply, Bob would need to generate a pair of keys +of his own. + +Let's see how we can do this in practice, using number theory! + +\hypertarget{rsa}{% +\subsection{RSA}\label{rsa}} + +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. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{2}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{p} \PY{o}{=} \PY{l+m+mi}{100003100019100043100057100069} +\PY{n}{q} \PY{o}{=} \PY{l+m+mi}{100144655312449572059845328443} +\PY{n}{n} \PY{o}{=} \PY{n}{p}\PY{o}{*}\PY{n}{q} +\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}{)} + +\PY{c+c1}{\PYZsh{} Use the command below to see how long it takes} +\PY{c+c1}{\PYZsh{}timeit(\PYZdq{}factor(n)\PYZdq{}, number=1, repeat=1)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +True True False + \end{Verbatim} + + 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! + +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. + +Of course, she does all of this using Sage! + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{105}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{k}{def} \PY{n+nf}{two\PYZus{}large\PYZus{}primes}\PY{p}{(}\PY{p}{)}\PY{p}{:} + \PY{n}{p}\PY{p}{,} \PY{n}{q} \PY{o}{=} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0} + \PY{c+c1}{\PYZsh{} We make sure that they are different} + \PY{k}{while} \PY{n}{p} \PY{o}{==} \PY{n}{q}\PY{p}{:} + \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}{]} + \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}{]} + \PY{k}{return} \PY{n}{p}\PY{p}{,} \PY{n}{q} + +\PY{k}{def} \PY{n+nf}{random\PYZus{}unit\PYZus{}mod}\PY{p}{(}\PY{n}{N}\PY{p}{)}\PY{p}{:} + \PY{n}{R} \PY{o}{=} \PY{n}{Integers}\PY{p}{(}\PY{n}{N}\PY{p}{)} + \PY{n}{d} \PY{o}{=} \PY{n}{R}\PY{p}{(}\PY{l+m+mi}{0}\PY{p}{)} + \PY{c+c1}{\PYZsh{} We make sure that it is invertible} + \PY{k}{while} \PY{o+ow}{not} \PY{n}{d}\PY{o}{.}\PY{n}{is\PYZus{}unit}\PY{p}{(}\PY{p}{)}\PY{p}{:} + \PY{n}{d} \PY{o}{=} \PY{n}{R}\PY{o}{.}\PY{n}{random\PYZus{}element}\PY{p}{(}\PY{p}{)} + \PY{k}{return} \PY{n}{d} + +\PY{k}{def} \PY{n+nf}{Alice\PYZus{}generate\PYZus{}keys}\PY{p}{(}\PY{p}{)}\PY{p}{:} + \PY{n}{p}\PY{p}{,} \PY{n}{q} \PY{o}{=} \PY{n}{two\PYZus{}large\PYZus{}primes}\PY{p}{(}\PY{p}{)} + \PY{n}{n} \PY{o}{=} \PY{n}{p}\PY{o}{*}\PY{n}{q} + \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!} + + \PY{n}{d} \PY{o}{=} \PY{n}{random\PYZus{}unit\PYZus{}mod}\PY{p}{(}\PY{n}{phi\PYZus{}n}\PY{p}{)} + \PY{n}{e} \PY{o}{=} \PY{n}{d}\PY{o}{\PYZca{}}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1} + \PY{k}{return} \PY{n}{n}\PY{p}{,} \PY{n}{d}\PY{p}{,} \PY{n}{e} + +\PY{n}{Alice\PYZus{}generate\PYZus{}keys}\PY{p}{(}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{105}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +(419199544978969, 235530823946467, 80799425863927) +\end{Verbatim} +\end{tcolorbox} + + 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.) + +Now he computes \(m^d\pmod n\) and sends it back to Alice. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{3}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{:} + \PY{n}{R} \PY{o}{=} \PY{n}{Integers}\PY{p}{(}\PY{n}{n}\PY{p}{)} + \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} + +\PY{n}{message} \PY{o}{=} \PY{l+m+mi}{42424242} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{3}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +149461597163501 +\end{Verbatim} +\end{tcolorbox} + + Since \(de\equiv 1\pmod{\varphi(n)}\), it follows that +\((m^d)^e\equiv m\pmod n\) (see +\href{https://en.wikipedia.org/wiki/Euler\%27s_theorem}{Wikipedia: +Euler's theorem}). So for Alice it is very easy to get back the original +message: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{108}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{:} + \PY{n}{R} \PY{o}{=} \PY{n}{Integers}\PY{p}{(}\PY{n}{n}\PY{p}{)} + \PY{k}{return} \PY{n}{R}\PY{p}{(}\PY{n}{m\PYZus{}encrypted}\PY{p}{)}\PY{o}{\PYZca{}}\PY{n}{e} + +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{108}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +42424242 +\end{Verbatim} +\end{tcolorbox} + + 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. + +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 +\href{https://en.wikipedia.org/wiki/Shor\%27s_algorithm}{Shor's +algorithm} takes advantage of this different logic and can factorize +numbers quickly, if run on a quantum computer. + +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. + + + % Add a bibliography block to the postdoc + + + +\end{document} diff --git a/src/Lecture6/live/8-SageCalculus-modified.ipynb b/src/Lecture6/live/8-SageCalculus-modified.ipynb @@ -0,0 +1,1614 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Last time we saw the basics of symbolic expressions:\n", + "* How to define and manipulate symbolic expressions\n", + "* How to introduce new variables (in the Mathematical sense) with `var()`\n", + "* How to solve equations and inequalities\n", + "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n", + "\n", + "Here are some examples to remind you of these basic things:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "x == -sqrt(-pi),\n", + "x == sqrt(-pi)\n", + "]\n", + "[\n", + "z == -sqrt(pi + x^2),\n", + "z == sqrt(pi + x^2)\n", + "]\n", + "[[y < -2], [y > 1]]\n", + "2*pi + e is approximately 9.00146713563863\n" + ] + } + ], + "source": [ + "var('y', 'z') # Define new variables (x is already defined by Sage)\n", + "f = x^2 + pi\n", + "g = y^2 + y - 2 > 0\n", + "print( solve(f==0, x) )\n", + "print( solve(z^2 - f, z) )\n", + "print( solve(g, y) )\n", + "print( 2*pi + e, \"is approximately\", n(2*pi + e) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will see some more details about solving equations and manipulating their solutions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving equations and inequalities\n", + "\n", + "**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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x + y = 2 \\\\\n", + " 2x - y = 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "\n", + "Can be solved as" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[x == (8/3), y == (-2/3)]]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x+1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Solution:** the system is\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " y^2 = x^2 - 2x +1\\\\\n", + " x^2 + y^2 = 4\n", + " \\end{cases}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[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]]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('y')\n", + "eq1 = y^2 == x^2-2*x+1\n", + "eq2 = x^2 + y^2 == 4\n", + "solve([eq1, eq2], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The set of solutions\n", + "\n", + "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)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-3\n" + ] + } + ], + "source": [ + "solutions = solve(x^2-9 == 0, x)\n", + "solutions[0] # This is the expression 'x == -3'\n", + "\n", + "# Using rhs() explained below\n", + "print(solutions[0].rhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rhs: -y + 2\n", + "lhs: x^2 + y\n" + ] + } + ], + "source": [ + "f = x^2+y <= 2-y\n", + "print(\"rhs:\", f.rhs())\n", + "print(\"lhs:\", f.lhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simple inequality: [[x < -3], [x > 3]]\n", + "System of inequalities:\n", + " [\n", + "[3 < x, x < 6],\n", + "[x < -3]\n", + "]\n" + ] + } + ], + "source": [ + "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n", + "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the last example (system of inequalities), Sage is telling us that the system\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x^2-9 > 9 \\\\\n", + " x < 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "has two solutions:\n", + "* $x$ is between $3$ and $6$;\n", + "* $x$ is less than $-3$.\n", + "\n", + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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)$." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All solutions:\n", + "[\n", + "[x == (-1/2*I + 1/2), y == -sqrt(1/2*I + 4)],\n", + "[x == (-1/2*I + 1/2), y == sqrt(1/2*I + 4)],\n", + "[x == (1/2*I + 1/2), y == -sqrt(-1/2*I + 4)],\n", + "[x == (1/2*I + 1/2), y == sqrt(-1/2*I + 4)]\n", + "]\n" + ] + } + ], + "source": [ + "# We use a different equation because the first exercise only\n", + "# had real solutions.\n", + "var('y')\n", + "eq1 = y^2 == x^2-2*x+5\n", + "eq2 = x^2 + y^2 == 4\n", + "solutions = solve([eq1, eq2], [x,y])\n", + "\n", + "print(\"All solutions:\")\n", + "print(solutions)\n", + "\n", + "for s in solutions:\n", + " #print(\"One solutions is:\", s)\n", + " x0 = s[0].rhs()\n", + " y0 = s[1].rhs()\n", + " if x0 in RR and y0 in RR:\n", + " print((x0, y0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{x: 8/3, y: -2/3}]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Alternative method for real roots: `find_root()`\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using solve():\n", + " [\n", + "x == -e^x + 10\n", + "]\n", + "Using find_root(): 2.070579904980303\n" + ] + } + ], + "source": [ + "f = e^x + x - 10\n", + "print(\"Using solve():\\n\", solve(f, x))\n", + "print(\"Using find_root():\", f.find_root(0,10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating functions\n", + "\n", + "If an expression contains only one variable you can evaluate it easily, even if it is not a function." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "y + 3 > (y + 3)^2\n" + ] + } + ], + "source": [ + "var('y')\n", + "f = x^2-3\n", + "g = x > x^2\n", + "\n", + "print(f(2))\n", + "print(g(3+y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2 == 0\n", + "3*y == 2\n" + ] + } + ], + "source": [ + "var('y','z')\n", + "\n", + "f = y*z^2 - y == z\n", + "print(f(2, 0))\n", + "print(f(z = 2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Symbolic computations\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{array}{llcc}\n", + " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n", + " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n", + " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n", + " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n", + " \\end{array}\n", + "\\end{align*}\n", + "Recall that $\\binom nk=\\frac{n!}{k!(n-k)!}$" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1) 1/2*n^2 + 1/2*n\n", + "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n", + "(3) 2^n\n", + "(4) 1/6*pi^2\n" + ] + } + ], + "source": [ + "var('k', 'n') # Remember to declare all variables\n", + "\n", + "s = []\n", + "s.append( sum(k, k, 0, n) )\n", + "s.append( sum(k^4, k, 0, n) )\n", + "s.append( sum(binomial(n,k), k, 0, n) )\n", + "s.append( sum(1/k^2, k, 1, infinity) )\n", + "\n", + "for i in range(len(s)):\n", + " print(\"({}) {}\".format(i+1, s[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "factorial(n)^2" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(x^2).prod(x, 1, n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(x + 1)^2 - (x - 1)^2\n", + "4*x\n" + ] + } + ], + "source": [ + "f = (x+1)^2 - (x-1)^2\n", + "print(f)\n", + "print(f.expand())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Symbolic Ring\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n", + "\n", + "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\"." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-b*c + a*d\n", + "[(-a, 2)]\n" + ] + } + ], + "source": [ + "var('a', 'b', 'c', 'd')\n", + "\n", + "M = matrix([[a,b], [c,d]])\n", + "print(M.determinant())\n", + "\n", + "polring.<x> = SR[]\n", + "f = x^2 + 2*a*x + a^2\n", + "print(f.roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the eigenvalues of the matrix\n", + "\\begin{align*}\n", + "\\begin{pmatrix}\n", + "\\cos \\alpha & \\sin \\alpha\\\\\n", + "-\\sin\\alpha & \\cos \\alpha\n", + "\\end{pmatrix}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-I\n" + ] + } + ], + "source": [ + "var('a')\n", + "M = matrix([[cos(a), sin(a)], [-sin(a), cos(a)]])\n", + "M.eigenvalues()\n", + "lam = M.eigenvalues()[0]\n", + "print(lam(pi/2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculus\n", + "**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)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Limits and series\n", + "\n", + "**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", + "\n", + "You can compute limits" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "+Infinity\n" + ] + } + ], + "source": [ + "var('x')\n", + "f = sin(x)/x\n", + "#print(f(0)) # This one gives an error\n", + "print( f.limit(x=0) )\n", + "\n", + "print( (e^(-x)).limit(x=-infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the constant $e$ using a limit." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "e^x" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expression = (1+x/n)^n\n", + "expression.limit(n=infinity)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "und\n", + "1\n", + "-1\n" + ] + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = abs(x)/x # 1 if x>0, -1 if x<0\n", + "print( f.limit(x=0) ) # undefined\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )\n", + "plot(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+Infinity\n", + "+Infinity\n", + "+Infinity\n" + ] + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = 1/x^2\n", + "print( f.limit(x=0) )\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )\n", + "plot(f, (x, -10, 10), ymax = 10, ymin = -10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1*(x - 1) + (-1/2)*(x - 1)^2 + 1/3*(x - 1)^3 + Order((x - 1)^4)\n", + "1*x^2 + (-5/6)*x^4 + Order(x^6)\n" + ] + } + ], + "source": [ + "f = e^x\n", + "g = sin(x) - 2*cos(x)\n", + "h = log(x)\n", + "\n", + "#print(f.series(x==0, 5))\n", + "#print(g.series(x==0, 7))\n", + "print(h.series(x==1, 4))\n", + "\n", + "print((sin(x)^2*cos(x)).series(x==0, 6))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivatives\n", + "**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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one." + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8*y^3\n", + "6*x^2 - 1\n" + ] + } + ], + "source": [ + "var('y')\n", + "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n", + "print( (2*x^3-x+2).derivative() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute higher order derivatives:" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6*x\n", + "84*x^5*y + 10*y^4 + 24*x^2*y\n", + "1680*x^3 + 48\n" + ] + } + ], + "source": [ + "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n", + "\n", + "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n", + "print( f.derivative(x, x, y) ) # Twice in x, once in y\n", + "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jacobian and Hessian matrices are also easy to compute:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-2*x + 2*y 2*x]\n", + "[ 0 3*y^2]\n", + "[ y + 1 x + 1] \n", + "\n", + "[ 2 -4*y + 1]\n", + "[ -4*y + 1 -4*x + 6*y]\n" + ] + } + ], + "source": [ + "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n", + "print( jacobian(f, [x,y]), \"\\n\" )\n", + "\n", + "g = x^2 + x*y + y^3 -2*x*y^2 -3\n", + "print( g.hessian() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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([...])`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrals\n", + "**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", + "\n", + "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n", + "When using a computer software to solve your integrals, you have two choices:\n", + "\n", + "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", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Symbolic integration\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*x^2 - cos(x)\n", + "0\n", + "1/2*pi^2 + 2\n" + ] + } + ], + "source": [ + "var('a', 'b')\n", + "f = x + sin(x)\n", + "print( f.integral(x) ) # Alternative: integral(f, x)\n", + "print( f.integral(x, -10, 10) )\n", + "print( f.integral(x, 0, pi) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your endpoints can also be $\\pm\\infty$:" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "sqrt(pi)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x), x, 0, infinity) )\n", + "print( integral(e^(-x^2), x, -infinity, infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*sqrt(pi)*erf(x)\n", + "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x^2), x) )\n", + "print( integral(e^(-x^2), x, 1, 2) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical integration\n", + "\n", + "In order to get an explicit value for the computations above, we can use a *numerical* method.\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.13525725794999466, 1.5016572202374808e-15)" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numerical_integral(e^(-x^2), 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result above means, in symbols\n", + "\\begin{align*}\n", + "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n", + "\\end{align*}\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Solution:** First, rewrite the equation as:\n", + "\\begin{align*}\n", + "y = \\sqrt{1- \\left(\\frac{x}{3}\\right)^2}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "3/2*pi" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y = sqrt(1-(x/3)^2)\n", + "show(plot(y, xmin=-3.1, xmax=3.1, ymin=-0.2, ymax=1.1))\n", + "integral(y, x, -3, 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Differential equations\n", + "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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()`." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "_C*e^x" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('x')\n", + "function('f')\n", + "equation = derivative(f(x)) == f(x)\n", + "desolve(equation, f(x)) # f(x) is the unknown function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3*e^x" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "desolve(equation, f(x), (0,3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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))$." + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n", + "desolve(equation, f(x), (0, 0, 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n", + "\\begin{align*}\n", + " \\begin{array}{rlcrl}\n", + " (A) &\n", + " \\begin{cases}\n", + " f(0) &= 1\\\\\n", + " f'(0) &= 0\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " & \\qquad \\qquad &\n", + " (B) &\n", + " \\begin{cases}\n", + " f(0) &= 0\\\\\n", + " f'(0) &= 1\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cos(x)\n", + "sin(x)\n", + "_K2*cos(x) + _K1*sin(x)\n" + ] + } + ], + "source": [ + "eq = derivative(f(x), x, 2) == -f(x)\n", + "conditions1 = (0,1,0)\n", + "conditions2 = (0,0,1)\n", + "print( desolve(eq, f(x), conditions1) )\n", + "print( desolve(eq, f(x), conditions2) )\n", + "print( desolve(eq, f(x)) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A real-world example\n", + "\n", + "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n", + "\n", + "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", + "\n", + "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", + "\n", + "Since the acceleration is the derivative of the velocity, we have a differential equation\n", + "\\begin{align*}\n", + " v'(t) = -g -kv(t)\n", + "\\end{align*}\n", + "and we can try to solve it with Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "var('t')\n", + "function('v')\n", + "g = 9.8\n", + "k = 1.5\n", + "conditions = (0, 0) # Start with velocity 0\n", + "sol = desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)\n", + "#plot(sol, xmin=0, xmax = 100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-(g*e^(k*t) - g)*e^(-k*t)/k" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t', 'g', 'k')\n", + "function('v')\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic data analysis and visualization\n", + "\n", + "## Statistics\n", + "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n", + "\n", + "Sage includes the most basic functions for statistical analysis." + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "Mean:\t\t\t 5/13\n", + "Median:\t\t\t 1\n", + "Mode:\t\t\t [3]\n", + "Standard deviation:\t 2*sqrt(29/13)\n", + "Variance:\t\t 116/13\n", + "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n" + ] + } + ], + "source": [ + "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "\n", + "print(\"Values:\\t\", L)\n", + "\n", + "print(\"Mean:\\t\\t\\t\", mean(L))\n", + "print(\"Median:\\t\\t\\t\", median(L))\n", + "print(\"Mode:\\t\\t\\t\", mode(L))\n", + "\n", + "print(\"Standard deviation:\\t\", std(L))\n", + "print(\"Variance:\\t\\t\", variance(L))\n", + "\n", + "print(\"Moving average (5):\", moving_average(L,5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "**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", + "\n", + "Some Sage objects can be plotted:" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "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++gGnT4NFHPbP0X0TEVyhREglQyclw991w8iSsWgV33GF3RCIi3kdDbyIBxrJMZ+2bboJatczSfyVJIiL5U6IkEkBOnoQHHoCYGBg4ENatgzp17I4qr7i4OEJDQwkPD7c7FBERbWEiEih++MF02d61C+bPh3797I6ocNrCRETczKUZmaooiQSA5cshLMxUlDZs8P4kSUTEWyhREvFj586ZlWzdu0Pbtmbp//XX2x2ViIjv0Ko3ET+1fz/07g1ffw0zZ8LYsVr6LyJyoZQoifihdeugVy+TGK1erQ1tRUQulobeRPyIZZnq0e23Q8OGZul/cZOkI0eOEB0djcPhwOFwEB0dzdGjRwu8/uzZszz22GNcf/31VKpUicsuu4x+/frx66+/Fi8QEREbKFES8RNOp9nQdtw4+Mc/ID7e9Ekqrj59+pCWlsbKlStZuXIlaWlpREdHF3j9yZMn+eabb5g8eTLffPMNH330Ebt27aJLly7FD0ZExMPUHkDED3z7rVn6/9tv8NZbUFI5yfbt2wkNDSUpKYmWLVsCkJSUREREBDt27KBBgwYuvc6mTZto0aIFv/zyC1deeaVL96g9gIi4mdoDiASCN96AVq2gcmVISSm5JAkgMTERh8ORmyQBtGrVCofDQUJCgsuv43Q6CQoKolq1agVek5WVRWZmZp5DRMRuSpREfNTp0zB4sOmw3bcvJCTA1VeX7DMyMjKoUaPGeedr1KhBRkaGi3GeZvz48fTp06fQylBsbGzuPCiHw0Edb2sZLiIBSYmSiA/avdvs1fb227Bwodm7rUIF1++fOnUqQUFBhR7JyckABOXTU8CyrHzP/9XZs2fp3bs3OTk5zJ07t9BrJ0yYgNPpzD327Nnj+hsSEXETtQcQ8TH//jdER8Mll0BiIjRteuGvMWLECHr37l3oNfXq1WPz5s0cOHDgvD/77bffqFmzZqH3nz17lp49e7J7926+/PLLIucZBQcHExwcXHTwIiIepERJxEdkZ8MTT8A//2nmIb35JhQy5adQISEhhISEFHldREQETqeTjRs30qJFCwA2bNiA0+kkMjKywPv+SJK+//57Vq9eTfXq1S8uUBERm2noTcQHHDwIUVEwbZo5li27+CTpQjRq1Ij27dsTExNDUlISSUlJxMTE0KlTpzwr3ho2bMiyZcsAOHfuHPfccw/JycksXryY7OxsMjIyyMjI4MyZM+4PWkSkBKmiJOLlvv4aevY0FaUvvoBbb/Xs8xcvXszIkSOJiooCoEuXLsyZMyfPNTt37sTpdAKwd+9ePvnkEwCa/mVccPXq1dzq6TcgIlIM6qMk4qUsC2bPNpvaRkTAkiVQu7bdUXmO+iiJiJupj5KIrzp61HTZHjsWRo82laRASpJERLyFht5EvExyshlqO3IEPv64ZBtIiojIhVFFScRLWBbExZn+SCEhkJqqJElExG5KlES8QGYm9O4NI0bAkCGwfj3Uq2d3VCIioqE3EZt9+y3cey9kZMAHH5jNbQNZXFwccXFxZGdn2x2KiIhWvYnYxbLM1iMjR0LDhiZJ+vvf7Y7Ke2jVm4i4mVa9iXir48ehXz+zqW3//mYrEiVJIiLeR0NvIh62bZsZXktPh0WLoG9fuyMSEZGCqKIk4kFvvQXh4VCqlGkDoCRJRMS7KVES8YBTp+DBB80wW8+esHGjmZckIiLeTUNvIm62a5dZ1fb99/DaazBwoN0RiYiIq1RREnGjJUsgLAyysmDDBiVJIiK+RomSiBucPg3Dhpkmkp07w6ZNcP31dkclIiIXSkNvIiXsp5/MUNvWrTB/vmkBEORStw4REfE2qiiJlKBly6BZM3A6TW+kIUOUJF2ouLg4QkNDCQ8PtzsUERF15hYpCadPw7hxMGcO3H03LFwIDofdUfk2deYWETdz6ddYDb2JFNP330OvXmaoLS4OHnpIVSQREX+hoTeRYnj3XTPUdvw4JCWZCdxKkkRE/IcSJZGLcPIkxMRAnz7QpQukpMCNN9odlYiIlDQNvYlcoG3bTHftn34yc5EGDlQVSUTEX6miJOIiy4LXX4fmzc3XmzbBAw8oSRIR8WdKlERccOwY9OtnEqO+fc1ebdddZ3dUIiLibhp6EylCWppZ1fbrr7B4sZmXJCIigUEVJZECWBbMnQutWkGlSvDNN0qSREQCjRIlkXwcPWq2IRk+3GxBkpgI11xjd1QiIuJpGnoT+YukJFM5OnIEli6FHj3sjiiwxMXFERcXR3Z2tt2hiIhoCxORP2Rnw4wZMHkyhIebZpL16tkdVeDSFiYi4mYurVnW0JsIZqJ2VBRMmgTjx8O6dUqSREREQ28i/PvfMGAABAfDF1/AbbfZHZGIiHgLVZQkYJ0+DSNHQufOEBkJ336rJElERPJSRUkC0vbt0Ls37NwJL71kVrepw7aIiPyVKkoSUCwLXn0VwsLg7FnTYXvECCVJhTly5AjR0dE4HA4cDgfR0dEcPXrU5fuHDBlCUFAQs2fPdluMIiLuokRJAsbRo6bDdkwMREdDcjI0aWJ3VN6vT58+pKWlsXLlSlauXElaWhrR0dEu3bt8+XI2bNjAZZdd5uYoRUTcQ0NvEhC+/tr0RsrMhA8+gHvusTsi37B9+3ZWrlxJUlISLVu2BOCVV14hIiKCnTt30qBBgwLv3bdvHyNGjODzzz+nY8eOngpZRKREqaIkfi07G55+Gm6+Ga680kzYVpLkusTERBwOR26SBNCqVSscDgcJCQkF3peTk0N0dDTjxo3jOu0eLCI+TBUl8Vt798L998P69aaJ5OOPQxl94i9IRkYGNWrUOO98jRo1yMjIKPC+6dOnU6ZMGUaOHOnys7KyssjKysr9OjMz88KCFRFxA1WUxC8tXw433AA//girV8PUqUqS/mzq1KkEBQUVeiQnJwMQlM9Md8uy8j0PkJKSwgsvvMAbb7xR4DX5iY2NzZ0w7nA4qFOnzsW9ORGREqQtTMSvnDgBY8bAK69At26wcCFccondUXmfQ4cOcejQoUKvqVevHu+88w5jx449b5VbtWrVeP755xk4cOB5982ePZuxY8dSqtT/fg/Lzs6mVKlS1KlTh59//jnf5+VXUapTp462MBERd3HpNzn9ji1+Y9Mm6NsX9u2DBQvgwQe17L8gISEhhISEFHldREQETqeTjRs30qJFCwA2bNiA0+kkMjIy33uio6Np27ZtnnPt2rUjOjo638TqD8HBwQQHB1/AuxARcT8lSuLzsrNh+nSYMgWaNjVbklx7rd1R+YdGjRrRvn17YmJiePnllwEYPHgwnTp1yrPirWHDhsTGxtK9e3eqV69O9erV87xO2bJlqVWrVqGr5EREvJHmKIlP++UXs+3I44/Do49CQoKSpJK2ePFirr/+eqKiooiKiqJJkya8/fbbea7ZuXMnTqfTpghFRNxHc5TEZy1eDMOGQbVqsGgRtGljd0RSkjIzM3E4HJqjJCLu4tLkDFWUxOccPWrmIt1/P3TqZHojKUkSERF30Bwl8Snr1pntR44eNRWlPn3sjkhERPyZKkriE86ehUmT4NZboW5dU0VSkiQiIu6mipJ4vV27zFBbWho88ww89hiULm13VCIiEghUURKvZVmmceSNN4LTCYmJMHGikiR/FxcXR2hoKOHh4XaHIiKiVW/inTIyICbG9EQaPBhmzYJKleyOSjxJq95ExM3UmVt809KlMGSIqRx9/DF06WJ3RCIiEqg09CZe4+hR6NcP7rkHbr4ZvvtOSZKIiNhLFSXxCl98AQMHmrlIb75pWgBonzYREbGbKkpiq5MnYdQoaNsWrrkGtmwxVSUlSSIi4g1UURLbbNpkKke//AIvvAAjRkAppe4iIuJF9M+SeNzZszBlCkREQJUqkJoKI0cqSRIREe+jipJ41PbtpoqUlgZPPAETJkDZsnZHJSIikj/9Di8ekZMDs2eb5pEnTkBSkkmUlCSJiIg3U6IkbvfLL3DHHTBmDDz0EHzzDTRvbndUIiIiRVOiJG5jWfDaa9CkCfz0E3z5JTz/PFSoYHdk4s20hYmIeBNtYSJusXev2Xrk//4PBgwww24Oh91RiS/RFiYi4mbawkQ8z7LgjTfMMFulSmavto4d7Y5KRETk4mjoTUrMvn3QqRM88AB062a2IFGSJCIivkwVJSk2y4K33jIdtitWhE8/NQmTiIiIr1NFSYrl11+hc2czD6lLF9i6VUmSiIj4D1WU5KJYFixaZDpqly8Pn3xiEiYRERF/ooqSXLD9+6FrV7N5badOpoqkJElERPyRKkriMsuCt9+G0aMhOBg+/tgMt4mIiPgrVZTEJb/8Ah06QP/+cNddZkWbkiQREfF3SpSkUDk5EBcHjRubIbbPPjNzk6pXtzsy8VfqzC0i3kSduaVAO3fCoEHw9ddmj7Zp00ANksVT1JlbRNzMpc7cqijJec6ehdhYuOEGOHgQ1q6FuXOVJImISODRZG7JIzXVVJE2b4Z//AOmTNEmtiIiErhUURIATp+GiRMhPNzMS9qwwQy1KUkSEZFApoqS8NVXpor088/w5JPw6KNQtqzdUYmIiNhPFaUA5nTC8OFw881mFVtaGkyapCRJ8jpy5AjR0dE4HA4cDgfR0dEcPXq0yPu2b99Oly5dcDgcVKlShVatWpGenu7+gEVESpASpQBkWfDhh9CokdnMdvZsWL/efC3yV3369CEtLY2VK1eycuVK0tLSiI6OLvSeH3/8kdatW9OwYUPWrFnDt99+y+TJkylfvryHohYRKRlqDxBg0tNNFenf/zbbkLz0EtSpY3dU4q22b99OaGgoSUlJtGzZEoCkpCQiIiLYsWMHDRo0yPe+3r17U7ZsWd5+++2LfrbaA4iIm6k9gPzPuXMwaxaEhpqVbcuWwfLlSpKkcImJiTgcjtwkCaBVq1Y4HA4SEhLyvScnJ4fPPvuMa6+9lnbt2lGjRg1atmzJ8uXLPRS1iEjJUaIUAFJSoGVLs9x/0CDYtg26dbM7KvEFGRkZ1KhR47zzNWrUICMjI997Dh48yPHjx5k2bRrt27dn1apVdO/enR49erB27doCn5WVlUVmZmaeQ0TEbkqU/NixY2YD2xYt/rfk/4UX1DhSYOrUqQQFBRV6JCcnAxAUdH512rKsfM+DqSgBdO3alTFjxtC0aVPGjx9Pp06dmD9/foExxcbG5k4Ydzgc1FG5U0S8gNoD+KmPP4YRI+D332HGDBg1Csrouy3/NWLECHr37l3oNfXq1WPz5s0cOHDgvD/77bffqFmzZr73hYSEUKZMGUJDQ/Ocb9SoEV999VWBz5swYQJjx47N/TozM1PJkojYTv90+pm9e+Hhh838o7vuMhva1qtnd1TibUJCQggJCSnyuoiICJxOJxs3bqRFixYAbNiwAafTSWRkZL73lCtXjvDwcHbu3Jnn/K5du6hbt26BzwoODiY4OPgC3oWIiPtp6M1PZGebFWyhoZCUBO+/b1a2KUmS4mjUqBHt27cnJiaGpKQkkpKSiImJoVOnTnlWvDVs2JBly5blfj1u3DiWLFnCK6+8wg8//MCcOXP49NNPGTZsmB1vQ0TkoilR8gNJSWbrkVGjoG9f2L4d7r0XCphCInJBFi9ezPXXX09UVBRRUVE0adLkvGX/O3fuxOl05n7dvXt35s+fz4wZM7j++ut59dVXWbp0Ka1bt/Z0+CIixaI+Sj7s0CEYPx4WLoRmzWDePDNxW8QfqI+SiLiZS+UEzVHyQTk58OqrMGGC+f+4OBgyBEqXtjsyERER/6KhNx+TkgKtWpnEqEsX2LkThg1TkiQiIuIOSpR8xJEjJiEKD4esLLM32+uvQz69AEVERKSEaOjNy+XkmI1rH30UTp+G5583e7WpJ5KIiIj7qaLkxb79Fm6+GQYOhDvvNMNsahwp/i4uLo7Q0FDCw8PtDkVERKvevNHhwzB5Mrz8MjRoYCZr33ab3VGJeJZWvYmIm2nVm685dw7mz4cnnjANJGfONMNs5crZHZmIiEhg0tCbl/jiC2jaFEaOhLvvhu+/hzFjlCSJiIjYSYmSzXbvhh49oG1bqFYNNm2CV17RajYRERFvoETJJidOwOOPQ6NGsHEjLF5slvyHhdkdmYiIiPxBc5Q8zLLg3XfNcv9Dh2DcOLMNSaVKdkcmIiIif6WKkgelpEDr1mbj2pYtzea1Tz+tJElERMRbKVHygH37TC+k8HDIzDQTt5cuhfr17Y5MRERECqOhNzc6fhxmzDDL/CtVgjlzYPBgNYwUERHxFfon2w2ys+G110zTyKNHzTL/8ePB4bA7MhEREbkQGnorYZ9/bvohDR5slvzv3AmxsUqSRFylLUxExJtoC5MSsmUL/OMfsGoVtGkDzz1n5iSJyMXRFiYi4mYubWGiilIx7d8PDz5oqki7d8OyZbB2rZIkERERf6A5Shfp+HGYNctM1g4Ohuefh6FDteWIiIiIP1GidIHOnIEFC0z/o6NHzd5sEyfC3/5md2QiIiJS0jT05qKcHLPNSMOGJjnq0MFM1P7Xv5QkiYiI+CslSkWwLFixAm68Ee6/H5o0gc2b4Y03oF49u6MTERERd1KiVIiEBLjlFujY0Szv//prWL4cGje2OzIRERHxBCVK+fjuO+jaFW66yWw5smKFWckWGWl3ZCIiIuJJSpT+5OefYcAAM7z23XdmTtI335j5SEEudVsQERERf6JVb8CePfDPf8LChXDJJWZPtgcf1FJ/ERGRQBfQidKvv5rtRRYsgCpV4NlnYdgws4GtiNgjLi6OuLg4srOz7Q5FRCQwtzA5cACmTYP586FCBRg3DkaMMMmSiHgHbWEiIm7m0qSagKoo/fab6Xs0Z44ZVpswAUaN0oa1IiIikr+ASJQOHzab1L74IpQqZTavHTNGjSJFRESkcH6dKB08aPZgi4sznbUfftgkSdWr2x2ZiIiI+AK/TJR+/dUMsb38MpQubSZoP/II1Khhd2QiIiLiS/yqj9LPP5ukqH59s8XIo4/CL7/A9OlKkkQu1pEjR4iOjsbhcOBwOIiOjubo0aOF3nP8+HFGjBjBFVdcQYUKFWjUqBHz5s3zTMAiIiXILypK339vlvm//TZUqwZPPmkSJi2UESm+Pn36sHfvXlauXAnA4MGDiY6O5tNPPy3wnjFjxrB69WoWLVpEvXr1WLVqFcOGDeOyyy6ja9eungpdRKTYfLo9wHffmUaRS5ZAzZqmghQToz5IIiVl+/bthIaGkpSURMuWLQFISkoiIiKCHTt20KBBg3zva9y4Mb169WLy5Mm558LCwrjrrrt4+umnXXq22gOIiJu51B7AJ4fekpKgRw+4/nqzcW1cHPz0E4werSRJpCQlJibicDhykySAVq1a4XA4SEhIKPC+1q1b88knn7Bv3z4sy2L16tXs2rWLdu3aFXhPVlYWmZmZeQ4REbv5TKKUkwOffgpt2kBEBGzdCq+/bobdhg6F8uXtjlDE/2RkZFAjnwl+NWrUICMjo8D7XnzxRUJDQ7niiisoV64c7du3Z+7cubRu3brAe2JjY3PnQTkcDurUqVMi70FEpDi8PlHKyjJ7sF13HXTpYhKm5cth+3azgW3ZsnZHKOJ7pk6dSlBQUKFHcnIyAEH57AhtWVa+5//w4osvkpSUxCeffEJKSgrPPfccw4YN4z//+U+B90yYMAGn05l77Nmzp/hvVESkmLx2MvfRo2aLkRdeMFuOdO1qEqbISLsjE/F9I0aMoHfv3oVeU69ePTZv3syBAwfO+7PffvuNmjVr5nvfqVOnmDhxIsuWLaNjx44ANGnShLS0NGbOnEnbtm3zvS84OJjg4OALfCciIu7ldYlSejrMng2vvAJnz0K/fqYHUgFzRkXkIoSEhBASElLkdRERETidTjZu3EiLFi0A2LBhA06nk8gCfms5e/YsZ8+epVSpvAXr0qVLk5OTU/zgRUQ8yGuG3lJTIToarr7azD0aOdL0RVqwQEmSiF0aNWpE+/btiYmJISkpiaSkJGJiYujUqVOeFW8NGzZk2bJlAFStWpVbbrmFcePGsWbNGnbv3s0bb7zBW2+9Rffu3e16KyIiF8XWitK5c/Dxx2Z4bf16uPJKmDkTBg2CypXtjExE/rB48WJGjhxJVFQUAF26dGHOnDl5rtm5cydOpzP36/fee48JEybQt29ffv/9d+rWrcuzzz7L0KFDPRq7iEhx2dJH6cgRM99ozhzTObt1axg1Crp1gzJeNxgoInZQHyURcTOX+ih5NC3ZsQNefBHefNNUk3r3NglSs2aejEJERETENR5JlCzLNIhcvtzsuTZunOl9VKuWJ54uIiIicnE8kigFBUF4OHTvDr16gVYAi4iIiC/w6b3eRMR/aY6SiLiZ/+71JiL+Ky4ujtDQUMLDw+0ORUREFSUR8U6qKImIm6miJCIiIlIcSpRERERECqBESURERKQAJTFHSUSkxAUFBVUFnIDDsqxMu+MRkcCkRElEvFJQUFAQUAU4ZukHlYjYRImSiIiISAE0R0lERESkAEqURERERAqgRElERESkAEqURERERAqgRElERESkAEqURERERAqgRElERESkAP8PMH5qhT0y7gkAAAAASUVORK5CYII=\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f = sin(x)\n", + "p = plot(f,\n", + " -2*pi, 2*pi, # bounds for x\n", + " ymin = -1.1, ymax = 1.1, # bounds for y\n", + " color = \"red\",\n", + " title = \"The sin function\",\n", + " )\n", + "print(\"hello\")\n", + "show(p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n", + "exponential = plot(exp(x), (x,-2,0.5))\n", + "\n", + "show(cosine + exponential) # works like print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b = bar_chart(range(1,10))\n", + "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n", + " marker = \"*\", # symbol\n", + " markersize = 100,\n", + " edgecolor = \"green\",\n", + " facecolor = \"red\"\n", + " )\n", + "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n", + "show(b + s + t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpolation\n", + "**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", + "\n", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n", + "polring.<x> = QQ[] # you need to specify a polynomial ring\n", + "lp = polring.lagrange_polynomial(points)\n", + "show(scatter_plot(points, facecolor=\"red\")\n", + " + plot(lp, 0, 3) # slightly different notation for polynomials\n", + " + text(lp, (1,8), color=\"black\")\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "However, it does not always give you good approximation of your data:" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "R = [x/10 for x in range(-10,10)]\n", + "L = [1/(1+25*x^2) for x in R]\n", + "points = [(R[i], L[i]) for i in range(len(L))]\n", + "polring.<x> = RR[]\n", + "lp = polring.lagrange_polynomial(points)\n", + "\n", + "show(plot(lp, -0.92, 0.82) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show(plot(spline(points), -1, 1) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb b/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-checkpoint.ipynb @@ -0,0 +1,1372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Last time we saw the basics of symbolic expressions:\n", + "* How to define and manipulate symbolic expressions\n", + "* How to introduce new variables (in the Mathematical sense) with `var()`\n", + "* How to solve equations and inequalities\n", + "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n", + "\n", + "Here are some examples to remind you of these basic things:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "x == -sqrt(-pi),\n", + "x == sqrt(-pi)\n", + "]\n", + "[\n", + "z == -sqrt(pi + x^2),\n", + "z == sqrt(pi + x^2)\n", + "]\n", + "[[y < -2], [y > 1]]\n", + "2*pi + e is approximately 9.00146713563863\n" + ] + } + ], + "source": [ + "var('y', 'z') # Define new variables (x is already defined by Sage)\n", + "f = x^2 + pi\n", + "g = y^2 + y - 2 > 0\n", + "print( solve(f==0, x) )\n", + "print( solve(z^2 - f, z) )\n", + "print( solve(g, y) )\n", + "print( 2*pi + e, \"is approximately\", n(2*pi + e) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will see some more details about solving equations and manipulating their solutions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving equations and inequalities\n", + "\n", + "**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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x + y = 2 \\\\\n", + " 2x - y = 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "\n", + "Can be solved as" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[x == (8/3), y == (-2/3)]]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The set of solutions\n", + "\n", + "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)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x == -3" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solutions = solve(x^2-9 == 0, x)\n", + "solutions[0] # This is the expression 'x == -3'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rhs: 2\n", + "lhs: x\n" + ] + } + ], + "source": [ + "f = x == 2\n", + "print(\"rhs:\", f.rhs())\n", + "print(\"lhs:\", f.lhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simple inequality: [[x < -3], [x > 3]]\n", + "System of inequalities:\n", + " [\n", + "[3 < x, x < 6],\n", + "[x < -3]\n", + "]\n" + ] + } + ], + "source": [ + "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n", + "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the last example (system of inequalities), Sage is telling us that the system\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x^2-9 > 9 \\\\\n", + " x < 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "has two solutions:\n", + "* $x$ is between $3$ and $6$;\n", + "* $x$ is less than $-3$.\n", + "\n", + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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)$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{x: 8/3, y: -2/3}]" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Alternative method for real roots: `find_root()`\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using solve():\n", + " [\n", + "x == -e^x + 10\n", + "]\n", + "Using find_root(): 2.070579904980303\n" + ] + } + ], + "source": [ + "f = e^x + x - 10\n", + "print(\"Using solve():\\n\", solve(f, x))\n", + "print(\"Using find_root():\", f.find_root(0,100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating functions\n", + "\n", + "If an expression contains only one variable you can evaluate it easily, even if it is not a function." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "y + 3 > (y + 3)^2\n" + ] + } + ], + "source": [ + "var('y')\n", + "f = x^2-3\n", + "g = x > x^2\n", + "\n", + "print(f(2))\n", + "print(g(3+y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2 == 0\n", + "3*y == 2\n" + ] + } + ], + "source": [ + "var('y','z')\n", + "\n", + "f = y*z^2 - y == z\n", + "print(f(2, 0))\n", + "print(f(z=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Symbolic computations\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{array}{llcc}\n", + " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n", + " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n", + " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n", + " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1) 1/2*n^2 + 1/2*n\n", + "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n", + "(3) 2^n\n", + "(4) 1/6*pi^2\n" + ] + } + ], + "source": [ + "var('k', 'n') # Remember to declare all variables\n", + "\n", + "s = []\n", + "s.append( sum(k, k, 0, n) )\n", + "s.append( sum(k^4, k, 0, n) )\n", + "s.append( sum(binomial(n,k), k, 0, n) )\n", + "s.append( sum(1/k^2, k, 1, infinity) )\n", + "\n", + "for i in range(len(s)):\n", + " print(\"({}) {}\".format(i+1, s[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(x + 1)^2 - (x - 1)^2\n", + "4*x\n" + ] + } + ], + "source": [ + "f = (x+1)^2 - (x-1)^2\n", + "print(f)\n", + "print(f.expand())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Symbolic Ring\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n", + "\n", + "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\"." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-b*c + a*d\n", + "[(-a, 2)]\n" + ] + } + ], + "source": [ + "var('a', 'b', 'c', 'd')\n", + "\n", + "M = matrix([[a,b], [c,d]])\n", + "print(M.determinant())\n", + "\n", + "polring.<x> = SR[]\n", + "f = x^2 + 2*a*x + a^2\n", + "print(f.roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the eigenvalues of the matrix\n", + "\\begin{align*}\n", + "\\begin{pmatrix}\n", + "\\cos \\alpha & \\sin \\alpha\\\\\n", + "-\\sin\\alpha & \\cos \\alpha\n", + "\\end{pmatrix}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculus\n", + "**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)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Limits and series\n", + "\n", + "**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", + "\n", + "You can compute limits" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "0\n" + ] + } + ], + "source": [ + "f = sin(x)/x\n", + "# print(f(0)) # This one gives an error\n", + "print( f.limit(x=0) )\n", + "\n", + "print( (e^(-x)).limit(x=infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the constant $e$ using a limit." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "und\n", + "1\n", + "-1\n" + ] + } + ], + "source": [ + "f = abs(x)/x # 1 if x>0, -1 if x<0\n", + "print( f.limit(x=0) ) # undefined\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1*x + 1/2*x^2 + Order(x^3)\n", + "(-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", + "1*(x - 1) + (-1/2)*(x - 1)^2 + Order((x - 1)^3)\n" + ] + } + ], + "source": [ + "f = e^x\n", + "g = sin(x) - 2*cos(x)\n", + "h = log(x)\n", + "\n", + "print(f.series(x==0, 3))\n", + "print(g.series(x==0, 7))\n", + "print(h.series(x==1, 3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivatives\n", + "**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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8*y^3\n", + "6*x^2 - 1\n" + ] + } + ], + "source": [ + "var('y')\n", + "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n", + "print( (2*x^3-x+2).derivative() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute higher order derivatives:" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6*x\n", + "84*x^5*y + 10*y^4 + 24*x^2*y\n", + "1680*x^3 + 48\n" + ] + } + ], + "source": [ + "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n", + "\n", + "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n", + "print( f.derivative(x, x, y) ) # Twice in x, once in y\n", + "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jacobian and Hessian matrices are also easy to compute:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-2*x + 2*y 2*x]\n", + "[ 0 3*y^2]\n", + "[ y + 1 x + 1] \n", + "\n", + "[ 2 -4*y + 1]\n", + "[ -4*y + 1 -4*x + 6*y]\n" + ] + } + ], + "source": [ + "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n", + "print( jacobian(f, [x,y]), \"\\n\" )\n", + "\n", + "g = x^2 + x*y + y^3 -2*x*y^2 -3\n", + "print( g.hessian() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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([...])`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrals\n", + "**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", + "\n", + "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n", + "When using a computer software to solve your integrals, you have two choices:\n", + "\n", + "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", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Symbolic integration\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*x^2 - cos(x)\n", + "0\n", + "-1/2*a^2 + 1/2*b^2 + cos(a) - cos(b)\n" + ] + } + ], + "source": [ + "var('a', 'b')\n", + "f = x + sin(x)\n", + "print( f.integral(x) ) # Alternative: integral(f, x)\n", + "print( f.integral(x, -10, 10) )\n", + "print( f.integral(x, a, b) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your endpoints can also be $\\pm\\infty$:" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "sqrt(pi)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x), x, 0, infinity) )\n", + "print( integral(e^(-x^2), x, -infinity, infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*sqrt(pi)*erf(x)\n", + "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x^2), x) )\n", + "print( integral(e^(-x^2), x, 1, 2) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical integration\n", + "\n", + "In order to get an explicit value for the computations above, we can use a *numerical* method.\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.13525725794999466, 1.5016572202374808e-15)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numerical_integral(e^(-x^2), 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result above means, in symbols\n", + "\\begin{align*}\n", + "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n", + "\\end{align*}\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Differential equations\n", + "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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()`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "_C*e^x" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('x')\n", + "function('f')\n", + "equation = derivative(f(x)) == f(x)\n", + "desolve(equation, f(x)) # f is the unknown function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3*e^x" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "desolve(equation, f(x), (0,3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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))$." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n", + "desolve(equation, f(x), (0, 0, 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n", + "\\begin{align*}\n", + " \\begin{array}{rlcrl}\n", + " (A) &\n", + " \\begin{cases}\n", + " f(0) &= 1\\\\\n", + " f'(0) &= 0\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " & \\qquad \\qquad &\n", + " (B) &\n", + " \\begin{cases}\n", + " f(0) &= 0\\\\\n", + " f'(0) &= 1\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A real-world example\n", + "\n", + "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n", + "\n", + "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", + "\n", + "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", + "\n", + "Since the acceleration is the derivative of the velocity, we have a differential equation\n", + "\\begin{align*}\n", + " v'(t) = -g -kv(t)\n", + "\\end{align*}\n", + "and we can try to solve it with Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-98/15*(e^(3/2*t) - 1)*e^(-3/2*t)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t')\n", + "function('v')\n", + "g = 9.8\n", + "k = 1.5\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-(g*e^(k*t) - g)*e^(-k*t)/k" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t', 'g', 'k')\n", + "function('v')\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic data analysis and visualization\n", + "\n", + "## Statistics\n", + "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n", + "\n", + "Sage includes the most basic functions for statistical analysis." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "Mean:\t\t\t 5/13\n", + "Median:\t\t\t 1\n", + "Mode:\t\t\t [3]\n", + "Standard deviation:\t 2*sqrt(29/13)\n", + "Variance:\t\t 116/13\n", + "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n" + ] + } + ], + "source": [ + "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "\n", + "print(\"Values:\\t\", L)\n", + "\n", + "print(\"Mean:\\t\\t\\t\", mean(L))\n", + "print(\"Median:\\t\\t\\t\", median(L))\n", + "print(\"Mode:\\t\\t\\t\", mode(L))\n", + "\n", + "print(\"Standard deviation:\\t\", std(L))\n", + "print(\"Variance:\\t\\t\", variance(L))\n", + "\n", + "print(\"Moving average (5):\", moving_average(L,5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "**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", + "\n", + "Some Sage objects can be plotted:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f,\n", + " -2*pi, 2*pi, # bounds for x\n", + " ymin = -0.7, ymax = 0.7, # bounds for y\n", + " color = \"red\",\n", + " title = \"The sin function\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n", + "exponential = plot(exp(x), (x,-2,0.5))\n", + "\n", + "show(cosine + exponential)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b = bar_chart(range(1,10))\n", + "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n", + " marker = \"*\", # symbol\n", + " markersize = 100,\n", + " edgecolor = \"black\",\n", + " facecolor = \"red\"\n", + " )\n", + "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n", + "show(b + s + t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpolation\n", + "**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", + "\n", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n", + "polring.<x> = QQ[] # you need to specify a polynomial ring\n", + "lp = polring.lagrange_polynomial(points)\n", + "show(scatter_plot(points, facecolor=\"red\")\n", + " + plot(lp, 0, 3) # slightly different notation for polynomials\n", + " + text(lp, (1,8), color=\"black\")\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "However, it does not always give you good approximation of your data:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "R = [x/10 for x in range(-10,10)]\n", + "L = [1/(1+25*x^2) for x in R]\n", + "points = [(R[i], L[i]) for i in range(len(L))]\n", + "polring.<x> = RR[]\n", + "lp = polring.lagrange_polynomial(points)\n", + "\n", + "show(plot(lp, -0.82, 0.72) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show(plot(spline(points), -1, 1) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb b/src/Lecture6/notebook/.ipynb_checkpoints/8-SageCalculus-modified-checkpoint.ipynb @@ -0,0 +1,1614 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Last time we saw the basics of symbolic expressions:\n", + "* How to define and manipulate symbolic expressions\n", + "* How to introduce new variables (in the Mathematical sense) with `var()`\n", + "* How to solve equations and inequalities\n", + "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n", + "\n", + "Here are some examples to remind you of these basic things:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "x == -sqrt(-pi),\n", + "x == sqrt(-pi)\n", + "]\n", + "[\n", + "z == -sqrt(pi + x^2),\n", + "z == sqrt(pi + x^2)\n", + "]\n", + "[[y < -2], [y > 1]]\n", + "2*pi + e is approximately 9.00146713563863\n" + ] + } + ], + "source": [ + "var('y', 'z') # Define new variables (x is already defined by Sage)\n", + "f = x^2 + pi\n", + "g = y^2 + y - 2 > 0\n", + "print( solve(f==0, x) )\n", + "print( solve(z^2 - f, z) )\n", + "print( solve(g, y) )\n", + "print( 2*pi + e, \"is approximately\", n(2*pi + e) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will see some more details about solving equations and manipulating their solutions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving equations and inequalities\n", + "\n", + "**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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x + y = 2 \\\\\n", + " 2x - y = 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "\n", + "Can be solved as" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[x == (8/3), y == (-2/3)]]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Find the intersection of the circle of radius $2$ centered in the origin and the parabula of equation $y=x^2-2x+1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Solution:** the system is\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " y^2 = x^2 - 2x +1\\\\\n", + " x^2 + y^2 = 4\n", + " \\end{cases}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[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]]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('y')\n", + "eq1 = y^2 == x^2-2*x+1\n", + "eq2 = x^2 + y^2 == 4\n", + "solve([eq1, eq2], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The set of solutions\n", + "\n", + "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)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-3\n" + ] + } + ], + "source": [ + "solutions = solve(x^2-9 == 0, x)\n", + "solutions[0] # This is the expression 'x == -3'\n", + "\n", + "# Using rhs() explained below\n", + "print(solutions[0].rhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rhs: -y + 2\n", + "lhs: x^2 + y\n" + ] + } + ], + "source": [ + "f = x^2+y <= 2-y\n", + "print(\"rhs:\", f.rhs())\n", + "print(\"lhs:\", f.lhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simple inequality: [[x < -3], [x > 3]]\n", + "System of inequalities:\n", + " [\n", + "[3 < x, x < 6],\n", + "[x < -3]\n", + "]\n" + ] + } + ], + "source": [ + "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n", + "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the last example (system of inequalities), Sage is telling us that the system\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x^2-9 > 9 \\\\\n", + " x < 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "has two solutions:\n", + "* $x$ is between $3$ and $6$;\n", + "* $x$ is less than $-3$.\n", + "\n", + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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)$." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All solutions:\n", + "[\n", + "[x == (-1/2*I + 1/2), y == -sqrt(1/2*I + 4)],\n", + "[x == (-1/2*I + 1/2), y == sqrt(1/2*I + 4)],\n", + "[x == (1/2*I + 1/2), y == -sqrt(-1/2*I + 4)],\n", + "[x == (1/2*I + 1/2), y == sqrt(-1/2*I + 4)]\n", + "]\n" + ] + } + ], + "source": [ + "# We use a different equation because the first exercise only\n", + "# had real solutions.\n", + "var('y')\n", + "eq1 = y^2 == x^2-2*x+5\n", + "eq2 = x^2 + y^2 == 4\n", + "solutions = solve([eq1, eq2], [x,y])\n", + "\n", + "print(\"All solutions:\")\n", + "print(solutions)\n", + "\n", + "for s in solutions:\n", + " #print(\"One solutions is:\", s)\n", + " x0 = s[0].rhs()\n", + " y0 = s[1].rhs()\n", + " if x0 in RR and y0 in RR:\n", + " print((x0, y0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{x: 8/3, y: -2/3}]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Alternative method for real roots: `find_root()`\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using solve():\n", + " [\n", + "x == -e^x + 10\n", + "]\n", + "Using find_root(): 2.070579904980303\n" + ] + } + ], + "source": [ + "f = e^x + x - 10\n", + "print(\"Using solve():\\n\", solve(f, x))\n", + "print(\"Using find_root():\", f.find_root(0,10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating functions\n", + "\n", + "If an expression contains only one variable you can evaluate it easily, even if it is not a function." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "y + 3 > (y + 3)^2\n" + ] + } + ], + "source": [ + "var('y')\n", + "f = x^2-3\n", + "g = x > x^2\n", + "\n", + "print(f(2))\n", + "print(g(3+y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2 == 0\n", + "3*y == 2\n" + ] + } + ], + "source": [ + "var('y','z')\n", + "\n", + "f = y*z^2 - y == z\n", + "print(f(2, 0))\n", + "print(f(z = 2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Symbolic computations\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{array}{llcc}\n", + " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n", + " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n", + " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n", + " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n", + " \\end{array}\n", + "\\end{align*}\n", + "Recall that $\\binom nk=\\frac{n!}{k!(n-k)!}$" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1) 1/2*n^2 + 1/2*n\n", + "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n", + "(3) 2^n\n", + "(4) 1/6*pi^2\n" + ] + } + ], + "source": [ + "var('k', 'n') # Remember to declare all variables\n", + "\n", + "s = []\n", + "s.append( sum(k, k, 0, n) )\n", + "s.append( sum(k^4, k, 0, n) )\n", + "s.append( sum(binomial(n,k), k, 0, n) )\n", + "s.append( sum(1/k^2, k, 1, infinity) )\n", + "\n", + "for i in range(len(s)):\n", + " print(\"({}) {}\".format(i+1, s[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "factorial(n)^2" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(x^2).prod(x, 1, n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(x + 1)^2 - (x - 1)^2\n", + "4*x\n" + ] + } + ], + "source": [ + "f = (x+1)^2 - (x-1)^2\n", + "print(f)\n", + "print(f.expand())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Symbolic Ring\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n", + "\n", + "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\"." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-b*c + a*d\n", + "[(-a, 2)]\n" + ] + } + ], + "source": [ + "var('a', 'b', 'c', 'd')\n", + "\n", + "M = matrix([[a,b], [c,d]])\n", + "print(M.determinant())\n", + "\n", + "polring.<x> = SR[]\n", + "f = x^2 + 2*a*x + a^2\n", + "print(f.roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the eigenvalues of the matrix\n", + "\\begin{align*}\n", + "\\begin{pmatrix}\n", + "\\cos \\alpha & \\sin \\alpha\\\\\n", + "-\\sin\\alpha & \\cos \\alpha\n", + "\\end{pmatrix}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-I\n" + ] + } + ], + "source": [ + "var('a')\n", + "M = matrix([[cos(a), sin(a)], [-sin(a), cos(a)]])\n", + "M.eigenvalues()\n", + "lam = M.eigenvalues()[0]\n", + "print(lam(pi/2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculus\n", + "**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)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Limits and series\n", + "\n", + "**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", + "\n", + "You can compute limits" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "+Infinity\n" + ] + } + ], + "source": [ + "var('x')\n", + "f = sin(x)/x\n", + "#print(f(0)) # This one gives an error\n", + "print( f.limit(x=0) )\n", + "\n", + "print( (e^(-x)).limit(x=-infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the constant $e$ using a limit." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "e^x" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expression = (1+x/n)^n\n", + "expression.limit(n=infinity)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "und\n", + "1\n", + "-1\n" + ] + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = abs(x)/x # 1 if x>0, -1 if x<0\n", + "print( f.limit(x=0) ) # undefined\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )\n", + "plot(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+Infinity\n", + "+Infinity\n", + "+Infinity\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGECAYAAADEN3+HAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAjaElEQVR4nO3dfZBU1Z3G8efy1swMdMMwOi+8yLiiSQviW4uQGKAqQpBAdjGuhF0X/whl6bgGE8qSmCoGV6DUhLgbuiq70SxYWddU4q6b3WhENwTWBXFgYVVGS9ARRsKAyNANA/TAcPePsz0w0DO3p+e+dDffT9Wtfrv3nDPY9jzzO6fvtWzbFgAAALrXL+gBAAAA5DsCEwAAgAMCEwAAgAMCEwAAgAMCEwAAgAMCEwAAgAMCEwAAgAMCE4C8ZBlhy7KsoMcCAAP6cCxnvASQk127pPHjpc2bpcmTM++TSCQUiUSUSCQyvv7aa9LXviY1N0ujRnk4WADFLqs/yqgwAfBde7u5DYVyb2PQoK5tAYCXCEwAfJcOOenQkwsCEwA/EZgA+I7ABKDQEJgA9NqmTZs0Z84c1dTUyLIsvfzyy11et21b9fX1qqmpUUlJiaZNm6Zdu3Z1vu5mYEqlcm8DALJFYALQa21tbZo4caLWrFmT8fWnnnpKq1ev1po1a9TQ0KCqqirdfvvtOnbsmKRzIYcKE4BC0ZdvyQG4RM2aNUuzZs3K+Jpt23rmmWf02GOPad68eZKkdevWqbKyUi+88ILuu+++jBWmVCql1HnlomQy2eMYCEwA/ESFCYCrmpqa1NLSohkzZnQ+FwqFNHXqVG3evFlS5im5VatWKRKJdG6jR4/usZ/0N+wITAD8QGAC4KqWlhZJUmVlZZfnKysrO1/LdFqBpUuXKpFIdG7Nzc099kOFCYCfmJID4IkLT9Bt23bnc+mQM3DguddDoZBCvTgxE4u+AfiJChMAV1VVVUk6V2lKO3ToUGfVKZWSBgyQ+vXhE4gKEwA/EZgAuKq2tlZVVVV6/fXXO59rb2/Xxo0bNWXKlP9/3LdvyEkEJgD+YkoOQK8dP35ce/bs6Xzc1NSknTt3qry8XGPGjNHixYu1cuVKjRs3TuPGjdPKlStVWlqqBQsWSHInMPXvL1kWgQmAPwhMAHpt27Ztmj59eufj7373u5KkhQsXau3atXrkkUd08uRJPfDAA2ptbdWkSZO0fv16DR06VJI7gcmyzKJx1jAB8AOBCUCvTZs2TbZtd/u6ZVmqr69XfX19xtfdCEySaYMKEwA/sIYJgO8ITAAKDYEJgO9Sqa7nYMoVgQmAXwhMAHxHhQlAoSEwAfCdm4GJRd8A/EBgAuA7twJTKESFCYA/CEwAfMeUHIBCQ2AC4LtUisAEoLAQmAD47tQpqaSk7+0MGmTaAgCvEZgA+O7kSWnw4L63M3gwi74B+IPABMB3p065E5hKSqgwAfAHgQmA73oKTPF4XNFoVLFYzLGdwYMJTAD8QWAC4LueAlNdXZ0aGxvV0NDg2A6BCYBfCEwAfOfWom8CEwC/EJgA+M6tNUwEJgB+ITAB8B2BCUChITAB8J2bgenkyb63AwBOCEwAfGXbVJgAFB4CEwBfnT5tQhPnYQJQSAhMAHyVDjhuVphsu+9tAUBPCEwAfOV2YLJtU7UCAC8RmAD4yu3AdH6bAOAVAhMAXxGYABQiAhMAXxGYABQiAhMAXxGYABQiAhMAX6XDjRvXkku3QWAC4DUCEwBfUWECUIgITAB85UVg4vIoALxGYALgK6fAFI/HFY1GFYvFHNuiwgTALwQmAL5yCkx1dXVqbGxUQ0ODY1sEJgB+ITAB8NXJk1K/ftKAAX1vi8AEwC8EJgC+OnXKBB3L6ntbBCYAfiEwAfBVOjC5YcAAU60iMAHwGoEJgK/cDEyWZc7FRGAC4DUCEwBfuRmYJNPWiRPutQcAmRCYAPiqrU0qLXWvvdJSAhMA7xGYAPjqxAmprMy99srKCEwAvEdgAuArtytMZWWmTQDwEoEJgK/crjAxJQfADwQmAL6iwgSgEBGYAPjKiwoTgQmA1whMAHzlRYWJKTkAXiMwAfCVF9+So8IEwGsEJgC+4jxMAAoRgQmAr06cYNE3gMJDYALgq7Y2Fn0DKDwEJgC+OX1aOnOm5wpTPB5XNBpVLBbLqk0WfQPwA4EJgG/SlaCeKkx1dXVqbGxUQ0NDVm2WlZkL+nZ0uDBAAOgGgQmAb9KVILcXfUvSyZPutQkAFyIwAfBNNhWm3kq3xTomAF4iMAHwjZcVJgITAC8RmAD4xssKEwu/AXiJwATAN15UmJiSA+AHAhMA36RDjRdTclSYAHiJwATAN+lQw6JvAIWGwATAN8ePm1sWfQMoNAQmAL5JJqUhQ6R+Ln7yUGEC4AcCEwDfHDsmhcPuttm/v1RScq56BQBeIDAB8E0yKQ0d6n674bBpGwC8QmAC4BsvKkySCWEEJgBeIjAB8I2XFaZjx9xvFwDSCEwAfONVhYkpOQBeIzAB8M2xY95UmJiSA+A1AhMA3yST3lWYmJID4CUCEwDfZFNhisfjikajisViWbfLlBwArxGYAPgmmwpTXV2dGhsb1dDQkHW7TMkB8BqBCYBvvFrDxJQcAK8RmAD4IpWS2tv5lhyAwkRgAuCLdAXIq2/JnTolnT7tftsAIBGYAPgkXQHyqsIkMS0HwDsEJgC+8LLClA5MTMsB8AqBCYAvvKwwpUMYgQmAVwhMAHxBhQlAISMwAfDF0aPmNhJxv20CEwCvEZgA+KK1VRo4UCorc7/tdAhLJNxvGwAkAhMAn7S2SsOHS5blfttlZSaMHTniftsAIBGYAPgkHZi8YFmm7dZWb9oHAAITAF94GZgkqbycChMA7xCYALiuvr5elmV12V544VVPAxMVJgBeGhD0AAAUp2uvvVZvvPFG5+N588o9D0xUmAB4hcAEwBMDBgxQVVVV5+Pjx3uekkulUkqlUp2Pk708R0B5ubR3b6+HCQBZYUoOgCd2796tmpoa1dbWav78+frsszMqL+9+/1WrVikSiXRuo0eP7lV/VJgAeInABMB1kyZN0vPPP6/XXntNP/vZz9TS0qKDB1MaNKit22OWLl2qRCLRuTU3N/eqz/Jy1jAB8A5TcgBcN2vWrM77EyZM0E03TVZ5eZnee+93kr6W8ZhQKKRQKJRzn1SYAHiJChMAz7W3m9N7Hz3a5Fkf5eXSqVNmAwC3EZgAeO7gwXZJUk1NiWd9pBeUMy0HwAsEJgCuW7JkiTZu3KimpiZt3bpVDzzwfUnS3XfP8KzP9IJypuUAeIE1TABc9+mnn+pb3/qWDh8+rMsuu0xXXPGgJGnixBrP+kxXmAhMALxAYALguhdffLHL4+eek7ZskUaM8K7Pyy4zt5995l0fAC5dTMkB8NyhQ2bKbOBA7/ooL5f69zd9AYDbCEwAPPfZZ9Lll3vbR79+pspEYALgBQITAM8dOuR9YJJMHwQmAF4gMAHwHIEJQKEjMAHw3KFD5xZle4nABMArBCYAnvNjDZNEYALgHQITAE/ZNlNyAAofgQmAp44elc6c8S8wff656Q8A3ERgAuCpdMXHr8AkcfJKAO4jMAHwVDq8+LXoW2JaDoD7CEwAPHXggLmtrMxu/3g8rmg0qlgs1uu+0n0cPNjrQwGgRwQmAJ7av18qKTl3cVwndXV1amxsVENDQ6/7qqoyt+mQBgBuITAB8NT+/dLIkZJled/X4MHmAr+ffup9XwAuLQQmAJ5KBya/jBpl+gQANxGYAHjK78A0ciQVJgDuIzAB8BQVJgDFgMAEwDO2HUyFicAEwG0EJgCeOXJEOnXK/wrTwYNSe7t/fQIofgQmAJ5JV3r8rjBJnFoAgLsITAA8s3evuR0zxr8+R40yt83N/vUJoPgRmAB45pNPpFBIqq72r8+xY81tU5N/fQIofgQmAJ5papKuuELq5+MnTVmZuUTKxx/71yeA4kdgAuCZpiapttb/fmtrqTABcBeBCYBnggpMV15JhQmAuwhMADxh21SYABQPAhMAT7S2SslkcBWm/fulVMr/vgEUJwITAE989JG5vfJK//uurTUVrvRpDQCgrwhMADzxwQfm9ppr/O/7qqvM7Ycf+t83gOJEYALgiQ8+MCeRHDKkd8fF43FFo1HFYrGc+073+/77OTcBAF1Ytm3nemzOBwIoft/8pnT0qPTGG7kdn0wmFYlElEgkFA6He338LbdI48dLP/95bv0DuGRY2exEhQmAJz74QPrCF4Lr/4tflBobg+sfQHEhMAFwXUeHtHt3sIEpGjVTcrkX0QHgHAITANc1NUnt7cEs+E774hfNaQ3++MfgxgCgeBCYALjuf//X3F53XXBjiEbNLdNyANxAYALguh07pOpqcxHcoNTWSqGQtGtXcGMAUDwITABct2OHdMMNwY6hf39T4dqxI9hxACgOBCYArtuxQ7r++qBHId18s7RtW9CjAFAMCEwAXHXwoHTgQPAVJkm66SbzTbnjx4MeCYBCR2AC4Kr0FFg+BKabbzanFdi5M+iRACh0BCYArtq2TYpEzKLroEWj0uDBTMsB6DsCEwBX/dd/SV/6ktQvDz5dBg40a6kaGoIeCYBClwcfaQCKxZkz0ubN0pe/HPRIzpkyxYQ4zvgNoC8ITABc8847ZoH1bbcFPZJzpk2TmpulTz4JeiQAChmBCYBr3nxTGjTILLbOF7fdJlmW9Ic/BD0SAIWMwATANZs2SbGYWWidL4YNM+uYNm4MeiQAChmBCYArTp+W3nhDmjGjb+3E43FFo1HFYjF3BiYzLff737OOCUDuLDv3TxA+egB02rRJmjrVfCPNjSm5ZDKpSCSiRCKhcDjcp7bWr5dmzjRrrCZM6PvYABQVK5udqDABcMUrr0iXXy7deGPQI7nY1KnS0KHSb34T9EgAFCoCEwBXvPKKNGtWfpx/6UKhkKkwEZgA5CoPP9oAFJoPPpDefVeaOzfokXRv7lzp7bfNde4AoLcITAD67IUXzOVQ7rgj6JF07447zJm/f/WroEcCoBARmAD0iW1L//RP0p135tfpBC40YoQ0e7a0bl3QIwFQiAhMAPrk7beljz+WFiwIeiTOFi6U/ud/zPQhAPQGgQlAnzz7rDRypDnXUb674w5TaaLKBKC3CEwAcvb559IvfiHdf7/Uv3/Qo3E2aJD0V38l/eM/Sm1tQY8GQCEhMAHI2XPPSWfPSosWBT2S7P31X0tHj1JlAtA7BCYAOTl5Uvrxj6W//EtzwspCUVtrFqivXi2dORP0aAAUCgITgJz8/d9Ln30mff/7QY+k95YulT76SFq7NuiRACgUXEsOQK8lEtLVV5uv6f/859704ea15DJZsEDauFHavVsqLXW9eQCFg2vJAfDG3/yNdPy49PjjQY8kd088YSpkq1cHPRIAhYDABKBX3n1X+tu/lR57TBo1KujR5O7KK6XFi01w+vDDoEcDIN8xJQcga+3t0qRJZrH0tm3morZe8XpKTpJOnJAmTpSqq6UNGwrj1AgAXMeUHAB3Pfqo9N575iv5XoYlv5SWmhNvvvmmqTQBQHcITACy8otfmNMIrF4t3Xijd/3E43FFo1HFYjHvOjnP1KnS8uVme/VVX7oEUICYkgPgaNMmaeZM6e67zVmyrawK2H3jx5Rc2tmz0je+If3hD+ZnveEGT7sDkF+YkgPQd//93+YabFOmSD/9qT9hyW/9+kn//M/SF74gzZhhLtALAOcjMAHo1n/+p/S1r0k33yz9+79LgwcHPSLvDBkivfaa+fbc9OkmKAJAGoEJwEVs21STZs6UJk+W/uM/Lo2TO5aXS2+8YdZoffWr5lp5ua9aAFBMCEwAujh82KxVuv9+6YEHpFdeMdWXS8XQoeZnvuce6dvflhYuNCfpBHBpIzABkGQqKb/+tXTttWYq7pe/lP7u76QBA4Iemf9KSqR/+AfzzcB/+Rfzb/Lyy1SbgEsZgQmANm+Wvvxl6a67pFtvlXbtkv78z4MeVfD+4i+kd96Rxo+X/uzPzHquhoagRwUgCAQm4BLV0SH9279JX/mK9KUvSW1t0vr15rmqqqBHlz+uvNKs4frXf5X27ZNuucVcdPi118zpCABcGghMwCXmww+lZcukq6+W/vRPTXD69a+l7dul228PenT5ybLMv9V775lpuv37TbXpmmukp56S9u4NeoQAvMaJK4Eid/asCUO/+52pHm3fbhY233mndN99ZgouH/l54sresm0zjRmPm8rTqVPm24Rz55ogNXFicZ6vCihSWf3fSmACikwqJe3YYX6hb9lizl59+LAUDpsK0vz5ZkqppCTokfYsnwPT+Y4dk37zG+lXvzKnJGhrkyorzbmcpkwx23XXSQMHBj1SAN0gMAHF7OxZMxX03ntmkXb6trFRam83J5mMxaTbbjNVj1tvLaxf2oUSmM7X3m5OePm735kL+m7bdu6/xfjxJjhdd500YYKZEq2pMWcZBxAoAhNQyFIp6eBBqaXFLDb+5BMTkD75xGxNTaaaIZnq0bXXml/KEyaYcDRxojRoUIA/QB8VYmC6UCplLrOydav5tt0775hgm0qZ10MhqbbWLCz/kz8xt2PHStXVZuF9ZWVxn10dyBMEJiAf2LYJNkePZt6OHDHBKL0dOmRuE4mu7ZSVmV+uV1xhfqnW1p4LSSNHFt+amWIITJmcOSPt2WO2jz8220cfnbt/6lTX/YcNM+EpvVVWmjOSDxt2bhs+vOvjIUOK7/0AeIjABFzo7FkzRZJKme38+06P0/dPnjQBKNvt2DHzTbRMBg0yv+wqK812+eXn7p+/jRljfkleSr8EizUw9eTsWemzz85VFi/c0s+3tpqwffJk5nb69zdVx7Iys5WWZr7N9FxJiXlfhkLm9sL7Pb3Wv7+v/1yAW4IPTLYtnThx7uy4tp3d/b6+fqnva9vmg/fs2a73Mz32cp9sj+voMH91nznT/f2eXst2v1TK3ObKsswvh8GDz/2yyWYLh7v+9X/+xnRL9y7FwNRbqVTmqmVrq6lQnjhhQnv69vz7mW5PnOjbePr16xqgBgwwW//+XW97e7+75/r1M/9f9uvX8+bHPpZ18SZlfj7X19xuz62+0o/TLnzOy9e628eyenX9y6wCU04XPbAsy0pcOF+Qwdmz5q9nFKb0h8OFHxKZHjvtk17YmulDJv1B2K/fufvpD8T0h2NJSdcPygs/QM9/3F1bmf4yHjjQ3Gb6i/nC1/v3d7fC095uNhipVEqp9OIeSceOHZNkghO6V1Jiturqvrd19uy5aurp07ndP336XDW2o+PcHy3n32bzXHt71+cv3K+7P84y/VGWad9s9kPhKiuT/vjH7PaNRCJhScdshwpSThUmy7LCkpwTEwAAQP6L2Lbd419nuQYmK5FIZJW/k8mkRo8erebmZl/K6rFYTA0+XeyJvvqmmN8bfvdXDH1dWGE6cOCAbrnlFjU2NmrkyJGu93ehYvg3vJT6KubPD/rqm96+NyKRSERZVJhympJzajSTcDjsy5u6f//+vq13oC93FON7w+/+irUvSRo6dGjRvT/oyz3F+PlBX+7I9r3hVFlKK7pTptXV1dFXAfXlJ79/rmL9b8b7g77yoS+/Feu/Y7H25QXPTyvAN13QHd4b6Mmnn37aWVYfNWpU0MNBnuHzA93J4b2R1dd5PK8whUIhLVu2TKFQyOuuUGB4b6An6fcF7w9kwucHuuPVe4MTVwLIS1QQAPgkPypMAAAAhY7ABAAA4IDABAAA4IDABAAA4MDTwLRixQpNmTJFpaWlGjZsWMZ99u3bpzlz5qisrEwVFRV66KGH1M4Fti5JY8eOlWVZXbZHH3006GEByBP19fUXfUZUVVUFPSwEZNOmTZozZ45qampkWZZefvnlLq/btq36+nrV1NSopKRE06ZN065du3Luz9PA1N7errvuukv3339/xtc7Ojo0e/ZstbW16c0339SLL76ol156Sd/73ve8HBby2OOPP64DBw50bj/4wQ+CHhKAPHLttdd2+Yx49913gx4SAtLW1qaJEydqzZo1GV9/6qmntHr1aq1Zs0YNDQ2qqqrS7bff3nlh797K6dIo2Vq+fLkkae3atRlfX79+vRobG9Xc3KyamhpJ0o9+9CPde++9WrFiBV8lvgQNHTqUvxgBdGvAgAF8RkCSNGvWLM2aNSvja7Zt65lnntFjjz2mefPmSZLWrVunyspKvfDCC7rvvvt63V+ga5i2bNmi8ePHd4YlSZo5c6ZSqZS2b98e4MgQlCeffFIjRozQ9ddfrxUrVjA9C6CL3bt3q6amRrW1tZo/f74+/vjjoIeEPNTU1KSWlhbNmDGj87lQKKSpU6dq8+bNObXpaYXJSUtLiyorK7s8N3z4cA0aNEgtLS0BjQpB+c53vqMbb7xRw4cP19tvv62lS5eqqalJzz77bNBDA5AHJk2apOeff15XX321Dh48qCeeeEJTpkzRrl27NGLEiKCHhzySzhAXZozKykrt3bs3pzZ7XWGyLKvesiz7woV352/btm3rTXsXPWfbdsbnUXgyLdLs7v3y8MMPa+rUqbruuuv07W9/Wz/96U/13HPP6fPPPw/4pwCQD2bNmqU777xTEyZM0Fe/+lX99re/lWSmWoBMLswSfckXuVSY1kh68f3333+/ux3Gjh2bVUNVVVXaunVrl+daW1t1+vTpi1IhCtODDz6o+fPn97hPd++XW2+9VZK0Z88e/nq8hMTjccXjcXV0dAQ9FOS5srIyTZgwQbt37w56KMgz6XVuLS0tqq6u7nz+0KFDOeeLXgcm27YPSzqcU28XmDx5slasWKEDBw50/kDr169XKBTSTTfd5EYXCFhFRYUqKipyOnbHjh2S1OXNjuJXV1enurq6zmvJAd1JpVJ6//33ddtttwU9FOSZ2tpaVVVV6fXXX9cNN9wgyXxzf+PGjXryySdzatPTNUz79u3TkSNHtG/fPnV0dGjnzp2SpKuuukpDhgzRjBkzFI1Gdc899+jpp5/WkSNHtGTJEi1atIhvyF1itmzZorfeekvTp09XJBJRQ0ODHn74Yc2dO1djxowJengA8sCSJUs0Z84cjRkzRocOHdITTzyhZDKphQsXBj00BOD48ePas2dP5+Ompibt3LlT5eXlGjNmjBYvXqyVK1dq3LhxGjdunFauXKnS0lItWLAgtw5t2851c7Rw4UJb0kXbhg0bOvfZu3evPXv2bLukpMQuLy+3H3zwQfvUqVPZNI8isn37dnvSpEl2JBKxBw8ebF9zzTX2smXL7La2tqCHhoAkEglbkp1IJIIeCvLE3XffbVdXV9sDBw60a2pq7Hnz5tm7du0KelgIyIYNGzJmjIULF9q2bdtnz561ly1bZldVVdmhUMj+yle+Yr/77ruZmsoq91i2beca7nI+EACcpKfkEokEFWcAXspqFTjXkgMAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAIAAHBAYAKQV+LxuKLRqGKxWNBDAYBOlm3buR6b84EA4CSZTCoSiSiRSCgcDgc9HADFy8pmJypMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAAAADghMAPJKPB5XNBpVLBYLeigA0MmybTvXY3M+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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = 1/x^2\n", + "print( f.limit(x=0) )\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )\n", + "plot(f, (x, -10, 10), ymax = 10, ymin = -10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1*(x - 1) + (-1/2)*(x - 1)^2 + 1/3*(x - 1)^3 + Order((x - 1)^4)\n", + "1*x^2 + (-5/6)*x^4 + Order(x^6)\n" + ] + } + ], + "source": [ + "f = e^x\n", + "g = sin(x) - 2*cos(x)\n", + "h = log(x)\n", + "\n", + "#print(f.series(x==0, 5))\n", + "#print(g.series(x==0, 7))\n", + "print(h.series(x==1, 4))\n", + "\n", + "print((sin(x)^2*cos(x)).series(x==0, 6))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivatives\n", + "**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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one." + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8*y^3\n", + "6*x^2 - 1\n" + ] + } + ], + "source": [ + "var('y')\n", + "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n", + "print( (2*x^3-x+2).derivative() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute higher order derivatives:" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6*x\n", + "84*x^5*y + 10*y^4 + 24*x^2*y\n", + "1680*x^3 + 48\n" + ] + } + ], + "source": [ + "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n", + "\n", + "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n", + "print( f.derivative(x, x, y) ) # Twice in x, once in y\n", + "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jacobian and Hessian matrices are also easy to compute:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-2*x + 2*y 2*x]\n", + "[ 0 3*y^2]\n", + "[ y + 1 x + 1] \n", + "\n", + "[ 2 -4*y + 1]\n", + "[ -4*y + 1 -4*x + 6*y]\n" + ] + } + ], + "source": [ + "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n", + "print( jacobian(f, [x,y]), \"\\n\" )\n", + "\n", + "g = x^2 + x*y + y^3 -2*x*y^2 -3\n", + "print( g.hessian() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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([...])`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrals\n", + "**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", + "\n", + "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n", + "When using a computer software to solve your integrals, you have two choices:\n", + "\n", + "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", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Symbolic integration\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*x^2 - cos(x)\n", + "0\n", + "1/2*pi^2 + 2\n" + ] + } + ], + "source": [ + "var('a', 'b')\n", + "f = x + sin(x)\n", + "print( f.integral(x) ) # Alternative: integral(f, x)\n", + "print( f.integral(x, -10, 10) )\n", + "print( f.integral(x, 0, pi) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your endpoints can also be $\\pm\\infty$:" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "sqrt(pi)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x), x, 0, infinity) )\n", + "print( integral(e^(-x^2), x, -infinity, infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*sqrt(pi)*erf(x)\n", + "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x^2), x) )\n", + "print( integral(e^(-x^2), x, 1, 2) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical integration\n", + "\n", + "In order to get an explicit value for the computations above, we can use a *numerical* method.\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.13525725794999466, 1.5016572202374808e-15)" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numerical_integral(e^(-x^2), 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result above means, in symbols\n", + "\\begin{align*}\n", + "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n", + "\\end{align*}\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Solution:** First, rewrite the equation as:\n", + "\\begin{align*}\n", + "y = \\sqrt{1- \\left(\\frac{x}{3}\\right)^2}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "3/2*pi" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y = sqrt(1-(x/3)^2)\n", + "show(plot(y, xmin=-3.1, xmax=3.1, ymin=-0.2, ymax=1.1))\n", + "integral(y, x, -3, 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Differential equations\n", + "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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()`." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "_C*e^x" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('x')\n", + "function('f')\n", + "equation = derivative(f(x)) == f(x)\n", + "desolve(equation, f(x)) # f(x) is the unknown function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3*e^x" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "desolve(equation, f(x), (0,3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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))$." + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n", + "desolve(equation, f(x), (0, 0, 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n", + "\\begin{align*}\n", + " \\begin{array}{rlcrl}\n", + " (A) &\n", + " \\begin{cases}\n", + " f(0) &= 1\\\\\n", + " f'(0) &= 0\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " & \\qquad \\qquad &\n", + " (B) &\n", + " \\begin{cases}\n", + " f(0) &= 0\\\\\n", + " f'(0) &= 1\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cos(x)\n", + "sin(x)\n", + "_K2*cos(x) + _K1*sin(x)\n" + ] + } + ], + "source": [ + "eq = derivative(f(x), x, 2) == -f(x)\n", + "conditions1 = (0,1,0)\n", + "conditions2 = (0,0,1)\n", + "print( desolve(eq, f(x), conditions1) )\n", + "print( desolve(eq, f(x), conditions2) )\n", + "print( desolve(eq, f(x)) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A real-world example\n", + "\n", + "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n", + "\n", + "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", + "\n", + "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", + "\n", + "Since the acceleration is the derivative of the velocity, we have a differential equation\n", + "\\begin{align*}\n", + " v'(t) = -g -kv(t)\n", + "\\end{align*}\n", + "and we can try to solve it with Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "var('t')\n", + "function('v')\n", + "g = 9.8\n", + "k = 1.5\n", + "conditions = (0, 0) # Start with velocity 0\n", + "sol = desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)\n", + "#plot(sol, xmin=0, xmax = 100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-(g*e^(k*t) - g)*e^(-k*t)/k" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t', 'g', 'k')\n", + "function('v')\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic data analysis and visualization\n", + "\n", + "## Statistics\n", + "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n", + "\n", + "Sage includes the most basic functions for statistical analysis." + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "Mean:\t\t\t 5/13\n", + "Median:\t\t\t 1\n", + "Mode:\t\t\t [3]\n", + "Standard deviation:\t 2*sqrt(29/13)\n", + "Variance:\t\t 116/13\n", + "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n" + ] + } + ], + "source": [ + "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "\n", + "print(\"Values:\\t\", L)\n", + "\n", + "print(\"Mean:\\t\\t\\t\", mean(L))\n", + "print(\"Median:\\t\\t\\t\", median(L))\n", + "print(\"Mode:\\t\\t\\t\", mode(L))\n", + "\n", + "print(\"Standard deviation:\\t\", std(L))\n", + "print(\"Variance:\\t\\t\", variance(L))\n", + "\n", + "print(\"Moving average (5):\", moving_average(L,5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "**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", + "\n", + "Some Sage objects can be plotted:" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f = sin(x)\n", + "p = plot(f,\n", + " -2*pi, 2*pi, # bounds for x\n", + " ymin = -1.1, ymax = 1.1, # bounds for y\n", + " color = \"red\",\n", + " title = \"The sin function\",\n", + " )\n", + "print(\"hello\")\n", + "show(p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n", + "exponential = plot(exp(x), (x,-2,0.5))\n", + "\n", + "show(cosine + exponential) # works like print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b = bar_chart(range(1,10))\n", + "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n", + " marker = \"*\", # symbol\n", + " markersize = 100,\n", + " edgecolor = \"green\",\n", + " facecolor = \"red\"\n", + " )\n", + "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n", + "show(b + s + t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpolation\n", + "**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", + "\n", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n", + "polring.<x> = QQ[] # you need to specify a polynomial ring\n", + "lp = polring.lagrange_polynomial(points)\n", + "show(scatter_plot(points, facecolor=\"red\")\n", + " + plot(lp, 0, 3) # slightly different notation for polynomials\n", + " + text(lp, (1,8), color=\"black\")\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "However, it does not always give you good approximation of your data:" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "R = [x/10 for x in range(-10,10)]\n", + "L = [1/(1+25*x^2) for x in R]\n", + "points = [(R[i], L[i]) for i in range(len(L))]\n", + "polring.<x> = RR[]\n", + "lp = polring.lagrange_polynomial(points)\n", + "\n", + "show(plot(lp, -0.92, 0.82) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show(plot(spline(points), -1, 1) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb b/src/Lecture6/notebook/.ipynb_checkpoints/9-SageLatex-checkpoint.ipynb @@ -0,0 +1,339 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "In this document we will describe some of these interactions between LaTeX and Sage." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The `show()` command\n", + "**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", + "\n", + "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", + "\n", + "You can see it as an alternative to `print()`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)\n" + ] + }, + { + "data": { + "text/html": [ + "<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>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\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", + "\\end{math}" + ], + "text/plain": [ + "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 4 5 6]\n", + "[ 8 9 10]\n" + ] + }, + { + "data": { + "text/html": [ + "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)</script></html>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)\n", + "\\end{math}" + ], + "text/plain": [ + "[ 1 2 3]\n", + "[ 4 5 6]\n", + "[ 8 9 10]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pi\n" + ] + }, + { + "data": { + "text/html": [ + "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi</script></html>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi\n", + "\\end{math}" + ], + "text/plain": [ + "pi" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "s = (e^x).series(x==0, 4)\n", + "M = matrix([[1,2,3],[4,5,6],[8,9,10]])\n", + "print(s)\n", + "show(s)\n", + "print(M)\n", + "show(M)\n", + "print(pi)\n", + "show(pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In a Jupyter notebook, the results above are displayed using [MathJax](https://www.mathjax.org/).\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The `latex()` command\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html)]\n", + "\n", + "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", + "\n", + "Technically, this is a function that returns a string, so you need to `print()` it to see the result." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n", + "\n", + "\n", + "\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)\n" + ] + } + ], + "source": [ + "print(latex(s))\n", + "print(\"\\n\")\n", + "print(latex(M))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "#latex(plot(x^2)) # The output is more than 20 pages long" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is probably easier to just generate the picture and include that in your Latex document with `\\includegraphics`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A Latex name for your variables\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html)]\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "phi1(epsilon)\n" + ] + }, + { + "data": { + "text/html": [ + "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)</script></html>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)\n", + "\\end{math}" + ], + "text/plain": [ + "e^epsilon + phi1(epsilon)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "e^{{\\epsilon}} + \\phi_1\\left({\\epsilon}\\right)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('epsilon', latex_name=\"\\\\epsilon\")\n", + "function('phi1', latex_name=\"\\\\phi_1\")\n", + "\n", + "print(phi1(epsilon))\n", + "show(phi1(epsilon) + e^epsilon)\n", + "latex(phi1(epsilon) + e^epsilon)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# From Jupyter to Latex\n", + "**Reference:** [[4](https://nbconvert.readthedocs.io/en/latest/)]\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SageTex\n", + "**Reference:** [[5](https://doc.sagemath.org/html/en/tutorial/sagetex.html)]\n", + "\n", + "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", + "\n", + "You might need to take some extra steps to make this work on your system, see the link above." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The Latex `listings` package\n", + "**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", + "\n", + "If you want to include some code (Sage, Python or anything else) in a Latex document you can use the listings package.\n", + "\n", + "```\n", + "\\usepackage{listings}\n", + "\n", + "...\n", + "\n", + "\\begin{lstlisting}[language=Python]\n", + "for i in range(0,100):\n", + " if i%5 == 0:\n", + " print(\"Multiple of 5!\")\n", + "\\end{lstlisting}\n", + "```\n", + "\n", + "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", + "\n", + "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", + "\n", + "```\n", + "\\lstinputlisting[language=Python]{file.py}\n", + "```\n", + "\n", + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture6/notebook/8-SageCalculus.aux b/src/Lecture6/notebook/8-SageCalculus.aux @@ -0,0 +1,58 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{toc}{\contentsline {section}{\numberline {1}Symbolic expressions}{1}{section.1}\protected@file@percent } +\newlabel{symbolic-expressions}{{1}{1}{Symbolic expressions}{section.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Solving equations and inequalities}{1}{subsection.1.1}\protected@file@percent } +\newlabel{solving-equations-and-inequalities}{{1.1}{1}{Solving equations and inequalities}{subsection.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.1}The set of solutions}{2}{subsubsection.1.1.1}\protected@file@percent } +\newlabel{the-set-of-solutions}{{1.1.1}{2}{The set of solutions}{subsubsection.1.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.1.2}Alternative method for real roots: \texttt {find\_root()}}{3}{subsubsection.1.1.2}\protected@file@percent } +\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}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Evaluating functions}{3}{subsection.1.2}\protected@file@percent } +\newlabel{evaluating-functions}{{1.2}{3}{Evaluating functions}{subsection.1.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Symbolic computations}{4}{subsection.1.3}\protected@file@percent } +\newlabel{symbolic-computations}{{1.3}{4}{Symbolic computations}{subsection.1.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.1}The Symbolic Ring}{5}{subsubsection.1.3.1}\protected@file@percent } +\newlabel{the-symbolic-ring}{{1.3.1}{5}{The Symbolic Ring}{subsubsection.1.3.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Calculus}{5}{section.2}\protected@file@percent } +\newlabel{calculus}{{2}{5}{Calculus}{section.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Limits and series}{5}{subsection.2.1}\protected@file@percent } +\newlabel{limits-and-series}{{2.1}{5}{Limits and series}{subsection.2.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Derivatives}{6}{subsection.2.2}\protected@file@percent } +\newlabel{derivatives}{{2.2}{6}{Derivatives}{subsection.2.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Integrals}{7}{subsection.2.3}\protected@file@percent } +\newlabel{integrals}{{2.3}{7}{Integrals}{subsection.2.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.1}Symbolic integration}{7}{subsubsection.2.3.1}\protected@file@percent } +\newlabel{symbolic-integration}{{2.3.1}{7}{Symbolic integration}{subsubsection.2.3.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.2}Numerical integration}{8}{subsubsection.2.3.2}\protected@file@percent } +\newlabel{numerical-integration}{{2.3.2}{8}{Numerical integration}{subsubsection.2.3.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Differential equations}{9}{subsection.2.4}\protected@file@percent } +\newlabel{differential-equations}{{2.4}{9}{Differential equations}{subsection.2.4}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.1}A real-world example}{10}{subsubsection.2.4.1}\protected@file@percent } +\newlabel{a-real-world-example}{{2.4.1}{10}{A real-world example}{subsubsection.2.4.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3}Basic data analysis and visualization}{10}{section.3}\protected@file@percent } +\newlabel{basic-data-analysis-and-visualization}{{3}{10}{Basic data analysis and visualization}{section.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Statistics}{10}{subsection.3.1}\protected@file@percent } +\newlabel{statistics}{{3.1}{10}{Statistics}{subsection.3.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Plotting}{11}{subsection.3.2}\protected@file@percent } +\newlabel{plotting}{{3.2}{11}{Plotting}{subsection.3.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Interpolation}{15}{subsection.3.3}\protected@file@percent } +\newlabel{interpolation}{{3.3}{15}{Interpolation}{subsection.3.3}{}} +\gdef \@abspage@last{18} diff --git a/src/Lecture6/notebook/8-SageCalculus.ipynb b/src/Lecture6/notebook/8-SageCalculus.ipynb @@ -0,0 +1,1372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Symbolic expressions\n", + "\n", + "**Reference:** [[1](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html)]\n", + "\n", + "Last time we saw the basics of symbolic expressions:\n", + "* How to define and manipulate symbolic expressions\n", + "* How to introduce new variables (in the Mathematical sense) with `var()`\n", + "* How to solve equations and inequalities\n", + "* Some of the Mathematical constants that are included in Sage, and how to approximate them using `n()`\n", + "\n", + "Here are some examples to remind you of these basic things:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "x == -sqrt(-pi),\n", + "x == sqrt(-pi)\n", + "]\n", + "[\n", + "z == -sqrt(pi + x^2),\n", + "z == sqrt(pi + x^2)\n", + "]\n", + "[[y < -2], [y > 1]]\n", + "2*pi + e is approximately 9.00146713563863\n" + ] + } + ], + "source": [ + "var('y', 'z') # Define new variables (x is already defined by Sage)\n", + "f = x^2 + pi\n", + "g = y^2 + y - 2 > 0\n", + "print( solve(f==0, x) )\n", + "print( solve(z^2 - f, z) )\n", + "print( solve(g, y) )\n", + "print( 2*pi + e, \"is approximately\", n(2*pi + e) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will see some more details about solving equations and manipulating their solutions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving equations and inequalities\n", + "\n", + "**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", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x + y = 2 \\\\\n", + " 2x - y = 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "\n", + "Can be solved as" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[x == (8/3), y == (-2/3)]]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The set of solutions\n", + "\n", + "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)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x == -3" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solutions = solve(x^2-9 == 0, x)\n", + "solutions[0] # This is the expression 'x == -3'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rhs: 2\n", + "lhs: x\n" + ] + } + ], + "source": [ + "f = x == 2\n", + "print(\"rhs:\", f.rhs())\n", + "print(\"lhs:\", f.lhs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simple inequality: [[x < -3], [x > 3]]\n", + "System of inequalities:\n", + " [\n", + "[3 < x, x < 6],\n", + "[x < -3]\n", + "]\n" + ] + } + ], + "source": [ + "print(\"Simple inequality:\", solve(x^2-9 > 0, x))\n", + "print(\"System of inequalities:\\n\", solve([x^2-9 > 0, x < 6], x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the last example (system of inequalities), Sage is telling us that the system\n", + "\\begin{align*}\n", + " \\begin{cases}\n", + " x^2-9 > 9 \\\\\n", + " x < 6\n", + " \\end{cases}\n", + "\\end{align*}\n", + "has two solutions:\n", + "* $x$ is between $3$ and $6$;\n", + "* $x$ is less than $-3$.\n", + "\n", + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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)$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{x: 8/3, y: -2/3}]" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solve([x+y == 2, 2*x - y == 6], [x,y], solution_dict=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Alternative method for real roots: `find_root()`\n", + "\n", + "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", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using solve():\n", + " [\n", + "x == -e^x + 10\n", + "]\n", + "Using find_root(): 2.070579904980303\n" + ] + } + ], + "source": [ + "f = e^x + x - 10\n", + "print(\"Using solve():\\n\", solve(f, x))\n", + "print(\"Using find_root():\", f.find_root(0,100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating functions\n", + "\n", + "If an expression contains only one variable you can evaluate it easily, even if it is not a function." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "y + 3 > (y + 3)^2\n" + ] + } + ], + "source": [ + "var('y')\n", + "f = x^2-3\n", + "g = x > x^2\n", + "\n", + "print(f(2))\n", + "print(g(3+y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2 == 0\n", + "3*y == 2\n" + ] + } + ], + "source": [ + "var('y','z')\n", + "\n", + "f = y*z^2 - y == z\n", + "print(f(2, 0))\n", + "print(f(z=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Symbolic computations\n", + "\n", + "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", + "\n", + "\\begin{align*}\n", + " \\begin{array}{llcc}\n", + " (1) & \\sum_{k=0}^nk &=&\\frac{n^2+n}{2}\\\\\n", + " (2) & \\sum_{k=0}^nk^4 &=&\\frac{6n^5+15n^4+10n^3-n}{30}\\\\\n", + " (3) & \\sum_{k=0}^n\\binom nk &=& 2^n\\\\\n", + " (4) & \\sum_{k=0}^\\infty \\frac1{k^2} &=& \\frac{\\pi^2}{6}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1) 1/2*n^2 + 1/2*n\n", + "(2) 1/5*n^5 + 1/2*n^4 + 1/3*n^3 - 1/30*n\n", + "(3) 2^n\n", + "(4) 1/6*pi^2\n" + ] + } + ], + "source": [ + "var('k', 'n') # Remember to declare all variables\n", + "\n", + "s = []\n", + "s.append( sum(k, k, 0, n) )\n", + "s.append( sum(k^4, k, 0, n) )\n", + "s.append( sum(binomial(n,k), k, 0, n) )\n", + "s.append( sum(1/k^2, k, 1, infinity) )\n", + "\n", + "for i in range(len(s)):\n", + " print(\"({}) {}\".format(i+1, s[i]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(x + 1)^2 - (x - 1)^2\n", + "4*x\n" + ] + } + ], + "source": [ + "f = (x+1)^2 - (x-1)^2\n", + "print(f)\n", + "print(f.expand())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Symbolic Ring\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html)]\n", + "\n", + "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\"." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-b*c + a*d\n", + "[(-a, 2)]\n" + ] + } + ], + "source": [ + "var('a', 'b', 'c', 'd')\n", + "\n", + "M = matrix([[a,b], [c,d]])\n", + "print(M.determinant())\n", + "\n", + "polring.<x> = SR[]\n", + "f = x^2 + 2*a*x + a^2\n", + "print(f.roots())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the eigenvalues of the matrix\n", + "\\begin{align*}\n", + "\\begin{pmatrix}\n", + "\\cos \\alpha & \\sin \\alpha\\\\\n", + "-\\sin\\alpha & \\cos \\alpha\n", + "\\end{pmatrix}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calculus\n", + "**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)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Limits and series\n", + "\n", + "**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", + "\n", + "You can compute limits" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "0\n" + ] + } + ], + "source": [ + "f = sin(x)/x\n", + "# print(f(0)) # This one gives an error\n", + "print( f.limit(x=0) )\n", + "\n", + "print( (e^(-x)).limit(x=infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the constant $e$ using a limit." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also specify a direction for the limit. If you don't, Sage assumes that you want to take a two-sided limit." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "und\n", + "1\n", + "-1\n" + ] + } + ], + "source": [ + "f = abs(x)/x # 1 if x>0, -1 if x<0\n", + "print( f.limit(x=0) ) # undefined\n", + "print( f.limit(x=0, dir=\"+\") )\n", + "print( f.limit(x=0, dir=\"-\") )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also the alternative notation `limit(f, x, dir)` which does the same as `f.limit(x, dir)`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute series expansions up to any order. **Watch out:** the notation uses `==` instead of `=` as `limit()` does." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1*x + 1/2*x^2 + Order(x^3)\n", + "(-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", + "1*(x - 1) + (-1/2)*(x - 1)^2 + Order((x - 1)^3)\n" + ] + } + ], + "source": [ + "f = e^x\n", + "g = sin(x) - 2*cos(x)\n", + "h = log(x)\n", + "\n", + "print(f.series(x==0, 3))\n", + "print(g.series(x==0, 7))\n", + "print(h.series(x==1, 3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Derivatives\n", + "**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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When computing derivatives, you need to specify with respect to which variables you want to derive, except in case there is only one." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8*y^3\n", + "6*x^2 - 1\n" + ] + } + ], + "source": [ + "var('y')\n", + "print( (x^2+2*y^4).derivative(y) ) # Alternative: derivative(f, y)\n", + "print( (2*x^3-x+2).derivative() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also compute higher order derivatives:" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6*x\n", + "84*x^5*y + 10*y^4 + 24*x^2*y\n", + "1680*x^3 + 48\n" + ] + } + ], + "source": [ + "print( (x^3).derivative(x, x) ) # Same as (x^3).derivative(x, 2)\n", + "\n", + "f = x^7*y^2 + x^4*y^2 - 2*x^3 + x^2*y^5 + y + 2\n", + "print( f.derivative(x, x, y) ) # Twice in x, once in y\n", + "print( f.derivative(x, 4, y, 2) ) # 4 times in x, twice in y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jacobian and Hessian matrices are also easy to compute:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-2*x + 2*y 2*x]\n", + "[ 0 3*y^2]\n", + "[ y + 1 x + 1] \n", + "\n", + "[ 2 -4*y + 1]\n", + "[ -4*y + 1 -4*x + 6*y]\n" + ] + } + ], + "source": [ + "f = (-x^2 + 2*x*y, y^3, x+y+x*y)\n", + "print( jacobian(f, [x,y]), \"\\n\" )\n", + "\n", + "g = x^2 + x*y + y^3 -2*x*y^2 -3\n", + "print( g.hessian() )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*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([...])`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integrals\n", + "**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", + "\n", + "You should remember from high school or from your first calculus/analysis course that derivatives are easy, but integrals are hard.\n", + "When using a computer software to solve your integrals, you have two choices:\n", + "\n", + "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", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Symbolic integration\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*x^2 - cos(x)\n", + "0\n", + "-1/2*a^2 + 1/2*b^2 + cos(a) - cos(b)\n" + ] + } + ], + "source": [ + "var('a', 'b')\n", + "f = x + sin(x)\n", + "print( f.integral(x) ) # Alternative: integral(f, x)\n", + "print( f.integral(x, -10, 10) )\n", + "print( f.integral(x, a, b) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Your endpoints can also be $\\pm\\infty$:" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "sqrt(pi)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x), x, 0, infinity) )\n", + "print( integral(e^(-x^2), x, -infinity, infinity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last function is also an example of an integral that perhaps you might want to compute numerically. In fact:" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1/2*sqrt(pi)*erf(x)\n", + "1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1)\n" + ] + } + ], + "source": [ + "print( integral(e^(-x^2), x) )\n", + "print( integral(e^(-x^2), x, 1, 2) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here `erf(x)` denotes the [error function](https://en.wikipedia.org/wiki/Error_function)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical integration\n", + "\n", + "In order to get an explicit value for the computations above, we can use a *numerical* method.\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.13525725794999466, 1.5016572202374808e-15)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numerical_integral(e^(-x^2), 1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result above means, in symbols\n", + "\\begin{align*}\n", + "\\int_1^2 e^{-x^2}\\mathrm dx = 0.13525725794999466 \\pm 1.5016572202374808\\times 10^{-15}\n", + "\\end{align*}\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Compute the area of the ellipse of equation $y^2+\\left(\\frac x3\\right)^2=1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Differential equations\n", + "**Reference:** [[13](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html)]\n", + "\n", + "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", + "\n", + "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", + "\n", + "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", + "\n", + "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()`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "_C*e^x" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('x')\n", + "function('f')\n", + "equation = derivative(f(x)) == f(x)\n", + "desolve(equation, f(x)) # f is the unknown function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "We can also specify *initial conditions* for our function. For example we can impose that $f(0)=3$ as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3*e^x" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "desolve(equation, f(x), (0,3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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))$." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e^(-1/2*x^2), x)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "equation = derivative(f(x), x, 2) + x*derivative(f(x)) == 1\n", + "desolve(equation, f(x), (0, 0, 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise.** Use Sage to find out the functions $f(x)$ that satisfy\n", + "\\begin{align*}\n", + " \\begin{array}{rlcrl}\n", + " (A) &\n", + " \\begin{cases}\n", + " f(0) &= 1\\\\\n", + " f'(0) &= 0\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " & \\qquad \\qquad &\n", + " (B) &\n", + " \\begin{cases}\n", + " f(0) &= 0\\\\\n", + " f'(0) &= 1\\\\\n", + " f''(x) &= -f(x)\n", + " \\end{cases}\n", + " \\end{array}\n", + "\\end{align*}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A real-world example\n", + "\n", + "Differential equations have countless applications in Science, so it would be a shame not to see at least a simple one.\n", + "\n", + "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", + "\n", + "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", + "\n", + "Since the acceleration is the derivative of the velocity, we have a differential equation\n", + "\\begin{align*}\n", + " v'(t) = -g -kv(t)\n", + "\\end{align*}\n", + "and we can try to solve it with Sage!" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-98/15*(e^(3/2*t) - 1)*e^(-3/2*t)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t')\n", + "function('v')\n", + "g = 9.8\n", + "k = 1.5\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-(g*e^(k*t) - g)*e^(-k*t)/k" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('t', 'g', 'k')\n", + "function('v')\n", + "conditions = (0, 0) # Start with velocity 0\n", + "desolve(derivative(v(t)) == -g -k*v(t), v(t), conditions, ivar=t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic data analysis and visualization\n", + "\n", + "## Statistics\n", + "**References:** [[14](https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html)]\n", + "\n", + "Sage includes the most basic functions for statistical analysis." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Values:\t [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "Mean:\t\t\t 5/13\n", + "Median:\t\t\t 1\n", + "Mode:\t\t\t [3]\n", + "Standard deviation:\t 2*sqrt(29/13)\n", + "Variance:\t\t 116/13\n", + "Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5]\n" + ] + } + ], + "source": [ + "L = [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0]\n", + "\n", + "print(\"Values:\\t\", L)\n", + "\n", + "print(\"Mean:\\t\\t\\t\", mean(L))\n", + "print(\"Median:\\t\\t\\t\", median(L))\n", + "print(\"Mode:\\t\\t\\t\", mode(L))\n", + "\n", + "print(\"Standard deviation:\\t\", std(L))\n", + "print(\"Variance:\\t\\t\", variance(L))\n", + "\n", + "print(\"Moving average (5):\", moving_average(L,5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "**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", + "\n", + "Some Sage objects can be plotted:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage's plotting functions are based on Python's [matplotlib](https://matplotlib.org/).\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = sin(x)\n", + "plot(f,\n", + " -2*pi, 2*pi, # bounds for x\n", + " ymin = -0.7, ymax = 0.7, # bounds for y\n", + " color = \"red\",\n", + " title = \"The sin function\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you need to plot more than one object at the time, you can sum two plots and show them together with `show()`:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cosine = plot(cos(x), (x,-pi/2,pi/2), color=\"red\")\n", + "exponential = plot(exp(x), (x,-2,0.5))\n", + "\n", + "show(cosine + exponential)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b = bar_chart(range(1,10))\n", + "s = scatter_plot([(1,5), (4,2), (8,8), (4,7)],\n", + " marker = \"*\", # symbol\n", + " markersize = 100,\n", + " edgecolor = \"black\",\n", + " facecolor = \"red\"\n", + " )\n", + "t = text(\"wow, such plot!\", (1, 8), color=\"black\", fontsize=20)\n", + "show(b + s + t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpolation\n", + "**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", + "\n", + "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", + "\n", + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 3 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "points = [ (0,1), (1,2), (1.5,0), (2,4), (3,5) ]\n", + "polring.<x> = QQ[] # you need to specify a polynomial ring\n", + "lp = polring.lagrange_polynomial(points)\n", + "show(scatter_plot(points, facecolor=\"red\")\n", + " + plot(lp, 0, 3) # slightly different notation for polynomials\n", + " + text(lp, (1,8), color=\"black\")\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "However, it does not always give you good approximation of your data:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "R = [x/10 for x in range(-10,10)]\n", + "L = [1/(1+25*x^2) for x in R]\n", + "points = [(R[i], L[i]) for i in range(len(L))]\n", + "polring.<x> = RR[]\n", + "lp = polring.lagrange_polynomial(points)\n", + "\n", + "show(plot(lp, -0.82, 0.72) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGGCAYAAACJ/96MAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAABDSUlEQVR4nO3deXxU1f3/8dfNIBBrElSQQAQEXEoUXCAiBFBQwiZCGlCrFbSiIvDTBNtatXXrQrUquGSB4vLFFaUERCAJdUESqUUUqRJFCQpEluKSERkBZ+7vj0OAkG2STObO8n4+HveBDnfmfoa5ufPOOeeeY9m2jYiIiIjULsbpAkRERERCnQKTiIiISD0UmERERETqocAkIiIiUg8FJhEREZF6KDCJiIiI1EOBSURERKQeCkwiIiIi9VBgEpGIYxnxlmVZTtciIpGhRQBeQ1OFi0hI2bFjB4mJiezYscPpUkQk9Pn1i5VamEQkYhQXFzMuI4OkpCQAkpKSGJeRQUlJicOViUi4U2ASkWb19ttvM3r0aDp27IhlWSxatKje56xcuZLevXvTunVrunXrRl5eXr3Pyc3NZdCgQZSuW8vfp01i8YP38vdpkyhdt5aBAwf69RoiIrUJRJeciEitfvjhB84++2yuu+46MjIy6t1/8+bNjBw5khtuuIHnnnuOkpISpkyZQrt27Wp9fnFxMVOnTmXa+MuYeetNxMQc/l3wlsvHkDkrjylTptCzZ09SU1MD9t5EJHpYtt3kIUgawyQifrEsi/z8fMaOHVvrPrfffjuvvvoqpaWlhx6bPHkyH374IatXr67xOeMyMihdt5b1z+ZWCUuVfD4fva65meTz+vDKKwua/D5EJKJoDJOIhJ/Vq1eTlpZW5bFhw4bx3nvvceDAgWr7ezweFi1ezKTRw2sMSwAxMTFMGj2c/PxFeDyeZqlbRCKbApOIhJQdO3bQvn37Ko+1b9+en376id27d1fb3+124/V66Z7Uoc7X7ZaUiNfrxe12B7ReEYkOCkwiEnKOnj6pcuhATdMqxcfH43K52FS+vc7XLCvfgcvlIj4+PnCFikjUUGASkZBS0/xJu3btokWLFpx44onV9v/ii1hatBhDXn4BPp+vxtf0+XzkLSygY8extGoV2yx1i0hkU2ASkZDSr18/VqxYUeWxoqIi+vTpwzHHHFPl8f/9D0aMgI4ds/hs6xayHp1dLTT5fD4yZ+Xx2bYtbN2axe9/3+xvQUQikKYVEJFmtWfPHj7//PND/79582bWrVvHCSecQOfOnbnjjjsoLy9n3rx5gLkj7oknnmD69OnccMMNrF69mieffJIXX3yxyuv6fHDNNbB3L6xdO4ClS3OYMmUKr7+3jkmjh9MtKZGy8h3MXVJA6eYt5OTk4PGkMn069O8PddyoJyJSnW3bTd1ERGr15ptv2pjpR6psEydOtG3btidOnGhfeOGFVZ7z1ltv2eeee67dsmVL+5RTTrFzc3OrvW5urm2DbS9ffvix4uJie9y4DNvlctmA7XK57HHjMuzi4mLbtm3b57Pt9HTbPvFE2969u7nesYiEGb/yjuZhEpGws2sX/PznkJ4OTz5Z/e937tx5aCzU0Xfc7dwJZ5wB48bB3LlBKlhEQpnmYRKRyHT77ebPv/2t5r+PjY2t8ueR2reHGTNM0NIScyLiL7UwiUhYKSmBAQNg9my48caa93G73SQkJFBRUVHjNAJeL/TrB/v3w/vvQy3zXYpIdPCrhUmBSUTCykUXgdsN771Xe9CpLzDB4eD1yiume05Eopa65EQksrz1FqxcCffe2/RWodRUGDYM7rnHtDiJiNRFgUlEwsZ998G558Lo0YF7vQ0bTCuTiEhdFJhEJCy8/bZpYbr7bqhhhZRG6dsXRo40wamWScJFRAAFJhEJE3/9K5x9NowZE9jXvesu+OQTKCgI7OuKSGRRYBKRkPfpp1BYCNOnB651qVK/ftCnDzz6aGBfV0QiiwKTiIS8J56Adu3giisC/9qWBbfeCkVFZjyTiEhNFJhEJKS53fDMM2bOpVatmucYl18OiYnw2GPN8/oiEv4UmEQkpP3f/4HHA5Mn179vdnY2ycnJpKSkNOgYLVvCzTfDvHnw7beNLFREIpomrhSRkGXbkJwMPXvCyy/7/zx/Jq482o4dcPLJZizT1KmNLFhEwpEmrhSR8LZ6tbmD7aabmv9YiYlw6aU1L+YrIqLAJCIh6+mnoUsXGDw4OMe7/nr44AOziYgcSYFJRELSDz/ASy/BxInBWxx3xAjT0vTUU8E5noiEDwUmEQlJ//wn7NkD114bvGO2aGEC2vPPw48/Bu+4IhL6FJhEJCQ9/bTpiuvaNbjHve46c6fckiXBPa6IhDYFJhEJOVu3mnXjJk4M/rHPOMPM/P3ii8E/toiELgUmEQk5r7xi5kYaO9aZ4//yl7BsGVRUOHN8EQk9CkwiEnJeeglGjoSEBGeOf/nlsH8/LFrkzPFFJPQoMIlISCkrgzVrmmfdOH+dfDIMHKhuORE5TIFJRELKyy/DscfC6NHO1nHllfCvf8H//udsHSISGhSYRCSkvPSSmXH7Zz9zto5x48yfCxY4W4eIhAYFJhEJGZ98Ah9+aFp3nNauHVxyibrlRMRQYBKRkDF/PsTFmRm3Q8EvfwmrVkF5udOViIjTFJhEJGTMn2+mEmjd2ulKjMsuM7N/6245EVFgEpGQ8MknUFoK48c7Xclhxx8PQ4bAwoVOVyIiTlNgEpGQsHixuTvukksa/xrZ2dkkJyeTkpISsLrS02HlSvj664C9pIiEIcu27aa+RpNfQESkXz/o0CEwrTlut5uEhAQqKiqIj49v0mtt3w5JSWZtOyeWahGRZmf5s5NamETEcTt2wLvvwpgxTldSXYcOJsypW04kuikwiYjjliwBy4JRo5yupGbp6VBUBD/84HQlIuIUBSYRcdzixTBgALRt63QlNUtPhx9/hOXLna5ERJyiwCQijtqzxyxBEordcZW6d4eePU1LmIhEJwUmEXFUYSHs2xfagQnMci3LloHX63QlIuIEBSYRcdTixXDmmaYVJ5SNGgW7d8OaNU5XIiJOUGASEcf89BMsXWpm9w51F1wAJ5wAr73mdCUi4gQFJhFxTHExfPNN6HfHAbhcMHKkApNItFJgEhHHLFli5jnq3dvpSvxz6aXw4YewbZvTlYhIsCkwiYhjCgth+HCICZMr0bBhpqVp6VKnKxGRYAuTy5SIRJrycvj4Y0hLc7oS/7VpY+aLUrecSPRRYBIRRxQVmdm9m7LYrhMuvRRefx08HqcrEZFgUmASEUcUFpqxS6E6u3dtLr3UhKU333S6EhEJJgUmEQk6rxdWrDBjgsLNGWdAt27qlhOJNgpMIhJ0779vphMIdGDKzs4mOTmZlJSUwL7wESzLtDItXQq23WyHEZEQY9lN/4nXJUNEGuTPf4YHH4Svv4Zjjgn867vdbhISEqioqCA+Pj7gr79ihRms/uGH0KtXwF9eRILL8mcntTCJSNAVFcGQIc0TloJh0CD42c9g+XKnKxGRYFFgEpGgcrth9erwHL9UqVUrGDzYDFwXkeigwCQiQfXmm2YNuXCaf6kmw4aZpV327HG6EhEJBgUmEQmqwkLo3t1s4WzYMDhwQNMLiEQLBSYRCarCwvDujqt06qlmegF1y4lEBwUmEQmaTZugrCz8u+PATC8wbJgCk0i0UGASkaApLIQWLcyA6UgwbBh8/rkJgiIS2RSYRCRoCguhf39ohqmRHDF4sAmAamUSiXwKTCISFAcOwBtvREZ3XKX4eEhNVWASiQYKTCLS7DweD0uX7mTPHk9EDPg+0rBhJghWVHjYuXMnHo/H6ZJEpBkoMIlIsykuLmZcRgbHHXcc6emJWMSRNvQEcnJy6nze888/z9lnn82xxx5Lhw4duO666/j666+DVHXDnHRSMT/syeDEE+NITEwkLi6OcRkZlJSUOF2aiASQ1pITkWaRm5vL1KlT+XmXTtwwZgTdkzqwqXw7cxYt45Mvt/KXv/yFO++8s9rziouLufDCC5k5cyajR4+mvLycyZMnc9ppp5Gfn+/XsZt7LblKle/xtE6dmZw+/NB7nLukgNLNW8jJyWHy5MnNdnwRCQi/1pJTYBKRgCsuLmbQoEFMG38ZM2+9iZiYw43ZPp+PzFl5ZC9YwqpVq0hNTa3y3Iceeojc3Fw2HXHr2eOPP86DDz7I1q1b/Tp+MAJTU96jiIQULb4rIs6YNXMmPbp2rhYkAGJiYpiVOZnTOyUxa9bMas/t378/27ZtY9myZdi2zc6dO1mwYAGjRo0KVvl+8ec99ujaucb3KCLhR4FJRALK4/GwaPFiJo0eXi1IVIqJieGm9FHk5y+qNki6f//+PP/881xxxRW0bNmSxMRE2rRpw+OPP17rMfft24fb7a6yNSd/3+Ok0cNrfI8iEn4UmEQkoNxuN16vl+5JHercr1tSIl6vt1q42bBhA7fccgt33303a9eupaCggM2bN9c5FmjGjBkkJCQc2jp16hSQ91Kbpr5HEQk/CkwiElDx8fG4XC42lW+vc7+y8h24XK5qY4xmzJhBamoqv/3tb+nVqxfDhg0jJyeHp556iu3ba37NO+64g4qKikObv2OdGqup71FEwo8Ck4gEVGxsLGPHjGHukgJ8Pl+N+/h8PuYsWkZ6+lhiY2Or/N3evXurdXO5XC4AartJpVWrVsTHx1fZmpO/73HukoIa36OIhB8FJhEJuMysLEo3byHr0dnVAkXlHWSfbtlGZmYWd9xxBxMmTDj096NHj2bhwoXk5uZSVlZGSUkJt9xyC+effz4dO3YM9luplT/vsXTzFjIzsxyqUEQCSdMKiEizyMvLY8qUKZx2cmcm/2I43ZISKSvfwez8pWzcWn5ojqJrr72WL774grfeeuvQcx9//HHy8vLYvHkzbdq0YciQITzwwAMkJSX5dexgzcNU+R57dO3MpNGH36PmYRIJK5qHSUSc9cgjJdx220xcrkV4vV5cLhfp6WPJzMxq1rmJghWYAEpKSpg1ayb5+eY9WrgYM2Ysv/lt875HEQkYBSYRcdZtt8H8+bBxo4fvv3cTHx8flPE8wQxMlTweD+vWuenfP55XX41l9OigHFZEmk4TV4qIswoLIS0Njj02lvbt20f04OfY2FguuKA9XbvGUlTkdDUiEmgKTCLSLLZtg48/hmHDnK4keCzLBEQFJpHIo8AkIs1ixQoTIC65xOlKgistDTZuhC++cLoSEQkkBSYRaRaFhdCnD5x4otOVBNeQIeByqZVJJNIoMIlIwHm9poUpmrrjKrVpA337KjCJRBoFJhEJuPffh2++ic7ABKZb7vXX4aefnK5ERAJFgUlEAq6wEOLiTEtLNEpLg+++g/fec7oSEQkUBSYRCbiiIrj4YjjmGKcrcUZKCiQkmOAoIpFBgUlEAsrthtWro7c7DqBFC3N3oMYxiUQOBSYRCag33jBjd9LSgn/s7OxskpOTSUlJCf7Bj5KWBu++a7rmRCT8aWkUEQmoKVPMHXKffeZcDU4sjXK0zZuhWzdYuBDS0x0pQUT8o6VRRCT4CgujuzuuUteucNppGsckEikUmEQkYD7/HMrKnOmOC0XDhpnA1PSGfBFxmgKTiARMUZEZ8Dx4sNOVhIa0NLNEyqZNTlciIk2lwCQiAVNYCP37mzmYBC66yARI3S0nEv4UmEQkIA4cMHfIafzSYXFxJkBqHJNI+FNgEpGAWL0a9uxRYDrasGEmSB444HQlItIUCkwiEhCFhdC2LZx7rtOVhJa0NBMk//1vpysRkaZQYBKRgCgqgqFDIUZXlSrOPRdOPFHjmETCnS5tItJku3fD2rXqjquJy2WWSdE4JpHwpsAkIk22YoWZa2joUKcrCU3DhsF778HXXztdiYg0lgKTiDRZURH07AkdOzpdSWgaOtQEytdfd7oSEWksBSYRaRLbNoFJ3XG1O/lkSE7WOCaRcKbAJCJN8tFH8NVXWg6lPmlpWiZFJJwpMIlIkxQVQWwsDBzodCWhbdgw2LYNPvnE6UpEpDEUmESkSQoL4cILoXVrpysJbYMGQcuW6pYTCVcKTCLSaB4PvP126HTHZWdnk5ycTEpKitOlVHPssaYVToFJJDwpMIlIo739NuzbFzoDvqdOncqGDRtYs2aN06XUKC0N3nrL/JuJSHhRYBKRRissNHeA9ejhdCXhYdgw2LsXSkqcrkREGkqBSUQarajItJpYltOVhIeePaF9e3XLiYQjBSYRaZRt2+Djj0OnOy4cxMSYSSwVmETCjwKTiDRKUZFpWbrkEqcrCS9pafDBB7Brl9OViEhDKDCJSKMUFUFKCpxwgtOVhJfK9fZWrHC2DhFpGAUmEWkwr9d84as7ruESE+Hss9UtJxJuFJhEpMHefx+++SZ05l8KN2lpJjBpmRSR8KHAJCINVlgI8fHQt6/TlYSntDTYscOswyci4UGBSUQarLAQLr4YjjnG6UrC04ABZv29wkKnKxERfykwiUiDuN2werW645qidWuz/p7GMYmEDwUmEWmQN94wg7414Ltp0tLM0jIej9OViIg/FJhEpEEKC+G006BrV6crCW9paWZNuVWrnK5ERPyhwCQiDVK5HIo0TXIyJCVpHJNIuFBgEhG/ff45lJWpOy4QLOvw9AIiEvoUmETEb4WF5s64iy5yupLIkJZmphb46iunKxGR+igwiYjfCgrMLfFxcU5XUrPs7GySk5NJSUlxuhS/XHKJaWnSMikioc+ymz7VrOaqFYkC+/aZdePuuQd+9zunq6mb2+0mISGBiooK4uPjnS6nTikpZhD9Cy84XYlI1LL82UktTCLil1WrYO9eGDHC6UoiS1qaaWHy+ZyuRETqosAkIn4pKICOHeGss5yuJLKkpcHu3bBundOViEhdFJhExC8FBTB8uBlzI4HTrx8cd5zulhMJdQpMIlKvrVvh449NYJLAatkSBg/WfEwioU6BSUTqVVAAMTHmri4JvLQ0KCmBPXucrkREaqPAJCL1KiiACy6A4493upLIlJYGBw7AypVOVyIitVFgEpE6HTgA//qX7o5rTqedBl26aByTSChTYBKROv373+B2a/xSc7Iss9yMxjGJhC4FJhGp0/Ll0LYtnHee05VEtrQ0+PRT+PJLpysRkZooMIlInQoKTOtHjK4WzWrIEPNvrGVSREKTLoEiUqsdO+CDD5reHZeTk0PXrl1p3bo1vXv3ZtWqVXXuv2/fPu666y66dOlCq1at6N69O0899VTTighxxx8P55+vcUwioaqF0wWISOgqKjo8vqax5s+fT2ZmJjk5OaSmpjJ79mxGjBjBhg0b6Ny5c43Pufzyy9m5cydPPvkkp556Krt27eKnn35qfBFhYtgweOwx8HrB5XK6GhE5khbfFZFa/fKX8PnnsGZN41+jb9++nHfeeeTm5h56rEePHowdO5YZM2ZU27+goIArr7ySsrIyTjjhhEYdM5wW3z3SO+9AaiqsXm2mcRCRoNDiuyLSeF6vaWFqSnfc/v37Wbt2LWlpaVUeT0tL45133qnxOa+++ip9+vThwQcfJCkpidNPP53f/OY3eDyeWo+zb98+3G53lS0cnX++6ZpbtszpSkTkaApMIlKj996Db75pWmDavXs3Xq+X9u3bV3m8ffv27Nixo8bnlJWVUVxczEcffUR+fj6zZs1iwYIFTJ06tdbjzJgxg4SEhENbp06dGl+0g1q0MP/eS5c6XYmIHE2BSURqVFAAbdpA375Nfy3rqBV7bduu9lgln8+HZVk8//zznH/++YwcOZJHHnmEZ555ptZWpjvuuIOKiopD29atW5tetENGjYL334ft252uRESOpMAkIjVavhyGDjWtHo3Vtm1bXC5XtdakXbt2VWt1qtShQweSkpJISEg49FiPHj2wbZtt27bV+JxWrVoRHx9fZQtXw4aZgfbqlhMJLQpMIlLN7t3wn/80fTqBli1b0rt3b1YcNbnQihUr6N+/f43PSU1N5auvvmLPESvRbty4kZiYGE4++eSmFRQG2rY1A77VLScSWhSYRKSa5cvBtmHkyKa/1vTp05k7dy5PPfUUpaWlZGVlsWXLFiZPngyY7rQJEyYc2v+qq67ixBNP5LrrrmPDhg28/fbb/Pa3v+XXv/41sbGxTS8oDIwaZSaw3L/f6UpEpJICk4hU89prkJICiYlNf60rrriCWbNmcf/993POOefw9ttvs2zZMrp06QLA9u3b2bJly6H9jzvuOFasWMF3331Hnz59uPrqqxk9ejSPPfZY04sJE6NGwZ49UM/8niISRJqHSUSqOHDAdAvddhvcfbfT1TROuM7DVMm2oVMnuPxyeOQRp6sRiXiah0lEGq64GNxuuPRSpyuJXpZlukM1jkkkdCgwiUgVr70GHTvCuec6XUl0GzUKNm40M62LiPMUmESkitdeM1/WtUyTJEFy8cXQsqVamURChQKTiByycaPZ1B3nvOOOg4suUmASCRUKTCJyyNKl0KqVad0Q540aBStXmjvmRMRZCkwicshrr8GQIfCznzldiYAJTPv3w7/+5XQlIqLAJCIAVFTA22+rOy6UdO8OZ5yhbjmRUKDAJCIAFBXBTz+ZVg0JHSNHmnXlmj5lnog0hQKTiACmO65nTzg4AbeEiNGj4auvYO1apysRiW4KTCKC12taMdQdF3oGDoTjj4fFi52uRCS6KTCJCP/5D+zeHf6BKTs7m+TkZFJSUpwuJWBatDDdpApMIs7SWnIiwp13wpw5sHMnuFxOV9N04b6W3NEWLIDx46GsDLp2dboakYijteRExD/5+WasTCSEpUg0bJiZ9VutTCLOUWASiXKffGK29HSnK5HaxMWZyUQVmESco8AkEuXy881ElUOHOl2J1GXMGFi1Cr75xulKRKKTApNIlMvPhxEjIDbW6UqkLqNHm7sZNYmliDMUmESi2LZtsGaNuuPCQceOcP756pYTcYoCk0gUW7QIjjlGs3uHizFjoKAAfvzR6UpEoo8Ck0gUW7jQLLabkOB0JeKP9HT44QdYscLpSkSijwKTSJT6+muz2K6648JHjx5mW7DA6UpEoo8Ck0iUWrIEfD7TzSPhY9w4ePVV2L/f6UpEoosCk0iU8Xg87Ny5kwULPPTrB4mJTlckDZGRAd99B8uXm8/R4/E4XZJIVFBgEokSxcXFjMvIIC4ujsTERJYtjWPP9xmUlJQ4XZo0gNtdTNxxGfwi3XyOcXFxjMvQ5yjS3BSYRKJAbm4ugwYNonTdWv4+bRKLH7yXh2+dxIE9axk4cCB5eXlOlyh+yM3N5cILB5F04loeusV8jn+fNonSdfocRZqbFt8ViXDFxcUMGjSIaeMvY+atNxETc/j3JJ/PR+asPLIXLGHVqlWkpqY6WGngRNriuxCdn6NIkPi1+K4Ck0iEG5eRQem6tax/NrfKl2wln89Hr2tuJvm8PrzySmTcfhWJgSkaP0eRIPErMKlLTiSCeTweFi1ezKTRw2v8kgWIiYlh0ujh5Ocv0gDiEKXPUcR5CkwiEcztduP1eume1KHO/bolJeL1enG73UGqrHlkZ2eTnJxMSkqK06UEVLR9jiKhSIFJJILFx8fjcrnYVL69zv3KynfgcrnCvvtq6tSpbNiwgTVr1jhdSkBF2+coEooUmEQiWGxsLGPHjGHukgJ8Pl+N+/h8PuYuKSA9fSyxsbFBrlD8oc9RxHkKTCIRLjMri9LNW8h6dHa1L9vKu6tKN28hMzPLoQrFH/ocRZylu+REokBeXh5TpkzhtJM7M/kXw+mWlEhZ+Q7mLimgdPMWcnJymDx5stNlBkwk3iUHhz/HHl07M2n04c9x9qICNm6JvM9RJEg0rYCIHPb735fw4IMziYlZhNfrxeVykZ4+lszMrIibtydSAxNASUkJs2bNJD/ffI4xMS5iYsZSWJjFkCGR9TmKBIkCk4gcNngwtGgBr77qwe12Ex8fH7FjXSI5MFXyeMznuGtXPL16xfLyyzB+vNNViYQlzcMkIsbWrfDWW/CrX5kBxO3bt4/YsBQtKj/Hnj1j6dMHXnzR6YpEIpsCk0gUePFFaN0a0tOdrkSaw1VXwdKl8N13TlciErkUmESiwHPPwZgxEKG9U1HviivgwAFYuNDpSkQilwKTSIRbvx7++1/THSeRqWNHuOgieOEFpysRiVwKTCIR7rnn4MQTYdgwpyuR5nT11fDGG7Btm9OViEQmBSaRCOb1mlaHK6+EY45xuhppTuPHm3Fqzz7rdCUikUmBSSSCrVwJ5eXqjosG8fGQkQFPPw1Nny1GRI6mwCQSwZ57Drp3h759na5EguG66+Czz2D1aqcrEYk8CkwiEer77+Hll2HCBLD8mpZNwt1FF0GXLvDMM05XIhJ5FJhEItTLL8PevXDttU5XEjzZ2dkkJyeTkpLidCmOiImBiRPhpZfMZy8igaOlUUQiVL9+0KYNLF/udCXBFw1Lo9Rm0yY49VTTHXv11U5XIxIWtDSKSLT6+GP497/h+uudrkSCrXt3GDTIDP4WkcBRYBKJQE8+CW3bwmWXOV2JOOG668ycTF9+6XQlIpFDgUkkwuzbZ+bimTABWrZ0uhpxwrhxcNxxMHeu05WIRA4FJpEI8+qrsHu3uuOi2XHHwTXXmJbGAwecrkYkMigwiUSYJ580A76Tk52uRJx0002wfTssWeJ0JSKRQYFJJIJ8+SUUFal1SaBXLxOc8/KcrkQkMigwiUSQ2bMhLg6uuMLpSiQUTJ4MK1bA5587XYlI+FNgEokQ+/aZQb4TJ5oxLCLjx8Pxx8OcOU5XIhL+FJhEIsSCBfC//8GUKU5XIqEiNtbM9P7UUyZQi0jjKTCJRIicHBgyBH7+c6crkVBy003w9dfwz386XYlIeFNgEokA69bBO++EbutSTk4OXbt2pXXr1vTu3ZtVq1b59bySkhJatGjBOeec07wFRrAzzoDBgyE31+lKRMKbApNIBMjJgY4dYcwYpyupbv78+WRmZnLXXXfxwQcfMHDgQEaMGMGWLVvqfF5FRQUTJkzg4osvDlKlkevmm6G42ARrEWkcLb4rEua++w6SkuD22+Huu52uprq+ffty3nnnkXtEE0ePHj0YO3YsM2bMqPV5V155Jaeddhoul4tFixaxrgHf9tG8+G5NfvoJunWDiy/WGnMiNdDiuyLR4B//MF+IN97odCXV7d+/n7Vr15KWllbl8bS0NN55551an/f000+zadMm7rnnnuYuMSq0aAHTpsELL8CuXU5XIxKeFJhEwtiBA/DYY3DVVZCY6HQ11e3evRuv10v79u2rPN6+fXt27NhR43M+++wzfv/73/P888/TokULv46zb98+3G53lU2qmjQJXC4zV5eINJwCk0gY++c/Yds2yMx0upK6WVbVFm/btqs9BuD1ernqqqu47777OP300/1+/RkzZpCQkHBo69SpU5NrjjQnnGAWZM7Jgf37na5GJPxoDJNImLJt6NvXzOz9+utOV1Oz/fv3c+yxx/LKK6+Qnp5+6PFbb72VdevWsXLlyir7f/fddxx//PG4XK5Dj/l8PmzbxuVyUVRUxJAhQ6odZ9++few7YqIht9tNp06dNIbpKBs2wJlnwrPPwq9+5XQ1IiHDrzFM/rV3i0jIeecdWLMmtBdXbdmyJb1792bFihVVAtOKFSsYU8MtffHx8fz3v/+t8lhOTg5vvPEGCxYsoGvXrjUep1WrVrRq1SqwxUeg5GQYNgweegiuvhpqaOQTkVooMImEqZkz4fTTYeRIpyup2/Tp07nmmmvo06cP/fr1Y86cOWzZsoXJkycDcMcdd1BeXs68efOIiYnhrLPOqvL8k046idatW1d7XBrnd78zd8sVFZnwJCL+UWASCUMbN8LChWY8SkyIj0S84oor+Prrr7n//vvZvn07Z511FsuWLaNLly4AbN++vd45mSRwBg+GPn3gwQcVmEQaQmOYRMLQ9dfDsmWweTO0bu10NaFH8zDVbcECszDvmjUmPIlEOc3DJBKJtmyBefPgttsUlqRx0tPh1FPhgQecrkQkfCgwiYSZhx82d8bddJPTlUi4crngN78x01J89pnT1YiEBwUmkTCya5eZ2fuWW0xoEmmsiRPhpJPMHXMiUj8FJpEw8uijZpD3Lbc4XYmEu9at4dZb4Zln4KuvnK5GJPQpMImEiYoKeOIJs/L8CSc4XY1EgilT4NhjzR1zIlI3BSaRMJGTAz/+CNOnO12JRIqEBMjKMuvLbd/udDUioU2BSSQM7N1rJqr89a+hQwenq5FIcuutpntOd8yJ1E2BSSQMPPEEfPedmaVZJJASEkyrZV6exjKJ1EWBSSTEVVTA3/4GkyZBLUupiTTJLbdAbKxamUTqosAkEuIeeQQ8HvjDH5yuRCJVZSvT7NlqZRKpjQKTSAjbvdsEpmnToGNHp6sJfdnZ2SQnJ5OSkuJ0KWHnllvMHXMzZjhdiUho0lpyIiHsN7+BOXOgrAzatnW6mvChteQaZ8YMuOceKC2F7t2drkYkaLSWnEg4Ky+H7GzTVaKwJMFw661m9u+77nK6EpHQo8AkEqL+/GfTRaJ5lyRYjj0W7rsP5s+HNWucrkYktCgwiYSgsjKYOxd+/3tQj5IE08SJcOaZZgqLpo/YEIkcCkwiIej2203XyNSpTlci0aZFCzONxVtvwfLlTlcjEjo06FskxKxaBYMGwbx5cM01TlcTnjTou2lsGy66CL75BtatA5fL6YpEmpVfg74VmERCiM8H558PlgXvvgsxagNuFAWmpvvPf6BvX3j6abj2WqerEWlWuktOJBx4PB527tyJx+Ph2Wdh7VqzbpzCkjjp/PNh/HgzYereveaxI89VkWijS7KIQ4qLixmXkUFcXByJiYnExcVx880ZDBlSwoABTlcnYuZl+t//YOrU6ufquIwMSkpKnC5RJGjUJSfigNzcXKZOnUqPrp2ZNHo43ZM6sKl8O3kLC/hs2xZycnKYPHmy02WGLXXJBc7w4bkUFppz9YbLDp+rc5cUULpZ56pEBI1hEglFxcXFDBo0iGnjL2PmrTcRc0Tfm8/nI3NWHtkLlrBq1SpSU1MdrDR8KTAFhs5ViRIKTCKhaFxGBqXr1rL+2dwqX0CVfD4fva65meTz+vDKKwscqDD8KTAFhs5ViRIa9C0SajweD4sWL2bS6OE1fgEBxMTEMGn0cPLzF2lwrThG56pIVQpMIkHkdrvxer10T+pQ537dkhLxer243e4gVSZSlc5VkaoUmESCKD4+HpfLxaby7XXuV1a+A5fLpe4kcYzOVZGqFJhEgig2NpaxY8Ywd0kBPp+vxn18Ph9zlxSQnj6W2NjYIFcoYuhcFalKgUkkyDKzsijdvIWsR2dX+yKqvPOodPMWMjOzHKowfGVnZ5OcnExKSorTpUQEnasih+kuOREHTJiQx7PPTjk0t023pETKyndobpsA0V1ygZOXl8eUKVMOzRlWea7m5Rfw2VadqxIRNK2ASCjauROSkyElpYS4uJnk5y/C6/XicrlITx9LZmaW5rRpIgWmwCopKWHWrKrnakzMWNLSsnjtNZ2rEvYUmERCjW3D2LGwejV8/DG0a2du33a73cTHx2scSIAoMDWPI8/VZ5+N5aab4PXXYcgQpysTaRIFJpFQM28eTJwI+fkmOEnzUGBqfj6fCUpffgnr10NcnNMViTSaJq4UCSVbt8Itt8A11ygsSfiLiYGnnjKL8/7mN05XI9L8FJhEgsC2YdIkOO44ePRRp6sRCYxu3eChh2DOHCgsdLoakealwCQSBHPmQFERPPkkHH+809WIBM5NN8HQoXD99fDNN05XI9J8FJhEmllZGdx2m/liGTbM6WpEAsuyzC8Ce/eaVtSmD4sVCU0KTCLN6Kef4Npr4aST4O9/d7oakebRqZMJTfn5MHu209WINA8FJpFm9Kc/QUkJ/N//6S4iiWzp6XDzzZCVBR995HQ1IoGnaQVEmskbb8All8D998Mf/uB0NdFF0wo4w+OBvn3B64U1a+DYY52uSMQvmlZAxCm7dsHVV8PgwXDHHU5XIxIcsbHw0kuweTNMn+50NSKBpcAkEmA+H0yYYP587jlwuZyuSCR4kpNh1iwzlumf/3S6GpHAUWASCbAHHjBz0jz7LHTo4HQ1IsF3ww0wbpyZaqCszOlqRAJDgUkkgAoK4K67zJiltDSnqxFxhmXBP/4BbduaWe1/+MHpikSaToFJJEA+/xx++UsYMQLuvdfpakSc1aYNLFpkWph+/WvNzyThT4FJJAD27DG/SbdrB88/r3FLTsnOziY5OZmUlBSnSxHgrLPMlBovv6x5yCT8aVoBkSaybRg/3oxbevddM+hVnKVpBULLXXfB3/4Gy5erq1pCkqYVEAmGGTPM3UDz5iksidTk/vvNskBXXgmbNjldjUjjKDCJNMH8+ea35z/+0cx0LCLVuVzwwgtmEPill8K33zpdkUjDKTCJNNLbb5v5lq6+WoO8RerTpg0sXQr/+58Z77dvn9MViTSMApNII5SWwpgxkJoKTz0FMfpJEqnXaafBq6+asX7XXmsmdxUJF7rMizTQ9u1m6oCTT4aFC6FlS6crEgkf/fubO0kru7NFwoUCk0gDfP89jBoFP/0Ey5aZbgYRaZiMDHjoIXPnXF6e09WI+KeF0wWIhIv9++Hyy80ElcXF0KmT0xWJhK+sLNiyBaZMgYQEM+mrSChTYBLxw08/mcHdb7xhWpZ69XK6IpHwZlnwyCPmjrkJEyAuztxBJxKq1CUnchSPx8POnTvxeDyAGZj6619Dfj688gpcfLHDBYpEiJgYePJJGD3aTP761ltV//7on0URJykwiRxUXFzMuIwM4uLiSExMJC4ujnEZGfziFyU89xw89xxcdpnTVYpElhYt4MUXYeBA08K0alXtP4slJSVOlytRTIFJBMjNzWXQoEGUrlvL36dNYvGD9/L3aZP4aO1aFi8eyNVX53HllU5XGb5ycnLo2rUrrVu3pnfv3qxatarWfRcuXMjQoUNp164d8fHx9OvXj8LCwiBWK8HWqpVpwe3bFy6+uOafxdJ1axk4cCB5GiUuDtFachL1iouLGTRoENPGX8bMW28i5ohJlXw+H5mz8shesIRVq1aRmprqYKXhaf78+VxzzTXk5OSQmprK7NmzmTt3Lhs2bKBz587V9s/MzKRjx44MHjyYNm3a8PTTT/PQQw/x7rvvcu655/p1TK0lF57+9a9i0oYOYtrl+lmUoPJrLTkFJol64zIyKF23lvXP5la5QFfy+Xz0uuZmks/rwyuvLHCgwvDWt29fzjvvPHJzcw891qNHD8aOHcuMGTP8eo0zzzyTK664grvvvtuv/RWYwtO4jAxKP1jL+uf0syhBpcV3Rerj8XhYtHgxk0YPr/ECDRATE8Ok0cPJz1+kwacNtH//ftauXUvaUUvUp6Wl8c477/j1Gj6fj++//54TTjih1n327duH2+2uskl4OfSzeJl+FiU0KTBJVHO73Xi9Xrondahzv25JiXi9Xn0RN9Du3bvxer20b9++yuPt27dnx44dfr3Gww8/zA8//MDll19e6z4zZswgISHh0NZJk2SFHf0sSqhTYJKoFh8fj8vlYlP59jr3KyvfgcvlUvdOI1lW1RZv27arPVaTF198kXvvvZf58+dz0kkn1brfHXfcQUVFxaFt69atTa5Zgks/ixLqFJgkqsXGxjL0kjHk5Rfgq2UlUJ/Px9wlBaSnjyU2NjbIFYa3tm3b4nK5qrUm7dq1q1qr09Hmz5/P9ddfz8svv8wll1xS576tWrUiPj6+yibhJTY2lrFjxjB3iX4WJTQpMElU++ADePc/WWzcsoWsR2dXu1BX3plTunkLmZlZDlUZvlq2bEnv3r1ZsWJFlcdXrFhB//79a33eiy++yLXXXssLL7zAqFGjmrtMCRGZWVmUbq7nZ7FsC5Mn62dRgk9Lo0jUys+HX/0KkpMHcPnlOdx++xRef28dk0YPp1tSImXlO5i7pIDSzVsO3RIvDTd9+nSuueYa+vTpQ79+/ZgzZw5btmxh8uTJgOlOKy8vZ968eYAJSxMmTODRRx/lggsuONQ6FRsbS0JCgmPvQ5rfgAEDyMnJYcqU2n8WWxyTwx/+kEqvXtCundMVS1Sxbbupm0hY8fls+y9/sW2w7fHjbfuHH8zjxcXF9rhxGbbL5bIB2+Vy2ePGZdjFxcXOFhwBsrOz7S5dutgtW7a0zzvvPHvlypWH/m7ixIn2hRdeeOj/L7zwQhszXUmVbeLEiX4fr6KiwgbsioqKAL4LCZa6fhbXrLHtk06y7VNOse1165yuVCKEX3lH8zBJVPF44MYbzTIn99wDd99t1rOquo8Ht9tNfHy8xkmEKc3DFBlq+1ncsgXGjoVPP4VnnjHr0Ik0gSauFDlSWRlkZMAnn8DTT6OlTiKYAlPk27sXrr8eXnoJ7rwT7r8fXC6nq5IwpYkrRSotXw59+oDbDf/+t8KSSLg79lh44QV44AGYMQNGjICdO52uSiKZApNEtJ9+gj/8AUaNgtRUeO89OPtsp6sSkUCwLPjd76CoCNavNz/b//qX01VJpFJgkoj1xRcwaBD87W/w5z/D4sVw/PFOVyUigXbJJbBuHfTsCWlp8Mc/ml+WRAJJgUki0oIFcM458NVXsGqVGeNQy/JUIhIBEhOhsND8cjRjBgwZAtu2OV2VRBJ9hUhE+fZbmDjR3DWTlmZ+6+zXz+mqRCQYYmLML0crV5oW5rPPhuefh6bf2ySiwCQRZPlyOOss0/X29NMwfz60aeN0VSISbKmpZhb/4cPN5LSXXQbl5U5XJeFOgUnCntsNkybByJFmDMNHH8G115oBoSISnU480bQuLV4Ma9dCcjLMnavWJmk8BSYJaR6Ph507d+LxeGr8+8WLTavS/PkwZ45pZTr55CAXKSIh67LLYMMGGDcObrjBdNV/8UXt+9d3zZHopcAkIam4uJhxGRnExcWRmJhIXFwc4zIyKCkpAeDLL2HMGDPb71lnwX//ay6GalUSkaO1aQNPPmkGhW/caK4ZTzwBXu/hfeq75ohopm8JObm5uUydOpUeXTszafRwuid1YFP59kOLb44dm0Nh4WSOPx4efRR+8QsFJTGys7PJzs7G6/WyceNGzfQt1bjd8PvfQ26umcz2iSfg/ffrvubk5OQcWixaIpKWRpHwU1xczKBBg5g2/jJm3noTMUfMBeDz+ciclccTryzh8stXMXduKnFxDhYrIUtLo0h9Skpg2jRYt64Yy6r7mpO9YAmrVq0iNTXVwYqlGSkwSfgZl5FB6bq1rH82t8qFq5LP56Pnr27mzN59eOWVBQ5UKOFAgUn84fVCSkoGP3y9lg0v1n7N6XXNzSSfp2tOBNNachJePB4PixYvZtLo4TVeuABiYmK44bLh5Ocv0qBMEWmS/fs9rF+/mMnpdV9zJo3WNUcUmCSEuN1uvF4v3ZM61Llft6REvF4vbrc7SJWJSCTSNUcaQoFJQsYxx8QTE+NiU/n2OvcrK9+By+VSV4uINEl8fDwul6454h8FJnHcvn2QnQ1nnRULjGH2ogJ8Pl+N+/p8PuYuKSA9fSyxsbHBLVREIkpsbCxjx4xh7pK6rzl5Cws4qd1YPvxQ15xopsAkjtmzB2bNgtNOg1tugaFD4YUXsti4ZQtZj86udgGrvGOldPMWMjOznClaRCJKZlYWpZvrvuZ8tm0LrVpn0a+fuU6tXOlQseKoFk4XINFn1y54/HHTqvT993DVVWZelB49AAbw7bc5TJkyhdffW8ek0cPplpRIWfmOKnOi6PZeEQmEAQMGkJNT/zXnxhtTWbgQ/vxnuOgiGDgQ/vAHE6A0D1x00LQCEjRlZfDQQ2ZhXJfLzMydlQWdO1fft6SkhFmzZpKfvwiv14vL5SI9fSyZmVkKS1IvTSsgDeXvNce24bXX4E9/gjVroFcvmD4drrwSWrVy8A1IU2geJnGebZsJ4h5/HBYsgBNOMN1vU6ea/66Px+PB7XYTHx+vMUviNwUmaSx/rzm2DW+9BQ8/DEuXQocOZiLMG26Adu2CV68EhAKTBJ6/F5M9e+CFF0y32/r1cOqpkJkJ110Hxx4bvHolOikwSTCVlsLMmTBvnglS48bB5MkwYED93XX6pTAkaOJKCRx/F6b89FO49VZISoKbb4ZTToGCAvP41KkKSyISeXr0gDlzYNs2+OtfTVfdoEFw5pnw2GPw7bfVn6PFfsOPWpikXvUthjtzZg4JCZN56ilYtco0R0+aBDfdBF26OF29RCO1MImTfD7TXZeXB/n5cMwxcMUVptXp/PMhL0+L/YYYdclJ0/m7GC6sYujQVK67Dn7xCw1+FGcpMEmo2LEDnnrKtEB9+SWcckoxX36pxX5DjAKTNJ0/i+GeddXNdEvuw9JlWphSQoMCk4QarxdWrIAbb8wglrVseEmL/YYQjWGSpvF3Mdwbxw6nsEgLU4qI1Mblggsv9PDVV4uZ/Ast9huOFJikRqWl8Kc/aWFKCS/Z2dkkJyeTkpLidCki1TR0sd+vvtI1NZQoMAlgboVdswbuvBN+/nNIToZHH40nxtLClBI+pk6dyoYNG1izZo3TpYhU05DFfi1cJCfHc+mlMHs2lJcHqUiplQJTGPN4POzcubPRzbbffWcmk7z+ejj5ZHP3xpw50L8/LFkCX38dS3p6/QtTajFcEZH6+bvY79wlBYwYMZa//jWWPXvMlCwnnwy9e8N998H775tfchujqd8b0UyBKQw1dv4O24YPPjDzhAwaBG3bwvjxsHq1mdb/jTcO39Fx6aXQurV/C1NqMVwREf/4e029864sbrvNTE+waxc895xZqPyRR0xw6tTJ/LL78svw9df1H1fzPjWd7pILM/XNiXT0/B07d8Kbb0JhoZlAcscOOO44uPhiGDEChg+vf66kvLw8pkyZcuiYNS1MqTlDJJToLjkJZU25pu7fb+a7W7rUXNc3bDCziaekwLBhcMkl0Ldv1aldGvq9EYU0rUCk8WdOpOwFS/jTn1axfXsqb75pfpjAzDg7YoTZBgyAli0bdmwthivhRIFJQl2grqlbt5rpCgoLzZ/ffmt6B/r3h4sughNPLGbaNM37VA8Fpkjjz5xIyVfezMatfTj11AUMHgyDB5sfmg5135ThN617JOFAgUnCRSCvqV4vfPih6cZ76y14+21wV2RwWifN+1QPBaZga84w4fF4iIuL4+/TJpF5ZXqt+816KZ/fPjGX77//XoFGopYCkwjs2eOhTRvnvzfC4BdtTVwZLM0xmM62YdMmmD8ffvtbuPhizYkkIiL+++GHhn1vjBvn5uGH4Z13YO/eph8/0gaat3C6gHB35GC6v0+bVGUw3cCBA/0aTGfbZpXrNWvgvfcOb5UrXHfpAuecE09MjOZEEhER/zRk3qeYGBdudzx//CN4PBATY+bj690bzjvP/HnOOfCzn/l37EB8N4Yadck1gb+DsI8cTLdvn5lFe/36w9uHH5rbRgE6doQ+fapu7dqZv/NnDJP6okXUJSdSqaHfGwcOwH//C2vXHt7Wrzd358XEmImNe/eGc8+FXr3MVvkdVakx340Oi+4xTMHoM/XnROx59c20iOvDWWctYP16+OQTMzAPoFu3wydc794mHHXsWPvxwvAkFHGEApOIEYjvjQMH4OOPq4eoH380f9++vfke69nTbM89m8H2zWtZ/5wzv9w34vs/OgNTcXExs2bOZNHixYdu1Rw7ZgxZ06cHNEQ0ZBD2bY/NpV+/7zn33NhDAenMMyEuruHH1ZxIIvVTYBI5rDm+N7xeM852/XrTIlXZY1JW5sEijodvDf5A8yZ8//sVmCJqDFNz9plWVMCnn5oWok8+gQ8+8H8wnW17WbjQTfv2TT8pJk+eTM+ePZk1aya/fWJulfk75sx7Xi1LIiJSRXN8b7hccPrpZhs37vDjmza5OfVU/wea33efm969YznjDNPrctxxDS4FCM6YqaAFpubuIisuLmbq1Kk1NjvecvkYMmeZhN2zZ88aTw6fD776CsrKTGretKnqfx859XynTnD66c4Nwk5NTSU1NTUcbtUUEZEQEKzvjY4dG7DAsOXiH/+I54EHDj9+0kkmOHXvbv6s3Lp3N/MJ1tDD1+Tvf381e5dcsLrI/BrY9qub6dCtD//v/y3gyy+rBqPNmw/3xwIkJR3+wLp3N9sZZ5g0XZmANQhbJDSpS07EOQ39bty9GzZuNN/FR26bNpmGjEqtWkHXrtUD1ROPZ1C+qUljppwfwxSs9WsaNJ7o0bnYfE+rVrF07Xo4DB0ZjE45BfwJ3hqELRJasrOzyc7Oxuv1snHjRgUmEQcE8rvR44Evvqgaoo4MVR5PQMZMOTuGKVBNZHv3wvbtZvvqq8P/feS2bVsDxhPh5b//dZOcHFtj015DDBgwgJycHKZMmcLr762rdTCdwpJIcEydOpWpU6ceamESkeAL5HdjbCz06GG2o9k2fPSRm169Gjapc2O7IpstMM2aOZMeXTtXC0sAMTExzMqczOvvfcidd87kxhtTawxC27fD0RNWt2pl+jErt9NPh3bt4rn/fv/HE3XvHt/ksFRJg7BFRESqCsZ3o2XBqaf6P2aqqeOJm6VLrjFdZHFxsVWCUG1bmzbmH+looTCeSIOwRUKDxjCJhI7m/m4MwPe/c11ybnfDusg2bXLTrVvT/hEzs7IYNGgQWY/OrrXPtHTzFubMe75Jx6lLbGysgpKIiMgRmvu7MVjf/80SmBqyfo3L5aJDh6b/BqjxRCIiItEnWN//zXaXnFNdZCUlJcyaNZP8/EVV+kwzM7MUlkSihLrkRKJPE77/nZ1WwOlb7jWeSCR6KTCJRK+wXEtO656JiBMUmESkAZwPTKAuMhEJPgUmEWmAoAUmv1iWFQvEA27btj1BOaiIRCXLsuKBCiDBtm13ffuLiNQnaIFJRCRYLMuygDjge1sXOREJAAUmERERkXoEaIEQERERkcilwCQiIiJSDwUmERERkXooMImIiIjUQ4FJREREpB4KTCIiIiL1UGASERERqYcCk4iIiEg9FJhERERE6qHAJCIiIlKPFk158hHrNYmIiIiEq3rXnWxSYMKEpYomvoaIiIiIkxIAd107NGnx3Qa2MMUB24CTge8bfdCG+Q9wfpCO5dQxI/09OnHeQOR/jjpvmoc+x/A/XjR8V+m8qa55W5gOvnidiaySyVaHivLrOU1lWZYvWMdy6piR/h6dOG8OHjeiP0edN812XH2O4X+8yv+M2O8qnTeNE+mDvrOj4JjR8B6dEOmfo86b5qHPMfyP54Ro+DcN+/fYpC65Bh3IsuIx450Sgp1sJXzpvJHG0HkjjaVzR2oTzBamfcB9B/8U8ZfOG2kMnTfSWDp3pEZBa2ESERERCVeRPoZJREREpMkUmERERETqocAkIiIiUg8FJhEREZF6NGtgsizrLsuy3rEsa69lWd/5+RzLsqx7Lcv6yrIsj2VZb1mWdWZz1imhxbKs4y3LetayrIqD27OWZbWp5znPWJZlH7X9O0gliwMsy5piWdZmy7J+tCxrrWVZA+vZ/8KD+/1oWVaZZVmTg1WrhI6GnDeWZV1Uw3XFtizr58GsWUJDc7cwtQReAXIb8JzfAdOBaUAKsANYYVmWFvmNHi8A5wDDD27nAM/68bwCoMMR28jmKU+cZlnWFcAs4C/AucAqYLllWZ1r2b8rsOzgfucCfwUesywrIygFS0ho6HlzhDOoem35rBnLlBAVlGkFLMu6Fphl23abevazgK8O7vvAwcdaATuB223bnt3MpYrDLMvqAWwALrBt+92Dj10ArAZ+btv2p7U87xmgjW3bY4NUqjjIsqx3gfdt2775iMdKgUW2bd9Rw/4PAJfZtt3jiMfygLNt2+4XjJrFeY04by4C3gSOt237uyCVKSEq1MYwdQUSgaLKB2zb3gesBPo7VZQEVT+gojIsAdi2/W/MzLv1nQMXWZa1y7KsjZZl/cOyrJOas1BxhmVZLYHeHHGdOKiI2s+RfjXsXwj0sSzrmMBWKKGokedNpQ8sy9puWdbrlmUNbpYCJeSFWmBKPPjnzqMe33nE30lkSwR21fD4Luo+B5YDVwNDgNsw3blvHGyhlMjSFnDRsOtEYi37tzj4ehL5GnPebAduBDKAXwCfAq9bljWouYqU0NWioU+wLOte4J56dkuxbfu9RlVkHN1PaNXwmIQRf8+bg3/W9FnXeQ7Ytj3/iP/9yLKs94AvgVHAQv8rlTDS0OtETfvX9LhENr/Pm4NDAI4cBrDasqxOwG+At5unPAlVDQ5MwBPAS/Xs80UjXhfMAG8waX/7EY+fRPXfCiS8+Hve9ALa1/B37WjAOWDb9nbLsr4ETvP3ORI2dgNeqrcK1HWd2FHL/j8BXwe0OglVjTlvavJv4FeBKkrCR4MDk23buzEnXnPYjLmwDQU+gEP9zhcCtzfTMSUI/D1vLMtaDSRYlnW+bdv/OfhYXyABeMff41mWdSLQiarBWyKAbdv7Lctai7lO5B/xV0OBxbU8bTUw+qjH0oD3bNs+EPgqJdQ08rypybnouhKVmnseps6WZZ0DdAZclmWdc3A77oh9PrEsKx3ANrfszQLutCwr3bKss4BngL2YW80lwtm2XYqZHuAflmVdcPAOuX8Arx15h9yR541lWcdZlvWQZVn9LMs65eCdLUswAS2/2kEkEjwCTLIs69eWZfWwLGsm5jqTB2BZ1gzLsuYdsX8e0MWyrEcO7v9r4HrgoaBXLk5q0HljWVamZVljLcs6zbKsMy3LmoEZz/SEI9WLoxrTJdcQ9wMTj/j/Dw7+ORh46+B/n4FpPaj0IBAL5ADHA+8CabZtf9+slUoouRp4jMN3s7yKmZfrSEeeN16gJzABaIP57e9N4AqdN5HJtu35B1sR78bMi/MRMNK27S8P7tIB80VYuf9my7JGAjOBqZjpS26xbfufwa1cnNTQ8wYzl+BDQBLgAT4GRtm2vSx4VUuoCMo8TCIiIiLhLNSmFRAREREJOQpMIiIiIvVQYBIRERGphwKTiIiISD0UmERERETqocAkIiIiUg8FJhEREZF6KDCJiIiI1EOBSURERKQeCkwiIiIi9VBgEhEREamHApOIiIhIPf4/cULtEGRU7vAAAAAASUVORK5CYII=\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show(plot(spline(points), -1, 1) + scatter_plot(points))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture6/notebook/8-SageCalculus.log b/src/Lecture6/notebook/8-SageCalculus.log @@ -0,0 +1,1106 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**8-SageCalculus.tex +(./8-SageCalculus.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty +Package: tcolorbox 2020/10/09 version 4.42 text color boxes + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks15 +\pgfutil@tempdima=\dimen139 +\pgfutil@tempdimb=\dimen140 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box47 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +Package: pgf 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen141 +\Gin@req@width=\dimen142 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen143 +\pgf@y=\dimen144 +\pgf@xa=\dimen145 +\pgf@ya=\dimen146 +\pgf@xb=\dimen147 +\pgf@yb=\dimen148 +\pgf@xc=\dimen149 +\pgf@yc=\dimen150 +\pgf@xd=\dimen151 +\pgf@yd=\dimen152 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count185 +\c@pgf@countb=\count186 +\c@pgf@countc=\count187 +\c@pgf@countd=\count188 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count189 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count190 +\pgfsyssoftpath@bigbuffer@items=\count191 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen153 +\pgfmath@count=\count192 +\pgfmath@box=\box48 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count193 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen154 +\pgf@picmaxx=\dimen155 +\pgf@picminy=\dimen156 +\pgf@picmaxy=\dimen157 +\pgf@pathminx=\dimen158 +\pgf@pathmaxx=\dimen159 +\pgf@pathminy=\dimen160 +\pgf@pathmaxy=\dimen161 +\pgf@xx=\dimen162 +\pgf@xy=\dimen163 +\pgf@yx=\dimen164 +\pgf@yy=\dimen165 +\pgf@zx=\dimen166 +\pgf@zy=\dimen167 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen168 +\pgf@path@lasty=\dimen169 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen170 +\pgf@shorten@start@additional=\dimen171 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box49 +\pgf@hbox=\box50 +\pgf@layerbox@main=\box51 +\pgf@picture@serial@count=\count194 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen172 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen173 +\pgf@pt@y=\dimen174 +\pgf@pt@temp=\dimen175 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen176 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen177 +\pgf@sys@shading@range@num=\count195 +\pgf@shadingcount=\count196 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box52 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfnodeparttextbox=\box53 +) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a) +\pgf@nodesepstart=\dimen178 +\pgf@nodesepend=\dimen179 +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements +\every@verbatim=\toks26 +\verbatim@line=\toks27 +\verbatim@in@stream=\read3 +) +(/usr/share/texmf-dist/tex/latex/environ/environ.sty +Package: environ 2014/05/04 v0.3 A new way to define environments + +(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\@envbody=\toks28 +) +(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count197 +) +\tcb@titlebox=\box54 +\tcb@upperbox=\box55 +\tcb@lowerbox=\box56 +\tcb@phantombox=\box57 +\c@tcbbreakpart=\count198 +\c@tcblayer=\count199 +\c@tcolorbox@number=\count266 +\tcb@temp=\box58 +\tcb@temp=\box59 +\tcb@temp=\box60 +\tcb@temp=\box61 +\tcb@out=\write4 +\tcb@record@out=\write5 + +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex +Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42' +(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty +Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO) + +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23. +\tcb@testbox=\box62 +\tcb@totalupperbox=\box63 +\tcb@totallowerbox=\box64 +)) +(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty +Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments + +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) + +(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +))) +(/usr/share/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2020/08/10 v2.0s Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2020/10/26 v3.5g Customizing captions (AR) + +(/usr/share/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2020/10/21 v2.2e caption3 kernel (AR) +\captionmargin=\dimen180 +\captionmargin@=\dimen181 +\captionwidth=\dimen182 +\caption@tempdima=\dimen183 +\caption@indent=\dimen184 +\caption@parindent=\dimen185 +\caption@hangindent=\dimen186 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count267 +\c@continuedfloat=\count268 +) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2020/11/20 v2.8 package option processing (HA) + +(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks29 +\XKV@tempa@toks=\toks30 +) +\XKV@depth=\count269 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material + +(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box65 +) +\tc@llx=\dimen187 +\tc@lly=\dimen188 +\tc@urx=\dimen189 +\tc@ury=\dimen190 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex +)) +\adjbox@Width=\dimen191 +\adjbox@Height=\dimen192 +\adjbox@Depth=\dimen193 +\adjbox@Totalheight=\dimen194 +\adjbox@pwidth=\dimen195 +\adjbox@pheight=\dimen196 +\adjbox@pdepth=\dimen197 +\adjbox@ptotalheight=\dimen198 + +(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection +\c@checkoddpage=\count270 +) +(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box66 +\sift@deathcycles=\count271 +\@vwid@loff=\dimen199 +\@vwid@roff=\dimen256 +)) +(/usr/share/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count272 +\float@exts=\toks31 +\float@box=\box67 +\@float@everytoks=\toks32 +\@floatcapt=\box68 +) +(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks33 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count273 +\Gm@cntv=\count274 +\c@Gm@tempcnt=\count275 +\Gm@bindingoffset=\dimen257 +\Gm@wd@mp=\dimen258 +\Gm@odd@mp=\dimen259 +\Gm@even@mp=\dimen260 +\Gm@layoutwidth=\dimen261 +\Gm@layoutheight=\dimen262 +\Gm@layouthoffset=\dimen263 +\Gm@layoutvoffset=\dimen264 +\Gm@dimlist=\toks34 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks35 +\ex@=\dimen265 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen266 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count276 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count277 +\leftroot@=\count278 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count279 +\DOTSCASE@=\count280 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box69 +\strutbox@=\box70 +\big@size=\dimen267 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count281 +\c@MaxMatrixCols=\count282 +\dotsspace@=\muskip16 +\c@parentequation=\count283 +\dspbrk@lvl=\count284 +\tag@help=\toks36 +\row@=\count285 +\column@=\count286 +\maxfields@=\count287 +\andhelp@=\toks37 +\eqnshift@=\dimen268 +\alignsep@=\dimen269 +\tagshift@=\dimen270 +\tagwidth@=\dimen271 +\totwidth@=\dimen272 +\lineht@=\dimen273 +\@envbody=\toks38 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks39 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box71 +) +(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count288 +\uc@combtoks=\toks40 +\uc@combtoksb=\toks41 +\uc@temptokena=\toks42 +) +(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv) +\FV@CodeLineNo=\count289 +\FV@InFile=\read4 +\FV@TabBox=\box72 +\c@FancyVerbLine=\count290 +\FV@StepNumber=\count291 +\FV@OutFile=\write6 +) +(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty +Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac +y) +Package grffile Info: This package is an empty stub for compatibility on input +line 40. +) +(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX + +(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen274 +\Hy@linkcounter=\count292 +\Hy@pagecounter=\count293 + +(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count294 +Package hyperref Info: Hyper figures OFF on input line 4464. +Package hyperref Info: Link nesting OFF on input line 4469. +Package hyperref Info: Hyper index ON on input line 4472. +Package hyperref Info: Plain pages OFF on input line 4479. +Package hyperref Info: Backreferencing OFF on input line 4484. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4717. +\c@Hy@tempcnt=\count295 + +(/usr/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5076. +\XeTeXLinkMargin=\dimen275 + +(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count296 +\Field@Width=\dimen276 +\Fld@charsize=\dimen277 +Package hyperref Info: Hyper figures OFF on input line 6347. +Package hyperref Info: Link nesting OFF on input line 6352. +Package hyperref Info: Hyper index ON on input line 6355. +Package hyperref Info: backreferencing OFF on input line 6362. +Package hyperref Info: Link coloring OFF on input line 6367. +Package hyperref Info: Link coloring with OCG OFF on input line 6372. +Package hyperref Info: PDF/A mode OFF on input line 6377. +LaTeX Info: Redefining \ref on input line 6417. +LaTeX Info: Redefining \pageref on input line 6421. + +(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa +ge +with kernel methods +) +\Hy@abspage=\count297 +\c@Item=\count298 +\c@Hfootnote=\count299 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX + +(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag +e +with kernel methods +) +\Fld@listcount=\count300 +\c@bookmark@seq@number=\count301 + +(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +) +\Hy@SectionHShift=\skip52 +) +(/usr/share/texmf-dist/tex/latex/titling/titling.sty +Package: titling 2009/09/04 v2.1d maketitle typesetting +\thanksmarkwidth=\skip53 +\thanksmargin=\skip54 +\droptitle=\skip55 +) +(/usr/share/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC) +\LTleft=\skip56 +\LTright=\skip57 +\LTpre=\skip58 +\LTpost=\skip59 +\LTchunksize=\count302 +\LTcapwidth=\dimen278 +\LT@head=\box73 +\LT@firsthead=\box74 +\LT@foot=\box75 +\LT@lastfoot=\box76 +\LT@cols=\count303 +\LT@rows=\count304 +\c@LT@tables=\count305 +\c@LT@chunks=\count306 +\LT@p@ftn=\toks43 +) +(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen279 +\lightrulewidth=\dimen280 +\cmidrulewidth=\dimen281 +\belowrulesep=\dimen282 +\belowbottomsep=\dimen283 +\aboverulesep=\dimen284 +\abovetopsep=\dimen285 +\cmidrulesep=\dimen286 +\cmidrulekern=\dimen287 +\defaultaddspace=\dimen288 +\@cmidla=\count307 +\@cmidlb=\count308 +\@aboverulesep=\dimen289 +\@belowrulesep=\dimen290 +\@thisruleclass=\count309 +\@lastruleclass=\count310 +\@thisrulewidth=\dimen291 +) +(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip60 +\enit@outerparindent=\dimen292 +\enit@toks=\toks44 +\enit@inbox=\box77 +\enit@count@id=\count311 +\enitdp@description=\count312 +) +(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box78 +\UL@hyphenbox=\box79 +\UL@skip=\skip61 +\UL@hook=\toks45 +\UL@height=\dimen293 +\UL@pe=\count313 +\UL@pixel=\dimen294 +\ULC@box=\box80 +Package: ulem 2019/11/18 +\ULdepth=\dimen295 +) +(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty +Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk) +\symrsfs=\mathgroup7 +) +\Wrappedcontinuationbox=\box81 +\Wrappedvisiblespacebox=\box82 +Package hyperref Info: Option `breaklinks' set `true' on input line 361. +Package hyperref Info: Option `colorlinks' set `true' on input line 361. +LaTeX Font Info: Trying to load font information for T1+ppl on input line 36 +8. + +(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count314 +\l__pdf_internal_box=\box83 +) +(./8-SageCalculus.aux) +\openout1 = `8-SageCalculus.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. + +(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count315 +\scratchdimen=\dimen296 +\scratchbox=\box84 +\nofMPsegments=\count316 +\nofMParguments=\count317 +\everyMPshowfont=\toks46 +\MPscratchCnt=\count318 +\MPscratchDim=\dimen297 +\MPnumerator=\count319 +\makeMPintoPDFobject=\count320 +\everyMPtoPDFconversion=\toks47 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: float package is loaded. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2020/05/30 v1.4b longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: <default> +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +Package hyperref Info: Link coloring ON on input line 368. + +(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count321 +) +LaTeX Info: Redefining \ref on input line 368. +LaTeX Info: Redefining \pageref on input line 368. +LaTeX Info: Redefining \nameref on input line 368. + +(./8-SageCalculus.out) (./8-SageCalculus.out) +\@outlinefile=\write7 +\openout7 = `8-SageCalculus.out'. + +LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3 +70. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Trying to load font information for OML+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Trying to load font information for OMS+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Trying to load font information for OMX+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Trying to load font information for OT1+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 370. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 370. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 370. +LaTeX Font Info: Trying to load font information for U+rsfs on input line 37 +0. + +(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd +File: ursfs.fd 1998/03/24 rsfs font definition file (jk) +) +LaTeX Font Info: Trying to load font information for T1+cmtt on input line 3 +70. + +(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 391. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 5.21004pt on input line 391. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 391. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 5.21004pt on input line 391. +LaTeX Font Info: Trying to load font information for TS1+cmtt on input line +392. + +(/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 432. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 432. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 432. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 432. + [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 511. + [2] +Underfull \hbox (badness 10000) in paragraph at lines 541--545 +[]\T1/ppl/m/n/10.95 When solv-ing a sys-tem of equa-tions (not in-equal-i-ties) +, you can use the op-tion + [] + +[3] [4] [5] [6] [7] [8] [9] [10] +<output_75_0.png, id=190, 423.5022pt x 281.853pt> +File: output_75_0.png Graphic file (type png) +<use output_75_0.png> +Package pdftex.def Info: output_75_0.png used on input line 1282. +(pdftex.def) Requested size: 423.50114pt x 281.85231pt. + [11] +Underfull \hbox (badness 10000) in paragraph at lines 1284--1285 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1290--1293 +[]\T1/cmtt/m/n/10.95 You can give a number of options to adjust the aspect of y +our plot, see [][]here[][]. + [] + +<output_77_0.png, id=199, 426.393pt x 281.1303pt> +File: output_77_0.png Graphic file (type png) +<use output_77_0.png> +Package pdftex.def Info: output_77_0.png used on input line 1311. +(pdftex.def) Requested size: 426.39195pt x 281.12961pt. +[12 <./output_75_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1313--1314 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1316--1321 +[]\T1/cmtt/m/n/10.95 Some of the options are not described precisely in Sage's +documentation, but you + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1316--1321 +\T1/cmtt/m/n/10.95 can find them on [][]matplotlib's documentation[][]. You can + find many examples online for + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1322--1324 +[]\T1/cmtt/m/n/10.95 If you need to plot more than one object at the time, you +can sum two plots and + [] + +<output_80_0.png, id=206, 424.9476pt x 281.1303pt> +File: output_80_0.png Graphic file (type png) +<use output_80_0.png> +Package pdftex.def Info: output_80_0.png used on input line 1336. +(pdftex.def) Requested size: 424.94655pt x 281.12961pt. +[13 <./output_77_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1338--1339 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1340--1347 +[]\T1/cmtt/m/n/10.95 Finally, there are other types of plots that you can use, +like [][]scatter plots[][] and + [] + +<output_82_0.png, id=216, 421.3341pt x 281.853pt> +File: output_82_0.png Graphic file (type png) +<use output_82_0.png> +Package pdftex.def Info: output_82_0.png used on input line 1364. +(pdftex.def) Requested size: 421.33307pt x 281.85231pt. +[14 <./output_80_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1366--1367 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1376--1380 +[]\T1/cmtt/m/n/10.95 When you need to work with a discrete set of data, like me +asurements of real-world + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1376--1380 +\T1/cmtt/m/n/10.95 quantities, it can be useful to visualize a ``smoothed out'' + version of this data, + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1381--1385 +[]\T1/cmtt/m/n/10.95 One way to do so is finding the lowest-degree polynomial t +hat passes through all + [] + +<output_84_0.png, id=225, 423.5022pt x 280.4076pt> +File: output_84_0.png Graphic file (type png) +<use output_84_0.png> +Package pdftex.def Info: output_84_0.png used on input line 1400. +(pdftex.def) Requested size: 423.50114pt x 280.4069pt. +[15 <./output_82_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1402--1403 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1404--1408 +[]\T1/cmtt/m/n/10.95 One can compute the Lagrange Polynomial over any base ring +, and it has the + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1404--1408 +\T1/cmtt/m/n/10.95 advantage that it is a very ``nice'' function (continuous an +d differentiable as much + [] + +<output_86_0.png, id=232, 424.9476pt x 281.853pt> +File: output_86_0.png Graphic file (type png) +<use output_86_0.png> +Package pdftex.def Info: output_86_0.png used on input line 1425. +(pdftex.def) Requested size: 424.94655pt x 281.85231pt. +[16 <./output_84_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1427--1428 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1429--1434 +[]\T1/cmtt/m/n/10.95 This particular example is called [][]Runge's phenomenon[] +[]. For a better approximation + [] + +<output_88_0.png, id=240, 424.9476pt x 281.853pt> +File: output_88_0.png Graphic file (type png) +<use output_88_0.png> +Package pdftex.def Info: output_88_0.png used on input line 1443. +(pdftex.def) Requested size: 424.94655pt x 281.85231pt. +[17 <./output_86_0.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1445--1446 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1447--1450 +[]\T1/cmtt/m/n/10.95 A detailed explanation of splines is a good topic for a co +urse of numerical + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1447--1450 +\T1/cmtt/m/n/10.95 analysis. For this course it is enough that you know that th +ey exist and they + [] + +[18 <./output_88_0.png>] (./8-SageCalculus.aux) +Package rerunfilecheck Info: File `8-SageCalculus.out' has not changed. +(rerunfilecheck) Checksum: 07C494ECBA08A2F1E2EF17E2726357A6;1338. + ) +Here is how much of TeX's memory you used: + 21395 strings out of 479383 + 389927 string characters out of 5875798 + 723366 words of memory out of 5000000 + 37972 multiletter control sequences out of 15000+600000 + 442051 words of font info for 125 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 107i,19n,111p,507b,620s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/ +texmf-dist/fonts/enc/dvips/base/8r.enc}{/usr/share/texmf-dist/fonts/enc/dvips/c +m-super/cm-super-t1.enc}</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c +mex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></us +r/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-d +ist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-dist/fonts/type +1/public/mathpazo/fplmr.pfb></usr/share/texmf-dist/fonts/type1/public/mathpazo/ +fplmri.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sfit1095.pfb></us +r/share/texmf-dist/fonts/type1/public/cm-super/sftt1095.pfb></usr/share/texmf-d +ist/fonts/type1/public/cm-super/sftt1200.pfb></usr/share/texmf-dist/fonts/type1 +/urw/palatino/uplb8a.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplr8a +.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplri8a.pfb> +Output written on 8-SageCalculus.pdf (18 pages, 323733 bytes). +PDF statistics: + 311 PDF objects out of 1000 (max. 8388607) + 262 compressed objects within 3 object streams + 59 named destinations out of 1000 (max. 500000) + 200 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture6/notebook/8-SageCalculus.out b/src/Lecture6/notebook/8-SageCalculus.out @@ -0,0 +1,19 @@ +\BOOKMARK [1][-]{section.1}{Symbolic expressions}{}% 1 +\BOOKMARK [2][-]{subsection.1.1}{Solving equations and inequalities}{section.1}% 2 +\BOOKMARK [3][-]{subsubsection.1.1.1}{The set of solutions}{subsection.1.1}% 3 +\BOOKMARK [3][-]{subsubsection.1.1.2}{Alternative method for real roots: find\137root\(\)}{subsection.1.1}% 4 +\BOOKMARK [2][-]{subsection.1.2}{Evaluating functions}{section.1}% 5 +\BOOKMARK [2][-]{subsection.1.3}{Symbolic computations}{section.1}% 6 +\BOOKMARK [3][-]{subsubsection.1.3.1}{The Symbolic Ring}{subsection.1.3}% 7 +\BOOKMARK [1][-]{section.2}{Calculus}{}% 8 +\BOOKMARK [2][-]{subsection.2.1}{Limits and series}{section.2}% 9 +\BOOKMARK [2][-]{subsection.2.2}{Derivatives}{section.2}% 10 +\BOOKMARK [2][-]{subsection.2.3}{Integrals}{section.2}% 11 +\BOOKMARK [3][-]{subsubsection.2.3.1}{Symbolic integration}{subsection.2.3}% 12 +\BOOKMARK [3][-]{subsubsection.2.3.2}{Numerical integration}{subsection.2.3}% 13 +\BOOKMARK [2][-]{subsection.2.4}{Differential equations}{section.2}% 14 +\BOOKMARK [3][-]{subsubsection.2.4.1}{A real-world example}{subsection.2.4}% 15 +\BOOKMARK [1][-]{section.3}{Basic data analysis and visualization}{}% 16 +\BOOKMARK [2][-]{subsection.3.1}{Statistics}{section.3}% 17 +\BOOKMARK [2][-]{subsection.3.2}{Plotting}{section.3}% 18 +\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 Binary files differ. diff --git a/src/Lecture6/notebook/8-SageCalculus.tex b/src/Lecture6/notebook/8-SageCalculus.tex @@ -0,0 +1,1456 @@ +\documentclass[11pt]{article} + + \usepackage[breakable]{tcolorbox} + \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour) + + \usepackage{iftex} + \ifPDFTeX + \usepackage[T1]{fontenc} + \usepackage{mathpazo} + \else + \usepackage{fontspec} + \fi + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % Maintain compatibility with old templates. Remove in nbconvert 6.0 + \let\Oldincludegraphics\includegraphics + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionFormat{nocaption}{} + \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt} + + \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size + \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}} + \usepackage{float} + \floatplacement{figure}{H} % forces figures to be placed at the correct location + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + \makeatletter % fix for grffile with XeLaTeX + \def\Gread@@xetex#1{% + \IfFileExists{"\Gin@base".bb}% + {\Gread@eps{\Gin@base.bb}}% + {\Gread@@xetex@aux#1}% + } + \makeatother + + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + % The default LaTeX title has an obnoxious amount of whitespace. By default, + % titling removes some of it. It also provides customization options. + \usepackage{titling} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + \usepackage{mathrsfs} + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF} + \definecolor{ansi-default-inverse-bg}{HTML}{000000} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatibility definitions + \def\gt{>} + \def\lt{<} + \let\Oldtex\TeX + \let\Oldlatex\LaTeX + \renewcommand{\TeX}{\textrm{\Oldtex}} + \renewcommand{\LaTeX}{\textrm{\Oldlatex}} + % Document parameters + % Document title + \title{Calculus and more with SageMath} + \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}} + \date{2021-05-07} + + + + + +% Pygments definitions +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\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}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % For linebreaks inside Verbatim environment from package fancyvrb. + \makeatletter + \newbox\Wrappedcontinuationbox + \newbox\Wrappedvisiblespacebox + \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}} + \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}} + \newcommand*\Wrappedcontinuationindent {3ex } + \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox} + % Take advantage of the already applied Pygments mark-up to insert + % potential linebreaks for TeX processing. + % {, <, #, %, $, ' and ": go to next line. + % _, }, ^, &, >, - and ~: stay at end of broken line. + % Use of \textquotesingle for straight quote. + \newcommand*\Wrappedbreaksatspecials {% + \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}% + \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}% + \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}% + \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}% + \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}% + \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}% + \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}% + \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}% + \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}% + \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}% + \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}% + \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}% + \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}% + \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}% + } + % Some characters . , ; ? ! / are not pygmentized. + % This macro makes them "active" and they will insert potential linebreaks + \newcommand*\Wrappedbreaksatpunct {% + \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}% + \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}% + \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}% + \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}% + \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}% + \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}% + \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}% + \catcode`\.\active + \catcode`\,\active + \catcode`\;\active + \catcode`\:\active + \catcode`\?\active + \catcode`\!\active + \catcode`\/\active + \lccode`\~`\~ + } + \makeatother + + \let\OriginalVerbatim=\Verbatim + \makeatletter + \renewcommand{\Verbatim}[1][1]{% + %\parskip\z@skip + \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}% + \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}% + \def\FancyVerbFormatLine ##1{\hsize\linewidth + \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ + \strut ##1\strut}% + }% + % If the linebreak is at a space, the latter will be displayed as visible + % space at end of first line, and a continuation symbol starts next line. + % Stretch/shrink are however usually zero for typewriter font. + \def\FV@Space {% + \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font + \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak} + {\kern\fontdimen2\font}% + }% + + % Allow breaks at special characters using \PYG... macros. + \Wrappedbreaksatspecials + % Breaks at punctuation characters . , ; ? ! and / need catcode=\active + \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]% + } + \makeatother + + % Exact colors from NB + \definecolor{incolor}{HTML}{303F9F} + \definecolor{outcolor}{HTML}{D84315} + \definecolor{cellborder}{HTML}{CFCFCF} + \definecolor{cellbackground}{HTML}{F7F7F7} + + % prompt + \makeatletter + \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep} + \makeatother + \newcommand{\prompt}[4]{ + \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip} + } + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + +\begin{document} + + \maketitle + + + + + \hypertarget{symbolic-expressions}{% +\section{Symbolic expressions}\label{symbolic-expressions}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]} + +Last time we saw the basics of symbolic expressions: * How to define and +manipulate symbolic expressions * How to introduce new variables (in the +Mathematical sense) with \texttt{var()} * How to solve equations and +inequalities * Some of the Mathematical constants that are included in +Sage, and how to approximate them using \texttt{n()} + +Here are some examples to remind you of these basic things: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{2}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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)} +\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{pi} +\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} +\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}{)} +\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}{)} +\PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{g}\PY{p}{,} \PY{n}{y}\PY{p}{)} \PY{p}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +[ +x == -sqrt(-pi), +x == sqrt(-pi) +] +[ +z == -sqrt(pi + x\^{}2), +z == sqrt(pi + x\^{}2) +] +[[y < -2], [y > 1]] +2*pi + e is approximately 9.00146713563863 + \end{Verbatim} + + Now we will see some more details about solving equations and +manipulating their solutions. + + \hypertarget{solving-equations-and-inequalities}{% +\subsection{Solving equations and +inequalities}\label{solving-equations-and-inequalities}} + +\textbf{Reference} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]} +for the details of \texttt{solve()} and \texttt{find\_root()}, +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html\#solving}{2}{]} +for examples. + +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 + +\begin{align*} + \begin{cases} + x + y = 2 \\ + 2x - y = 6 + \end{cases} +\end{align*} + +Can be solved as + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{40}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{40}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +[[x == (8/3), y == (-2/3)]] +\end{Verbatim} +\end{tcolorbox} + + \textbf{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\). + + \hypertarget{the-set-of-solutions}{% +\subsubsection{The set of solutions}\label{the-set-of-solutions}} + +One would expect the result of \texttt{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) + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{37}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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{}} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{37}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +x == -3 +\end{Verbatim} +\end{tcolorbox} + + To read the actual solution without the \texttt{x\ ==} part you can use +the \texttt{rhs()} or \texttt{lhs()} functions, which can be applied to +any expression containing a relation operator (like \texttt{==}, +\texttt{\textless{}}, \texttt{\textgreater{}=}\ldots) and return the +\emph{right hand side} and \emph{left hand side} of the expression, +respectively + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{41}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{f} \PY{o}{=} \PY{n}{x} \PY{o}{==} \PY{l+m+mi}{2} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +rhs: 2 +lhs: x + \end{Verbatim} + + 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 \texttt{True} at the +same time. It is easier to explain with an example: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{38}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +Simple inequality: [[x < -3], [x > 3]] +System of inequalities: + [ +[3 < x, x < 6], +[x < -3] +] + \end{Verbatim} + + In the last example (system of inequalities), Sage is telling us that +the system \begin{align*} + \begin{cases} + x^2-9 > 9 \\ + x < 6 + \end{cases} +\end{align*} has two solutions: * \(x\) is between \(3\) and \(6\); * +\(x\) is less than \(-3\). + +Since in Sage (and in Python) expressions can have at most on relational +operator like \texttt{\textless{}}, the first solution requires two +expressions to be described. Hence the ``list of lists''. + + \textbf{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)\). + + When solving a system of equations (not inequalities), you can use the +option \texttt{solution\_dict=True} to have the solutions arranged as a +\emph{dictionary}, which is a type of Python collection that we did not +treat in this course + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{44}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{44}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +[\{x: 8/3, y: -2/3\}] +\end{Verbatim} +\end{tcolorbox} + + \hypertarget{alternative-method-for-real-roots-find_root}{% +\subsubsection{\texorpdfstring{Alternative method for real roots: +\texttt{find\_root()}}{Alternative method for real roots: find\_root()}}\label{alternative-method-for-real-roots-find_root}} + +The \texttt{solve()} method is very useful when solving \emph{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. + +When you want to find an explicit, even if approximate, solution, it can +be better to use \texttt{find\_root()}. This function works +\emph{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: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{52}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +Using solve(): + [ +x == -e\^{}x + 10 +] +Using find\_root(): 2.070579904980303 + \end{Verbatim} + + \hypertarget{evaluating-functions}{% +\subsection{Evaluating functions}\label{evaluating-functions}} + +If an expression contains only one variable you can evaluate it easily, +even if it is not a function. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{21}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{3} +\PY{n}{g} \PY{o}{=} \PY{n}{x} \PY{o}{\PYZgt{}} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} + +\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 +y + 3 > (y + 3)\^{}2 + \end{Verbatim} + + 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. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{38}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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{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} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +-2 == 0 +3*y == 2 + \end{Verbatim} + + \hypertarget{symbolic-computations}{% +\subsection{Symbolic computations}\label{symbolic-computations}} + +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 +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.sum}{\texttt{sum()}} +function: + +\begin{align*} + \begin{array}{llcc} + (1) & \sum_{k=0}^nk &=&\frac{n^2+n}{2}\\ + (2) & \sum_{k=0}^nk^4 &=&\frac{6n^5+15n^4+10n^3-n}{30}\\ + (3) & \sum_{k=0}^n\binom nk &=& 2^n\\ + (4) & \sum_{k=0}^\infty \frac1{k^2} &=& \frac{\pi^2}{6} + \end{array} +\end{align*} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{22}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} + +\PY{n}{s} \PY{o}{=} \PY{p}{[}\PY{p}{]} +\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}{)} +\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}{)} +\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}{)} +\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}{)} + +\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}{:} + \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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +(1) 1/2*n\^{}2 + 1/2*n +(2) 1/5*n\^{}5 + 1/2*n\^{}4 + 1/3*n\^{}3 - 1/30*n +(3) 2\^{}n +(4) 1/6*pi\^{}2 + \end{Verbatim} + + An alternative notation is \texttt{expression.sum(k,\ a,\ b)}. There is +an analogous +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.prod}{\texttt{prod()}} +for products. + + 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 +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.expand}{\texttt{expand()}} +function: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{30}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{expand}\PY{p}{(}\PY{p}{)}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +(x + 1)\^{}2 - (x - 1)\^{}2 +4*x + \end{Verbatim} + + \hypertarget{the-symbolic-ring}{% +\subsubsection{The Symbolic Ring}\label{the-symbolic-ring}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html}{3}{]} + +The symbolic expressions that we have seen so far live in a ring called +\emph{symbolic ring} and denoted by \texttt{SR} in Sage. This ring works +like the ring \texttt{ZZ} of integers or \texttt{RR} of reals numbers. +In particular, you can define matrices and other objects using it as a +``basis''. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{45}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} + +\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}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{M}\PY{o}{.}\PY{n}{determinant}\PY{p}{(}\PY{p}{)}\PY{p}{)} + +\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{SR}\PY{p}{[}\PY{p}{]} +\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} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{roots}\PY{p}{(}\PY{p}{)}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +-b*c + a*d +[(-a, 2)] + \end{Verbatim} + + \textbf{Exercise.} Compute the eigenvalues of the matrix \begin{align*} +\begin{pmatrix} +\cos \alpha & \sin \alpha\\ +-\sin\alpha & \cos \alpha +\end{pmatrix} +\end{align*} + + \hypertarget{calculus}{% +\section{Calculus}\label{calculus}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/index.html}{4}{]} +for an overview, but most functions are described in +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]} + + \hypertarget{limits-and-series}{% +\subsection{Limits and series}\label{limits-and-series}} + +\textbf{References:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html\#sage.calculus.calculus.limit}{5}{]} +for limits, +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.series}{6}{]} +for series + +You can compute limits + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{54}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{o}{/}\PY{n}{x} +\PY{c+c1}{\PYZsh{} print(f(0)) \PYZsh{} This one gives an error} +\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{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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 +0 + \end{Verbatim} + + \textbf{Exercise.} Compute the constant \(e\) using a limit. + + You can also specify a direction for the limit. If you don't, Sage +assumes that you want to take a two-sided limit. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{55}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} +\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} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +und +1 +-1 + \end{Verbatim} + + There is also the alternative notation \texttt{limit(f,\ x,\ dir)} which +does the same as \texttt{f.limit(x,\ dir)}. + + You can also compute series expansions up to any order. \textbf{Watch +out:} the notation uses \texttt{==} instead of \texttt{=} as +\texttt{limit()} does. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{56}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{f} \PY{o}{=} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{x} +\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}{)} +\PY{n}{h} \PY{o}{=} \PY{n}{log}\PY{p}{(}\PY{n}{x}\PY{p}{)} + +\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}{)} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 + 1*x + 1/2*x\^{}2 + Order(x\^{}3) +(-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) +1*(x - 1) + (-1/2)*(x - 1)\^{}2 + Order((x - 1)\^{}3) + \end{Verbatim} + + \hypertarget{derivatives}{% +\subsection{Derivatives}\label{derivatives}} + +\textbf{References:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.derivative}{7}{]} +and +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html\#sage.calculus.functional.derivative}{8}{]} +for derivatives, +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html\#sage.calculus.functions.jacobian}{9}{]} +for the Jacobian matrix and +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.hessian}{10}{]} +for the Hessian. + + When computing derivatives, you need to specify with respect to which +variables you want to derive, except in case there is only one. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{57}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\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)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +8*y\^{}3 +6*x\^{}2 - 1 + \end{Verbatim} + + You can also compute higher order derivatives: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{58}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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)} + +\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} +\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} +\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} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +6*x +84*x\^{}5*y + 10*y\^{}4 + 24*x\^{}2*y +1680*x\^{}3 + 48 + \end{Verbatim} + + Jacobian and Hessian matrices are also easy to compute: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{59}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} + +\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} +\PY{n+nb}{print}\PY{p}{(} \PY{n}{g}\PY{o}{.}\PY{n}{hessian}\PY{p}{(}\PY{p}{)} \PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +[-2*x + 2*y 2*x] +[ 0 3*y\^{}2] +[ y + 1 x + 1] + +[ 2 -4*y + 1] +[ -4*y + 1 -4*x + 6*y] + \end{Verbatim} + + \emph{Note:} the notation \texttt{f.jacobian({[}x,y{]})} is also valid, +but only if you specify that \texttt{f} is vector by declaring it as +\texttt{f\ =\ vector({[}...{]})}. + + \hypertarget{integrals}{% +\subsection{Integrals}\label{integrals}} + +\textbf{References:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html}{11}{]} +for symbolic integration and +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html}{12}{]} +for numerical methods. + +You should remember from high school or from your first +calculus/analysis course that derivatives are easy, but integrals are +hard. When using a computer software to solve your integrals, you have +two choices: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\tightlist +\item + 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 + \emph{symbolic integration}. +\item + You can get an \emph{approximated} result with a \emph{numerical + method}. This method always gives some kind of result, but it cannot + be used to compute indefinite integrals. +\end{enumerate} + +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). + + \hypertarget{symbolic-integration}{% +\subsubsection{Symbolic integration}\label{symbolic-integration}} + +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. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{60}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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{n}{f} \PY{o}{=} \PY{n}{x} \PY{o}{+} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} +\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)} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1/2*x\^{}2 - cos(x) +0 +-1/2*a\^{}2 + 1/2*b\^{}2 + cos(a) - cos(b) + \end{Verbatim} + + Your endpoints can also be \(\pm\infty\): + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{61}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 +sqrt(pi) + \end{Verbatim} + + The last function is also an example of an integral that perhaps you +might want to compute numerically. In fact: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{65}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1/2*sqrt(pi)*erf(x) +1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1) + \end{Verbatim} + + Here \texttt{erf(x)} denotes the +\href{https://en.wikipedia.org/wiki/Error_function}{error function}. + + \hypertarget{numerical-integration}{% +\subsubsection{Numerical integration}\label{numerical-integration}} + +In order to get an explicit value for the computations above, we can use +a \emph{numerical} method. + +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. +\href{https://en.wikipedia.org/wiki/Numerical_analysis}{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. + +The Sage function +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html\#sage.calculus.integration.numerical_integral}{\texttt{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. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{40}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{40}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +(0.13525725794999466, 1.5016572202374808e-15) +\end{Verbatim} +\end{tcolorbox} + + The result above means, in symbols \begin{align*} +\int_1^2 e^{-x^2}\mathrm dx = 0.13525725794999466 \pm 1.5016572202374808\times 10^{-15} +\end{align*} + +There is also a +\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html\#sage.calculus.integration.monte_carlo_integral}{\texttt{monte\_carlo\_integral()}} +method for functions with more than one variable. + + \textbf{Exercise.} Compute the area of the ellipse of equation +\(y^2+\left(\frac x3\right)^2=1\). + + \hypertarget{differential-equations}{% +\subsection{Differential equations}\label{differential-equations}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html}{13}{]} + +A +\href{https://en.wikipedia.org/wiki/Differential_equation}{differential +equation} is an equation involving an unknwon function and its +derivatives. They can be of two kinds: \emph{ordinary} differential +equations +(\href{https://en.wikipedia.org/wiki/Ordinary_differential_equation}{ODE}) +and \emph{partial} differential equations +(\href{https://en.wikipedia.org/wiki/Partial_differential_equation}{PDE}). +The latter involve multivariate functions and their partial derivatives. + +Differential equations are in general hard to solve \emph{exactly} (or +\emph{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! + +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 +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html}{13}{]}). +However we will focus on the simple ODEs that can be solved exactly. + +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 +\texttt{function()} construct, which allows us to define an ``unknwon'' +function inside Sage, like we define variables with \texttt{var()}. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{4}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{x}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{f}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\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}{)} +\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} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{4}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\_C*e\^{}x +\end{Verbatim} +\end{tcolorbox} + + 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. + +We can also specify \emph{initial conditions} for our function. For +example we can impose that \(f(0)=3\) as follows: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{5}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{5}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +3*e\^{}x +\end{Verbatim} +\end{tcolorbox} + + You can also solve \emph{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))\). + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{6}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{6}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +-1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e\^{}(-1/2*x\^{}2), x) +\end{Verbatim} +\end{tcolorbox} + + \textbf{Exercise.} Use Sage to find out the functions \(f(x)\) that +satisfy \begin{align*} + \begin{array}{rlcrl} + (A) & + \begin{cases} + f(0) &= 1\\ + f'(0) &= 0\\ + f''(x) &= -f(x) + \end{cases} + & \qquad \qquad & + (B) & + \begin{cases} + f(0) &= 0\\ + f'(0) &= 1\\ + f''(x) &= -f(x) + \end{cases} + \end{array} +\end{align*} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{ }{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] + +\end{Verbatim} +\end{tcolorbox} + + \hypertarget{a-real-world-example}{% +\subsubsection{A real-world example}\label{a-real-world-example}} + +Differential equations have countless applications in Science, so it +would be a shame not to see at least a simple one. + +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\). + +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). + +Since the acceleration is the derivative of the velocity, we have a +differential equation \begin{align*} + v'(t) = -g -kv(t) +\end{align*} and we can try to solve it with Sage! + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{7}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{t}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{v}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\PY{n}{g} \PY{o}{=} \PY{l+m+mf}{9.8} +\PY{n}{k} \PY{o}{=} \PY{l+m+mf}{1.5} +\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} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{7}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +-98/15*(e\^{}(3/2*t) - 1)*e\^{}(-3/2*t) +\end{Verbatim} +\end{tcolorbox} + + If you want to solve this equation symbolically (that is, keeping \(g\) +and \(k\) in symbols) you need to specify that \(t\) is the +\emph{independent variable} of the equation: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{10}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{v}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} +\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} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{10}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +-(g*e\^{}(k*t) - g)*e\^{}(-k*t)/k +\end{Verbatim} +\end{tcolorbox} + + \hypertarget{basic-data-analysis-and-visualization}{% +\section{Basic data analysis and +visualization}\label{basic-data-analysis-and-visualization}} + +\hypertarget{statistics}{% +\subsection{Statistics}\label{statistics}} + +\textbf{References:} +{[}\href{https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html}{14}{]} + +Sage includes the most basic functions for statistical analysis. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{20}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{]} + +\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}{)} + +\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}{)} +\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}{)} +\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}{)} + +\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}{)} +\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}{)} + +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +Values: [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0] +Mean: 5/13 +Median: 1 +Mode: [3] +Standard deviation: 2*sqrt(29/13) +Variance: 116/13 +Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5] + \end{Verbatim} + + You can also compare your data to a probability distribution, see +\href{https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html}{this +page}. If you need to do more advanced statistics you should consider +using \href{https://www.r-project.org/}{R}; you can also use it inside +Sage. + + \hypertarget{plotting}{% +\subsection{Plotting}\label{plotting}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/plotting/index.html}{15}{]}, +more specifically the subsection +{[}\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html}{16}{]}. + +Some Sage objects can be plotted: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{21}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} +\PY{n}{plot}\PY{p}{(}\PY{n}{f}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + +\prompt{Out}{outcolor}{21}{} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_75_0.png} + \end{center} + { \hspace*{\fill} \\} + + + Sage's plotting functions are based on Python's +\href{https://matplotlib.org/}{matplotlib}. + +You can give a number of options to adjust the aspect of your plot, see +\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html\#sage.plot.plot.plot}{here}. +Let's see some of them: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{67}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} +\PY{n}{plot}\PY{p}{(}\PY{n}{f}\PY{p}{,} + \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} + \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} + \PY{n}{color} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} + \PY{n}{title} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{The sin function}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} + \PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + +\prompt{Out}{outcolor}{67}{} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_77_0.png} + \end{center} + { \hspace*{\fill} \\} + + + Some of the options are not described precisely in Sage's documentation, +but you can find them on +\href{https://matplotlib.org/stable/contents.html}{matplotlib's +documentation}. You can find many examples online for adjusting your +plot as you like! + + If you need to plot more than one object at the time, you can sum two +plots and show them together with \texttt{show()}: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{36}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} + +\PY{n}{show}\PY{p}{(}\PY{n}{cosine} \PY{o}{+} \PY{n}{exponential}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_80_0.png} + \end{center} + { \hspace*{\fill} \\} + + Finally, there are other types of plots that you can use, like +\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html\#sage.plot.scatter_plot.scatter_plot}{scatter +plots} and +\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html\#sage.plot.bar_chart.bar_chart}{bar +charts}. You can also add +\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html\#sage.plot.text.text}{text} +to your plot: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{53}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{,} + \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} + \PY{n}{markersize} \PY{o}{=} \PY{l+m+mi}{100}\PY{p}{,} + \PY{n}{edgecolor} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} + \PY{n}{facecolor} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}} + \PY{p}{)} +\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}{)} +\PY{n}{show}\PY{p}{(}\PY{n}{b} \PY{o}{+} \PY{n}{s} \PY{o}{+} \PY{n}{t}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_82_0.png} + \end{center} + { \hspace*{\fill} \\} + + \hypertarget{interpolation}{% +\subsection{Interpolation}\label{interpolation}} + +\textbf{References:} +{[}\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}{]} +and +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html}{18}{]}. + +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. + +One way to do so is finding the lowest-degree polynomial that passes +through all your points. This is called +\href{https://en.wikipedia.org/wiki/Lagrange_polynomial}{Lagrange +Polynomial}. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{65}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{]} +\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} +\PY{n}{lp} \PY{o}{=} \PY{n}{polring}\PY{o}{.}\PY{n}{lagrange\PYZus{}polynomial}\PY{p}{(}\PY{n}{points}\PY{p}{)} +\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}{)} + \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} + \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}{)} + \PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_84_0.png} + \end{center} + { \hspace*{\fill} \\} + + 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). + +However, it does not always give you good approximation of your data: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{2}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{]} +\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}{]} +\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}{]} +\PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{RR}\PY{p}{[}\PY{p}{]} +\PY{n}{lp} \PY{o}{=} \PY{n}{polring}\PY{o}{.}\PY{n}{lagrange\PYZus{}polynomial}\PY{p}{(}\PY{n}{points}\PY{p}{)} + +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_86_0.png} + \end{center} + { \hspace*{\fill} \\} + + This particular example is called +\href{https://en.wikipedia.org/wiki/Runge\%27s_phenomenon}{Runge's +phenomenon}. For a better approximation you can use a +\href{https://en.wikipedia.org/wiki/Spline_(mathematics)}{spline}, which +is a \emph{piecewise} polynomial function: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{90}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{center} + \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_88_0.png} + \end{center} + { \hspace*{\fill} \\} + + 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. + + + % Add a bibliography block to the postdoc + + + +\end{document} diff --git a/src/Lecture6/notebook/9-SageLatex.aux b/src/Lecture6/notebook/9-SageLatex.aux @@ -0,0 +1,32 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{toc}{\contentsline {section}{\numberline {1}The \texttt {show()} command}{1}{section.1}\protected@file@percent } +\newlabel{the-show-command}{{1}{1}{\texorpdfstring {The \texttt {show()} command}{The show() command}}{section.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2}The \texttt {latex()} command}{2}{section.2}\protected@file@percent } +\newlabel{the-latex-command}{{2}{2}{\texorpdfstring {The \texttt {latex()} command}{The latex() command}}{section.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}A Latex name for your variables}{2}{subsection.2.1}\protected@file@percent } +\newlabel{a-latex-name-for-your-variables}{{2.1}{2}{A Latex name for your variables}{subsection.2.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3}From Jupyter to Latex}{3}{section.3}\protected@file@percent } +\newlabel{from-jupyter-to-latex}{{3}{3}{From Jupyter to Latex}{section.3}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4}SageTex}{3}{section.4}\protected@file@percent } +\newlabel{sagetex}{{4}{3}{SageTex}{section.4}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5}The Latex \texttt {listings} package}{3}{section.5}\protected@file@percent } +\newlabel{the-latex-listings-package}{{5}{3}{\texorpdfstring {The Latex \texttt {listings} package}{The Latex listings package}}{section.5}{}} +\gdef \@abspage@last{4} diff --git a/src/Lecture6/notebook/9-SageLatex.ipynb b/src/Lecture6/notebook/9-SageLatex.ipynb @@ -0,0 +1,346 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "\n", + "In this document we will describe some of these interactions between LaTeX and Sage." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The `show()` command\n", + "**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", + "\n", + "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", + "\n", + "You can see it as an alternative to `print()`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)\n" + ] + }, + { + "data": { + "text/html": [ + "<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>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\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", + "\\end{math}" + ], + "text/plain": [ + "1 + 1*x + 1/2*x^2 + 1/6*x^3 + Order(x^4)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 2 3]\n", + "[ 4 5 6]\n", + "[ 8 9 10]\n" + ] + }, + { + "data": { + "text/html": [ + "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)</script></html>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)\n", + "\\end{math}" + ], + "text/plain": [ + "[ 1 2 3]\n", + "[ 4 5 6]\n", + "[ 8 9 10]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pi\n" + ] + }, + { + "data": { + "text/html": [ + "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi</script></html>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\pi\n", + "\\end{math}" + ], + "text/plain": [ + "pi" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "s = (e^x).series(x==0, 4)\n", + "M = matrix([[1,2,3],[4,5,6],[8,9,10]])\n", + "print(s)\n", + "show(s)\n", + "print(M)\n", + "show(M)\n", + "print(pi)\n", + "show(pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In a Jupyter notebook, the results above are displayed using [MathJax](https://www.mathjax.org/).\n", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The `latex()` command\n", + "**Reference:** [[2](https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html)]\n", + "\n", + "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", + "\n", + "Technically, this is a function that returns a string, so you need to `print()` it to see the result." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + 1 x + \\frac{1}{2} x^{2} + \\frac{1}{6} x^{3} + \\mathcal{O}\\left(x^{4}\\right)\n", + "\n", + "\n", + "\\left(\\begin{array}{rrr}\n", + "1 & 2 & 3 \\\\\n", + "4 & 5 & 6 \\\\\n", + "8 & 9 & 10\n", + "\\end{array}\\right)\n" + ] + } + ], + "source": [ + "print(latex(s))\n", + "print(\"\\n\")\n", + "print(latex(M))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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)." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "#latex(plot(x^2)) # The output is more than 20 pages long" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is probably easier to just generate the picture and include that in your Latex document with `\\includegraphics`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A Latex name for your variables\n", + "**Reference:** [[3](https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html)]\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "phi1(epsilon)\n" + ] + }, + { + "data": { + "text/html": [ + "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)</script></html>" + ], + "text/latex": [ + "\\begin{math}\n", + "\\newcommand{\\Bold}[1]{\\mathbf{#1}}e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)\n", + "\\end{math}" + ], + "text/plain": [ + "e^epsilon + phi1(epsilon)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "e^{{\\varepsilon}} + \\phi_1\\left({\\varepsilon}\\right)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('epsilon', latex_name=\"\\\\varepsilon\")\n", + "function('phi1', latex_name=\"\\\\phi_1\")\n", + "\n", + "print(phi1(epsilon))\n", + "show(phi1(epsilon) + e^epsilon)\n", + "latex(phi1(epsilon) + e^epsilon)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**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`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# From Jupyter to Latex\n", + "**Reference:** [[4](https://nbconvert.readthedocs.io/en/latest/)]\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SageTex\n", + "**Reference:** [[5](https://doc.sagemath.org/html/en/tutorial/sagetex.html)]\n", + "\n", + "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", + "\n", + "You might need to take some extra steps to make this work on your system, see the link above." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The Latex `listings` package\n", + "**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", + "\n", + "If you want to include some code (Sage, Python or anything else) in a Latex document you can use the listings package.\n", + "\n", + "```\n", + "\\usepackage{listings}\n", + "\n", + "...\n", + "\n", + "\\begin{lstlisting}[language=Python]\n", + "for i in range(0,100):\n", + " if i%5 == 0:\n", + " print(\"Multiple of 5!\")\n", + "\\end{lstlisting}\n", + "```\n", + "\n", + "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", + "\n", + "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", + "\n", + "```\n", + "\\lstinputlisting[language=Python]{file.py}\n", + "```\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.2", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture6/notebook/9-SageLatex.log b/src/Lecture6/notebook/9-SageLatex.log @@ -0,0 +1,954 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**9-SageLatex.tex +(./9-SageLatex.tex +LaTeX2e <2020-10-01> patch level 2 +L3 programming layer <2020-12-03> xparse <2020-03-03> +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty +Package: tcolorbox 2020/10/09 version 4.42 text color boxes + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks15 +\pgfutil@tempdima=\dimen139 +\pgfutil@tempdimb=\dimen140 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex)) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box47 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/01 v3.1.7a (3.1.7a) +)) +Package: pgf 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +(/usr/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen141 +\Gin@req@width=\dimen142 +) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen143 +\pgf@y=\dimen144 +\pgf@xa=\dimen145 +\pgf@ya=\dimen146 +\pgf@xb=\dimen147 +\pgf@yb=\dimen148 +\pgf@xc=\dimen149 +\pgf@yc=\dimen150 +\pgf@xd=\dimen151 +\pgf@yd=\dimen152 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count185 +\c@pgf@countb=\count186 +\c@pgf@countc=\count187 +\c@pgf@countd=\count188 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count189 + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/01 v3.1.7a (3.1.7a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfsyssoftpath@smallbuffer@items=\count190 +\pgfsyssoftpath@bigbuffer@items=\count191 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen153 +\pgfmath@count=\count192 +\pgfmath@box=\box48 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code +.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.te +x) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics +.code.tex))) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count193 +)) (/usr/share/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +File: pgfcorepoints.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@picminx=\dimen154 +\pgf@picmaxx=\dimen155 +\pgf@picminy=\dimen156 +\pgf@picmaxy=\dimen157 +\pgf@pathminx=\dimen158 +\pgf@pathmaxx=\dimen159 +\pgf@pathminy=\dimen160 +\pgf@pathmaxy=\dimen161 +\pgf@xx=\dimen162 +\pgf@xy=\dimen163 +\pgf@yx=\dimen164 +\pgf@yy=\dimen165 +\pgf@zx=\dimen166 +\pgf@zy=\dimen167 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex +File: pgfcorepathconstruct.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@path@lastx=\dimen168 +\pgf@path@lasty=\dimen169 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex +File: pgfcorepathusage.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@shorten@end@additional=\dimen170 +\pgf@shorten@start@additional=\dimen171 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +File: pgfcorescopes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfpic=\box49 +\pgf@hbox=\box50 +\pgf@layerbox@main=\box51 +\pgf@picture@serial@count=\count194 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex +File: pgfcoregraphicstate.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgflinewidth=\dimen172 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.t +ex +File: pgfcoretransformations.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@pt@x=\dimen173 +\pgf@pt@y=\dimen174 +\pgf@pt@temp=\dimen175 +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex +File: pgfcoreobjects.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.te +x +File: pgfcorepathprocessing.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex +File: pgfcorearrows.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfarrowsep=\dimen176 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgf@max=\dimen177 +\pgf@sys@shading@range@num=\count195 +\pgf@shadingcount=\count196 +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/01 v3.1.7a (3.1.7a) + +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +File: pgfcoreexternal.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfexternal@startupbox=\box52 +)) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex +File: pgfcorelayers.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex +File: pgfcoretransparency.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) (/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex +File: pgfcorepatterns.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/01 v3.1.7a (3.1.7a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/01 v3.1.7a (3.1.7a) +\pgfnodeparttextbox=\box53 +) +(/usr/share/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/01 v3.1.7a (3.1.7a) +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty +Package: pgfcomp-version-0-65 2020/12/01 v3.1.7a (3.1.7a) +\pgf@nodesepstart=\dimen178 +\pgf@nodesepend=\dimen179 +) +(/usr/share/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty +Package: pgfcomp-version-1-18 2020/12/01 v3.1.7a (3.1.7a) +)) +(/usr/share/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements +\every@verbatim=\toks26 +\verbatim@line=\toks27 +\verbatim@in@stream=\read3 +) +(/usr/share/texmf-dist/tex/latex/environ/environ.sty +Package: environ 2014/05/04 v0.3 A new way to define environments + +(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\@envbody=\toks28 +) +(/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count197 +) +\tcb@titlebox=\box54 +\tcb@upperbox=\box55 +\tcb@lowerbox=\box56 +\tcb@phantombox=\box57 +\c@tcbbreakpart=\count198 +\c@tcblayer=\count199 +\c@tcolorbox@number=\count266 +\tcb@temp=\box58 +\tcb@temp=\box59 +\tcb@temp=\box60 +\tcb@temp=\box61 +\tcb@out=\write4 +\tcb@record@out=\write5 + +(/usr/share/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex +Library (tcolorbox): 'tcbbreakable.code.tex' version '4.42' +(/usr/share/texmf-dist/tex/generic/oberdiek/pdfcol.sty +Package: pdfcol 2019/12/29 v1.6 Handle new color stacks for pdfTeX (HO) + +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23. +\tcb@testbox=\box62 +\tcb@totalupperbox=\box63 +\tcb@totallowerbox=\box64 +)) +(/usr/share/texmf-dist/tex/latex/parskip/parskip.sty +Package: parskip 2020-06-15 v2.0f non-zero parskip adjustments + +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) + +(/usr/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +))) +(/usr/share/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2020/08/10 v2.0s Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/psnfss/mathpazo.sty +Package: mathpazo 2020/03/25 PSNFSS-v9.3 Palatino w/ Pazo Math (D.Puga, WaS) +\symupright=\mathgroup4 +) +(/usr/share/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2020/10/26 v3.5g Customizing captions (AR) + +(/usr/share/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2020/10/21 v2.2e caption3 kernel (AR) +\captionmargin=\dimen180 +\captionmargin@=\dimen181 +\captionwidth=\dimen182 +\caption@tempdima=\dimen183 +\caption@indent=\dimen184 +\caption@parindent=\dimen185 +\caption@hangindent=\dimen186 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count267 +\c@continuedfloat=\count268 +) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2020/11/20 v2.8 package option processing (HA) + +(/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks29 +\XKV@tempa@toks=\toks30 +) +\XKV@depth=\count269 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material + +(/usr/share/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box65 +) +\tc@llx=\dimen187 +\tc@lly=\dimen188 +\tc@urx=\dimen189 +\tc@ury=\dimen190 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex +)) +\adjbox@Width=\dimen191 +\adjbox@Height=\dimen192 +\adjbox@Depth=\dimen193 +\adjbox@Totalheight=\dimen194 +\adjbox@pwidth=\dimen195 +\adjbox@pheight=\dimen196 +\adjbox@pdepth=\dimen197 +\adjbox@ptotalheight=\dimen198 + +(/usr/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection +\c@checkoddpage=\count270 +) +(/usr/share/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box66 +\sift@deathcycles=\count271 +\@vwid@loff=\dimen199 +\@vwid@roff=\dimen256 +)) +(/usr/share/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count272 +\float@exts=\toks31 +\float@box=\box67 +\@float@everytoks=\toks32 +\@floatcapt=\box68 +) +(/usr/share/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks33 +) +(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count273 +\Gm@cntv=\count274 +\c@Gm@tempcnt=\count275 +\Gm@bindingoffset=\dimen257 +\Gm@wd@mp=\dimen258 +\Gm@odd@mp=\dimen259 +\Gm@even@mp=\dimen260 +\Gm@layoutwidth=\dimen261 +\Gm@layoutheight=\dimen262 +\Gm@layouthoffset=\dimen263 +\Gm@layoutvoffset=\dimen264 +\Gm@dimlist=\toks34 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks35 +\ex@=\dimen265 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen266 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count276 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count277 +\leftroot@=\count278 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count279 +\DOTSCASE@=\count280 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box69 +\strutbox@=\box70 +\big@size=\dimen267 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count281 +\c@MaxMatrixCols=\count282 +\dotsspace@=\muskip16 +\c@parentequation=\count283 +\dspbrk@lvl=\count284 +\tag@help=\toks36 +\row@=\count285 +\column@=\count286 +\maxfields@=\count287 +\andhelp@=\toks37 +\eqnshift@=\dimen268 +\alignsep@=\dimen269 +\tagshift@=\dimen270 +\tagwidth@=\dimen271 +\totwidth@=\dimen272 +\lineht@=\dimen273 +\@envbody=\toks38 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks39 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup5 +\symAMSb=\mathgroup6 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +(/usr/share/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba +tim +) +(/usr/share/texmf-dist/tex/latex/eurosym/eurosym.sty +Package: eurosym 1998/08/06 v1.1 European currency symbol ``Euro'' +\@eurobox=\box71 +) +(/usr/share/texmf-dist/tex/latex/ucs/ucs.sty +Package: ucs 2013/05/11 v2.2 UCS: Unicode input support + +(/usr/share/texmf-dist/tex/latex/ucs/data/uni-global.def +File: uni-global.def 2013/05/13 UCS: Unicode global data +) +\uc@secondtry=\count288 +\uc@combtoks=\toks40 +\uc@combtoksb=\toks41 +\uc@temptokena=\toks42 +) +(/usr/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2020/05/03 v3.6 verbatim text (tvz,hv) +\FV@CodeLineNo=\count289 +\FV@InFile=\read4 +\FV@TabBox=\box72 +\c@FancyVerbLine=\count290 +\FV@StepNumber=\count291 +\FV@OutFile=\write6 +) +(/usr/share/texmf-dist/tex/latex/grffile/grffile.sty +Package: grffile 2019/11/11 v2.1 Extended file name support for graphics (legac +y) +Package grffile Info: This package is an empty stub for compatibility on input +line 40. +) +(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX + +(/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen274 +\Hy@linkcounter=\count292 +\Hy@pagecounter=\count293 + +(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count294 +Package hyperref Info: Hyper figures OFF on input line 4464. +Package hyperref Info: Link nesting OFF on input line 4469. +Package hyperref Info: Hyper index ON on input line 4472. +Package hyperref Info: Plain pages OFF on input line 4479. +Package hyperref Info: Backreferencing OFF on input line 4484. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4717. +\c@Hy@tempcnt=\count295 + +(/usr/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5076. +\XeTeXLinkMargin=\dimen275 + +(/usr/share/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count296 +\Field@Width=\dimen276 +\Fld@charsize=\dimen277 +Package hyperref Info: Hyper figures OFF on input line 6347. +Package hyperref Info: Link nesting OFF on input line 6352. +Package hyperref Info: Hyper index ON on input line 6355. +Package hyperref Info: backreferencing OFF on input line 6362. +Package hyperref Info: Link coloring OFF on input line 6367. +Package hyperref Info: Link coloring with OCG OFF on input line 6372. +Package hyperref Info: PDF/A mode OFF on input line 6377. +LaTeX Info: Redefining \ref on input line 6417. +LaTeX Info: Redefining \pageref on input line 6421. + +(/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packa +ge +with kernel methods +) +\Hy@abspage=\count297 +\c@Item=\count298 +\c@Hfootnote=\count299 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020-05-15 v7.00e Hyperref driver for pdfTeX + +(/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag +e +with kernel methods +) +\Fld@listcount=\count300 +\c@bookmark@seq@number=\count301 + +(/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +) +\Hy@SectionHShift=\skip52 +) +(/usr/share/texmf-dist/tex/latex/titling/titling.sty +Package: titling 2009/09/04 v2.1d maketitle typesetting +\thanksmarkwidth=\skip53 +\thanksmargin=\skip54 +\droptitle=\skip55 +) +(/usr/share/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC) +\LTleft=\skip56 +\LTright=\skip57 +\LTpre=\skip58 +\LTpost=\skip59 +\LTchunksize=\count302 +\LTcapwidth=\dimen278 +\LT@head=\box73 +\LT@firsthead=\box74 +\LT@foot=\box75 +\LT@lastfoot=\box76 +\LT@cols=\count303 +\LT@rows=\count304 +\c@LT@tables=\count305 +\c@LT@chunks=\count306 +\LT@p@ftn=\toks43 +) +(/usr/share/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen279 +\lightrulewidth=\dimen280 +\cmidrulewidth=\dimen281 +\belowrulesep=\dimen282 +\belowbottomsep=\dimen283 +\aboverulesep=\dimen284 +\abovetopsep=\dimen285 +\cmidrulesep=\dimen286 +\cmidrulekern=\dimen287 +\defaultaddspace=\dimen288 +\@cmidla=\count307 +\@cmidlb=\count308 +\@aboverulesep=\dimen289 +\@belowrulesep=\dimen290 +\@thisruleclass=\count309 +\@lastruleclass=\count310 +\@thisrulewidth=\dimen291 +) +(/usr/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip60 +\enit@outerparindent=\dimen292 +\enit@toks=\toks44 +\enit@inbox=\box77 +\enit@count@id=\count311 +\enitdp@description=\count312 +) +(/usr/share/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box78 +\UL@hyphenbox=\box79 +\UL@skip=\skip61 +\UL@hook=\toks45 +\UL@height=\dimen293 +\UL@pe=\count313 +\UL@pixel=\dimen294 +\ULC@box=\box80 +Package: ulem 2019/11/18 +\ULdepth=\dimen295 +) +(/usr/share/texmf-dist/tex/latex/jknapltx/mathrsfs.sty +Package: mathrsfs 1996/01/01 Math RSFS package v1.0 (jk) +\symrsfs=\mathgroup7 +) +\Wrappedcontinuationbox=\box81 +\Wrappedvisiblespacebox=\box82 +Package hyperref Info: Option `breaklinks' set `true' on input line 361. +Package hyperref Info: Option `colorlinks' set `true' on input line 361. +LaTeX Font Info: Trying to load font information for T1+ppl on input line 36 +8. + +(/usr/share/texmf-dist/tex/latex/psnfss/t1ppl.fd +File: t1ppl.fd 2001/06/04 font definitions for T1/ppl. +) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-09-24 L3 backend support: PDF output (pdfTeX) +\l__kernel_color_stack_int=\count314 +\l__pdf_internal_box=\box83 +) +(./9-SageLatex.aux) +\openout1 = `9-SageLatex.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 368. +LaTeX Font Info: ... okay on input line 368. + (/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count315 +\scratchdimen=\dimen296 +\scratchbox=\box84 +\nofMPsegments=\count316 +\nofMParguments=\count317 +\everyMPshowfont=\toks46 +\MPscratchCnt=\count318 +\MPscratchDim=\dimen297 +\MPnumerator=\count319 +\makeMPintoPDFobject=\count320 +\everyMPtoPDFconversion=\toks47 +) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: float package is loaded. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/share/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2020/05/30 v1.4b longtable captions (AR) +) +Package caption Info: End \AtBeginDocument code. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: <default> +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt) +* \paperwidth=614.295pt +* \paperheight=794.96999pt +* \textwidth=469.75502pt +* \textheight=650.43001pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=59.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texmf-dist/tex/latex/ucs/ucsencs.def +File: ucsencs.def 2011/01/21 Fixes to fontencodings LGR, T3 +) +Package hyperref Info: Link coloring ON on input line 368. + +(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count321 +) +LaTeX Info: Redefining \ref on input line 368. +LaTeX Info: Redefining \pageref on input line 368. +LaTeX Info: Redefining \nameref on input line 368. + +(./9-SageLatex.out) (./9-SageLatex.out) +\@outlinefile=\write7 +\openout7 = `9-SageLatex.out'. + +LaTeX Font Info: Trying to load font information for OT1+ppl on input line 3 +70. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd +File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl. +) +LaTeX Font Info: Trying to load font information for OML+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omlzplm.fd +File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm. +) +LaTeX Font Info: Trying to load font information for OMS+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omszplm.fd +File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm. +) +LaTeX Font Info: Trying to load font information for OMX+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/omxzplm.fd +File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm. +) +LaTeX Font Info: Trying to load font information for OT1+zplm on input line +370. + +(/usr/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd +File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm. +) +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 12.50409pt on input line 370. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 9.37807pt on input line 370. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 7.29405pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 12.50409pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 9.37807pt on input line 370. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 7.29405pt on input line 370. +LaTeX Font Info: Trying to load font information for U+rsfs on input line 37 +0. + +(/usr/share/texmf-dist/tex/latex/jknapltx/ursfs.fd +File: ursfs.fd 1998/03/24 rsfs font definition file (jk) +) +LaTeX Font Info: Trying to load font information for T1+cmtt on input line 3 +70. + +(/usr/share/texmf-dist/tex/latex/base/t1cmtt.fd +File: t1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <14.4> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 386. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 6.25204pt on input line 402. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 5.21004pt on input line 402. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 6.25204pt on input line 402. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 5.21004pt on input line 402. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 11.40997pt on input line 418. +LaTeX Font Info: Font shape `U/msa/m/n' will be +(Font) scaled to size 8.33606pt on input line 418. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 11.40997pt on input line 418. +LaTeX Font Info: Font shape `U/msb/m/n' will be +(Font) scaled to size 8.33606pt on input line 418. + [1 + +{/usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <10.95> not available +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 473. +LaTeX Font Info: Trying to load font information for TS1+cmtt on input line +517. + (/usr/share/texmf-dist/tex/latex/base/ts1cmtt.fd +File: ts1cmtt.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) [2] [3] [4] (./9-SageLatex.aux) +Package rerunfilecheck Info: File `9-SageLatex.out' has not changed. +(rerunfilecheck) Checksum: A41656EED8025F02B8135E03FFA75587;350. + + +LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. + + ) +Here is how much of TeX's memory you used: + 21220 strings out of 479383 + 386846 string characters out of 5875798 + 697645 words of memory out of 5000000 + 37852 multiletter control sequences out of 15000+600000 + 439695 words of font info for 120 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 107i,8n,111p,504b,595s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}{/usr/share/ +texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/usr/share/texmf-dist/font +s/enc/dvips/base/8r.enc}</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/c +mex10.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr +/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-d +ist/fonts/type1/public/mathpazo/fplmri.pfb></usr/share/texmf-dist/fonts/type1/p +ublic/cm-super/sfit1095.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/ +sftt1095.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sftt1200.pfb></ +usr/share/texmf-dist/fonts/type1/public/cm-super/sftt1440.pfb></usr/share/texmf +-dist/fonts/type1/urw/palatino/uplb8a.pfb></usr/share/texmf-dist/fonts/type1/ur +w/palatino/uplr8a.pfb></usr/share/texmf-dist/fonts/type1/urw/palatino/uplri8a.p +fb> +Output written on 9-SageLatex.pdf (4 pages, 183997 bytes). +PDF statistics: + 122 PDF objects out of 1000 (max. 8388607) + 103 compressed objects within 2 object streams + 17 named destinations out of 1000 (max. 500000) + 61 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture6/notebook/9-SageLatex.out b/src/Lecture6/notebook/9-SageLatex.out @@ -0,0 +1,6 @@ +\BOOKMARK [1][-]{section.1}{The show\(\) command}{}% 1 +\BOOKMARK [1][-]{section.2}{The latex\(\) command}{}% 2 +\BOOKMARK [2][-]{subsection.2.1}{A Latex name for your variables}{section.2}% 3 +\BOOKMARK [1][-]{section.3}{From Jupyter to Latex}{}% 4 +\BOOKMARK [1][-]{section.4}{SageTex}{}% 5 +\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 Binary files differ. diff --git a/src/Lecture6/notebook/9-SageLatex.tex b/src/Lecture6/notebook/9-SageLatex.tex @@ -0,0 +1,634 @@ +\documentclass[11pt]{article} + + \usepackage[breakable]{tcolorbox} + \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour) + + \usepackage{iftex} + \ifPDFTeX + \usepackage[T1]{fontenc} + \usepackage{mathpazo} + \else + \usepackage{fontspec} + \fi + + % Basic figure setup, for now with no caption control since it's done + % automatically by Pandoc (which extracts ![](path) syntax from Markdown). + \usepackage{graphicx} + % Maintain compatibility with old templates. Remove in nbconvert 6.0 + \let\Oldincludegraphics\includegraphics + % Ensure that by default, figures have no caption (until we provide a + % proper Figure object with a Caption API and a way to capture that + % in the conversion process - todo). + \usepackage{caption} + \DeclareCaptionFormat{nocaption}{} + \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt} + + \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size + \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}} + \usepackage{float} + \floatplacement{figure}{H} % forces figures to be placed at the correct location + \usepackage{xcolor} % Allow colors to be defined + \usepackage{enumerate} % Needed for markdown enumerations to work + \usepackage{geometry} % Used to adjust the document margins + \usepackage{amsmath} % Equations + \usepackage{amssymb} % Equations + \usepackage{textcomp} % defines textquotesingle + % Hack from http://tex.stackexchange.com/a/47451/13684: + \AtBeginDocument{% + \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code + } + \usepackage{upquote} % Upright quotes for verbatim code + \usepackage{eurosym} % defines \euro + \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support + \usepackage{fancyvrb} % verbatim replacement that allows latex + \usepackage{grffile} % extends the file name processing of package graphics + % to support a larger range + \makeatletter % fix for grffile with XeLaTeX + \def\Gread@@xetex#1{% + \IfFileExists{"\Gin@base".bb}% + {\Gread@eps{\Gin@base.bb}}% + {\Gread@@xetex@aux#1}% + } + \makeatother + + % The hyperref package gives us a pdf with properly built + % internal navigation ('pdf bookmarks' for the table of contents, + % internal cross-reference links, web links for URLs, etc.) + \usepackage{hyperref} + % The default LaTeX title has an obnoxious amount of whitespace. By default, + % titling removes some of it. It also provides customization options. + \usepackage{titling} + \usepackage{longtable} % longtable support required by pandoc >1.10 + \usepackage{booktabs} % table support for pandoc > 1.12.2 + \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) + \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) + % normalem makes italics be italics, not underlines + \usepackage{mathrsfs} + + + + % Colors for the hyperref package + \definecolor{urlcolor}{rgb}{0,.145,.698} + \definecolor{linkcolor}{rgb}{.71,0.21,0.01} + \definecolor{citecolor}{rgb}{.12,.54,.11} + + % ANSI colors + \definecolor{ansi-black}{HTML}{3E424D} + \definecolor{ansi-black-intense}{HTML}{282C36} + \definecolor{ansi-red}{HTML}{E75C58} + \definecolor{ansi-red-intense}{HTML}{B22B31} + \definecolor{ansi-green}{HTML}{00A250} + \definecolor{ansi-green-intense}{HTML}{007427} + \definecolor{ansi-yellow}{HTML}{DDB62B} + \definecolor{ansi-yellow-intense}{HTML}{B27D12} + \definecolor{ansi-blue}{HTML}{208FFB} + \definecolor{ansi-blue-intense}{HTML}{0065CA} + \definecolor{ansi-magenta}{HTML}{D160C4} + \definecolor{ansi-magenta-intense}{HTML}{A03196} + \definecolor{ansi-cyan}{HTML}{60C6C8} + \definecolor{ansi-cyan-intense}{HTML}{258F8F} + \definecolor{ansi-white}{HTML}{C5C1B4} + \definecolor{ansi-white-intense}{HTML}{A1A6B2} + \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF} + \definecolor{ansi-default-inverse-bg}{HTML}{000000} + + % commands and environments needed by pandoc snippets + % extracted from the output of `pandoc -s` + \providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} + % Add ',fontsize=\small' for more characters per line + \newenvironment{Shaded}{}{} + \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} + \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} + \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} + \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} + \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} + \newcommand{\RegionMarkerTok}[1]{{#1}} + \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} + \newcommand{\NormalTok}[1]{{#1}} + + % Additional commands for more recent versions of Pandoc + \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} + \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} + \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} + \newcommand{\ImportTok}[1]{{#1}} + \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} + \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} + \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} + \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} + \newcommand{\BuiltInTok}[1]{{#1}} + \newcommand{\ExtensionTok}[1]{{#1}} + \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} + \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} + \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} + + + % Define a nice break command that doesn't care if a line doesn't already + % exist. + \def\br{\hspace*{\fill} \\* } + % Math Jax compatibility definitions + \def\gt{>} + \def\lt{<} + \let\Oldtex\TeX + \let\Oldlatex\LaTeX + \renewcommand{\TeX}{\textrm{\Oldtex}} + \renewcommand{\LaTeX}{\textrm{\Oldlatex}} + % Document parameters + % Document title + \title{Sage and Latex interaction} + \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}} + \date{2021-05-07} + + + + + +% Pygments definitions +\makeatletter +\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% + \let\PY@ul=\relax \let\PY@tc=\relax% + \let\PY@bc=\relax \let\PY@ff=\relax} +\def\PY@tok#1{\csname PY@tok@#1\endcsname} +\def\PY@toks#1+{\ifx\relax#1\empty\else% + \PY@tok{#1}\expandafter\PY@toks\fi} +\def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% + \PY@it{\PY@bf{\PY@ff{#1}}}}}}} +\def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} + +\expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} +\expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} +\expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} +\expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} +\expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} +\expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} +\expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} +\expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} +\expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} +\expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\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}}} +\expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} +\expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} + +\def\PYZbs{\char`\\} +\def\PYZus{\char`\_} +\def\PYZob{\char`\{} +\def\PYZcb{\char`\}} +\def\PYZca{\char`\^} +\def\PYZam{\char`\&} +\def\PYZlt{\char`\<} +\def\PYZgt{\char`\>} +\def\PYZsh{\char`\#} +\def\PYZpc{\char`\%} +\def\PYZdl{\char`\$} +\def\PYZhy{\char`\-} +\def\PYZsq{\char`\'} +\def\PYZdq{\char`\"} +\def\PYZti{\char`\~} +% for compatibility with earlier versions +\def\PYZat{@} +\def\PYZlb{[} +\def\PYZrb{]} +\makeatother + + + % For linebreaks inside Verbatim environment from package fancyvrb. + \makeatletter + \newbox\Wrappedcontinuationbox + \newbox\Wrappedvisiblespacebox + \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}} + \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}} + \newcommand*\Wrappedcontinuationindent {3ex } + \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox} + % Take advantage of the already applied Pygments mark-up to insert + % potential linebreaks for TeX processing. + % {, <, #, %, $, ' and ": go to next line. + % _, }, ^, &, >, - and ~: stay at end of broken line. + % Use of \textquotesingle for straight quote. + \newcommand*\Wrappedbreaksatspecials {% + \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}% + \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}% + \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}% + \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}% + \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}% + \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}% + \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}% + \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}% + \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}% + \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}% + \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}% + \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}% + \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}% + \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}% + } + % Some characters . , ; ? ! / are not pygmentized. + % This macro makes them "active" and they will insert potential linebreaks + \newcommand*\Wrappedbreaksatpunct {% + \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}% + \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}% + \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}% + \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}% + \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}% + \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}% + \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}% + \catcode`\.\active + \catcode`\,\active + \catcode`\;\active + \catcode`\:\active + \catcode`\?\active + \catcode`\!\active + \catcode`\/\active + \lccode`\~`\~ + } + \makeatother + + \let\OriginalVerbatim=\Verbatim + \makeatletter + \renewcommand{\Verbatim}[1][1]{% + %\parskip\z@skip + \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}% + \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}% + \def\FancyVerbFormatLine ##1{\hsize\linewidth + \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ + \strut ##1\strut}% + }% + % If the linebreak is at a space, the latter will be displayed as visible + % space at end of first line, and a continuation symbol starts next line. + % Stretch/shrink are however usually zero for typewriter font. + \def\FV@Space {% + \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font + \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak} + {\kern\fontdimen2\font}% + }% + + % Allow breaks at special characters using \PYG... macros. + \Wrappedbreaksatspecials + % Breaks at punctuation characters . , ; ? ! and / need catcode=\active + \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]% + } + \makeatother + + % Exact colors from NB + \definecolor{incolor}{HTML}{303F9F} + \definecolor{outcolor}{HTML}{D84315} + \definecolor{cellborder}{HTML}{CFCFCF} + \definecolor{cellbackground}{HTML}{F7F7F7} + + % prompt + \makeatletter + \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep} + \makeatother + \newcommand{\prompt}[4]{ + \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip} + } + + + + % Prevent overflowing lines due to hard-to-break entities + \sloppy + % Setup hyperref package + \hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=urlcolor, + linkcolor=linkcolor, + citecolor=citecolor, + } + % Slightly bigger margins than the latex defaults + + \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} + + + +\begin{document} + + \maketitle + + + + + 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. + +In this document we will describe some of these interactions between +LaTeX and Sage. + + \hypertarget{the-show-command}{% +\section{\texorpdfstring{The \texttt{show()} +command}{The show() command}}\label{the-show-command}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/repl/sage/repl/display/pretty_print.html}{1}{]} +(\texttt{show()} is just an alternative name for +\texttt{pretty\_print()}). + +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. + +You can see it as an alternative to \texttt{print()}. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{4}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{s}\PY{p}{)} +\PY{n}{show}\PY{p}{(}\PY{n}{s}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{M}\PY{p}{)} +\PY{n}{show}\PY{p}{(}\PY{n}{M}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{pi}\PY{p}{)} +\PY{n}{show}\PY{p}{(}\PY{n}{pi}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 + 1*x + 1/2*x\^{}2 + 1/6*x\^{}3 + Order(x\^{}4) + \end{Verbatim} + + \begin{math} +\newcommand{\Bold}[1]{\mathbf{#1}}1 + 1 x + \frac{1}{2} x^{2} + \frac{1}{6} x^{3} + \mathcal{O}\left(x^{4}\right) +\end{math} + + + \begin{Verbatim}[commandchars=\\\{\}] +[ 1 2 3] +[ 4 5 6] +[ 8 9 10] + \end{Verbatim} + + \begin{math} +\newcommand{\Bold}[1]{\mathbf{#1}}\left(\begin{array}{rrr} +1 & 2 & 3 \\ +4 & 5 & 6 \\ +8 & 9 & 10 +\end{array}\right) +\end{math} + + + \begin{Verbatim}[commandchars=\\\{\}] +pi + \end{Verbatim} + + \begin{math} +\newcommand{\Bold}[1]{\mathbf{#1}}\pi +\end{math} + + + In a Jupyter notebook, the results above are displayed using +\href{https://www.mathjax.org/}{MathJax}. + +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 \texttt{latex()} +command. + + \hypertarget{the-latex-command}{% +\section{\texorpdfstring{The \texttt{latex()} +command}{The latex() command}}\label{the-latex-command}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/misc/sage/misc/latex.html}{2}{]} + +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. + +Technically, this is a function that returns a string, so you need to +\texttt{print()} it to see the result. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{5}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{n+nb}{print}\PY{p}{(}\PY{n}{latex}\PY{p}{(}\PY{n}{s}\PY{p}{)}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} +\PY{n+nb}{print}\PY{p}{(}\PY{n}{latex}\PY{p}{(}\PY{n}{M}\PY{p}{)}\PY{p}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +1 + 1 x + \textbackslash{}frac\{1\}\{2\} x\^{}\{2\} + \textbackslash{}frac\{1\}\{6\} x\^{}\{3\} + \textbackslash{}mathcal\{O\}\textbackslash{}left(x\^{}\{4\}\textbackslash{}right) + + +\textbackslash{}left(\textbackslash{}begin\{array\}\{rrr\} +1 \& 2 \& 3 \textbackslash{}\textbackslash{} +4 \& 5 \& 6 \textbackslash{}\textbackslash{} +8 \& 9 \& 10 +\textbackslash{}end\{array\}\textbackslash{}right) + \end{Verbatim} + + 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). + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{15}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\PY{c+c1}{\PYZsh{}latex(plot(x\PYZca{}2)) \PYZsh{} The output is more than 20 pages long} +\end{Verbatim} +\end{tcolorbox} + + It is probably easier to just generate the picture and include that in +your Latex document with \texttt{\textbackslash{}includegraphics}. + + \hypertarget{a-latex-name-for-your-variables}{% +\subsection{A Latex name for your +variables}\label{a-latex-name-for-your-variables}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/var.html}{3}{]} + +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: + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{16}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +\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}{)} +\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}{)} + +\PY{n+nb}{print}\PY{p}{(}\PY{n}{phi1}\PY{p}{(}\PY{n}{epsilon}\PY{p}{)}\PY{p}{)} +\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}{)} +\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}{)} +\end{Verbatim} +\end{tcolorbox} + + \begin{Verbatim}[commandchars=\\\{\}] +phi1(epsilon) + \end{Verbatim} + + \begin{math} +\newcommand{\Bold}[1]{\mathbf{#1}}e^{{\varepsilon}} + \phi_1\left({\varepsilon}\right) +\end{math} + + + \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] +\prompt{Out}{outcolor}{16}{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] +e\^{}\{\{\textbackslash{}varepsilon\}\} + \textbackslash{}phi\_1\textbackslash{}left(\{\textbackslash{}varepsilon\}\textbackslash{}right) +\end{Verbatim} +\end{tcolorbox} + + \textbf{Warning:} You need to use two backspaces +\texttt{\textbackslash{}\textbackslash{}}. 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 +\texttt{\textbackslash{}n}. + + \hypertarget{from-jupyter-to-latex}{% +\section{From Jupyter to Latex}\label{from-jupyter-to-latex}} + +\textbf{Reference:} +{[}\href{https://nbconvert.readthedocs.io/en/latest/}{4}{]} + +From the Jupyter menu \texttt{File\ \textgreater{}\ 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. + +If you choose to download the pdf file, you might need to install some +extra packages. For example I had to install +\href{https://pandoc.org/}{\texttt{pandoc}}, \texttt{texlive-XeTeX} and +\texttt{texlive-Xdvi}, but this depends on your operating system and +Latex distribution. + + \hypertarget{sagetex}{% +\section{SageTex}\label{sagetex}} + +\textbf{Reference:} +{[}\href{https://doc.sagemath.org/html/en/tutorial/sagetex.html}{5}{]} + +With SageTex it is possible to run Sage commands directly inside Latex, +using the \texttt{\textbackslash{}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. + +You might need to take some extra steps to make this work on your +system, see the link above. + + \hypertarget{the-latex-listings-package}{% +\section{\texorpdfstring{The Latex \texttt{listings} +package}{The Latex listings package}}\label{the-latex-listings-package}} + +\textbf{References:} +{[}\href{https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings}{6}{]} +and +{[}\href{https://ftp.snt.utwente.nl/pub/software/tex/macros/latex/contrib/listings/listings.pdf}{7}{]} + +If you want to include some code (Sage, Python or anything else) in a +Latex document you can use the listings package. + +\begin{verbatim} +\usepackage{listings} + +... + +\begin{lstlisting}[language=Python] +for i in range(0,100): + if i%5 == 0: + print("Multiple of 5!") +\end{lstlisting} +\end{verbatim} + +You need to specify the language you are using with the +\texttt{language=} option. This option can also be set at the beginning +of the document using the +\texttt{\textbackslash{}lstset\{language=Python\}} command. + +As an alternative, you can include a file directly without copying the +code into the tex file, like you would do for a picture: + +\begin{verbatim} +\lstinputlisting[language=Python]{file.py} +\end{verbatim} + +It is technically possible to include Latex listings in a markdown cell +of the Jupyter notebook using +\href{https://jupyter-contrib-nbextensions.readthedocs.io/en/latest/nbextensions/latex_envs/README.html}{this +package}, but it does not make much sense. So we will move to a Latex +editor for the examples. + + \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] +\prompt{In}{incolor}{ }{\boxspacing} +\begin{Verbatim}[commandchars=\\\{\}] + +\end{Verbatim} +\end{tcolorbox} + + + % Add a bibliography block to the postdoc + + + +\end{document} diff --git a/src/Lecture6/notebook/output_75_0.png 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 Binary files differ. diff --git a/src/Lecture6/notebook/output_80_0.png 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 Binary files differ. diff --git a/src/Lecture6/notebook/output_84_0.png 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 Binary files differ. diff --git a/src/Lecture6/notebook/output_88_0.png 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 @@ -0,0 +1,412 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Nested loops\n", + "\n", + "The following two functions compute sum and product of matrices, respectively.\n", + "\n", + "By counting the nested loops it is easy to see that `add()` is $O(n^2)$ while `prod()` is $O(n^3)$." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time for add: 0.01961983600000039\n", + "Time for prod: 11.278560734\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def add(A, B):\n", + " S = [[0] * len(A) for i in range(len(A))]\n", + " for i in range(len(A)):\n", + " for j in range(len(A)):\n", + " S[i][j] = A[i][j] + B[i][j]\n", + " return S\n", + "\n", + "def prod(A, B):\n", + " S = [[0] * len(A) for i in range(len(A))]\n", + " for i in range(len(A)):\n", + " for j in range(len(A)):\n", + " for k in range(len(A)):\n", + " S[i][j] = S[i][j] + A[i][k] * B[k][j]\n", + " return S\n", + "\n", + "N = 400\n", + "A = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n", + "B = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n", + "\n", + "t0 = time.process_time()\n", + "add(A,B)\n", + "t1 = time.process_time()\n", + "prod(A,B)\n", + "t2 = time.process_time()\n", + "\n", + "print(\"Time for add: \", t1-t0)\n", + "print(\"Time for prod:\", t2-t1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sorting a list, slow version\n", + "\n", + "The following code implements a slow version of the so-called *insertion sort* alogithm\n", + "\n", + "Complexity: $O(n^2)$." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running time: 1.2679741750000009\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def correct_position(e, S):\n", + " for i in range(len(S)):\n", + " if S[i] > e:\n", + " return i\n", + " return len(S)\n", + "\n", + "def sort_list(L):\n", + " S = []\n", + " for e in L:\n", + " cp = correct_position(e, S)\n", + " S.insert(cp, e)\n", + " return S\n", + "\n", + "N = 10000\n", + "L = [randint(0,10**9) for i in range(N)]\n", + "\n", + "t0 = time.process_time()\n", + "sort_list(L)\n", + "#L.sort()\n", + "t1 = time.process_time()\n", + "\n", + "print(\"Running time:\", t1-t0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Binary search\n", + "\n", + "The following code implements a binary search.\n", + "\n", + "Complexity: $O(\\log_2(n))$" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The correct position of e = 36132116 in L is:\n", + "... 36130178 36131096 e 36132160 36132386 ...\n", + "\n", + "Time for sorting: 0.4964379069999971\n", + "Time for searching: 0.00012017000000241751\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def binary_search(e, S, start, end):\n", + " if start == end:\n", + " return start\n", + " midpoint = (start+end) // 2\n", + " if e < S[midpoint]:\n", + " return binary_search(e, S, start, midpoint)\n", + " else:\n", + " return binary_search(e, S, midpoint+1, end)\n", + " \n", + "N = 1000000\n", + "L = [randint(0,10**9) for i in range(N)]\n", + "e = randint(0,10**9)\n", + "\n", + "t0 = time.process_time()\n", + "L.sort() # Using Python's sort()\n", + "t1 = time.process_time()\n", + "i = binary_search(e, L, 0, len(L))\n", + "t2 = time.process_time()\n", + "print(\"The correct position of e =\", e, \"in L is:\")\n", + "print(\"...\", L[i-2], L[i-1], \"e\", L[i], L[i+1], \"...\")\n", + "print(\"\")\n", + "print(\"Time for sorting: \", t1-t0)\n", + "print(\"Time for searching:\", t2-t1)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sorting a list, fast version (with binary_search)\n", + "\n", + "The following code uses the function `binary_search()` above instead of `correct_position()` in our insertion sort algorithm.\n", + "\n", + "Complexity: $O(n\\log_2(n))$" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running time: 1.5683504970000008\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def binary_search(e, S, start, end):\n", + " if start == end:\n", + " return start\n", + " midpoint = (start+end) // 2\n", + " if e < S[midpoint]:\n", + " return binary_search(e, S, start, midpoint)\n", + " else:\n", + " return binary_search(e, S, midpoint+1, end)\n", + " \n", + "def sort_list(L):\n", + " S = []\n", + " for e in L:\n", + " cp = binary_search(e, S, 0, len(S)) # Changed here\n", + " S.insert(cp, e)\n", + " return S\n", + " \n", + "N = 100000\n", + "L = [randint(0,10**9) for i in range(N)]\n", + "\n", + "t0 = time.process_time()\n", + "sort_list(L)\n", + "t1 = time.process_time()\n", + "\n", + "print(\"Running time:\", t1-t0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fast exponentiation\n", + "\n", + "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", + "\n", + "Complexity: $O(n)$ for the slow algorithm, $O(\\log_2(n))$ for the other two." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.71828179834636\n", + "2.7182817863957984\n", + "2.7182817983473577\n", + "Time for slow_power(): 3.5567659670000005\n", + "Time for fast_power(): 0.00014241699999928414\n", + "Time for Python's **: 9.477100000054861e-05\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "def slow_power(a, n):\n", + " r = 1\n", + " for i in range(n):\n", + " r = r * a\n", + " return r\n", + "\n", + "def fast_power(a, n):\n", + " if n == 0:\n", + " return 1\n", + " if n%2 == 0:\n", + " return fast_power(a*a, n//2)\n", + " else:\n", + " return a * fast_power(a, n-1)\n", + "\n", + "a = 1.00000001\n", + "n = 100000000\n", + "\n", + "t0 = time.process_time()\n", + "print(slow_power(a, n))\n", + "t1 = time.process_time()\n", + "print(fast_power(a, n))\n", + "t2 = time.process_time()\n", + "print(a**n)\n", + "t3 = time.process_time()\n", + "\n", + "print(\"Time for slow_power():\", t1-t0)\n", + "print(\"Time for fast_power():\", t2-t1)\n", + "print(\"Time for Python's **: \", t3-t2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fast gcd\n", + "\n", + "Complexity: $O(\\log_2(n))$" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "126\n", + "Running time: 0.0002987290000007192\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "def gcd(a, b):\n", + " if b == 0:\n", + " return a\n", + " else:\n", + " return gcd(b, a%b)\n", + "\n", + "t0 = time.process_time()\n", + "print(gcd(155275387236018, 572335397352432))\n", + "t1 = time.process_time()\n", + "\n", + "print(\"Running time:\", t1-t0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fibonacci numbers\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "222232244629420445529739893461909967206666939096499764990979600\n", + "Time for F_slow: 3.0404000000316955e-05\n", + "Time for F_fast: 0.0003859389999973928\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "F_memorized = [-1] * (10**6)\n", + "\n", + "def F_slow(n):\n", + " if n <= 1:\n", + " return n\n", + " else:\n", + " return F_slow(n-1) + F_slow(n-2)\n", + " \n", + "def F_fast(n):\n", + " if F_memorized[n] == -1:\n", + " if n <= 1:\n", + " F_memorized[n] = n\n", + " else:\n", + " F_memorized[n] = F_fast(n-1) + F_fast(n-2)\n", + " \n", + " return F_memorized[n]\n", + "\n", + "n = 300\n", + "\n", + "t0 = time.process_time()\n", + "#print(F_slow(n))\n", + "t1 = time.process_time()\n", + "print(F_fast(n))\n", + "t2 = time.process_time()\n", + "\n", + "print(\"Time for F_slow:\", t1-t0)\n", + "print(\"Time for F_fast:\", t2-t1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture7/notebook/X2-StudentsRequests-notebook.ipynb b/src/Lecture7/notebook/X2-StudentsRequests-notebook.ipynb @@ -0,0 +1,516 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Diffie-Hellman key exchange\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Public key: p = 97021 and g = 66271 \n", + "\n", + "[[ Alice's secret key: a = 19234 ]]\n", + "[[ Bob's secret key: b = 76267 ]] \n", + "\n", + "Alice sends h1 = 17104 to Bob\n", + "Bob sends h2 = 28787 to Alice \n", + "\n", + "Alice computed 62444 using h2 and her secret a\n", + "Bob computed 62444 using h1 and his secret b\n" + ] + } + ], + "source": [ + "# Public information:\n", + "p = Primes()[10^3 + randint(1,10000)] # random prime\n", + "g = randint(2, p-1) # random integer\n", + "\n", + "print(\"Public key: p =\", p, \"and g =\", g, \"\\n\")\n", + "\n", + "a = randint(2, p-1) # Only Alice knows this\n", + "b = randint(2, p-1) # Only Bob knows this\n", + "\n", + "print(\"[[ Alice's secret key: a =\", a, \"]]\")\n", + "print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n", + "\n", + "h1 = (g^a) % p # Alice sends this to Bob\n", + "h2 = (g^b) % p # Bob sends this to Alice\n", + "\n", + "print(\"Alice sends h1 =\", h1, \"to Bob\")\n", + "print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n", + "\n", + "secret_a = (h2^a) % p # Alice can compute this because she knows a\n", + "secret_b = (h1^b) % p # Bob can compute this because he knows b\n", + "\n", + "print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n", + "print(\"Bob computed\", secret_b, \"using h1 and his secret b\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## General Diffie-Hellman\n", + "\n", + "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$." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Public key:\n", + "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", + "g = (35 : 131 : 1) \n", + "\n", + "[[ Alice's secret key: a = 140 ]]\n", + "[[ Bob's secret key: b = 73 ]] \n", + "\n", + "Alice sends h1 = (150 : 80 : 1) to Bob\n", + "Bob sends h2 = (18 : 121 : 1) to Alice \n", + "\n", + "Alice computed (154 : 35 : 1) using h2 and her secret a\n", + "Bob computed (154 : 35 : 1) using h1 and his secret b\n" + ] + } + ], + "source": [ + "def genericDH(G):\n", + " if G.cardinality() == 1:\n", + " print(\"Group is trivial, can't do anything\")\n", + " return\n", + " g = G.random_element()\n", + " while g == G.identity(): # Make sure g is not trivial\n", + " g = G.random_element()\n", + " \n", + " print(\"Public key:\\nG =\", G, \"\\ng =\", g, \"\\n\")\n", + " \n", + " a = randint(2, G.exponent()-1) # Only Alice knows this\n", + " b = randint(2, G.exponent()-1) # Only Bob knows this\n", + "\n", + " print(\"[[ Alice's secret key: a =\", a, \"]]\")\n", + " print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n", + " \n", + " # \"Ternary operator\", I did not explain this\n", + " # https://docs.python.org/3/reference/expressions.html#conditional-expressions\n", + " h1 = g^a if G.is_multiplicative() else a*g # Alice sends this to Bob\n", + " h2 = g^b if G.is_multiplicative() else b*g # Bob sends this to Alice\n", + "\n", + " print(\"Alice sends h1 =\", h1, \"to Bob\")\n", + " print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n", + " \n", + " secret_a = h2^a if G.is_multiplicative() else a*h2 # Alice can compute this because she knows a\n", + " secret_b = h1^b if G.is_multiplicative() else b*h1 # Bob can compute this because he knows b\n", + "\n", + " print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n", + " print(\"Bob computed\", secret_b, \"using h1 and his secret b\")\n", + " \n", + "E = EllipticCurve(GF(157), [1,-1])\n", + "G = E.abelian_group()\n", + "genericDH(G)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Numerical methods for differential equations\n", + "\n", + "## Euler's method (ODE)\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('y')\n", + "\n", + "def euler_desolve(f, x0, y0, x1):\n", + " n = 10000\n", + " h = (x1-x0)/n\n", + " S = []\n", + " Y = [y0]\n", + " for i in range(n+1):\n", + " S.append(x0 + i*h)\n", + " Y.append(N( Y[i] + h*f(S[i], Y[i]) ))\n", + " return S, Y\n", + "\n", + "f(x,y) = y\n", + "x0 = -1\n", + "x1 = 2\n", + "y0 = e^(-1)\n", + "\n", + "S, Y = euler_desolve(f, x0, y0, x1)\n", + "plot(e^x, -1, 2) + line([(S[i], Y[i]) for i in range(len(S))], color='red', marker='o', markersize=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage also has an `eulers_method()` function \"for pedagogical purposes only\":" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " x y h*f(x,y)\n", + " -1 0.367879441171442 0.0367879441171442\n", + "-0.900000000000000 0.404667385288587 0.0404667385288587\n", + "-0.800000000000000 0.445134123817445 0.0445134123817445\n", + "-0.700000000000000 0.489647536199190 0.0489647536199190\n", + "-0.600000000000000 0.538612289819109 0.0538612289819109\n", + "-0.500000000000000 0.592473518801020 0.0592473518801020\n", + "-0.400000000000000 0.651720870681122 0.0651720870681122\n", + "-0.300000000000000 0.716892957749234 0.0716892957749234\n", + "-0.200000000000000 0.788582253524157 0.0788582253524157\n", + "-0.100000000000000 0.867440478876573 0.0867440478876573\n", + "-1.38777878078145e-16 0.954184526764230 0.0954184526764230\n", + "0.0999999999999999 1.04960297944065 0.104960297944065\n", + "0.200000000000000 1.15456327738472 0.115456327738472\n", + "0.300000000000000 1.27001960512319 0.127001960512319\n", + "0.400000000000000 1.39702156563551 0.139702156563551\n", + "0.500000000000000 1.53672372219906 0.153672372219906\n", + "0.600000000000000 1.69039609441897 0.169039609441897\n", + "0.700000000000000 1.85943570386086 0.185943570386086\n", + "0.800000000000000 2.04537927424695 0.204537927424695\n", + "0.900000000000000 2.24991720167165 0.224991720167165\n", + "1.00000000000000 2.47490892183881 0.247490892183881\n", + "1.10000000000000 2.72239981402269 0.272239981402269\n", + "1.20000000000000 2.99463979542496 0.299463979542496\n", + "1.30000000000000 3.29410377496746 0.329410377496746\n", + "1.40000000000000 3.62351415246420 0.362351415246420\n", + "1.50000000000000 3.98586556771062 0.398586556771062\n", + "1.60000000000000 4.38445212448168 0.438445212448168\n", + "1.70000000000000 4.82289733692985 0.482289733692985\n", + "1.80000000000000 5.30518707062284 0.530518707062284\n", + "1.90000000000000 5.83570577768512 0.583570577768512\n", + "2.00000000000000 6.41927635545363 0.641927635545363\n" + ] + } + ], + "source": [ + "# Usage: eulers_method(f, x0, y0, h, x1)\n", + "eulers_method(f, -1, N(e^(-1)), 0.1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving the heat equation with a finite difference method" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGGCAYAAACJ/96MAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAbGUlEQVR4nO3de5DVdf348dcKsQItS1jcCpSK0o28pOsN/QaaNGSU45QVJealwel4QcqUsQve2J9OMRScKJtJCYQYTc0aspgyiIpfC0g1nvmJKJNkomW2uyy1KZzfH37dPLnwZuFcPsDjMXNm53z27Hm/jm/O8uSzxz11xWKxGAAA7NZhtR4AACDrBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJCQuWAqFovR3t4efp8mAJAVmQumjo6OaGxsjI6OjlqP0m3Dhoi6upc/Hszr1uJxHsyP8WB+bLVYLwtrH+z/ja1nvQNp3T2pxEyZCyYAgKwRTAAACb0OptWrV8eUKVNi5MiRUVdXFw888ED351588cW47rrr4t3vfncMHDgwRo4cGdOmTYu//OUvZR0aAKCaeh1MnZ2dcdxxx8WCBQte87kdO3bEhg0b4ktf+lJs2LAh7rvvvti0aVN86EMfKsuwAAC10Le3XzB58uSYPHlyj59rbGyMlStXlhybP39+nHzyyfHUU0/F6NGj921KAIAa6nUw9VZbW1vU1dXF4MGDe/x8V1dXdHV1dV9vb2+v9EgAAL1S0Rd9/+tf/4rrr78+pk6dGoMGDerxNi0tLdHY2Nh9GTVqVCVHAgDotYoF04svvhgf//jHY9euXfHNb35zt7ebNWtWtLW1dV+2bt1aqZEAAPZJRX4k9+KLL8YFF1wQW7ZsiV/84he7PbsUEVFfXx/19fWVGAMAoCzKHkyvxNLjjz8eDz/8cBxxxBHlXgIAoKp6HUzbt2+PzZs3d1/fsmVLbNy4MYYMGRIjR46Mj3zkI7Fhw4b48Y9/HDt37oxt27ZFRMSQIUOiX79+5ZscAKBKeh1M69ati4kTJ3ZfnzlzZkREXHTRRTF79ux48MEHIyLi+OOPL/m6hx9+OCZMmLAfowIA1Eavg2nChAlRLBZ3+/k9fQ4A4EDkveQAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAICEzARTPp+PpqamaG5urvUoAAAlMhNMuVwuCoVCtLa21noUAIASmQkmAICsEkwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAICEzweTNdwGArMpMMHnzXQAgqzITTAAAWSWYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASMhMMOXz+Whqaorm5uZajwIAUCIzwZTL5aJQKERra2utRwEAKJGZYAIAyCrBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACCh18G0evXqmDJlSowcOTLq6urigQceKPl8sViM2bNnx8iRI6N///4xYcKEePTRR8s2MABAtfU6mDo7O+O4446LBQsW9Pj522+/PebOnRsLFiyI1tbWGD58eJxzzjnR0dGx38MCANRC395+weTJk2Py5Mk9fq5YLMa8efPihhtuiPPPPz8iIhYtWhTDhg2LpUuXxvTp0/dvWgCAGijra5i2bNkS27Zti0mTJnUfq6+vj/e+973xm9/8ppxLAQBUTa/PMO3Jtm3bIiJi2LBhJceHDRsWf/rTn3r8mq6urujq6uq+3t7eXs6RAAD2W0X+L7m6urqS68Vi8TXHXtHS0hKNjY3dl1GjRlViJACAfVbWYBo+fHhE/OdM0yuee+6515x1esWsWbOira2t+7J169ZyjgQAsN/KGkxjxoyJ4cOHx8qVK7uP/fvf/45Vq1bF6aef3uPX1NfXx6BBg0ouAABZ0uvXMG3fvj02b97cfX3Lli2xcePGGDJkSIwePTpmzJgRc+bMibFjx8bYsWNjzpw5MWDAgJg6dWpZBwcAqJZeB9O6deti4sSJ3ddnzpwZEREXXXRR3HXXXfGFL3wh/vnPf8ZnP/vZeOGFF+KUU06Jn/3sZ9HQ0FC+qQEAqqjXwTRhwoQoFou7/XxdXV3Mnj07Zs+evT9zAQBkhveSAwBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAEBCZoIpn89HU1NTNDc313oUAIASmQmmXC4XhUIhWltbaz0KAECJzAQTAEBWCSYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkJCZYPLmuwBAVmUmmLz5LgCQVZkJJgCArBJMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJGQmmPL5fDQ1NUVzc3OtRwEAKJGZYMrlclEoFKK1tbXWowAAlMhMMAEAZJVgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJBQ9mB66aWX4otf/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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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/PiZMmBA//vGPY+jQofH73/8+Bg8enPVSAAA1kXkw3XTTTTFy5Mi48847uy876KCDsl4GAKBmMn9JbsmSJXH00UfHpz/96Rg6dGgcccQRcccdd+zw9l1dXdHR0VFxAgDIk8yD6Q9/+EPMnz8/Ro8eHQ8//HBcfPHFcfnll8c999yz3du3trZGU1NT92nkyJFZjwQAsFsyD6atW7fGkUceGXPmzIkjjjgipk+fHhdddFHMnz9/u7efNWtWtLe3d5/Wr1+f9UgAALsl82AaPnx4NDc3V1x2yCGHxPPPP7/d2zc2NsagQYMqTgAAeZJ5MB1//PHx1FNPVVz29NNPx4EHHpj1UgAANZF5MF155ZXxxBNPxJw5c+LZZ5+NRYsWxe233x6FQiHrpQAAaiLzYGppaYkHHngg7rvvvhgzZkzccMMNMXfu3Dj33HOzXgoAoCYy/zlMERFnnHFGnHHGGdW4awCAmvNZcgAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQEJugqlYLEZzc3O0tLTUexQAgAq5CaZCoRClUina2trqPQoAQIXcBBMAQF4JJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABJyE0zFYjGam5ujpaWl3qMAAFTITTAVCoUolUrR1tZW71EAACrkJpgAAPJKMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCAhNwEkw/fBQDyKjfB5MN3AYC8yk0wAQDklWACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASqh5Mra2t0dDQEDNmzKj2UgAAVVHVYGpra4vbb789DjvssGouAwBQVVULps2bN8e5554bd9xxR7zjHe+o1jIAAFVXtWAqFApx+umnx8knn7zT23V1dUVHR0fFCQAgT/pW406/+93vxpo1a97UB+m2trbGddddV40xAAAykfkRpvXr18cVV1wRCxcujL333jt5+1mzZkV7e3v3af369VmPBACwWzI/wrR69erYuHFjHHXUUd2XbdmyJVasWBHz5s2Lrq6u6NOnT/d1jY2N0djYmPUYAACZyTyYPvKRj8RvfvObisumTp0aBx98cFx11VUVsQQAsCfIPJgGDhwYY8aMqbhsn332iX333fcNlwMA7An8pG8AgISq/C+5//azn/2sFssAAFSFI0wAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAEBCboKpWCxGc3NztLS01HsUAIAKuQmmQqEQpVIp2tra6j0KAECF3AQTAEBeCSYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAICE3AXTK69UfgUAqLfcBNO2D9899tjzIiLi6afrPBAAwL/kJpi2ffjuggUL6z0KAECF3AQTAEBeCSYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAAS+tZ7gG2KxWIUi8Xo7HxvvUcBAKiQmyNMhUIhSqVSLFiwsN6jAABUyE0wAQDklWACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkJB5MLW2tkZLS0sMHDgwhg4dGh//+MfjqaeeynoZAICayTyYli9fHoVCIZ544olYtmxZvPbaa3HqqadGZ2dn1ksBANRE5h+N8tBDD1Wcv/POO2Po0KGxevXqOPHEE7NeDgCg6qr+Hqb29vaIiBgyZEi1lwIAqIqqfvhuuVyOmTNnxgknnBBjxozZ7m26urqiq6ur+3xn5+ZqjgQA0GNVDaZLL700fv3rX8fKlSt3eJvW1ta47rrr/uOSw6o5EgBAj1XtJbnLLrsslixZEo899li8+93v3uHtZs2aFe3t7d2npUt/XK2RAAB2SeZHmMrlclx22WXxwAMPxM9+9rMYNWrUTm/f2NgYjY2N3ef32SfriQAAdk/mwVQoFGLRokXxgx/8IAYOHBgbNmyIiIimpqbo379/1ssBAFRd5i/JzZ8/P9rb22P8+PExfPjw7tPixYuzXgoAoCaq8pIcAMBbic+SAwBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEqr64bs9USwWo1gsRmfne+s9CgBAhdwcYSoUClEqlWLBgoX1HgUAoEJuggkAIK8EEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAl96z3ANsViMYrFYnR2vrfeowAAVMjNEaZCoRClUikWLFhY71EAACrkJpgAAPJKMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJDQt94DbFMsFqNYLEZn53vrPQoAQIXcHGEqFApRKpViwYKF9R4FAKBCboIJACCvBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASKjZh++Wy+XYtGnTGy7v6uqKrq6u7vN/+lNnRER0dnZER0etptu5zZv//bWWM9V6XevtmWv1hvV68/pv9b31e2nNPBg4cGA0NDTs9DYN5XK5XIthOjo6oqmpqRZLAQC8ae3t7TFo0KCd3qZmwfRmjzA99tifYsqUI+P73/9/ccopw6s+V0tLS7S1te30NmvXRnz4wxHLl0ccfnh118pi3Z6us6vrdXR0xMiRI2P9+vXJP2i7u96uPqZdWa9Wa2WxzptZb3f3qSfrZfmYdmX9atjeY6rG+jvap2qstbN9ynq91J+JWn5/zWKtnjyfdne9XXk+1frvjZ6uWavvET39vvdmjjDV7CW5hoaGNzX0O9/5+tuqBgwYmNk3953p06dPcp23v/3fX3dnpDezVhbr9nSd3V1v0KBBVV9vVx/TrqxXq7WyWKcn6+3qPvVkvSwf066sXw3be0zVXP+/96kaa+1sn7JeL/VnopbfX7N8bG/m+bS76+3K86nWf2/0dM1afY/YJsvve73+Td+FQuEtt1YtH1Ot2Kc9g8e0Z/B82jPYp3wRTP5A7hHs057BY9ozeD7tGexTvuQumPr161fxlfxqbGyMr3zlK9HY2FjvUdgJ+7RnsE97Bvu0Z6jGPtXsPUxv1tve1q/iK/nV2NgYs2fPrvcYJNinPYN92jPYpz1DNfYpd0eYAADyRjABACQIJgCABMHEDt12220xatSo2HvvveOoo46Kn//85zu87f333x+nnHJK7LfffjFo0KA47rjj4uGHH67htL3XbbfdFmeccUZERJx77rk73af/9Itf/CL69u0bh1f7Jz8SET17PkW8/kN9r7nmmjj99NMjIuLMM8+M73znO7UYtdfr6V7de++9MXbs2BgwYEAMHz48pk6dGn/5y19qNC3/acWKFTFp0qQYMWJENDQ0xIMPPpjZfQsmtmvx4sUxY8aMuOaaa+LJJ5+MD33oQzFx4sR4/vnnt3v7FStWxCmnnBJLly6N1atXx4QJE2LSpEnx5JNP1njy3mXbPk2bNi0iIo444oid7tM27e3tMWXKlPjIRz5SizF7vZ4+nyIizjrrrHj00Ufj2muvjYiIOXPmxMEHH1yrkXutnu7VypUrY8qUKTFt2rT43e9+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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkwAAAGGCAYAAACJ/96MAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAbSUlEQVR4nO3de5DVdf348dcKueq6uwTFzbzQSCmiaLhoYgXeGlTSaUoNCzVtcDyKSHlh7IJd2HR+MszIkdJKDYTIxmuDF8ZUvGSz3Mo8fb0yqSk5OrbAapvC+f1hbJ0E3iz7ORfg8Zg5s3M+57P7fh0+nOXJ5+yeU1csFosBAMBm7VLtAQAAap1gAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEmoumIrFYqxZsya8niYAUCtqLpgefXRtNDc3x6OPrq32KF2WL4+oq3v/ozW3v7V29PV25PtWqzPsyH/mO/J9s96Os2Y11FwwAQDUGsEEAJDQ7WBasmRJjB8/PgYPHhx1dXVx5513dt327rvvxuWXXx4HH3xwNDQ0xODBg2PixInx6quvZjo0AEAldTuYOjo6YsSIETF79uwP3Pb222/H8uXL4zvf+U4sX748br/99nj22WfjC1/4QibDAgBUQ+/ufsK4ceNi3Lhxm7ytubk5Fi9eXLLtuuuui1GjRsVLL70U++yzz7ZNCQBQRd0Opu5qb2+Purq66NOnzyZv7+zsjM7Ozq7rHR3ryj0SAEC3lPWHvv/5z3/GFVdcERMmTIimpqZN7tPa2hrNzc1dlxNP3PTZKwCAailbML377rtxxhlnxIYNG+L666/f7H7Tpk2L9vb2rsuiRfeWayQAgG1Slqfk3n333TjttNNi1apV8bvf/W6zZ5ciIurr66O+vr7rekNDOSYCANh2mQfTxlh67rnn4qGHHop+/fplvQQAQEV1O5jWrVsXzz//fNf1VatWxcqVK6Nv374xePDg+NKXvhTLly+P3/72t7F+/fpYvXp1RET07ds3dt111+wmBwCokG4H09KlS2Ps2LFd16dOnRoREWeddVZMnz497r777oiIOPTQQ0s+76GHHooxY8b0YFQAgOrodjCNGTMmisXiZm/f0m0AANsj7yUHAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAklOW95LZFPp+PfD4fHR37V3sUAIASNXOGKZfLRaFQiLlz51V7FACAEjUTTAAAtUowAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEb74LAJBQM2eYvPkuAFCraiaYAABqlWACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgoXe1B9gon89HPp+Pjo79qz0KAECJmjnDlMvlolAoxNy586o9CgBAiZoJJgCAWiWYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACR0O5iWLFkS48ePj8GDB0ddXV3ceeedJbcXi8WYPn16DB48OHbfffcYM2ZMPP3005kNDABQad0Opo6OjhgxYkTMnj17k7dfc801MXPmzJg9e3a0tbXFwIED4/jjj4+1a9f2eFgAgGro9lujjBs3LsaNG7fJ24rFYsyaNSuuvPLK+OIXvxgREbfccksMGDAg5s+fH5MmTerZtAAAVZDpzzCtWrUqVq9eHSeccELXtvr6+vjc5z4XTzzxRJZLAQBUTKZvvrt69eqIiBgwYEDJ9gEDBsRf//rXTX5OZ2dndHZ2dl3v6FiX5UgAAD1Wlt+Sq6urK7leLBY/sG2j1tbWaG5u7rqceOKmn+4DAKiWTINp4MCBEfGfM00bvf766x8467TRtGnTor29veuyaNG9WY4EANBjmQbTkCFDYuDAgbF48eKubf/617/ikUceiaOOOmqTn1NfXx9NTU1dl4aGPbMcCQCgx7r9M0zr1q2L559/vuv6qlWrYuXKldG3b9/YZ599YsqUKTFjxowYOnRoDB06NGbMmBF77LFHTJgwIdPBAQAqpdvBtHTp0hg7dmzX9alTp0ZExFlnnRU333xzXHbZZfHOO+/EBRdcEG+99VYcccQR8cADD0RjY2N2UwMAVFC3g2nMmDFRLBY3e3tdXV1Mnz49pk+f3pO5AABqhveSAwBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAEBCt1+4slzy+Xzk8/no6Ni/2qMAAJSomTNMuVwuCoVCzJ07r9qjAACUqJlgAgCoVYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACR4810AgISaOcPkzXcBgFpVM8EEAFCrBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJvas9wEb5fD7y+Xx0dOxf7VEAAErUzBmmXC4XhUIh5s6dV+1RAABK1EwwAQDUKsEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAICHzYHrvvffi29/+dgwZMiR23333+PjHPx7f//73Y8OGDVkvBQBQEZm/0vfVV18dP/nJT+KWW26Jgw46KJYuXRrnnHNONDc3x8UXX5z1cgAAZZd5MP3+97+PU045JU466aSIiNhvv/1iwYIFsXTp0qyXAgCoiMyfkjv66KPjwQcfjGeffTYiIv74xz/GY489FieeeGLWSwEAVETmZ5guv/zyaG9vjwMOOCB69eoV69evjx/96Efxla98ZZP7d3Z2RmdnZ9f1jo51WY8EANAjmQfTwoULY968eTF//vw46KCDYuXKlTFlypQYPHhwnHXWWR/Yv7W1Na666qr/2nJI1iMBAPRI5k/JXXrppXHFFVfEGWecEQcffHB87Wtfi0suuSRaW1s3uf+0adOivb2967Jo0b1ZjwQA0COZn2F6++23Y5ddSjusV69em31Zgfr6+qivr++63tCQ9UQAAD2TeTCNHz8+fvSjH8U+++wTBx10UKxYsSJmzpwZX//617NeCgCgIjIPpuuuuy6+853vxAUXXBCvv/56DB48OCZNmhTf/e53s14KAKAiMg+mxsbGmDVrVsyaNSvrLw0AUBXeSw4AIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAHYob78dsXz5+x+zUjPBlM/nY9iwYfG1r3212qMAANux//u/iJEj3/+YlZoJplwuF4VCIebOnVftUQAAStRMMAEA1CrBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQELvag+wUT6fj3w+Hx0d+1d7FACAEjVzhimXy0WhUIi5c+dVexQAgBI1E0wAALVKMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJDQu9oDbJTP5yOfz0dHx/7VHgUAoETNnGHK5XJRKBRi7tx51R4FAKBEzQQTAECtEkwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEsoSTH/729/iq1/9avTr1y/22GOPOPTQQ2PZsmXlWAoAoOwyf6Xvt956K0aPHh1jx46Ne++9N/r37x8vvPBC9OnTJ+ulAAAqIvNguvrqq2PvvfeOm266qWvbfvvtl/UyAAAVk/lTcnfffXccfvjh8eUvfzn69+8fhx12WNx4442b3b+zszPWrFnTdenoWJf1SAAAPZJ5ML344osxZ86cGDp0aNx///1x/vnnx+TJk+OXv/zlJvdvbW2N5ubmrsuJJ47LeiQAgB7JPJg2bNgQn/rUp2LGjBlx2GGHxaRJk+Ib3/hGzJkzZ5P7T5s2Ldrb27suixbdm/VIAAA9knkwDRo0KIYNG1ay7cADD4yXXnppk/vX19dHU1NT16WhYc+sRwIA6JHMg2n06NHxzDPPlGx79tlnY9999816KQCAisg8mC655JJ48sknY8aMGfH888/H/Pnz44YbbohcLpf1UgAAFZF5MLW0tMQdd9wRCxYsiOHDh8cPfvCDmDVrVpx55plZLwUAUBGZvw5TRMTJJ58cJ598cjm+NABAxXkvOQCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIKEsr8O0LfL5fOTz+ejo2L/aowAAlKiZM0y5XC4KhULMnTuv2qMAAJSomWACAKhVggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAICE3tUeYKN8Ph/5fD46Ovav9igAACVq5gxTLpeLQqEQc+fOq/YoAAAlaiaYAABqlWACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAnefBcAIKFmzjB5810AoFbVTDABANQqwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACSUPZhaW1ujrq4upkyZUu6lAADKoqzB1NbWFjfccEMccsgh5VwGAKCsyhZM69atizPPPDNuvPHG+PCHP1yuZQAAyq5swZTL5eKkk06K4447bov7dXZ2xpo1a7ouHR3ryjUSAMA26V2OL/qrX/0qli9fHm1tbcl9W1tb46qrrvqvLZ6+AwBqS+ZnmF5++eW4+OKLY968ebHbbrsl9582bVq0t7d3XRYtujfrkQAAeiTzM0zLli2L119/PUaOHNm1bf369bFkyZKYPXt2dHZ2Rq9evbpuq6+vj/r6+q7rDQ1ZTwQA0DOZB9Oxxx4bTz31VMm2c845Jw444IC4/PLLS2IJAGB7kHkwNTY2xvDhw0u2NTQ0RL9+/T6wHQBge+CVvgEAEsryW3L/6+GHH67EMgAAZeEMEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkFCR12HaGvl8PvL5fHR07F/tUQAAStTMGaZcLheFQiHmzp1X7VEAAErUTDABANQqwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAErz5LgBAQs2cYfLmuwBAraqZYAIAqFWCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgITe1R5go3w+H/l8Pjo69q/2KAAAJWrmDFMul4tCoRB/+MO8iIj4xCeqPBAAwL/VTDBttMcepR8BAKqt5oIJAKDWCCYAgATBBACQIJgAABIEEwBAgmACAEjIPJhaW1ujpaUlGhsbo3///nHqqafGM888k/UyAAAVk3kwPfLII5HL5eLJJ5+MxYsXx3vvvRcnnHBCdHR0ZL0UAEBFZP7WKPfdd1/J9Ztuuin69+8fy5Yti89+9rNZLwcAUHZl/xmm9vb2iIjo27dvuZcCACiLsr75brFYjKlTp8bRRx8dw4cP3+Q+nZ2d0dnZ2XV9zZo15RwJAKDbynqG6cILL4w//elPsWDBgs3u09raGs3NzV2Xvffeu5wjAQB0W9mC6aKLLoq77747HnroofjYxz622f2mTZsW7e3tXZeXX365XCMBAGyTzJ+SKxaLcdFFF8Udd9wRDz/8cAwZMmSL+9fX10d9fX3WYwAAZCbzYMrlcjF//vy46667orGxMVavXh0REc3NzbH77rtnvRwAQNll/pTcnDlzor29PcaMGRODBg3quixcuDDrpQAAKqIsT8kBAOxIvJccAECCYAIASBBMAAAJggkAIEEwAQAkCCYAgATBBACQUDPBlM/nY9iwYdHS0lLtUQAAStRMMOVyuSgUCtHW1lbtUQAAStRMMAEA1CrBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQELNBFM+n49hw4ZFS0tLtUcBAChRM8GUy+WiUChEW1tbtUcBAChRM8EEAFCrBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJNRNM+Xw+hg0bFi0tLdUeBQCgRM0EUy6Xi0KhEG1tbdUeBQCgRM0EEwBArRJMAAAJggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACChd6UWKhaLsXbt2g9s7+zsjM7Ozq7rG/dZs2ZNpUZLWrfuPx8rNdaOvmal79+OvN6OfN9qdYYd+c98R75v1ttx1kzp7kyNjY1RV1e3xX3qisViMYPZktasWRPNzc2VWAoAYKu1t7dHU1PTFvepWDBt7Rmm1157LUaNGhWFQiH22muvss/V0tISbW1tW9xn5cqIz30u4pFHIg49tLxrZbFmd9bpyZpr1qyJvffeO15++eXkX7SerrWt92lb1uvpWlu7XhbrbM1aPTlO3V0vq/vUkxmytqn7VI71t3Scsl5vS8epkmtlud7W/t3r6XrdfTxV+nv5tq7Xk8dupb+/bo3HH18XJ564ZyxatC5Gj94zuf/WnGGq2FNydXV13fpm3djYmMk395RevXol19lzz/987MlIW7NWFmt2Z50s1mxqaur2et1da1vv07as19O1tna9LNbZ2rUitu04dXe9rO5TT2bI2qbuUznX39Rxynq9LR2nSq6V5Xpb+3cvq/W29vFU6e/l27peTx67lf7+ujUaGnaJiD2joWGXaGpKB9PW2Ol/6DuXy+1wa1XyPlWK47R9cJ+2Dx5P2wfHqbYIJn8htwuO0/bBfdo+eDxtHxyn2lJzwVRfX1/ykdpVX18f3/ve9xyrGuc4bR8cp+2D47R92HXXXUs+ZqFiP8O0tQTT9qO+vj6mT59e7TFIcJy2D47T9sFx2j6UI5hq7gwTAECtEUwAAAmCCQAgQTCxWddff30MGTIkdttttxg5cmQ8+uijm9339ttvj+OPPz4++tGPRlNTU3z605+O+++/v4LT7rx+/etfR0TEkUcemTxO/+3xxx+P3r17x6HlfuVHIqJ7j6eI91/U98orr4x99903jjjiiIiIuOuuuyox6k6vu8fq1ltvjREjRsQee+wRgwYNinPOOSfefPPNCk3Lf1uyZEmMHz8+Pv/5z0dExEMPPZTZ1xZMbNLChQtjypQpceWVV8aKFSviM5/5TIwbNy5eeumlTe6/ZMmSOP7442PRokWxbNmyGDt2bIwfPz5WrFhR4cl3LgsXLoxrr/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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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/vtt18sXLiwGksBAFRdz6zv8N13343DDjssRo8eHQ899FAMHDgwXnvttdh+++2zXgoAoCYyD6brr78+hg4dGrfffnvXtt122y3rZQAAaibzl+QeeOCBOOigg+JrX/taDBw4MPbff/+47bbb1rt/Z2dndHR0VFwAAPIk82B6/fXXY8aMGbHHHnvEI488Euedd15ceOGF8Ytf/GKd+7e2tkZTU1PXZejQoVmPBACwSTIPpjVr1sQBBxwQU6dOjf333z/OPffc+Na3vhUzZsxY5/6TJ0+O9vb2rsvSpUuzHgkAYJNkHkyDBw+O5ubmim177bVXvPnmm+vcv7GxMfr161dxAQDIk8yD6bDDDouXXnqpYtvLL78cu+66a9ZLAQDURObBdMkll8Szzz4bU6dOjVdffTVmz54dt956axQKhayXAgCoicyDqaWlJe69996YM2dOjBgxIr7zne/EtGnT4rTTTst6KQCAmsj89zBFRJxwwglxwgknVOOuAQBqznvJAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACbkJpmKxGM3NzdHS0lLvUQAAKuQmmAqFQpRKpWhra6v3KAAAFXITTAAAeSWYAAASBBMAQIJgAgBIEEwAAAmCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASMhNMBWLxWhubo6WlpZ6jwIAUCE3wVQoFKJUKkVbW1u9RwEAqJCbYAIAyCvBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASchNM3nwXAMir3ASTN98FAPIqN8EEAJBXggkAIEEwAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEioejC1trZGQ0NDXHzxxdVeCgCgKqoaTG1tbXHrrbfGvvvuW81lAACqqmrBtHLlyjjttNPitttui89+9rPVWgYAoOqqFkyFQiGOP/74OOaYYz51v87Ozujo6Ki4AADkSc9q3Okvf/nLWLRo0Qa9kW5ra2tce+211RgDACATmZ9hWrp0aVx00UVx1113Re/evZP7T548Odrb27suS5cuzXokAIBNkvkZpoULF8by5cvjwAMP7Nq2evXqmD9/fkyfPj06OzujR48eXbc1NjZGY2Nj1mMAAGQm82A6+uij4/nnn6/YdvbZZ8fw4cPj8ssvr4glAIDNQebB1Ldv3xgxYkTFtu222y4GDBiw1nYAgM2B3/QNAJBQlf8l95+eeOKJWiwDAFAVzjABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJuQmmYrEYzc3N0dLSUu9RAAAq5CaYCoVClEqlaGtrq/coAAAVchNMAAB5JZgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQEJugsmb7wIAeZWbYPLmuwBAXuUmmAAA8kowAQAkCCYAgATBBACQIJgAABIEEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkJCbYCoWi9Hc3BwtLS31HgUAoEJugqlQKESpVIq2trZ6jwIAUCE3wQQAkFeCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAEBC5sHU2toaLS0t0bdv3xg4cGB8+ctfjpdeeinrZQAAaibzYHryySejUCjEs88+G/PmzYuPPvooxowZE6tWrcp6KQCAmuiZ9R0+/PDDFddvv/32GDhwYCxcuDD+53/+J+vlAACqruo/w9Te3h4REf3796/2UgAAVZH5GaZ/Vy6XY+LEiXH44YfHiBEj1rlPZ2dndHZ2dl3v6Oio5kgAAN1W1TNMF1xwQfzpT3+KOXPmrHef1tbWaGpq6roMHTq0miMBAHRb1YJpwoQJ8cADD8Tjjz8eO++883r3mzx5crS3t3ddli5dWq2RAAA2SuYvyZXL5ZgwYULce++98cQTT8SwYcM+df/GxsZobGzMegwAgMxkHkyFQiFmz54d999/f/Tt2zeWLVsWERFNTU2x7bbbZr0cAEDVZf6S3IwZM6K9vT1GjRoVgwcP7rrMnTs366UAAGqiKi/JAQBsSbyXHABAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkJCbYCoWi9Hc3BwtLS31HgUAoEJugqlQKESpVIq2trZ6jwIAUCE3wQQAkFeCCQAgQTABACQIJgCABMEEAJAgmAAAEgQTAECCYAIASBBMAAAJggkAIEEwAQAk5C6Y3nuv8iMAQL3lJpiKxWI0NzfHIYecHhERL79c54EAAP5PboKpUChEqVSKO++8q96jAABUyE0wAQDklWACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIEEwAAAmCCQAgoWe9B/hEsViMYrEYq1b9d71HAQCokJszTIVCIUqlUtx55131HgUAoEJuggkAIK8EEwBAgmACAEgQTAAACYIJACBBMAEAJAgmAIAEwQQAkCCYAAASBBMAQIJgAgBIqNmb75bL5VixYsVa2zs7O6Ozs7Pr+t//vioiIlat6oiOjlpN9+lWrvzXx1rNVOs1t+T1PLbNd708z7El/9lvyY+t1uttyY+tnmtmrW/fvtHQ0PCp+zSUy+VyLYbp6OiIpqamWiwFALDB2tvbo1+/fp+6T82CaUPPMD3++N9j/PgD4le/+n9x7LGDqz5XS0tLtLW1feo+ixdHHHlkxJNPRuy3X3XXymLN7qyzKet1dHTE0KFDY+nSpcm/aJu63sY8pnqs1Z31NnWdDV1rU45Td9fL4jFlMUeW1veYsp4hdZyyXC91nGq5Vlbr1erra3efT5vD1/KNXWtj1qzV14juHqcNOcNUs5fkGhoaNmjoHXb4+Meq+vTpu8lf3DdEjx49kut85jP/+rgpI23IWlms2Z11slivX79+VV9vYx5TPdbqznqbuk531orYuOPU3fWyeExZzJGl9T2mas2wvuOU5Xqp41TLtbJar1ZfXz+xoc+nzeVrea2+xtbqa8Qnsvi694mt/oe+C4XCFrdWLR9TrThOmwePafPg+bR5cJzyRTD5C7lZcJw2Dx7T5sHzafPgOOVL7oKpV69eFR/Jr8bGxrjmmmuisbGx3qPwKRynzYPjtHlwnDYP1ThONfsZpg31X//Vq+Ij+dXY2BhTpkyp9xgkOE6bB8dp8+A4bR6qcZxyd4YJACBvBBMAQIJgAgBIEEys1y233BLDhg2L3r17x4EHHhi///3v17vvPffcE8cee2x87nOfi379+sUXv/jFeOSRR2o47dbthBNO2KDj9O+efvrp6NmzZ+xX7d/8SER07/kU8fEv9b3iiiti1113jcbGxjjxxBNrNCndPVazZs2KkSNHRp8+fWLw4MFx9tlnxzvvvFOjafl38+fPj3HjxsWQIUOioaEh7rvvvszuWzCxTnPnzo2LL744rrjiinjuuefiiCOOiLFjx8abb765zv3nz58fxx57bDz44IOxcOHCGD16dIwbNy6ee+65Gk++dXn00UcjIuKcc87ZoOP0ifb29hg/fnwcffTRtRhzq9fd51NExEknnRSPPfZY/OxnP4uXXnoppk6dWsOJt17dPVZPPfVUjB8/Ps4555x44YUX4u677462trb45je/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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "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/9YsSIEVttBwDYHfhN3wAA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+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", + "text/plain": [ + "Graphics object consisting of 1 graphics primitive" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def heat_fdm(u0j, u1j, ui0):\n", + " m, n = len(u0j)-1, len(ui0)-1\n", + " k, h = 1/m, 1/n\n", + " \n", + " u = [[0] * (m+1) for i in range(n+1)]\n", + " for j in range(m+1):\n", + " u[0][j] = u0j[j]\n", + " for j in range(m+1):\n", + " u[n][j] = u1j[j]\n", + " for i in range(n+1):\n", + " u[i][0] = ui0[i]\n", + " \n", + " for j in range(0,m):\n", + " for i in range(1,n):\n", + " u[i][j+1] = (k/(h*h)) * (u[i+1][j] - 2*u[i][j] + u[i-1][j]) + u[i][j]\n", + " \n", + " return u\n", + "\n", + "n, m = 20, 20\n", + "u0j = [10 - (j/m)*10 for j in range(m+1)] # One extreme goes from hot to cold\n", + "u1j = [(j/m)*10 for j in range(m+1)] # The other does the opposite\n", + "ui0 = [10 - (i/m)*10 for i in range(0,n+1)]\n", + "\n", + "u = heat_fdm(u0j, u1j, ui0)\n", + "for t in range(m+1):\n", + " show(line([(i/n, u[i][t]) for i in range(n+1)], ymin=-1, ymax =12))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.0", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-checkpoint.ipynb b/src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-checkpoint.ipynb @@ -0,0 +1,394 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Nested loops\n", + "\n", + "The following two functions compute sum and product of matrices, respectively.\n", + "\n", + "By counting the nested loops it is easy to see that `add()` is $O(n^2)$ while `prod()` is $O(n^3)$." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time for add: 0.00012074300000008975\n", + "Time for prod: 0.00036587199999971176\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def add(A, B):\n", + " S = [[0] * len(A) for i in range(len(A))]\n", + " for i in range(len(A)):\n", + " for j in range(len(A)):\n", + " S[i][j] = A[i][j] + B[i][j]\n", + " return S\n", + "\n", + "def prod(A, B):\n", + " S = [[0] * len(A) for i in range(len(A))]\n", + " for i in range(len(A)):\n", + " for j in range(len(A)):\n", + " for k in range(len(A)):\n", + " S[i][j] = S[i][j] + A[i][k] * B[k][j]\n", + " return S\n", + "\n", + "N = 10\n", + "A = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n", + "B = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n", + "\n", + "t0 = time.process_time()\n", + "add(A,B)\n", + "t1 = time.process_time()\n", + "prod(A,B)\n", + "t2 = time.process_time()\n", + "\n", + "print(\"Time for add: \", t1-t0)\n", + "print(\"Time for prod:\", t2-t1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sorting a list, slow version\n", + "\n", + "The following code implements a slow version of the so-called *insertion sort* alogithm\n", + "\n", + "Complexity: $O(n^2)$." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running time: 1.1012288430000012\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def correct_position(e, S):\n", + " for i in range(len(S)):\n", + " if S[i] > e:\n", + " return i\n", + " return len(S)\n", + "\n", + "def sort_list(L):\n", + " S = []\n", + " for e in L:\n", + " cp = correct_position(e, S)\n", + " S.insert(cp, e)\n", + " return S\n", + "\n", + "N = 10000\n", + "L = [randint(0,10**9) for i in range(N)]\n", + "\n", + "t0 = time.process_time()\n", + "sort_list(L)\n", + "t1 = time.process_time()\n", + "\n", + "print(\"Running time:\", t1-t0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Binary search\n", + "\n", + "The following code implements a binary search.\n", + "\n", + "Complexity: $O(\\log_2(n))$" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The correct position of e = 658230309 in L is:\n", + "... 658211821 658224379 e 658234625 658246765 ...\n", + "\n", + "Time for sorting: 0.021211020999999164\n", + "Time for searching: 7.820199999741817e-05\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def binary_search(e, S, start, end):\n", + " if start == end:\n", + " return start\n", + " midpoint = (start+end) // 2\n", + " if e < S[midpoint]:\n", + " return binary_search(e, S, start, midpoint)\n", + " else:\n", + " return binary_search(e, S, midpoint+1, end)\n", + " \n", + "N = 100000\n", + "L = [randint(0,10**9) for i in range(N)]\n", + "e = randint(0,10**9)\n", + "\n", + "t0 = time.process_time()\n", + "L.sort() # Using Python's sort()\n", + "t1 = time.process_time()\n", + "i = binary_search(e, L, 0, len(L))\n", + "t2 = time.process_time()\n", + "print(\"The correct position of e =\", e, \"in L is:\")\n", + "print(\"...\", L[i-2], L[i-1], \"e\", L[i], L[i+1], \"...\")\n", + "print(\"\")\n", + "print(\"Time for sorting: \", t1-t0)\n", + "print(\"Time for searching:\", t2-t1)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sorting a list, fast version (with binary_search)\n", + "\n", + "The following code uses the function `binary_search()` above instead of `correct_position()` in our insertion sort algorithm.\n", + "\n", + "Complexity: $O(n\\log_2(n))$" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running time: 0.03710268399998995\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def binary_search(e, S, start, end):\n", + " if start == end:\n", + " return start\n", + " midpoint = (start+end) // 2\n", + " if e < S[midpoint]:\n", + " return binary_search(e, S, start, midpoint)\n", + " else:\n", + " return binary_search(e, S, midpoint+1, end)\n", + " \n", + "def sort_list(L):\n", + " S = []\n", + " for e in L:\n", + " cp = binary_search(e, S, 0, len(S)) # Changed here\n", + " S.insert(cp, e)\n", + " return S\n", + " \n", + "N = 10000\n", + "L = [randint(0,10**9) for i in range(N)]\n", + "\n", + "t0 = time.process_time()\n", + "sort_list(L)\n", + "t1 = time.process_time()\n", + "\n", + "print(\"Running time:\", t1-t0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fast exponentiation\n", + "\n", + "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", + "\n", + "Complexity: $O(n)$ for the slow algorithm, $O(\\log_2(n))$ for the other two." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.71828179834636\n", + "2.7182817863957984\n", + "2.7182817983473577\n", + "Time for slow_power(): 3.234879998000004\n", + "Time for fast_power(): 9.059099999575437e-05\n", + "Time for Python's **: 0.00010159500000384014\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "def slow_power(a, n):\n", + " r = 1\n", + " for i in range(n):\n", + " r = r * a\n", + " return r\n", + "\n", + "def fast_power(a, n):\n", + " if n == 0:\n", + " return 1\n", + " if n%2 == 0:\n", + " return fast_power(a*a, n//2)\n", + " else:\n", + " return a * fast_power(a, n-1)\n", + "\n", + "a = 1.00000001\n", + "n = 100000000\n", + "\n", + "t0 = time.process_time()\n", + "print(slow_power(a, n))\n", + "t1 = time.process_time()\n", + "print(fast_power(a, n))\n", + "t2 = time.process_time()\n", + "print(a**n)\n", + "t3 = time.process_time()\n", + "\n", + "print(\"Time for slow_power():\", t1-t0)\n", + "print(\"Time for fast_power():\", t2-t1)\n", + "print(\"Time for Python's **: \", t3-t2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fast gcd\n", + "\n", + "Complexity: $O(\\log_2(n))$" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "126\n", + "Running time: 0.00017707599999994272\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "def gcd(a, b):\n", + " if b == 0:\n", + " return a\n", + " else:\n", + " return gcd(b, a%b)\n", + "\n", + "t0 = time.process_time()\n", + "print(gcd(155275387236018, 572335397352432))\n", + "t1 = time.process_time()\n", + "\n", + "print(\"Running time:\", t1-t0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fibonacci numbers\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "F_memorized = [-1] * (10**6)\n", + "\n", + "def F_slow(n):\n", + " if n <= 1:\n", + " return n\n", + " else:\n", + " return F_slow(n-1) + F_slow(n-2)\n", + " \n", + "def F_fast(n):\n", + " if F_memorized[n] == -1:\n", + " if n <= 1:\n", + " F_memorized[n] = n\n", + " else:\n", + " F_memorized[n] = F_fast(n-1) + F_fast(n-2)\n", + " \n", + " return F_memorized[n]\n", + "\n", + "n = 40\n", + "\n", + "t0 = time.process_time()\n", + "print(F_slow(n))\n", + "t1 = time.process_time()\n", + "print(F_fast(n))\n", + "t2 = time.process_time()\n", + "\n", + "print(\"Time for F_slow:\", t1-t0)\n", + "print(\"Time for F_fast:\", t2-t1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-notebook-checkpoint.ipynb b/src/Lecture7/slides/.ipynb_checkpoints/X1-ComputationalComplexity-notebook-checkpoint.ipynb @@ -0,0 +1,412 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Nested loops\n", + "\n", + "The following two functions compute sum and product of matrices, respectively.\n", + "\n", + "By counting the nested loops it is easy to see that `add()` is $O(n^2)$ while `prod()` is $O(n^3)$." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time for add: 0.005766554000000035\n", + "Time for prod: 1.3871021639999999\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def add(A, B):\n", + " S = [[0] * len(A) for i in range(len(A))]\n", + " for i in range(len(A)):\n", + " for j in range(len(A)):\n", + " S[i][j] = A[i][j] + B[i][j]\n", + " return S\n", + "\n", + "def prod(A, B):\n", + " S = [[0] * len(A) for i in range(len(A))]\n", + " for i in range(len(A)):\n", + " for j in range(len(A)):\n", + " for k in range(len(A)):\n", + " S[i][j] = S[i][j] + A[i][k] * B[k][j]\n", + " return S\n", + "\n", + "N = 200\n", + "A = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n", + "B = [ [randint(0,100) for i in range(N)] for j in range(N) ]\n", + "\n", + "t0 = time.process_time()\n", + "add(A,B)\n", + "t1 = time.process_time()\n", + "prod(A,B)\n", + "t2 = time.process_time()\n", + "\n", + "print(\"Time for add: \", t1-t0)\n", + "print(\"Time for prod:\", t2-t1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sorting a list, slow version\n", + "\n", + "The following code implements a slow version of the so-called *insertion sort* alogithm\n", + "\n", + "Complexity: $O(n^2)$." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running time: 1.1191449070000001\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def correct_position(e, S):\n", + " for i in range(len(S)):\n", + " if S[i] > e:\n", + " return i\n", + " return len(S)\n", + "\n", + "def sort_list(L):\n", + " S = []\n", + " for e in L:\n", + " cp = correct_position(e, S)\n", + " S.insert(cp, e)\n", + " return S\n", + "\n", + "N = 10000\n", + "L = [randint(0,10**9) for i in range(N)]\n", + "\n", + "t0 = time.process_time()\n", + "sort_list(L)\n", + "t1 = time.process_time()\n", + "\n", + "print(\"Running time:\", t1-t0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Binary search\n", + "\n", + "The following code implements a binary search.\n", + "\n", + "Complexity: $O(\\log_2(n))$" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The correct position of e = 216197744 in L is:\n", + "... 216196218 216197540 e 216198673 216198962 ...\n", + "\n", + "Time for sorting: 0.26413054400000036\n", + "Time for searching: 9.616099999965044e-05\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def binary_search(e, S, start, end):\n", + " if start == end:\n", + " return start\n", + " midpoint = (start+end) // 2\n", + " if e < S[midpoint]:\n", + " return binary_search(e, S, start, midpoint)\n", + " else:\n", + " return binary_search(e, S, midpoint+1, end)\n", + " \n", + "N = 1000000\n", + "L = [randint(0,10**9) for i in range(N)]\n", + "e = randint(0,10**9)\n", + "\n", + "t0 = time.process_time()\n", + "L.sort() # Using Python's sort()\n", + "t1 = time.process_time()\n", + "i = binary_search(e, L, 0, len(L))\n", + "t2 = time.process_time()\n", + "print(\"The correct position of e =\", e, \"in L is:\")\n", + "print(\"...\", L[i-2], L[i-1], \"e\", L[i], L[i+1], \"...\")\n", + "print(\"\")\n", + "print(\"Time for sorting: \", t1-t0)\n", + "print(\"Time for searching:\", t2-t1)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sorting a list, fast version (with binary_search)\n", + "\n", + "The following code uses the function `binary_search()` above instead of `correct_position()` in our insertion sort algorithm.\n", + "\n", + "Complexity: $O(n\\log_2(n))$" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running time: 0.03710268399998995\n" + ] + } + ], + "source": [ + "from random import randint\n", + "import time\n", + "\n", + "def binary_search(e, S, start, end):\n", + " if start == end:\n", + " return start\n", + " midpoint = (start+end) // 2\n", + " if e < S[midpoint]:\n", + " return binary_search(e, S, start, midpoint)\n", + " else:\n", + " return binary_search(e, S, midpoint+1, end)\n", + " \n", + "def sort_list(L):\n", + " S = []\n", + " for e in L:\n", + " cp = binary_search(e, S, 0, len(S)) # Changed here\n", + " S.insert(cp, e)\n", + " return S\n", + " \n", + "N = 10000\n", + "L = [randint(0,10**9) for i in range(N)]\n", + "\n", + "t0 = time.process_time()\n", + "sort_list(L)\n", + "t1 = time.process_time()\n", + "\n", + "print(\"Running time:\", t1-t0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fast exponentiation\n", + "\n", + "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", + "\n", + "Complexity: $O(n)$ for the slow algorithm, $O(\\log_2(n))$ for the other two." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.71828179834636\n", + "2.7182817863957984\n", + "2.7182817983473577\n", + "Time for slow_power(): 3.234879998000004\n", + "Time for fast_power(): 9.059099999575437e-05\n", + "Time for Python's **: 0.00010159500000384014\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "def slow_power(a, n):\n", + " r = 1\n", + " for i in range(n):\n", + " r = r * a\n", + " return r\n", + "\n", + "def fast_power(a, n):\n", + " if n == 0:\n", + " return 1\n", + " if n%2 == 0:\n", + " return fast_power(a*a, n//2)\n", + " else:\n", + " return a * fast_power(a, n-1)\n", + "\n", + "a = 1.00000001\n", + "n = 100000000\n", + "\n", + "t0 = time.process_time()\n", + "print(slow_power(a, n))\n", + "t1 = time.process_time()\n", + "print(fast_power(a, n))\n", + "t2 = time.process_time()\n", + "print(a**n)\n", + "t3 = time.process_time()\n", + "\n", + "print(\"Time for slow_power():\", t1-t0)\n", + "print(\"Time for fast_power():\", t2-t1)\n", + "print(\"Time for Python's **: \", t3-t2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fast gcd\n", + "\n", + "Complexity: $O(\\log_2(n))$" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "126\n", + "Running time: 0.00017707599999994272\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "def gcd(a, b):\n", + " if b == 0:\n", + " return a\n", + " else:\n", + " return gcd(b, a%b)\n", + "\n", + "t0 = time.process_time()\n", + "print(gcd(155275387236018, 572335397352432))\n", + "t1 = time.process_time()\n", + "\n", + "print(\"Running time:\", t1-t0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fibonacci numbers\n", + "\n", + "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", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9227465\n", + "9227465\n", + "Time for F_slow: 2.3301570169999906\n", + "Time for F_fast: 8.848800000293977e-05\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "F_memorized = [-1] * (10**6)\n", + "\n", + "def F_slow(n):\n", + " if n <= 1:\n", + " return n\n", + " else:\n", + " return F_slow(n-1) + F_slow(n-2)\n", + " \n", + "def F_fast(n):\n", + " if F_memorized[n] == -1:\n", + " if n <= 1:\n", + " F_memorized[n] = n\n", + " else:\n", + " F_memorized[n] = F_fast(n-1) + F_fast(n-2)\n", + " \n", + " return F_memorized[n]\n", + "\n", + "n = 35\n", + "\n", + "t0 = time.process_time()\n", + "print(F_slow(n))\n", + "t1 = time.process_time()\n", + "print(F_fast(n))\n", + "t2 = time.process_time()\n", + "\n", + "print(\"Time for F_slow:\", t1-t0)\n", + "print(\"Time for F_fast:\", t2-t1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-checkpoint.ipynb b/src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-checkpoint.ipynb @@ -0,0 +1,165 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Diffie-Hellman key exchange\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Public key: p = 20747 and g = 13428 \n", + "\n", + "[[ Alice's secret key: a = 12403 ]]\n", + "[[ Bob's secret key: b = 17642 ]] \n", + "\n", + "Alice sends h1 = 14710 to Bob\n", + "Bob sends h2 = 10680 to Alice \n", + "\n", + "Alice computed 10455 using h2 and her secret a\n", + "Bob computed 10455 using h1 and his secret b\n" + ] + } + ], + "source": [ + "# Public information:\n", + "p = Primes()[10^3 + randint(1,10000)] # random prime\n", + "g = randint(2, p-1) # random integer\n", + "\n", + "print(\"Public key: p =\", p, \"and g =\", g, \"\\n\")\n", + "\n", + "a = randint(2, p-1) # Only Alice knows this\n", + "b = randint(2, p-1) # Only Bob knows this\n", + "\n", + "print(\"[[ Alice's secret key: a =\", a, \"]]\")\n", + "print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n", + "\n", + "h1 = (g^a) % p # Alice sends this to Bob\n", + "h2 = (g^b) % p # Bob sends this to Alice\n", + "\n", + "print(\"Alice sends h1 =\", h1, \"to Bob\")\n", + "print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n", + "\n", + "secret_a = (h2^a) % p # Alice can compute this because she knows a\n", + "secret_b = (h1^b) % p # Bob can compute this because he knows b\n", + "\n", + "print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n", + "print(\"Bob computed\", secret_b, \"using h1 and his secret b\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## General Diffie-Hellman\n", + "\n", + "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$." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Public key:\n", + "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", + "g = (155 : 60 : 1) \n", + "\n", + "[[ Alice's secret key: a = 141 ]]\n", + "[[ Bob's secret key: b = 158 ]] \n", + "\n", + "Alice sends h1 = (29 : 125 : 1) to Bob\n", + "Bob sends h2 = (60 : 59 : 1) to Alice \n", + "\n", + "Alice computed (109 : 94 : 1) using h2 and her secret a\n", + "Bob computed (109 : 94 : 1) using h1 and his secret b\n" + ] + } + ], + "source": [ + "def genericDH(G):\n", + " if G.cardinality() == 1:\n", + " print(\"Group is trivial, can't do anything\")\n", + " return\n", + " g = G.random_element()\n", + " while g == G.identity(): # Make sure g is not trivial\n", + " g = G.random_element()\n", + " \n", + " print(\"Public key:\\nG =\", G, \"\\ng =\", g, \"\\n\")\n", + " \n", + " a = randint(2, G.exponent()-1) # Only Alice knows this\n", + " b = randint(2, G.exponent()-1) # Only Bob knows this\n", + "\n", + " print(\"[[ Alice's secret key: a =\", a, \"]]\")\n", + " print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n", + " \n", + " # \"Ternary operator\", I did not explain this\n", + " # https://docs.python.org/3/reference/expressions.html#conditional-expressions\n", + " h1 = g^a if G.is_multiplicative() else a*g # Alice sends this to Bob\n", + " h2 = g^b if G.is_multiplicative() else b*g # Bob sends this to Alice\n", + "\n", + " print(\"Alice sends h1 =\", h1, \"to Bob\")\n", + " print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n", + " \n", + " secret_a = h2^a if G.is_multiplicative() else a*h2 # Alice can compute this because she knows a\n", + " secret_b = h1^b if G.is_multiplicative() else b*h1 # Bob can compute this because he knows b\n", + "\n", + " print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n", + " print(\"Bob computed\", secret_b, \"using h1 and his secret b\")\n", + " \n", + "E = EllipticCurve(GF(157), [1,-1])\n", + "G = E.abelian_group()\n", + "genericDH(G)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Numerical methods for PDEs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.0", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-notebook-checkpoint.ipynb b/src/Lecture7/slides/.ipynb_checkpoints/X2-StudentsRequests-notebook-checkpoint.ipynb @@ -0,0 +1,298 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Diffie-Hellman key exchange\n", + "\n", + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Public key: p = 75521 and g = 58258 \n", + "\n", + "[[ Alice's secret key: a = 22794 ]]\n", + "[[ Bob's secret key: b = 69773 ]] \n", + "\n", + "Alice sends h1 = 31067 to Bob\n", + "Bob sends h2 = 54398 to Alice \n", + "\n", + "Alice computed 30031 using h2 and her secret a\n", + "Bob computed 30031 using h1 and his secret b\n" + ] + } + ], + "source": [ + "# Public information:\n", + "p = Primes()[10^3 + randint(1,10000)] # random prime\n", + "g = randint(2, p-1) # random integer\n", + "\n", + "print(\"Public key: p =\", p, \"and g =\", g, \"\\n\")\n", + "\n", + "a = randint(2, p-1) # Only Alice knows this\n", + "b = randint(2, p-1) # Only Bob knows this\n", + "\n", + "print(\"[[ Alice's secret key: a =\", a, \"]]\")\n", + "print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n", + "\n", + "h1 = (g^a) % p # Alice sends this to Bob\n", + "h2 = (g^b) % p # Bob sends this to Alice\n", + "\n", + "print(\"Alice sends h1 =\", h1, \"to Bob\")\n", + "print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n", + "\n", + "secret_a = (h2^a) % p # Alice can compute this because she knows a\n", + "secret_b = (h1^b) % p # Bob can compute this because he knows b\n", + "\n", + "print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n", + "print(\"Bob computed\", secret_b, \"using h1 and his secret b\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## General Diffie-Hellman\n", + "\n", + "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$." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Public key:\n", + "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", + "g = (53 : 90 : 1) \n", + "\n", + "[[ Alice's secret key: a = 145 ]]\n", + "[[ Bob's secret key: b = 65 ]] \n", + "\n", + "Alice sends h1 = (150 : 80 : 1) to Bob\n", + "Bob sends h2 = (4 : 58 : 1) to Alice \n", + "\n", + "Alice computed (28 : 28 : 1) using h2 and her secret a\n", + "Bob computed (28 : 28 : 1) using h1 and his secret b\n" + ] + } + ], + "source": [ + "def genericDH(G):\n", + " if G.cardinality() == 1:\n", + " print(\"Group is trivial, can't do anything\")\n", + " return\n", + " g = G.random_element()\n", + " while g == G.identity(): # Make sure g is not trivial\n", + " g = G.random_element()\n", + " \n", + " print(\"Public key:\\nG =\", G, \"\\ng =\", g, \"\\n\")\n", + " \n", + " a = randint(2, G.exponent()-1) # Only Alice knows this\n", + " b = randint(2, G.exponent()-1) # Only Bob knows this\n", + "\n", + " print(\"[[ Alice's secret key: a =\", a, \"]]\")\n", + " print(\"[[ Bob's secret key: b =\", b, \"]]\", \"\\n\")\n", + " \n", + " # \"Ternary operator\", I did not explain this\n", + " # https://docs.python.org/3/reference/expressions.html#conditional-expressions\n", + " h1 = g^a if G.is_multiplicative() else a*g # Alice sends this to Bob\n", + " h2 = g^b if G.is_multiplicative() else b*g # Bob sends this to Alice\n", + "\n", + " print(\"Alice sends h1 =\", h1, \"to Bob\")\n", + " print(\"Bob sends h2 =\", h2, \"to Alice\", \"\\n\")\n", + " \n", + " secret_a = h2^a if G.is_multiplicative() else a*h2 # Alice can compute this because she knows a\n", + " secret_b = h1^b if G.is_multiplicative() else b*h1 # Bob can compute this because he knows b\n", + "\n", + " print(\"Alice computed\", secret_a, \"using h2 and her secret a\")\n", + " print(\"Bob computed\", secret_b, \"using h1 and his secret b\")\n", + " \n", + "E = EllipticCurve(GF(157), [1,-1])\n", + "G = E.abelian_group()\n", + "genericDH(G)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Numerical methods for differential equations\n", + "\n", + "## Euler's method (ODE)\n", + "\n", + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "text/plain": [ + "Graphics object consisting of 2 graphics primitives" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "var('y')\n", + "\n", + "def euler_desolve(f, x0, y0, x1):\n", + " n = 5\n", + " h = (x1-x0)/n\n", + " S = []\n", + " Y = [y0]\n", + " for i in range(n+1):\n", + " S.append(x0 + i*h)\n", + " Y.append(N( Y[i] + h*f(S[i], Y[i]) ))\n", + " return S, Y\n", + "\n", + "f(x,y) = y\n", + "x0 = -1\n", + "x1 = 2\n", + "y0 = e^(-1)\n", + "\n", + "S, Y = euler_desolve(f, x0, y0, x1)\n", + "plot(e^x, -1, 2) + line([(S[i], Y[i]) for i in range(len(S))], color='red', marker='o', markersize=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sage also has an `eulers_method()` function \"for pedagogical purposes only\":" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " x y h*f(x,y)\n", + " -1 0.367879441171442 0.0367879441171442\n", + "-0.900000000000000 0.404667385288587 0.0404667385288587\n", + "-0.800000000000000 0.445134123817445 0.0445134123817445\n", + "-0.700000000000000 0.489647536199190 0.0489647536199190\n", + "-0.600000000000000 0.538612289819109 0.0538612289819109\n", + "-0.500000000000000 0.592473518801020 0.0592473518801020\n", + "-0.400000000000000 0.651720870681122 0.0651720870681122\n", + "-0.300000000000000 0.716892957749234 0.0716892957749234\n", + "-0.200000000000000 0.788582253524157 0.0788582253524157\n", + "-0.100000000000000 0.867440478876573 0.0867440478876573\n", + "-1.38777878078145e-16 0.954184526764230 0.0954184526764230\n", + "0.0999999999999999 1.04960297944065 0.104960297944065\n", + "0.200000000000000 1.15456327738472 0.115456327738472\n", + "0.300000000000000 1.27001960512319 0.127001960512319\n", + "0.400000000000000 1.39702156563551 0.139702156563551\n", + "0.500000000000000 1.53672372219906 0.153672372219906\n", + "0.600000000000000 1.69039609441897 0.169039609441897\n", + "0.700000000000000 1.85943570386086 0.185943570386086\n", + "0.800000000000000 2.04537927424695 0.204537927424695\n", + "0.900000000000000 2.24991720167165 0.224991720167165\n", + "1.00000000000000 2.47490892183881 0.247490892183881\n", + "1.10000000000000 2.72239981402269 0.272239981402269\n", + "1.20000000000000 2.99463979542496 0.299463979542496\n", + "1.30000000000000 3.29410377496746 0.329410377496746\n", + "1.40000000000000 3.62351415246420 0.362351415246420\n", + "1.50000000000000 3.98586556771062 0.398586556771062\n", + "1.60000000000000 4.38445212448168 0.438445212448168\n", + "1.70000000000000 4.82289733692985 0.482289733692985\n", + "1.80000000000000 5.30518707062284 0.530518707062284\n", + "1.90000000000000 5.83570577768512 0.583570577768512\n", + "2.00000000000000 6.41927635545363 0.641927635545363\n" + ] + } + ], + "source": [ + "# Usage: eulers_method(f, x0, y0, h, x1)\n", + "eulers_method(f, -1, N(e^(-1)), 0.1, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving the heat equation with a finite difference method" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def heat_fdm(u0j, u1j, ui0):\n", + " m, n = len(u0j)-1, len(ui0)-1\n", + " k, h = 1/m, 1/n\n", + " \n", + " u = [[0] * (m+1) for i in range(n+1)]\n", + " for j in range(m+1):\n", + " u[0][j] = u0j[j]\n", + " for j in range(m+1):\n", + " u[n][j] = u1j[j]\n", + " for i in range(n+1):\n", + " u[i][0] = ui0[i]\n", + " \n", + " for j in range(0,m):\n", + " for i in range(1,n):\n", + " u[i][j+1] = (k/(h*h)) * (u[i+1][j] - 2*u[i][j] + u[i-1][j]) + u[i][j]\n", + " \n", + " return u\n", + "\n", + "n, m = 20, 20\n", + "u0j = [10 - (j/m)*10 for j in range(m+1)] # One extreme goes from hot to cold\n", + "u1j = [(j/m)*10 for j in range(m+1)] # The other does the opposite\n", + "ui0 = [10 - (i/m)*10 for i in range(0,n+1)]\n", + "\n", + "u = heat_fdm(u0j, u1j, ui0)\n", + "for t in range(m+1):\n", + " show(line([(i/n, u[i][t]) for i in range(n+1)], ymin=-1, ymax =12))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 9.0", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.aux b/src/Lecture7/slides/X1-ComputationalComplexity.aux @@ -0,0 +1,100 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {22}{22}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{23}{23/26}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {23}{26}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{24}{27/30}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {27}{30}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{25}{31/31}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {31}{31}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{26}{32/32}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {32}{32}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{27}{33/33}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {33}{33}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{28}{34/34}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {34}{34}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{29}{35/35}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {35}{35}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{30}{36/36}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {36}{36}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{31}{37/37}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {37}{37}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{32}{38/38}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {38}{38}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{33}{39/39}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {39}{39}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{34}{40/40}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {40}{40}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{35}{41/41}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {41}{41}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{36}{42/42}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {42}{42}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{37}{43/43}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {43}{43}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{38}{44/44}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {44}{44}}} +\@writefile{nav}{\headcommand {\beamer@partpages {1}{44}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{44}}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{44}}} +\@writefile{nav}{\headcommand {\beamer@documentpages {44}}} +\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {38}}} diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.log b/src/Lecture7/slides/X1-ComputationalComplexity.log @@ -0,0 +1,1513 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**X1-ComputationalComplexity.tex +(./X1-ComputationalComplexity.tex +LaTeX2e <2020-02-02> patch level 2 +L3 programming layer <2020-02-14> +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls +Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty +(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count167 +) +\beamer@tempbox=\box45 +\beamer@tempcount=\count168 +\c@beamerpauses=\count169 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty +\beamer@slideinframe=\count170 +\beamer@minimum=\count171 +\beamer@decode@box=\box46 +) +\beamer@commentbox=\box47 +\beamer@modecount=\count172 +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2019/11/07 v1.0c TeX engine tests +)) +\headdp=\dimen134 +\footheight=\dimen135 +\sidebarheight=\dimen136 +\beamer@tempdim=\dimen137 +\beamer@finalheight=\dimen138 +\beamer@animht=\dimen139 +\beamer@animdp=\dimen140 +\beamer@animwd=\dimen141 +\beamer@leftmargin=\dimen142 +\beamer@rightmargin=\dimen143 +\beamer@leftsidebar=\dimen144 +\beamer@rightsidebar=\dimen145 +\beamer@boxsize=\dimen146 +\beamer@vboxoffset=\dimen147 +\beamer@descdefault=\dimen148 +\beamer@descriptionwidth=\dimen149 +\beamer@lastskip=\skip47 +\beamer@areabox=\box48 +\beamer@animcurrent=\box49 +\beamer@animshowbox=\box50 +\beamer@sectionbox=\box51 +\beamer@logobox=\box52 +\beamer@linebox=\box53 +\beamer@sectioncount=\count173 +\beamer@subsubsectionmax=\count174 +\beamer@subsectionmax=\count175 +\beamer@sectionmax=\count176 +\beamer@totalheads=\count177 +\beamer@headcounter=\count178 +\beamer@partstartpage=\count179 +\beamer@sectionstartpage=\count180 +\beamer@subsectionstartpage=\count181 +\beamer@animationtempa=\count182 +\beamer@animationtempb=\count183 +\beamer@xpos=\count184 +\beamer@ypos=\count185 +\beamer@ypos@offset=\count186 +\beamer@showpartnumber=\count187 +\beamer@currentsubsection=\count188 +\beamer@coveringdepth=\count189 +\beamer@sectionadjust=\count190 +\beamer@tocsectionnumber=\count191 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) +\beamer@paperwidth=\skip48 +\beamer@paperheight=\skip49 + +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count192 +\Gm@cntv=\count193 +\c@Gm@tempcnt=\count194 +\Gm@bindingoffset=\dimen150 +\Gm@wd@mp=\dimen151 +\Gm@odd@mp=\dimen152 +\Gm@even@mp=\dimen153 +\Gm@layoutwidth=\dimen154 +\Gm@layoutheight=\dimen155 +\Gm@layouthoffset=\dimen156 +\Gm@layoutvoffset=\dimen157 +\Gm@dimlist=\toks15 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen158 +\Gin@req@width=\dimen159 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks16 +\pgfutil@tempdima=\dimen160 +\pgfutil@tempdimb=\dimen161 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t +ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box54 +(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty +Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t +ex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen162 +\pgf@y=\dimen163 +\pgf@xa=\dimen164 +\pgf@ya=\dimen165 +\pgf@xb=\dimen166 +\pgf@yb=\dimen167 +\pgf@xc=\dimen168 +\pgf@yc=\dimen169 +\pgf@xd=\dimen170 +\pgf@yd=\dimen171 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count195 +\c@pgf@countb=\count196 +\c@pgf@countc=\count197 +\c@pgf@countd=\count198 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count199 + (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de +f +File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code. +tex +File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfsyssoftpath@smallbuffer@items=\count266 +\pgfsyssoftpath@bigbuffer@items=\count267 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code. +tex +File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen172 +\pgfmath@count=\count268 +\pgfmath@box=\box55 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet +ric.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod +e.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison +.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari +thmetics.code.tex))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count269 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te +x +File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@picminx=\dimen173 +\pgf@picmaxx=\dimen174 +\pgf@picminy=\dimen175 +\pgf@picmaxy=\dimen176 +\pgf@pathminx=\dimen177 +\pgf@pathmaxx=\dimen178 +\pgf@pathminy=\dimen179 +\pgf@pathmaxy=\dimen180 +\pgf@xx=\dimen181 +\pgf@xy=\dimen182 +\pgf@yx=\dimen183 +\pgf@yy=\dimen184 +\pgf@zx=\dimen185 +\pgf@zy=\dimen186 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct. +code.tex +File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@path@lastx=\dimen187 +\pgf@path@lasty=\dimen188 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code +.tex +File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@shorten@end@additional=\dimen189 +\pgf@shorten@start@additional=\dimen190 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te +x +File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfpic=\box56 +\pgf@hbox=\box57 +\pgf@layerbox@main=\box58 +\pgf@picture@serial@count=\count270 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c +ode.tex +File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgflinewidth=\dimen191 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation +s.code.tex +File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@pt@x=\dimen192 +\pgf@pt@y=\dimen193 +\pgf@pt@temp=\dimen194 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t +ex +File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing +.code.tex +File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te +x +File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowsep=\dimen195 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@max=\dimen196 +\pgf@sys@shading@range@num=\count271 +\pgf@shadingcount=\count272 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code. +tex +File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfexternal@startupbox=\box59 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te +x +File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c +ode.tex +File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code. +tex +File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty +Package: xxcolor 2003/10/24 ver 0.1 +\XC@nummixins=\count273 +\XC@countmixins=\count274 +) +(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO) +)) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO) +) +\@linkdim=\dimen197 +\Hy@linkcounter=\count275 +\Hy@pagecounter=\count276 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count277 +\pdfmajorversion=\count278 +Package hyperref Info: Option `bookmarks' set `true' on input line 4421. +Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421. +Package hyperref Info: Option `implicit' set `false' on input line 4421. +Package hyperref Info: Hyper figures OFF on input line 4547. +Package hyperref Info: Link nesting OFF on input line 4552. +Package hyperref Info: Hyper index ON on input line 4555. +Package hyperref Info: Plain pages OFF on input line 4562. +Package hyperref Info: Backreferencing OFF on input line 4567. +Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals. +Package hyperref Info: Bookmarks ON on input line 4800. +\c@Hy@tempcnt=\count279 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5159. +\XeTeXLinkMargin=\dimen198 + +(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count280 +\Field@Width=\dimen199 +\Fld@charsize=\dimen256 +Package hyperref Info: Hyper figures OFF on input line 6430. +Package hyperref Info: Link nesting OFF on input line 6435. +Package hyperref Info: Hyper index ON on input line 6438. +Package hyperref Info: backreferencing OFF on input line 6445. +Package hyperref Info: Link coloring OFF on input line 6450. +Package hyperref Info: Link coloring with OCG OFF on input line 6455. +Package hyperref Info: PDF/A mode OFF on input line 6460. +LaTeX Info: Redefining \ref on input line 6500. +LaTeX Info: Redefining \pageref on input line 6504. +\Hy@abspage=\count281 + + +Package hyperref Message: Stopped early. + +) +Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO) +) +\Fld@listcount=\count282 +\c@bookmark@seq@number=\count283 + +(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks26 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty +Package: sansmathaccent 2020/01/31 + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty +Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files) +))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty +Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty +\beamer@argscount=\count284 +\beamer@lastskipcover=\skip50 +\beamer@trivlistdepth=\count285 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty +\c@lecture=\count286 +\c@part=\count287 +\c@section=\count288 +\c@subsection=\count289 +\c@subsubsection=\count290 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty +\beamer@framebox=\box60 +\beamer@frametitlebox=\box61 +\beamer@zoombox=\box62 +\beamer@zoomcount=\count291 +\beamer@zoomframecount=\count292 +\beamer@frametextheight=\dimen257 +\c@subsectionslide=\count293 +\beamer@frametopskip=\skip51 +\beamer@framebottomskip=\skip52 +\beamer@frametopskipautobreak=\skip53 +\beamer@framebottomskipautobreak=\skip54 +\beamer@envbody=\toks27 +\framewidth=\dimen258 +\c@framenumber=\count294 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty +\beamer@verbatimfileout=\write4 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty +\beamer@splitbox=\box63 +\beamer@autobreakcount=\count295 +\beamer@autobreaklastheight=\dimen259 +\beamer@frametitletoks=\toks28 +\beamer@framesubtitletoks=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty +\beamer@footins=\box64 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty +\beamer@frameboxcopy=\box65 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty +\beamer@sbttoks=\toks30 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty +\bmb@box=\box66 +\bmb@colorbox=\box67 +\bmb@boxshadow=\box68 +\bmb@boxshadowball=\box69 +\bmb@boxshadowballlarge=\box70 +\bmb@temp=\dimen260 +\bmb@dima=\dimen261 +\bmb@dimb=\dimen262 +\bmb@prevheight=\dimen263 +) +\beamer@blockheadheight=\dimen264 +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks31 +) +\c@figure=\count296 +\c@table=\count297 +\abovecaptionskip=\skip55 +\belowcaptionskip=\skip56 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty +\beamer@section@min@dim=\dimen265 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/01/20 v2.17e AMS math features +\@mathmargin=\skip57 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks32 +\ex@=\dimen266 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen267 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count298 +LaTeX Info: Redefining \frac on input line 227. +\uproot@=\count299 +\leftroot@=\count300 +LaTeX Info: Redefining \overline on input line 389. +\classnum@=\count301 +\DOTSCASE@=\count302 +LaTeX Info: Redefining \ldots on input line 486. +LaTeX Info: Redefining \dots on input line 489. +LaTeX Info: Redefining \cdots on input line 610. +\Mathstrutbox@=\box71 +\strutbox@=\box72 +\big@size=\dimen268 +LaTeX Font Info: Redeclaring font encoding OML on input line 733. +LaTeX Font Info: Redeclaring font encoding OMS on input line 734. +\macc@depth=\count303 +\c@MaxMatrixCols=\count304 +\dotsspace@=\muskip17 +\c@parentequation=\count305 +\dspbrk@lvl=\count306 +\tag@help=\toks33 +\row@=\count307 +\column@=\count308 +\maxfields@=\count309 +\andhelp@=\toks34 +\eqnshift@=\dimen269 +\alignsep@=\dimen270 +\tagshift@=\dimen271 +\tagwidth@=\dimen272 +\totwidth@=\dimen273 +\lineht@=\dimen274 +\@envbody=\toks35 +\multlinegap=\skip58 +\multlinetaggap=\skip59 +\mathdisplay@stack=\toks36 +LaTeX Info: Redefining \[ on input line 2859. +LaTeX Info: Redefining \] on input line 2860. +) +(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2017/10/31 v2.20.4 +\thm@style=\toks37 +\thm@bodyfont=\toks38 +\thm@headfont=\toks39 +\thm@notefont=\toks40 +\thm@headpunct=\toks41 +\thm@preskip=\skip60 +\thm@postskip=\skip61 +\thm@headsep=\skip62 +\dth@everypar=\toks42 +) +\c@theorem=\count310 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty +\beamer@dima=\dimen275 +\beamer@dimb=\dimen276 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file +\inpenc@prehook=\toks43 +\inpenc@posthook=\toks44 +) +(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.sty +\lst@mode=\count311 +\lst@gtempboxa=\box73 +\lst@token=\toks45 +\lst@length=\count312 +\lst@currlwidth=\dimen277 +\lst@column=\count313 +\lst@pos=\count314 +\lst@lostspace=\dimen278 +\lst@width=\dimen279 +\lst@newlines=\count315 +\lst@lineno=\count316 +\lst@maxwidth=\dimen280 + +(/usr/share/texlive/texmf-dist/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2019/09/10 1.8c (Carsten Heinz) +\c@lstnumber=\count317 +\lst@skipnumbers=\count318 +\lst@framebox=\box74 +) +(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.cfg +File: listings.cfg 2019/09/10 1.8c listings configuration +)) +Package: listings 2019/09/10 1.8c (Carsten Heinz) + +(/usr/share/texlive/texmf-dist/tex/latex/mathtools/mathtools.sty +Package: mathtools 2020/01/17 v1.23 mathematical typesetting tools + +(/usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty +Package: calc 2017/05/25 v4.3 Infix arithmetic (KKT,FJ) +\calc@Acount=\count319 +\calc@Bcount=\count320 +\calc@Adimen=\dimen281 +\calc@Bdimen=\dimen282 +\calc@Askip=\skip63 +\calc@Bskip=\skip64 +LaTeX Info: Redefining \setlength on input line 80. +LaTeX Info: Redefining \addtolength on input line 81. +\calc@Ccount=\count321 +\calc@Cskip=\skip65 +) +(/usr/share/texlive/texmf-dist/tex/latex/mathtools/mhsetup.sty +Package: mhsetup 2017/03/31 v1.3 programming setup (MH) +) +LaTeX Info: Thecontrolsequence`\('isalreadyrobust on input line 129. +LaTeX Info: Thecontrolsequence`\)'isalreadyrobust on input line 129. +LaTeX Info: Thecontrolsequence`\['isalreadyrobust on input line 129. +LaTeX Info: Thecontrolsequence`\]'isalreadyrobust on input line 129. +\g_MT_multlinerow_int=\count322 +\l_MT_multwidth_dim=\dimen283 +\origjot=\skip66 +\l_MT_shortvdotswithinadjustabove_dim=\dimen284 +\l_MT_shortvdotswithinadjustbelow_dim=\dimen285 +\l_MT_above_intertext_sep=\dimen286 +\l_MT_below_intertext_sep=\dimen287 +\l_MT_above_shortintertext_sep=\dimen288 +\l_MT_below_shortintertext_sep=\dimen289 +) +(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty +Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ + +(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +Package: pgf 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfnodeparttextbox=\box75 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65 +.sty +Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b) +\pgf@nodesepstart=\dimen290 +\pgf@nodesepend=\dimen291 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18 +.sty +Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen292 +\pgffor@skip=\dimen293 +\pgffor@stack=\toks46 +\pgffor@toks=\toks47 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers +.code.tex +File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@plot@mark@count=\count323 +\pgfplotmarksize=\dimen294 +) +\tikz@lastx=\dimen295 +\tikz@lasty=\dimen296 +\tikz@lastxsaved=\dimen297 +\tikz@lastysaved=\dimen298 +\tikz@lastmovetox=\dimen299 +\tikz@lastmovetoy=\dimen300 +\tikzleveldistance=\dimen301 +\tikzsiblingdistance=\dimen302 +\tikz@figbox=\box76 +\tikz@figbox@bg=\box77 +\tikz@tempbox=\box78 +\tikz@tempbox@bg=\box79 +\tikztreelevel=\count324 +\tikznumberofchildren=\count325 +\tikznumberofcurrentchild=\count326 +\tikz@fig@count=\count327 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfmatrixcurrentrow=\count328 +\pgfmatrixcurrentcolumn=\count329 +\pgf@matrix@numberofcolumns=\count330 +) +\tikz@expandcount=\count331 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarymatrix.code.tex +File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibraryquotes.code.tex +File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta. +code.tex +File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowinset=\dimen303 +\pgfarrowlength=\dimen304 +\pgfarrowwidth=\dimen305 +\pgfarrowlinewidth=\dimen306 +))) (/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2019/01/04 v1.2 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2014/12/03 v2.7a package option processing (HA) + +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks48 +\XKV@tempa@toks=\toks49 +) +\XKV@depth=\count332 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2018/04/08 v1.1 Trim and clip general TeX material + +(/usr/share/texlive/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box80 +) +\tc@llx=\dimen307 +\tc@lly=\dimen308 +\tc@urx=\dimen309 +\tc@ury=\dimen310 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex +)) +\adjbox@Width=\dimen311 +\adjbox@Height=\dimen312 +\adjbox@Depth=\dimen313 +\adjbox@Totalheight=\dimen314 +\adjbox@pwidth=\dimen315 +\adjbox@pheight=\dimen316 +\adjbox@pdepth=\dimen317 +\adjbox@ptotalheight=\dimen318 + +(/usr/share/texlive/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection +\c@checkoddpage=\count333 +) +(/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box81 +\sift@deathcycles=\count334 +\@vwid@loff=\dimen319 +\@vwid@roff=\dimen320 +)) +(/usr/share/texlive/texmf-dist/tex/latex/listings/lstlang1.sty +File: lstlang1.sty 2019/09/10 1.8c listings language file +) +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode +\l__kernel_color_stack_int=\count335 +\l__pdf_internal_box=\box82 +) +(./X1-ComputationalComplexity.aux) +\openout1 = `X1-ComputationalComplexity.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 32. +LaTeX Font Info: ... okay on input line 32. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: custom +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: includehead includefoot +* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt) +* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt) +* \paperwidth=364.19536pt +* \paperheight=273.14662pt +* \textwidth=342.2953pt +* \textheight=244.6939pt +* \oddsidemargin=-61.31996pt +* \evensidemargin=-61.31996pt +* \topmargin=-72.26999pt +* \headheight=14.22636pt +* \headsep=0.0pt +* \topskip=11.0pt +* \footskip=14.22636pt +* \marginparwidth=4.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count336 +\scratchdimen=\dimen321 +\scratchbox=\box83 +\nofMPsegments=\count337 +\nofMParguments=\count338 +\everyMPshowfont=\toks50 +\MPscratchCnt=\count339 +\MPscratchDim=\dimen322 +\MPnumerator=\count340 +\makeMPintoPDFobject=\count341 +\everyMPtoPDFconversion=\toks51 +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +ABD: EveryShipout initializing macros +\AtBeginShipoutBox=\box84 +Package hyperref Info: Link coloring OFF on input line 32. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count342 +) +LaTeX Info: Redefining \ref on input line 32. +LaTeX Info: Redefining \pageref on input line 32. +LaTeX Info: Redefining \nameref on input line 32. + +(./X1-ComputationalComplexity.out) (./X1-ComputationalComplexity.out) +\@outlinefile=\write5 +\openout5 = `X1-ComputationalComplexity.out'. + +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 32. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 32. +\symnumbers=\mathgroup6 +\sympureletters=\mathgroup7 +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 32. +LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 32. +LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 32. +LaTeX Font Info: Redeclaring math alphabet \mathit on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 32. +LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 32. +LaTeX Font Info: Overwriting symbol font `numbers' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 32. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 32. +LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 32. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal' +(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 3 +2. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 3 +2. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp +ut line 32. + +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary +-English.dict +Dictionary: translator-basic-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic +tionary-English.dict +Dictionary: translator-bibliography-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict +ionary-English.dict +Dictionary: translator-environment-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar +y-English.dict +Dictionary: translator-months-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona +ry-English.dict +Dictionary: translator-numbers-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona +ry-English.dict +Dictionary: translator-theorem-dictionary, Language: English +) +\c@lstlisting=\count343 + (./X1-ComputationalComplexity.nav) +<img/unilu.jpg, id=20, 645.16031pt x 578.16pt> +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 36. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 51. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [2 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 64. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [3 + +] +LaTeX Font Info: Trying to load font information for U+msa on input line 80. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 80. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp +ut line 80. + +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd +File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma +thkerncmss. +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 80. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[4 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 89. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [5 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 111. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [6 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 131. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [7 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 143. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [8 + +] +<img/plot1.png, id=252, 426.32072pt x 280.84122pt> +File: img/plot1.png Graphic file (type png) +<use img/plot1.png> +Package pdftex.def Info: img/plot1.png used on input line 147. +(pdftex.def) Requested size: 298.42245pt x 196.5875pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 147. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [9 + + <./img/plot1.png>] +<img/plot2.png, id=281, 424.73079pt x 280.84122pt> +File: img/plot2.png Graphic file (type png) +<use img/plot2.png> +Package pdftex.def Info: img/plot2.png used on input line 151. +(pdftex.def) Requested size: 297.30951pt x 196.5875pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 151. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [10 + + <./img/plot2.png>] +<img/plot3.png, id=309, 425.23668pt x 280.84122pt> +File: img/plot3.png Graphic file (type png) +<use img/plot3.png> +Package pdftex.def Info: img/plot3.png used on input line 155. +(pdftex.def) Requested size: 297.66365pt x 196.5875pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 155. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [11 + + <./img/plot3.png>] +<img/plot4.png, id=337, 424.87534pt x 280.84122pt> +File: img/plot4.png Graphic file (type png) +<use img/plot4.png> +Package pdftex.def Info: img/plot4.png used on input line 159. +(pdftex.def) Requested size: 297.4107pt x 196.5875pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 159. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [12 + + <./img/plot4.png>] +<img/plot5.png, id=366, 424.65852pt x 280.84122pt> +File: img/plot5.png Graphic file (type png) +<use img/plot5.png> +Package pdftex.def Info: img/plot5.png used on input line 163. +(pdftex.def) Requested size: 297.25893pt x 196.5875pt. +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 163. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [13 + + <./img/plot5.png>] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 186. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [14 + +] +\openout4 = `X1-ComputationalComplexity.vrb'. + + +(./X1-ComputationalComplexity.vrb +LaTeX Font Info: Trying to load font information for TS1+cmss on input line +5. + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmss.fd +File: ts1cmss.fd 2019/12/16 v2.5j Standard LaTeX font definitions +)) [15 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 224. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [16 + +] +\openout4 = `X1-ComputationalComplexity.vrb'. + + +(./X1-ComputationalComplexity.vrb +LaTeX Font Info: Trying to load font information for OML+cmss on input line +5. +LaTeX Font Info: No file OMLcmss.fd. on input line 5. + + +LaTeX Font Warning: Font shape `OML/cmss/m/n' undefined +(Font) using `OML/cmm/m/it' instead +(Font) for symbol `textgreater' on input line 5. + +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 241. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [17 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 260. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [18 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 269. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [19 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 277. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [20 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 291. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [21 + +] +\openout4 = `X1-ComputationalComplexity.vrb'. + + (./X1-ComputationalComplexity.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 305. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [22 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 363. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [23 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 363. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[24 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 363. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [25 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 363. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [26 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 419. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [27 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 419. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [28 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 419. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [29 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 419. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [30 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 427. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [31 + +] +\openout4 = `X1-ComputationalComplexity.vrb'. + + (./X1-ComputationalComplexity.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 443. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[32 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 456. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [33 + +] +\openout4 = `X1-ComputationalComplexity.vrb'. + + (./X1-ComputationalComplexity.vrb + +LaTeX Font Warning: Font shape `OML/cmss/m/it' undefined +(Font) using `OML/cmm/m/it' instead +(Font) for symbol `textgreater' on input line 3. + +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 469. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [34 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 478. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [35 + +] +\openout4 = `X1-ComputationalComplexity.vrb'. + + (./X1-ComputationalComplexity.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 507. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [36 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 516. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [37 + +] +\openout4 = `X1-ComputationalComplexity.vrb'. + + +(./X1-ComputationalComplexity.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 538. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [38 + +] +\openout4 = `X1-ComputationalComplexity.vrb'. + + (./X1-ComputationalComplexity.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 551. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[39 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 560. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [40 + +] +\openout4 = `X1-ComputationalComplexity.vrb'. + + (./X1-ComputationalComplexity.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 577. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [41 + +] +\openout4 = `X1-ComputationalComplexity.vrb'. + + +(./X1-ComputationalComplexity.vrb) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 589. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [42 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 597. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [43 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 606. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [44 + +] +\tf@nav=\write6 +\openout6 = `X1-ComputationalComplexity.nav'. + +\tf@toc=\write7 +\openout7 = `X1-ComputationalComplexity.toc'. + +\tf@snm=\write8 +\openout8 = `X1-ComputationalComplexity.snm'. + +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 608. +Package atveryend Info: Empty hook `AfterLastShipout' on input line 608. + +(./X1-ComputationalComplexity.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 608. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 608. +Package rerunfilecheck Info: File `X1-ComputationalComplexity.out' has not chan +ged. +(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. + + +LaTeX Font Warning: Some font shapes were not available, defaults substituted. + + ) +Here is how much of TeX's memory you used: + 25931 strings out of 481239 + 509927 string characters out of 5920377 + 935890 words of memory out of 5000000 + 40483 multiletter control sequences out of 15000+600000 + 549107 words of font info for 85 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 58i,31n,89p,810b,1569s stack positions out of 5000i,500n,10000p,200000b,80000s + </home/sebastiano/.texlive2019/texmf-var/fonts/pk/ljfour/jknappen/ec/tcss090 +0.600pk></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pf +b></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></us +r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi9.pfb></usr/share +/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/texli +ve/texmf-dist/fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texlive/tex +mf-dist/fonts/type1/public/amsfonts/cm/cmss8.pfb></usr/share/texlive/texmf-dist +/fonts/type1/public/amsfonts/cm/cmss9.pfb></usr/share/texlive/texmf-dist/fonts/ +type1/public/amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-dist/fonts/type +1/public/amsfonts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/fonts/type1/pub +lic/amsfonts/cm/cmssi8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/am +sfonts/cm/cmssi9.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts +/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cm +sy8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy9.pfb +></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb></usr +/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt8.pfb> +Output written on X1-ComputationalComplexity.pdf (44 pages, 1769406 bytes). +PDF statistics: + 1306 PDF objects out of 1440 (max. 8388607) + 1204 compressed objects within 13 object streams + 89 named destinations out of 1000 (max. 500000) + 121 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.nav b/src/Lecture7/slides/X1-ComputationalComplexity.nav @@ -0,0 +1,81 @@ +\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}} +\headcommand {\beamer@framepages {1}{1}} +\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}} +\headcommand {\beamer@framepages {2}{2}} +\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}} +\headcommand {\beamer@framepages {3}{3}} +\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}} +\headcommand {\beamer@framepages {4}{4}} +\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}} +\headcommand {\beamer@framepages {5}{5}} +\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}} +\headcommand {\beamer@framepages {6}{6}} +\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}} +\headcommand {\beamer@framepages {7}{7}} +\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}} +\headcommand {\beamer@framepages {8}{8}} +\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}} +\headcommand {\beamer@framepages {9}{9}} +\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}} +\headcommand {\beamer@framepages {10}{10}} +\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}} +\headcommand {\beamer@framepages {11}{11}} +\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}} +\headcommand {\beamer@framepages {12}{12}} +\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}} +\headcommand {\beamer@framepages {13}{13}} +\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}} +\headcommand {\beamer@framepages {14}{14}} +\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}} +\headcommand {\beamer@framepages {15}{15}} +\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}} +\headcommand {\beamer@framepages {16}{16}} +\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}} +\headcommand {\beamer@framepages {17}{17}} +\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}} +\headcommand {\beamer@framepages {18}{18}} +\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}} +\headcommand {\beamer@framepages {19}{19}} +\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}} +\headcommand {\beamer@framepages {20}{20}} +\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}} +\headcommand {\beamer@framepages {21}{21}} +\headcommand {\slideentry {0}{0}{22}{22/22}{}{0}} +\headcommand {\beamer@framepages {22}{22}} +\headcommand {\slideentry {0}{0}{23}{23/26}{}{0}} +\headcommand {\beamer@framepages {23}{26}} +\headcommand {\slideentry {0}{0}{24}{27/30}{}{0}} +\headcommand {\beamer@framepages {27}{30}} +\headcommand {\slideentry {0}{0}{25}{31/31}{}{0}} +\headcommand {\beamer@framepages {31}{31}} +\headcommand {\slideentry {0}{0}{26}{32/32}{}{0}} +\headcommand {\beamer@framepages {32}{32}} +\headcommand {\slideentry {0}{0}{27}{33/33}{}{0}} +\headcommand {\beamer@framepages {33}{33}} +\headcommand {\slideentry {0}{0}{28}{34/34}{}{0}} +\headcommand {\beamer@framepages {34}{34}} +\headcommand {\slideentry {0}{0}{29}{35/35}{}{0}} +\headcommand {\beamer@framepages {35}{35}} +\headcommand {\slideentry {0}{0}{30}{36/36}{}{0}} +\headcommand {\beamer@framepages {36}{36}} +\headcommand {\slideentry {0}{0}{31}{37/37}{}{0}} +\headcommand {\beamer@framepages {37}{37}} +\headcommand {\slideentry {0}{0}{32}{38/38}{}{0}} +\headcommand {\beamer@framepages {38}{38}} +\headcommand {\slideentry {0}{0}{33}{39/39}{}{0}} +\headcommand {\beamer@framepages {39}{39}} +\headcommand {\slideentry {0}{0}{34}{40/40}{}{0}} +\headcommand {\beamer@framepages {40}{40}} +\headcommand {\slideentry {0}{0}{35}{41/41}{}{0}} +\headcommand {\beamer@framepages {41}{41}} +\headcommand {\slideentry {0}{0}{36}{42/42}{}{0}} +\headcommand {\beamer@framepages {42}{42}} +\headcommand {\slideentry {0}{0}{37}{43/43}{}{0}} +\headcommand {\beamer@framepages {43}{43}} +\headcommand {\slideentry {0}{0}{38}{44/44}{}{0}} +\headcommand {\beamer@framepages {44}{44}} +\headcommand {\beamer@partpages {1}{44}} +\headcommand {\beamer@subsectionpages {1}{44}} +\headcommand {\beamer@sectionpages {1}{44}} +\headcommand {\beamer@documentpages {44}} +\headcommand {\gdef \inserttotalframenumber {38}} diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.out b/src/Lecture7/slides/X1-ComputationalComplexity.out diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.pdf 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 diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.tex b/src/Lecture7/slides/X1-ComputationalComplexity.tex @@ -0,0 +1,608 @@ +\documentclass[11pt]{beamer} +\usetheme{Madrid} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} + +\usepackage{color} +\usepackage{listings} +\usepackage{mathtools} +\usepackage{tikz-cd} +\usepackage{adjustbox} + +\definecolor{myblue}{rgb}{0,0,0.5} +\lstset{ + language=Python, + tabsize=4, + basicstyle=\footnotesize, + keywordstyle=\bf\color{myblue}, + commentstyle=\it\color{gray}, + numbers=left, + numbersep=3pt, + numberstyle=\tiny\color{gray}, +} + +\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto} +\title[Computational Complexity]% +{Why is my code slow?} +\logo{\includegraphics[scale=0.1]{img/unilu.jpg}} +%\institute{University of Luxembourg} + +\date{2021-05-21} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + +\begin{frame}{Computational Complexity} + \begin{itemize} + \item \textbf{Goal:} + estimate the running {\color{blue}time} of a program + \item \textbf{How:} + count the {\color{blue}basic steps} that an + {\color{blue}algorithm} takes to complete + \item \textbf{Why}: + find the \emph{bottleneck} of your program, make it faster + \end{itemize} + + \vspace{0.5cm} + Our analysis should not depend on the hardware +\end{frame} + +\begin{frame}{Algorithm} + \begin{definition} + \emph{An algorithm is a sequence of {\color{blue}steps} needed to + solve a {\color{blue}class of problems}. } + \end{definition} + + \begin{definition}[alternative] + \emph{An algorithm is a sequence of steps that takes + an input satisfying certain conditions and produces an output + satisfying other conditions.} + \end{definition} +\end{frame} + +\begin{frame}{Sorting a list} + \begin{block}{Class of problems} + Sort a list $L$ of numbers in increasing order. + \end{block} + + \begin{block}{Algorithm} + \begin{enumerate} + \item Let $S$ be an empty list. + \item Take an element from $L$ an insert it in $S$ in its correct + position. + \item Repeat step $2$ until $L$ is empty. + \item Return $S$. + \end{enumerate} + \end{block} +\end{frame} + +\begin{frame}{Sorting a list} +\begin{itemize} + \item It solves a \emph{class} of problems: works for any list + \item The specific steps to sort the list $[3,7,1]$ are not an algorithm + \item Input conditions: must be a list of numbers + \item Output conditions: same numbers in increasing order +\end{itemize} +\end{frame} + +\begin{frame}{How to write an algorithm} + \begin{itemize} + \item \textbf{Human language}: + \begin{itemize} + \item Easy to understand + \item Not precise + \end{itemize} + + \vspace{0.3cm} + \item \textbf{Computer code}: + \begin{itemize} + \item Can be executed by computers + \item Precise + \item From very low level (machine code) to high level + (Python, \dots) + \end{itemize} + \end{itemize} + + %\vspace{0.5cm} + %To what \emph{level of detail}? +\end{frame} + +\begin{frame}{Basic steps} + \begin{itemize} + %\item Strictly speaking, only CPU instructions are \emph{basic} + %\item In practice:%, we consider basic: + % \begin{itemize} + \item Arithmetic operations $+,-,*,//,\%$ + \item Relational operations $==, !=, >, <,\dots$ + \item Memory access (read/write variable) + % \end{itemize} + \end{itemize} + + \vspace{0.5cm} + \textbf{Warning:} + Depends on data type (integer, floating point, string,\dots) + %\begin{itemize} + % \item Depends on data type (integer, floating point, string,\dots) + % \item There are non-basic instructions such as \texttt{sort()} + %\end{itemize} +\end{frame} + +\begin{frame}{Running time} + \begin{itemize} + \item Depends on computer power, programming language, compiler\dots + %\item Not all basic steps are equal + \item ``Big O'' notation: an algorithm runs in time $O(f(n))$ if, when + run with input of size $n$, it takes about $c\cdot f(n)$ steps + \item Algorithm A is \emph{asymptotically faster} than algorithm B if + it is faster \textbf{for $n$ large enough} + \item Rule of thumb: $10^7\sim10^9$ basic steps per second + \end{itemize} +\end{frame} + +\begin{frame}{Asymptotical analysis vs constant factors} + \includegraphics[scale=0.7]{img/plot1.png} +\end{frame} + +\begin{frame}{Asymptotical analysis vs constant factors} + \includegraphics[scale=0.7]{img/plot2.png} +\end{frame} + +\begin{frame}{Asymptotical analysis vs constant factors} + \includegraphics[scale=0.7]{img/plot3.png} +\end{frame} + +\begin{frame}{Asymptotical analysis vs constant factors} + \includegraphics[scale=0.7]{img/plot4.png} +\end{frame} + +\begin{frame}{Asymptotical analysis vs constant factors} + \includegraphics[scale=0.7]{img/plot5.png} +\end{frame} + +%\begin{frame}{title} +%graphs here, uncomment +%\end{frame} + +\begin{frame}{Basic complexity analysis} + + Easy things to do: + + \vspace{0.3cm} + \begin{itemize} + \item Check documentation for ``non-basic steps'' + \begin{itemize} + \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()}}) + \end{itemize} + + \vspace{0.3cm} + \item Count nested loops + \begin{itemize} + \item How many times is a step repeated? + \end{itemize} + \end{itemize} +\end{frame} + +{\setbeamertemplate{logo}{} +\begin{frame}[fragile]{Nested loops - matrix sum and product} +\begin{lstlisting} +def add(A, B): + n = len(A) + S = [[0] * n for i in range(n)] + for i in range(0, n): + for j in range(0, n): + S[i][j] = A[i][j] + B[i][j] + return S +\end{lstlisting} + +\vspace{0.5cm} +\begin{lstlisting} +def prod(A, B): + n = len(A) + S = [[0] * n for i in range(n)] + for i in range(0, n): + for j in range(0, n): + for k in range(0, n): + S[i][j] = S[i][j] + A[i][k]*B[k][j] + return S +\end{lstlisting} +\end{frame} +} + +\begin{frame}{Nested loops - matrix sum and product} + \begin{itemize} + \item \texttt{add} is $O(n^2)$ (two loops) + \item \texttt{prod} is $O(n^3)$ (three loops) + \end{itemize} + + \vspace{0.3cm} + \textbf{Fun fact:} there are faster algorithms for matrix multiplication, + for example \href{https://en.wikipedia.org/wiki/Strassen_algorithm}% + {Strassen's algorithm}. +\end{frame} + +\begin{frame}[fragile]{Sorting a list} +\begin{lstlisting} +def correct_position(e, S): + for i in range(0, len(S)): + if S[i] > e: + return i + return len(S) + +def sort_list(L): + S = [] + for e in L: + cp = correct_position(e, S) + S.insert(cp, e) + return S +\end{lstlisting} +\end{frame} + +\begin{frame}{Sorting a list} + \begin{itemize} + \item Complexity of \texttt{correct\_position()}: + \begin{itemize} + %\item best case $O(1)$ + \item worst case $O($\texttt{len(S)}$)$ + \item average $O($\texttt{len(S)}$)$ + \end{itemize} + + \vspace{0.3cm} + \item Complexity of \texttt{sort\_list} (here $n=$\texttt{len(L)}): + \begin{align*} + %\sum_{i=0}^{n-1} O(1) = O(n) && \text{best case}\\ + \sum_{i=0}^{n-1} O(i) = O(n^2)% && \text{average/worst} + \end{align*} + (it calls \texttt{correct\_position()} $n$ times). + \end{itemize} +\end{frame} + +\begin{frame}{Sorting a list} + \begin{itemize} + \item For which lists does the ``best case'' happen? + \item For which lists does the ``worst case'' happen? + \item How large can $n$ be for \texttt{sort\_list()} to run + in under a second? + \end{itemize} +\end{frame} + +\begin{frame}{Sorting a list} + How to improve our code? + \begin{itemize} + \item Improve \texttt{correct\_position()} + \item Take advantage of the fact that $S$ is always sorted + \end{itemize} +\end{frame} + +\begin{frame}{Binary search} + \begin{block}{Algorithm} + \textbf{Input:} a \emph{sorted} list $S$ and a value $e$. + \begin{enumerate} + \item If the list is empty, you have found the position of $e$ + \item Otherwise, compare $e$ to the middle element $m$ of $S$ + \begin{itemize} + \item If $e<m$, repeat from (1) on the first half of $S$ + \item Otherwise, repeat from (1) on the second half of $S$ + \end{itemize} + \end{enumerate} + \end{block} +\end{frame} + +\begin{frame}[fragile]{Binary search} +\begin{lstlisting} +# Return position of e in L +def binary_search(e, S, start, end): + if start == end: + return start + midpoint = (end+start)//2 + if e < S[midpoint]: + return binary_search(e, S, start, midpoint) + else: + return binary_search(e, S, midpoint+1, end) +\end{lstlisting} +\end{frame} + +\begin{frame}{Binary search - example 1} + Searching for \texttt{e}$=2$: + \begin{align*} + \only<1>{ + \underbrace{ + \overset{{\color{blue} + \substack{\mathclap{\texttt{start}=0}\\\downarrow}}}{-2} + \quad 0\quad 1\quad 3\quad + \overset{\substack{\mathclap{\texttt{midpoint}=4}\\\downarrow}}{5} + \quad 6\quad 7\quad 9\quad 12 + }\quad + \overset{{\color{red} + \substack{\mathclap{\texttt{end}=9}\\\downarrow}}}{\phantom{0}} + } + \only<2>{ + \underbrace{ + \overset{{\color{blue} + \substack{\mathclap{\texttt{start}=0}\\\downarrow}}}{-2} + \quad 0\quad + \overset{\substack{\mathclap{\texttt{midpoint}=2}\\\\\downarrow}}% + {1} + \quad 3 + }\quad + \overset{{\color{red} + \substack{\mathclap{\texttt{end}=4}\\\downarrow}}}{5} + \quad 6\quad 7\quad 9\quad 12\quad \phantom{0} + } + \only<3>{ + -2\quad 0\quad 1\quad + \underbrace{ + \overset{ + \substack{ + \mathclap{ + {\color{blue}\texttt{start}}=\texttt{midpoint}=3}\\\\ + {\color{blue}\downarrow} + } + }{3} + } \quad + \overset{{\color{red} + \substack{\mathclap{\texttt{end}=4}\\\downarrow}}}{5} + \quad 6\quad 7\quad 9\quad 12\quad \phantom{0} + } + \only<4>{ + -2\quad 0\quad 1\quad + \overset{ + \substack{ + \mathclap{ + {\color{blue}\texttt{start}}= + {\color{red}\texttt{end}}=3}\\\downarrow}}{3} + \quad 5 \quad 6\quad 7\quad 9\quad 12\quad \phantom{0} + } + \end{align*} + \only<1>{{\color{blue}$e<5$}$\implies$ check left half} + \only<2>{{\color{red}$e>1$}$\implies$ check right half} + \only<3>{{\color{blue}$e<3$}$\implies$ check left half} + \only<4>{\texttt{start}=\texttt{end}, done} +\end{frame} + +\begin{frame}{Binary search - example 2} + Searching for \texttt{e}$=11$: + \begin{align*} + \only<1>{ + \underbrace{ + \overset{{\color{blue} + \substack{\mathclap{\texttt{start}=0}\\\downarrow}}}{-2} + \quad 0\quad 1\quad 3\quad + \overset{\substack{\mathclap{\texttt{midpoint}=4}\\\downarrow}}{5} + \quad 6\quad 7\quad 9\quad 12 + }\quad + \overset{{\color{red} + \substack{\mathclap{\texttt{end}=9}\\\downarrow}}}{\phantom{0}} + } + \only<2>{ + -2 \quad 0\quad 1 \quad 3 \quad 5 \quad + \underbrace{ + \overset{{\color{blue} + \substack{\mathclap{\texttt{start}=5}\\\downarrow}}}{6} + \quad 7 \quad + \overset{\substack{\mathclap{\texttt{midpoint}=7}\\\\\downarrow}}% + {9} + \quad 12 + }\quad + \overset{{\color{red} + \substack{\mathclap{\texttt{end}=9}\\\downarrow}}}{\phantom{0}} + } + \only<3>{ + -2\quad 0\quad 1\quad 3\quad 5\quad 6\quad 7\quad 9\quad + \underbrace{ + \overset{ + \substack{ + \mathclap{ + {\color{blue}\texttt{start}}=\texttt{midpoint}=8}\\\\ + {\color{blue}\downarrow} + } + }{12} + } \quad + \overset{{\color{red} + \substack{\mathclap{\texttt{end}=9}\\\downarrow}}}{\phantom{0}} + } + \only<4>{ + -2\quad 0\quad 1\quad 3\quad 5\quad 6\quad 7\quad 9\quad + \overset{ + \substack{ + \mathclap{ + {\color{blue}\texttt{start}}= + {\color{red}\texttt{end}}=8}\\\downarrow}}{12} + } + \end{align*} + \only<1>{{\color{red}$e>5$}$\implies$ check right half} + \only<2>{{\color{red}$e>9$}$\implies$ check right half} + \only<3>{{\color{blue}$e<11$}$\implies$ check left half} + \only<4>{\texttt{start}=\texttt{end}, done} +\end{frame} + +\begin{frame}{Binary search} + \begin{itemize} + \item Works only if the list is sorted + \item Complexity $O(\log_2(n))$: at every step we cut the list in half + \item Recursive, \emph{divide et impera} + \end{itemize} +\end{frame} + +\begin{frame}[fragile]{Sorting a list - binary search version} +\begin{lstlisting} +def sort_list(L): + S = [] + for e in L: + cp = binary_search(e, S, 0, len(S)) # This changed + S.insert(cp, e) + return S +\end{lstlisting} + \vspace{0.3cm} + \begin{itemize} + \item Complexity: \[\sum_{i=0}^{n-1} O(\log_2(i)) = O(n\log_2(n))\]\\ + (it calls \texttt{binary\_search} $n$ times). + \end{itemize} +\end{frame} + +\begin{frame}{Fast exponentiation} + \begin{block}{Algorithm / formula} + \begin{align*} + a^n= + \begin{cases} + 1 & \text{if }n=0,\\ + (a\cdot a)^{\frac n2} & \text{if $n$ is even},\\ + a\cdot a^{n-1} & \text{if $n$ is odd.} + \end{cases} + \end{align*} + \end{block} +\end{frame} + +\begin{frame}[fragile]{Fast exponentiation} +\begin{lstlisting} +# Compute a^n (n>=0 integer) +def power(a, n): + if n == 0: + return 1 + if n % 2 == 0: # n is even + return power(a*a, n//2) + else: # n is odd + return a*power(a, n-1) +\end{lstlisting} +\end{frame} + +\begin{frame}{Fast exponentiation} + + \begin{itemize} + \item Complexity: $O(\log_2(n))$ (after $2$ steps, $n$ is halved) + \item Python's operator $**$ does something similar + \item Naive algorithm (one loop): $O(n)$ + \end{itemize} +\end{frame} + + +\begin{frame}[fragile]{Fast $\gcd$} + \begin{block}{Algorithm / formula} + \begin{align*} + \gcd(a,b) = + \begin{cases} + a & \text{if }b=0,\\ + \gcd(b,a\bmod b) & \text{otherwise.} + \end{cases} + \end{align*} + \end{block} + +\begin{columns} +\column{0.5\textwidth} +\begin{lstlisting} +def gcd(a, b): + if b == 0: + return a + else: + return gcd(b, a%b) +\end{lstlisting} + +\column{0.5\textwidth} +\begin{itemize} + \item After $2$ steps, $a$ is halved $\implies$ complexity $O(\log_2(a))$ +\end{itemize} +\end{columns} +\end{frame} + +\begin{frame}{Recursion} + \begin{itemize} + \item These examples use \emph{recursion} + (a function that calls itself) + \item If it calls itself more than once, it is slow + (\emph{exponential} complexity!) + \end{itemize} +\end{frame} + +\begin{frame}[fragile]{Fibonacci numbers} + + \begin{block}{Algorithm / formula} + \begin{align*} + F(n) = + \begin{cases} + n & \text{if }n\leq1,\\ + F(n-1)+F(n-2) & \text{otherwise.} + \end{cases} + \end{align*} + \end{block} + +\vspace{0.5cm} +\begin{lstlisting} +def F(n): + if n <= 1: + return n + else: + return F(n-1) + F(n-2) +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile]{Fibonacci} + \begin{adjustbox}{scale={0.85}{0.9},center} + \begin{tikzcd}[column sep=1mm] + & & & & & & & & F(5) \ar[drrr] \ar[dlll]\\ + & & & & & F(4)\ar[dll]\ar[dr] & & & & & & F(3) \ar[dl] \ar[dr]\\ + & & & F(3) \ar[dl]\ar[dr] & & & F(2) \ar[dr]\ar[dl] + & & & & F(2) \ar[dl]\ar[dr] & & F(1) \\ + & & F(2) \ar[dl]\ar[dr] & & F(1) & F(1) & & F(0) & & F(1) & & F(0)\\ + & F(1) & & F(0) + \end{tikzcd} + \end{adjustbox} +\end{frame} + +\begin{frame}{Fibonacci} + \begin{itemize} + \item Complexity: almost $O(2^n)$ (actually $O(\varphi^n)$ + with $\varphi=\frac{1+\sqrt 5}{2}\sim 1.6$) + \item But some values are computed many times! + \item Optimization: memorize previously computed values + \end{itemize} +\end{frame} + +\begin{frame}[fragile]{Fibonacci with memorization} +\begin{lstlisting} +# List with memorized values, N is the largest possible +N = 10**6 +F_memorized = [-1] * N + +def F(n): + if F_memorized[n] == -1: + if n <= 1: + F_memorized[n] = n + else: + F_memorized[n] = F(n-1) + F(n-2) + + return F_memorized[n] +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile]{Fibonacci with memorization} + \begin{adjustbox}{scale={0.85}{0.9},center} + \begin{tikzcd}[column sep=1mm] + & & & & & & & & F(5) \ar[drrr] \ar[dlll]\\ + & & & & & F(4)\ar[dll]\ar[dr] & & & & & & {\color{blue}F(3)}\\ + & & & F(3) \ar[dl]\ar[dr] & & & {\color{blue}F(2)}\\ + & & F(2) \ar[dl]\ar[dr] & & {\color{blue}F(1)} \\ + & F(1) & & F(0) + \end{tikzcd} + \end{adjustbox} +\end{frame} + +\begin{frame}{Fibonacci with memorization} + \begin{itemize} + \item Complexity: $O(n)$, huge improvement! + \item Further improvement (but still $O(n)$): dynamic programming + \item Pay attention to memory usage + \end{itemize} +\end{frame} + +\begin{frame}{References} + \begin{itemize} + \item Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and + Clifford Stein - + \href{https://en.wikipedia.org/wiki/Introduction\_to\_Algorithms}% + {\emph{Introductions to Algorithms}} + \end{itemize} +\end{frame} + +\end{document} diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.toc b/src/Lecture7/slides/X1-ComputationalComplexity.toc diff --git a/src/Lecture7/slides/X1-ComputationalComplexity.vrb b/src/Lecture7/slides/X1-ComputationalComplexity.vrb @@ -0,0 +1,10 @@ +\frametitle{Fibonacci with memorization} +\begin{adjustbox}{scale={0.85}{0.9},center} + \begin{tikzcd}[column sep=1mm] + & & & & & & & & F(5) \ar[drrr] \ar[dlll]\\ + & & & & & F(4)\ar[dll]\ar[dr] & & & & & & {\color{blue}F(3)}\\ + & & & F(3) \ar[dl]\ar[dr] & & & {\color{blue}F(2)}\\ + & & F(2) \ar[dl]\ar[dr] & & {\color{blue}F(1)} \\ + & F(1) & & F(0) + \end{tikzcd} + \end{adjustbox} diff --git a/src/Lecture7/slides/X2-StudentsRequests.aux b/src/Lecture7/slides/X2-StudentsRequests.aux @@ -0,0 +1,67 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand{\transparent@use}[1]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {16}{16}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {17}{17}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {18}{18}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {19}{19}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {20}{20}}} +\@writefile{nav}{\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}}} +\@writefile{nav}{\headcommand {\beamer@framepages {21}{21}}} +\@writefile{nav}{\headcommand {\beamer@partpages {1}{21}}} +\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{21}}} +\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{21}}} +\@writefile{nav}{\headcommand {\beamer@documentpages {21}}} +\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {21}}} diff --git a/src/Lecture7/slides/X2-StudentsRequests.log b/src/Lecture7/slides/X2-StudentsRequests.log @@ -0,0 +1,1307 @@ +This 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 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**X2-StudentsRequests.tex +(./X2-StudentsRequests.tex +LaTeX2e <2020-02-02> patch level 2 +L3 programming layer <2020-02-14> +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls +Document Class: beamer 2019/09/29 v3.57 A class for typesetting presentations +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty +(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count167 +) +\beamer@tempbox=\box45 +\beamer@tempcount=\count168 +\c@beamerpauses=\count169 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty +\beamer@slideinframe=\count170 +\beamer@minimum=\count171 +\beamer@decode@box=\box46 +) +\beamer@commentbox=\box47 +\beamer@modecount=\count172 +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2019/11/07 v1.0c TeX engine tests +)) +\headdp=\dimen134 +\footheight=\dimen135 +\sidebarheight=\dimen136 +\beamer@tempdim=\dimen137 +\beamer@finalheight=\dimen138 +\beamer@animht=\dimen139 +\beamer@animdp=\dimen140 +\beamer@animwd=\dimen141 +\beamer@leftmargin=\dimen142 +\beamer@rightmargin=\dimen143 +\beamer@leftsidebar=\dimen144 +\beamer@rightsidebar=\dimen145 +\beamer@boxsize=\dimen146 +\beamer@vboxoffset=\dimen147 +\beamer@descdefault=\dimen148 +\beamer@descriptionwidth=\dimen149 +\beamer@lastskip=\skip47 +\beamer@areabox=\box48 +\beamer@animcurrent=\box49 +\beamer@animshowbox=\box50 +\beamer@sectionbox=\box51 +\beamer@logobox=\box52 +\beamer@linebox=\box53 +\beamer@sectioncount=\count173 +\beamer@subsubsectionmax=\count174 +\beamer@subsectionmax=\count175 +\beamer@sectionmax=\count176 +\beamer@totalheads=\count177 +\beamer@headcounter=\count178 +\beamer@partstartpage=\count179 +\beamer@sectionstartpage=\count180 +\beamer@subsectionstartpage=\count181 +\beamer@animationtempa=\count182 +\beamer@animationtempb=\count183 +\beamer@xpos=\count184 +\beamer@ypos=\count185 +\beamer@ypos@offset=\count186 +\beamer@showpartnumber=\count187 +\beamer@currentsubsection=\count188 +\beamer@coveringdepth=\count189 +\beamer@sectionadjust=\count190 +\beamer@tocsectionnumber=\count191 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +)) +\beamer@paperwidth=\skip48 +\beamer@paperheight=\skip49 + +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count192 +\Gm@cntv=\count193 +\c@Gm@tempcnt=\count194 +\Gm@bindingoffset=\dimen150 +\Gm@wd@mp=\dimen151 +\Gm@odd@mp=\dimen152 +\Gm@even@mp=\dimen153 +\Gm@layoutwidth=\dimen154 +\Gm@layoutheight=\dimen155 +\Gm@layouthoffset=\dimen156 +\Gm@layoutvoffset=\dimen157 +\Gm@dimlist=\toks15 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2019/12/20 v1.4l Standard LaTeX file (size option) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen158 +\Gin@req@width=\dimen159 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks16 +\pgfutil@tempdima=\dimen160 +\pgfutil@tempdimb=\dimen161 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t +ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box54 +(/usr/share/texlive/texmf-dist/tex/latex/ms/everyshi.sty +Package: everyshi 2001/05/15 v3.00 EveryShipout Package (MS) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/01/08 v3.1.5b (3.1.5b) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks17 +\pgfkeys@temptoks=\toks18 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t +ex +\pgfkeys@tmptoks=\toks19 +)) +\pgf@x=\dimen162 +\pgf@y=\dimen163 +\pgf@xa=\dimen164 +\pgf@ya=\dimen165 +\pgf@xb=\dimen166 +\pgf@yb=\dimen167 +\pgf@xc=\dimen168 +\pgf@yc=\dimen169 +\pgf@xd=\dimen170 +\pgf@yd=\dimen171 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count195 +\c@pgf@countb=\count196 +\c@pgf@countc=\count197 +\c@pgf@countd=\count198 +\t@pgf@toka=\toks20 +\t@pgf@tokb=\toks21 +\t@pgf@tokc=\toks22 +\pgf@sys@id@count=\count199 + (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/01/08 v3.1.5b (3.1.5b) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de +f +File: pgfsys-common-pdf.def 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code. +tex +File: pgfsyssoftpath.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfsyssoftpath@smallbuffer@items=\count266 +\pgfsyssoftpath@bigbuffer@items=\count267 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code. +tex +File: pgfsysprotocol.code.tex 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen172 +\pgfmath@count=\count268 +\pgfmath@box=\box55 +\pgfmath@toks=\toks23 +\pgfmath@stack@operand=\toks24 +\pgfmath@stack@operation=\toks25 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet +ric.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod +e.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison +.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari +thmetics.code.tex))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count269 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te +x +File: pgfcorepoints.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@picminx=\dimen173 +\pgf@picmaxx=\dimen174 +\pgf@picminy=\dimen175 +\pgf@picmaxy=\dimen176 +\pgf@pathminx=\dimen177 +\pgf@pathmaxx=\dimen178 +\pgf@pathminy=\dimen179 +\pgf@pathmaxy=\dimen180 +\pgf@xx=\dimen181 +\pgf@xy=\dimen182 +\pgf@yx=\dimen183 +\pgf@yy=\dimen184 +\pgf@zx=\dimen185 +\pgf@zy=\dimen186 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct. +code.tex +File: pgfcorepathconstruct.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@path@lastx=\dimen187 +\pgf@path@lasty=\dimen188 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code +.tex +File: pgfcorepathusage.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@shorten@end@additional=\dimen189 +\pgf@shorten@start@additional=\dimen190 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te +x +File: pgfcorescopes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfpic=\box56 +\pgf@hbox=\box57 +\pgf@layerbox@main=\box58 +\pgf@picture@serial@count=\count270 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c +ode.tex +File: pgfcoregraphicstate.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgflinewidth=\dimen191 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation +s.code.tex +File: pgfcoretransformations.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@pt@x=\dimen192 +\pgf@pt@y=\dimen193 +\pgf@pt@temp=\dimen194 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t +ex +File: pgfcoreobjects.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing +.code.tex +File: pgfcorepathprocessing.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te +x +File: pgfcorearrows.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowsep=\dimen195 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@max=\dimen196 +\pgf@sys@shading@range@num=\count271 +\pgf@shadingcount=\count272 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code. +tex +File: pgfcoreexternal.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfexternal@startupbox=\box59 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te +x +File: pgfcorelayers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c +ode.tex +File: pgfcoretransparency.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code. +tex +File: pgfcorepatterns.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty +Package: xxcolor 2003/10/24 ver 0.1 +\XC@nummixins=\count273 +\XC@countmixins=\count274 +) +(/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +Package: atbegshi 2019/12/05 v1.19 At begin shipout hook (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO) +)) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020/01/14 v7.00d Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO) +) +\@linkdim=\dimen197 +\Hy@linkcounter=\count275 +\Hy@pagecounter=\count276 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020/01/14 v7.00d Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count277 +\pdfmajorversion=\count278 +Package hyperref Info: Option `bookmarks' set `true' on input line 4421. +Package hyperref Info: Option `bookmarksopen' set `true' on input line 4421. +Package hyperref Info: Option `implicit' set `false' on input line 4421. +Package hyperref Info: Hyper figures OFF on input line 4547. +Package hyperref Info: Link nesting OFF on input line 4552. +Package hyperref Info: Hyper index ON on input line 4555. +Package hyperref Info: Plain pages OFF on input line 4562. +Package hyperref Info: Backreferencing OFF on input line 4567. +Package hyperref Info: Implicit mode OFF; no redefinition of LaTeX internals. +Package hyperref Info: Bookmarks ON on input line 4800. +\c@Hy@tempcnt=\count279 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5159. +\XeTeXLinkMargin=\dimen198 + +(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count280 +\Field@Width=\dimen199 +\Fld@charsize=\dimen256 +Package hyperref Info: Hyper figures OFF on input line 6430. +Package hyperref Info: Link nesting OFF on input line 6435. +Package hyperref Info: Hyper index ON on input line 6438. +Package hyperref Info: backreferencing OFF on input line 6445. +Package hyperref Info: Link coloring OFF on input line 6450. +Package hyperref Info: Link coloring with OCG OFF on input line 6455. +Package hyperref Info: PDF/A mode OFF on input line 6460. +LaTeX Info: Redefining \ref on input line 6500. +LaTeX Info: Redefining \pageref on input line 6504. +\Hy@abspage=\count281 + + +Package hyperref Message: Stopped early. + +) +Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2020/01/14 v7.00d Hyperref driver for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +Package: atveryend 2019-12-11 v1.11 Hooks at the very end of document (HO) +) +\Fld@listcount=\count282 +\c@bookmark@seq@number=\count283 + +(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks26 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty +Package: sansmathaccent 2020/01/31 + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty +Package: scrlfile 2020/01/24 v3.29 KOMA-Script package (loading files) +))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty +Package: translator 2019-05-31 v1.12a Easy translation of strings in LaTeX +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty +\beamer@argscount=\count284 +\beamer@lastskipcover=\skip50 +\beamer@trivlistdepth=\count285 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty +\c@lecture=\count286 +\c@part=\count287 +\c@section=\count288 +\c@subsection=\count289 +\c@subsubsection=\count290 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty +\beamer@framebox=\box60 +\beamer@frametitlebox=\box61 +\beamer@zoombox=\box62 +\beamer@zoomcount=\count291 +\beamer@zoomframecount=\count292 +\beamer@frametextheight=\dimen257 +\c@subsectionslide=\count293 +\beamer@frametopskip=\skip51 +\beamer@framebottomskip=\skip52 +\beamer@frametopskipautobreak=\skip53 +\beamer@framebottomskipautobreak=\skip54 +\beamer@envbody=\toks27 +\framewidth=\dimen258 +\c@framenumber=\count294 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty +\beamer@verbatimfileout=\write4 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty +\beamer@splitbox=\box63 +\beamer@autobreakcount=\count295 +\beamer@autobreaklastheight=\dimen259 +\beamer@frametitletoks=\toks28 +\beamer@framesubtitletoks=\toks29 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty +\beamer@footins=\box64 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty +\beamer@frameboxcopy=\box65 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty +\beamer@sbttoks=\toks30 + +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty +\bmb@box=\box66 +\bmb@colorbox=\box67 +\bmb@boxshadow=\box68 +\bmb@boxshadowball=\box69 +\bmb@boxshadowballlarge=\box70 +\bmb@temp=\dimen260 +\bmb@dima=\dimen261 +\bmb@dimb=\dimen262 +\bmb@prevheight=\dimen263 +) +\beamer@blockheadheight=\dimen264 +)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty +(/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks31 +) +\c@figure=\count296 +\c@table=\count297 +\abovecaptionskip=\skip55 +\belowcaptionskip=\skip56 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty +\beamer@section@min@dim=\dimen265 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/01/20 v2.17e AMS math features +\@mathmargin=\skip57 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks32 +\ex@=\dimen266 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen267 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count298 +LaTeX Info: Redefining \frac on input line 227. +\uproot@=\count299 +\leftroot@=\count300 +LaTeX Info: Redefining \overline on input line 389. +\classnum@=\count301 +\DOTSCASE@=\count302 +LaTeX Info: Redefining \ldots on input line 486. +LaTeX Info: Redefining \dots on input line 489. +LaTeX Info: Redefining \cdots on input line 610. +\Mathstrutbox@=\box71 +\strutbox@=\box72 +\big@size=\dimen268 +LaTeX Font Info: Redeclaring font encoding OML on input line 733. +LaTeX Font Info: Redeclaring font encoding OMS on input line 734. +\macc@depth=\count303 +\c@MaxMatrixCols=\count304 +\dotsspace@=\muskip17 +\c@parentequation=\count305 +\dspbrk@lvl=\count306 +\tag@help=\toks33 +\row@=\count307 +\column@=\count308 +\maxfields@=\count309 +\andhelp@=\toks34 +\eqnshift@=\dimen269 +\alignsep@=\dimen270 +\tagshift@=\dimen271 +\tagwidth@=\dimen272 +\totwidth@=\dimen273 +\lineht@=\dimen274 +\@envbody=\toks35 +\multlinegap=\skip58 +\multlinetaggap=\skip59 +\mathdisplay@stack=\toks36 +LaTeX Info: Redefining \[ on input line 2859. +LaTeX Info: Redefining \] on input line 2860. +) +(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty +Package: amsthm 2017/10/31 v2.20.4 +\thm@style=\toks37 +\thm@bodyfont=\toks38 +\thm@headfont=\toks39 +\thm@notefont=\toks40 +\thm@headpunct=\toks41 +\thm@preskip=\skip60 +\thm@postskip=\skip61 +\thm@headsep=\skip62 +\dth@everypar=\toks42 +) +\c@theorem=\count310 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty +\beamer@dima=\dimen275 +\beamer@dimb=\dimen276 +) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty))) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemeMadrid.sty +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemewhale.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemeorchid.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemerounded.sty) +(/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemeinfolines.sty)) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file +\inpenc@prehook=\toks43 +\inpenc@posthook=\toks44 +) +(/usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty +Package: svg 2020/01/13 v2.02e (include SVG pictures) + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty +Package: scrbase 2020/01/24 v3.29 KOMA-Script package (KOMA-Script-independent +basics and keyval usage) +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty +Package: shellesc 2019/11/08 v1.0c unified shell escape interface for LaTeX +Package shellesc Info: Unrestricted shell escape enabled on input line 75. +) +(/usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\svg@box=\box73 +\c@svg@param@lastpage=\count311 +\c@svg@param@currpage=\count312 + +(/usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty +Package: ifplatform 2017/10/13 v0.4a Testing for the operating system + +(/usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty +Package: catchfile 2019/12/09 v1.8 Catch the contents of a file (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty +Package: ifluatex 2019/10/25 v1.5 ifluatex legacy package. Use iftex instead. +) +runsystem(uname -s > "X2-StudentsRequests.w18")...executed. + + +(./X2-StudentsRequests.w18) +runsystem(rm -- "X2-StudentsRequests.w18")...executed. + +)) +(/usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty +Package: transparent 2019/11/29 v1.4 Transparency via pdfTeX's color stack (HO) + +) +(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.sty +\lst@mode=\count313 +\lst@gtempboxa=\box74 +\lst@token=\toks45 +\lst@length=\count314 +\lst@currlwidth=\dimen277 +\lst@column=\count315 +\lst@pos=\count316 +\lst@lostspace=\dimen278 +\lst@width=\dimen279 +\lst@newlines=\count317 +\lst@lineno=\count318 +\lst@maxwidth=\dimen280 + +(/usr/share/texlive/texmf-dist/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2019/09/10 1.8c (Carsten Heinz) +\c@lstnumber=\count319 +\lst@skipnumbers=\count320 +\lst@framebox=\box75 +) +(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.cfg +File: listings.cfg 2019/09/10 1.8c listings configuration +)) +Package: listings 2019/09/10 1.8c (Carsten Heinz) + +(/usr/share/texlive/texmf-dist/tex/latex/mathtools/mathtools.sty +Package: mathtools 2020/01/17 v1.23 mathematical typesetting tools + +(/usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty +Package: calc 2017/05/25 v4.3 Infix arithmetic (KKT,FJ) +\calc@Acount=\count321 +\calc@Bcount=\count322 +\calc@Adimen=\dimen281 +\calc@Bdimen=\dimen282 +\calc@Askip=\skip63 +\calc@Bskip=\skip64 +LaTeX Info: Redefining \setlength on input line 80. +LaTeX Info: Redefining \addtolength on input line 81. +\calc@Ccount=\count323 +\calc@Cskip=\skip65 +) +(/usr/share/texlive/texmf-dist/tex/latex/mathtools/mhsetup.sty +Package: mhsetup 2017/03/31 v1.3 programming setup (MH) +) +LaTeX Info: Thecontrolsequence`\('isalreadyrobust on input line 129. +LaTeX Info: Thecontrolsequence`\)'isalreadyrobust on input line 129. +LaTeX Info: Thecontrolsequence`\['isalreadyrobust on input line 129. +LaTeX Info: Thecontrolsequence`\]'isalreadyrobust on input line 129. +\g_MT_multlinerow_int=\count324 +\l_MT_multwidth_dim=\dimen283 +\origjot=\skip66 +\l_MT_shortvdotswithinadjustabove_dim=\dimen284 +\l_MT_shortvdotswithinadjustbelow_dim=\dimen285 +\l_MT_above_intertext_sep=\dimen286 +\l_MT_below_intertext_sep=\dimen287 +\l_MT_above_shortintertext_sep=\dimen288 +\l_MT_below_shortintertext_sep=\dimen289 +) +(/usr/share/texlive/texmf-dist/tex/latex/tikz-cd/tikz-cd.sty +Package: tikz-cd 2018/11/19 v0.9f Commutative diagrams with TikZ + +(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +Package: pgf 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfnodeparttextbox=\box76 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65 +.sty +Package: pgfcomp-version-0-65 2020/01/08 v3.1.5b (3.1.5b) +\pgf@nodesepstart=\dimen290 +\pgf@nodesepend=\dimen291 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18 +.sty +Package: pgfcomp-version-1-18 2020/01/08 v3.1.5b (3.1.5b) +)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen292 +\pgffor@skip=\dimen293 +\pgffor@stack=\toks46 +\pgffor@toks=\toks47 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/01/08 v3.1.5b (3.1.5b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers +.code.tex +File: pgflibraryplothandlers.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgf@plot@mark@count=\count325 +\pgfplotmarksize=\dimen294 +) +\tikz@lastx=\dimen295 +\tikz@lasty=\dimen296 +\tikz@lastxsaved=\dimen297 +\tikz@lastysaved=\dimen298 +\tikz@lastmovetox=\dimen299 +\tikz@lastmovetoy=\dimen300 +\tikzleveldistance=\dimen301 +\tikzsiblingdistance=\dimen302 +\tikz@figbox=\box77 +\tikz@figbox@bg=\box78 +\tikz@tempbox=\box79 +\tikz@tempbox@bg=\box80 +\tikztreelevel=\count326 +\tikznumberofchildren=\count327 +\tikznumberofcurrentchild=\count328 +\tikz@fig@count=\count329 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfmatrixcurrentrow=\count330 +\pgfmatrixcurrentcolumn=\count331 +\pgf@matrix@numberofcolumns=\count332 +) +\tikz@expandcount=\count333 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/01/08 v3.1.5b (3.1.5b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/tikz-cd/tikzlibrarycd.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarymatrix.code.tex +File: tikzlibrarymatrix.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibraryquotes.code.tex +File: tikzlibraryquotes.code.tex 2020/01/08 v3.1.5b (3.1.5b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta. +code.tex +File: pgflibraryarrows.meta.code.tex 2020/01/08 v3.1.5b (3.1.5b) +\pgfarrowinset=\dimen303 +\pgfarrowlength=\dimen304 +\pgfarrowwidth=\dimen305 +\pgfarrowlinewidth=\dimen306 +))) (/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2019/01/04 v1.2 Adjusting TeX boxes (trim, clip, ...) + +(/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2014/12/03 v2.7a package option processing (HA) + +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks48 +\XKV@tempa@toks=\toks49 +) +\XKV@depth=\count334 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2018/04/08 v1.1 Trim and clip general TeX material + +(/usr/share/texlive/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box81 +) +\tc@llx=\dimen307 +\tc@lly=\dimen308 +\tc@urx=\dimen309 +\tc@ury=\dimen310 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/share/texlive/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex +)) +\adjbox@Width=\dimen311 +\adjbox@Height=\dimen312 +\adjbox@Depth=\dimen313 +\adjbox@Totalheight=\dimen314 +\adjbox@pwidth=\dimen315 +\adjbox@pheight=\dimen316 +\adjbox@pdepth=\dimen317 +\adjbox@ptotalheight=\dimen318 + +(/usr/share/texlive/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection +\c@checkoddpage=\count335 +) +(/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box82 +\sift@deathcycles=\count336 +\@vwid@loff=\dimen319 +\@vwid@roff=\dimen320 +)) +(/usr/share/texlive/texmf-dist/tex/latex/listings/lstlang1.sty +File: lstlang1.sty 2019/09/10 1.8c listings language file +) +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode +\l__kernel_color_stack_int=\count337 +\l__pdf_internal_box=\box83 +) +(./X2-StudentsRequests.aux) +\openout1 = `X2-StudentsRequests.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 33. +LaTeX Font Info: ... okay on input line 33. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 33. +LaTeX Font Info: ... okay on input line 33. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 33. +LaTeX Font Info: ... okay on input line 33. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 33. +LaTeX Font Info: ... okay on input line 33. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 33. +LaTeX Font Info: ... okay on input line 33. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 33. +LaTeX Font Info: ... okay on input line 33. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 33. +LaTeX Font Info: ... okay on input line 33. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 33. +LaTeX Font Info: ... okay on input line 33. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: custom +* layout: <same size as paper> +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: includehead includefoot +* h-part:(L,W,R)=(10.95003pt, 342.2953pt, 10.95003pt) +* v-part:(T,H,B)=(0.0pt, 273.14662pt, 0.0pt) +* \paperwidth=364.19536pt +* \paperheight=273.14662pt +* \textwidth=342.2953pt +* \textheight=244.6939pt +* \oddsidemargin=-61.31996pt +* \evensidemargin=-61.31996pt +* \topmargin=-72.26999pt +* \headheight=14.22636pt +* \headsep=0.0pt +* \topskip=11.0pt +* \footskip=14.22636pt +* \marginparwidth=4.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count338 +\scratchdimen=\dimen321 +\scratchbox=\box84 +\nofMPsegments=\count339 +\nofMParguments=\count340 +\everyMPshowfont=\toks50 +\MPscratchCnt=\count341 +\MPscratchDim=\dimen322 +\MPnumerator=\count342 +\makeMPintoPDFobject=\count343 +\everyMPtoPDFconversion=\toks51 +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +ABD: EveryShipout initializing macros +\AtBeginShipoutBox=\box85 +Package hyperref Info: Link coloring OFF on input line 33. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count344 +) +LaTeX Info: Redefining \ref on input line 33. +LaTeX Info: Redefining \pageref on input line 33. +LaTeX Info: Redefining \nameref on input line 33. + +(./X2-StudentsRequests.out) (./X2-StudentsRequests.out) +\@outlinefile=\write5 +\openout5 = `X2-StudentsRequests.out'. + +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> OT1/cmss/m/n on input line 33. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 33. +\symnumbers=\mathgroup6 +\sympureletters=\mathgroup7 +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmr/m/n on input line 33. +LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/cmss/b/n on input line 33. +LaTeX Font Info: Redeclaring math alphabet \mathsf on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> OT1/cmss/m/n on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> OT1/cmss/m/n on input line 33. +LaTeX Font Info: Redeclaring math alphabet \mathit on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> OT1/cmss/m/it on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmr/bx/it --> OT1/cmss/m/it on input line 33. +LaTeX Font Info: Redeclaring math alphabet \mathtt on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/m/n on input line 33. +LaTeX Font Info: Overwriting symbol font `numbers' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 33. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmr/b/n on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmss/b/n --> OT1/cmss/b/n on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/m/n --> OT1/cmss/b/n on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmss/m/it --> OT1/cmss/b/it on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/cmtt/b/n on input line 33. +LaTeX Font Info: Redeclaring symbol font `pureletters' on input line 33. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `normal' +(Font) OT1/cmss/m/it --> OT1/mathkerncmss/m/sl on input line 3 +3. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/cmss/b/it --> OT1/mathkerncmss/m/sl on input line 3 +3. +LaTeX Font Info: Overwriting symbol font `pureletters' in version `bold' +(Font) OT1/mathkerncmss/m/sl --> OT1/mathkerncmss/bx/sl on inp +ut line 33. + +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary +-English.dict +Dictionary: translator-basic-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dic +tionary-English.dict +Dictionary: translator-bibliography-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dict +ionary-English.dict +Dictionary: translator-environment-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionar +y-English.dict +Dictionary: translator-months-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictiona +ry-English.dict +Dictionary: translator-numbers-dictionary, Language: English +) +(/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictiona +ry-English.dict +Dictionary: translator-theorem-dictionary, Language: English +) +\c@lstlisting=\count345 + (./X2-StudentsRequests.nav) +<img/unilu.jpg, id=20, 645.16031pt x 578.16pt> +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 37. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./img/unilu.jpg>] [2 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 53. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [3 + +] +LaTeX Font Info: Trying to load font information for U+msa on input line 76. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 76. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for OT1+mathkerncmss on inp +ut line 76. + +(/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/ot1mathkerncmss.fd +File: ot1mathkerncmss.fd 2020/01/31 Fontinst v1.933 font definitions for OT1/ma +thkerncmss. +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 76. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + +[4 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 85. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [5 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 95. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [6 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 105. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [7 + +] +Package svg Info: Last page of `./svg-inkscape/DH_svg-tex.pdf' is 1 on input li +ne 109. + (./svg-inkscape/DH_svg-tex.pdf_tex +<./svg-inkscape/DH_svg-tex.pdf, id=228, page=1, 321.11218pt x 481.97127pt> +File: ./svg-inkscape/DH_svg-tex.pdf Graphic file (type pdf) +<use ./svg-inkscape/DH_svg-tex.pdf, page 1> +Package pdftex.def Info: ./svg-inkscape/DH_svg-tex.pdf , page1 used on input li +ne 56. +(pdftex.def) Requested size: 144.49948pt x 216.88507pt. +) +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 109. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [8 + + <./svg-inkscape/DH_svg-tex.pdf>] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 120. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [9 + +] [10 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 133. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [11 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 152. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [12 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 165. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [13 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 185. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [14 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 193. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [15 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 211. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [16 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 232. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [17 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 254. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [18 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 266. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [19 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 297. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [20 + +] +File: img/unilu.jpg Graphic file (type jpg) +<use img/unilu.jpg> +Package pdftex.def Info: img/unilu.jpg used on input line 307. +(pdftex.def) Requested size: 64.5198pt x 57.81938pt. + [21 + +] +\tf@nav=\write6 +\openout6 = `X2-StudentsRequests.nav'. + +\tf@toc=\write7 +\openout7 = `X2-StudentsRequests.toc'. + +\tf@snm=\write8 +\openout8 = `X2-StudentsRequests.snm'. + +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 309. +Package atveryend Info: Empty hook `AfterLastShipout' on input line 309. + +(./X2-StudentsRequests.aux) +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 309. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 309. +Package rerunfilecheck Info: File `X2-StudentsRequests.out' has not changed. +(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. + ) +Here is how much of TeX's memory you used: + 25732 strings out of 481239 + 509817 string characters out of 5920377 + 960739 words of memory out of 5000000 + 40331 multiletter control sequences out of 15000+600000 + 545963 words of font info for 73 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 58i,21n,89p,803b,926s stack positions out of 5000i,500n,10000p,200000b,80000s +</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></us +r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cmextra/cmex8.pfb></usr/ +share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/ +texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi12.pfb></usr/share/texliv +e/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb></usr/share/texlive/texmf +-dist/fonts/type1/public/amsfonts/cm/cmss10.pfb></usr/share/texlive/texmf-dist/ +fonts/type1/public/amsfonts/cm/cmss12.pfb></usr/share/texlive/texmf-dist/fonts/ +type1/public/amsfonts/cm/cmss17.pfb></usr/share/texlive/texmf-dist/fonts/type1/ +public/amsfonts/cm/cmss8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/ +amsfonts/cm/cmssbx10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsf +onts/cm/cmssi10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/ +cm/cmssi12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cm +ssi8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.p +fb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></us +r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></usr/share +/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt8.pfb></usr/share/texliv +e/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb> +Output written on X2-StudentsRequests.pdf (21 pages, 271722 bytes). +PDF statistics: + 687 PDF objects out of 1000 (max. 8388607) + 621 compressed objects within 7 object streams + 43 named destinations out of 1000 (max. 500000) + 106 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/src/Lecture7/slides/X2-StudentsRequests.nav b/src/Lecture7/slides/X2-StudentsRequests.nav @@ -0,0 +1,47 @@ +\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}} +\headcommand {\beamer@framepages {1}{1}} +\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}} +\headcommand {\beamer@framepages {2}{2}} +\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}} +\headcommand {\beamer@framepages {3}{3}} +\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}} +\headcommand {\beamer@framepages {4}{4}} +\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}} +\headcommand {\beamer@framepages {5}{5}} +\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}} +\headcommand {\beamer@framepages {6}{6}} +\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}} +\headcommand {\beamer@framepages {7}{7}} +\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}} +\headcommand {\beamer@framepages {8}{8}} +\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}} +\headcommand {\beamer@framepages {9}{9}} +\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}} +\headcommand {\beamer@framepages {10}{10}} +\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}} +\headcommand {\beamer@framepages {11}{11}} +\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}} +\headcommand {\beamer@framepages {12}{12}} +\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}} +\headcommand {\beamer@framepages {13}{13}} +\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}} +\headcommand {\beamer@framepages {14}{14}} +\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}} +\headcommand {\beamer@framepages {15}{15}} +\headcommand {\slideentry {0}{0}{16}{16/16}{}{0}} +\headcommand {\beamer@framepages {16}{16}} +\headcommand {\slideentry {0}{0}{17}{17/17}{}{0}} +\headcommand {\beamer@framepages {17}{17}} +\headcommand {\slideentry {0}{0}{18}{18/18}{}{0}} +\headcommand {\beamer@framepages {18}{18}} +\headcommand {\slideentry {0}{0}{19}{19/19}{}{0}} +\headcommand {\beamer@framepages {19}{19}} +\headcommand {\slideentry {0}{0}{20}{20/20}{}{0}} +\headcommand {\beamer@framepages {20}{20}} +\headcommand {\slideentry {0}{0}{21}{21/21}{}{0}} +\headcommand {\beamer@framepages {21}{21}} +\headcommand {\beamer@partpages {1}{21}} +\headcommand {\beamer@subsectionpages {1}{21}} +\headcommand {\beamer@sectionpages {1}{21}} +\headcommand {\beamer@documentpages {21}} +\headcommand {\gdef \inserttotalframenumber {21}} diff --git a/src/Lecture7/slides/X2-StudentsRequests.out b/src/Lecture7/slides/X2-StudentsRequests.out diff --git a/src/Lecture7/slides/X2-StudentsRequests.pdf 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 diff --git a/src/Lecture7/slides/X2-StudentsRequests.tex b/src/Lecture7/slides/X2-StudentsRequests.tex @@ -0,0 +1,309 @@ +\documentclass[11pt]{beamer} +\usetheme{Madrid} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} + +\usepackage{svg} +\usepackage{color} +\usepackage{listings} +\usepackage{mathtools} +\usepackage{tikz-cd} +\usepackage{adjustbox} + +\definecolor{myblue}{rgb}{0,0,0.5} +\lstset{ + language=Python, + tabsize=4, + basicstyle=\footnotesize, + keywordstyle=\bf\color{myblue}, + commentstyle=\it\color{gray}, + numbers=left, + numbersep=3pt, + numberstyle=\tiny\color{gray}, +} + +\author[\texttt{sebastiano.tronto@uni.lu}]{Sebastiano Tronto} +\title[Students requests]% +{Students requests} +\logo{\includegraphics[scale=0.1]{img/unilu.jpg}} +%\institute{University of Luxembourg} + +\date{2021-05-21} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + +\begin{frame}[plain] + \begin{center} {\Huge More cryptography} \end{center} +\end{frame} + +\begin{frame}{Cryptography} + What we have seen: + + \vspace{0.3cm} + \begin{itemize} + \item \textbf{RSA:} + sending messages using a private key / public key pair + \item \textbf{Flip-a-coin:} + cryptographic ``proof'' that the opponent is not cheating + \end{itemize} +\end{frame} + +\begin{frame}{Cryptography} + \begin{itemize} + \item Rely on integer factorization being hard + + \vspace{0.3cm} + \textbf{Example:} the best-known factorization algorithm + (\href{https://en.wikipedia.org/wiki/General\_number\_field\_sieve}% + {\emph{General number field sieve}}) has complexity + \begin{align*} + \sim O\left( + e^{\sqrt[3]{\frac{64}{9}\log_2n\cdot(\log_2\log_2n)^2}} + \right) + \end{align*} + + Factoring a number with $300$ digits: + \begin{itemize} + \item Your laptop: $10^{13}$ billion years + \item Best supercomputer: $13$ billion years + (age of the universe) + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame}{Symmetric and asymmetric cryptography} + \begin{itemize} + \item Our examples are \emph{asymmetric}: different public/private keys + \item Safe against eavesdroppers + \item Symmetric protocols can be faster and simpler, but you need + a secure way to exchange a key + \end{itemize} +\end{frame} + +\begin{frame}{Diffie-Hellman key exchange} + \begin{itemize} + \item Generate a ``password'' without communicating it directly + \item It can then be used for symmetric cryptography + \item Based on a different hard problem: + \href{https://en.wikipedia.org/wiki/Discrete\_logarithm}% + {\emph{discrete logarithm}} + \end{itemize} +\end{frame} + +\begin{frame}{Diffie-Hellman key exchange} + \begin{itemize} + \item Alice and Bob agree on a prime number $p$ and an integer $g$ + \item Alice picks an integer $a$ and sends $(g^a\bmod p)$ to Bob + \item Bob picks an integer $b$ and sends $(g^b\bmod p)$ to Alice + \item Alice can compute $(g^b)^a\bmod p$ and Bob can compute + $(g^a)^b\bmod p$. This is their shared secret (key). + \end{itemize} +\end{frame} + +\begin{frame}{Diffie-Hellman with colors (from Wikipedia)} + \begin{center}\includesvg[scale=0.45]{img/DH}\end{center} +\end{frame} + +\begin{frame}{Diffie-Hellman key exchange} + \begin{itemize} + \item Knowing $h$ and $a$, it is hard to find $g$ such that + $g^a \bmod p =h$ (discrete logarithm problem) + \item Very simple, many variants + \item Any group can be used, e.g. Elliptic Curves (see +\href{https://en.wikipedia.org/wiki/Elliptic-curve_Diffie\%E2\%80\%93Hellman}% + {Wikipedia: elliptic-curve Diffie-Hellman}) + \end{itemize} +\end{frame} + + +\begin{frame}[plain] + \begin{center} {\Huge Numerical methods for PDEs} \end{center} +\end{frame} + +\begin{frame}{Solving partial differential equations} + \begin{itemize} + \item Very, very hard + \item Very important in practical applications (physics and such) + \item Approximations are necessary, might as well use numerical methods + \end{itemize} +\end{frame} + +\begin{frame}{Numerical methods for ODEs} + \begin{block}{Problem} + Given $f(x,y)$, $x_0$ and $y_0$, find an approximation + for $y(x)$ such that + \begin{align*} + \begin{cases} + y'(x) = f(x, y(x))\\ + y(x_0) =y_0 + \end{cases} + \end{align*} + \end{block} + + \begin{block}{Approximation} + We can describe $y(x)$ in an interval $[x_0,x_1]$ by giving the + (approximate) values $y(s_0)$, \dots, $y(s_n)$ for many + values of $s_i\in [x_0, x_1]$. + \end{block} +\end{frame} + +\begin{frame}{Euler's method} + \begin{block}{Idea} + For $h$ small + \begin{align*} + y'(x)\approx\frac{y(x+h)-y(x)}{h} + \end{align*} + which implies + \begin{align*} + y(x+h) \approx y(x) + h\cdot f(x, y(x)) + \end{align*} + \end{block} +\end{frame} + +\begin{frame}{Euler's method} + \begin{block}{Algorithm} + \textbf{Input:} the data $f(x,y)$, $x_0$, $y_0$ and $x_1$ describing + the problem and the desired range for the solution. + + \vspace{0.3cm} + \textbf{Output:} $x_0=s_0 < s_1 < \dots < s_n=x_1$ and + $y_0, \dots, y_n$ such that $y_i\approx y(s_i)$. + + \vspace{0.3cm} + \begin{enumerate} + \item Choose a value $n$ and let + $h=\frac{x_1-x_0}{n}$ and $s_i=x_0+ih$ + \item For $i=0,\dots, n-1$ compute + $y_{i+1}=y_i+h\cdot f(s_i, y_i)$ + \item Return $s_0, \dots, s_n$ and $y_0, \dots, y_n$ + \end{enumerate} + \end{block} +\end{frame} + +\begin{frame}{Euler's method} + \begin{itemize} + \item Very simple and fast + \item Generalization for higher-order equations: Runge-Kutta methods + \item A similar idea works for some PDEs + \end{itemize} +\end{frame} + +\begin{frame}{The heat equation (PDE)} + \begin{align*} + \frac{\partial u}{\partial t} = \frac{\partial^2 u}{\partial x_1^2} + + \frac{\partial^2 u}{\partial x_2^2} + \cdots + + \frac{\partial^2 u}{\partial x_n^2} + \end{align*} + + Where + \[u(x_1,x_2,\dots,x_n,t): \mathbb R^n\times \mathbb R_+\to \mathbb R\] + describes the quantity of heat at the point $(x_1,\dots x_n)$ at time $t$. + + \vspace{0.3cm} It appears also outside thermodynamics: mathematical finance + (\href{https://en.wikipedia.org/wiki/Black\%E2\%80\%93Scholes\_equation}% + {Black-Scholes equation}), quantum mechanics + (\href{https://en.wikipedia.org/wiki/Schr\%C3\%B6dinger\_equation}% + {Schrödinger equation}), image analysis\dots +\end{frame} + +\begin{frame}{A simple case ($n=1$, in $[0,1]^2$)} + \begin{block}{Problem} + Given $u_0(t)$, $u_1(t)$ and $u^0(x)$, find an approximation + for $u(x,t)$ such that + \begin{align*} + \begin{cases} + \frac{\partial u}{\partial t} = + \frac{\partial^2 u}{\partial x^2} \\ + u(0,t) = u_{(0)}(t) \quad \text{(boundary condition)}\\ + u(1,t) = u_{(1)}(t) \quad \text{(boundary condition)}\\ + u(x,0) = u^0(x) \quad \text{(initial condition)} + \end{cases} + \end{align*} + \end{block} + + \begin{block}{Approximation} + Values $u_i^j\approx u(s_i, r^j)$ for + $(s_i,r^j)\in [0,1]\times [0,1]$ + \end{block} +\end{frame} + +\begin{frame}{Idea} + For $k$ small: + \begin{align*} + \frac{\partial u(x,t)}{\partial t} \approx \frac{u(x,t+k)-u(x,t)}{k}\\ + \end{align*} + For $h$ small (left limit + right limit): + \begin{align*} + \frac{\partial^2 u(x,t)}{\partial x^2} &\approx + \frac{\partial}{\partial x}\left( + \frac{u(x,t) - u(x-h,t)}{h} + \right)\\ + &\approx \frac1h\left( + \frac{\partial u(x,t)}{\partial x} - + \frac{\partial u(x-h,t)}{\partial x} + \right)\\ + &\approx \frac1h\left( + \frac{u(x+h,t) - u(x,t)}{h} - \frac{u(x,t)-u(x-h,t)}{h} + \right)\\ + &\approx \frac{u(x+h,t)-2u(x,t)+u(x-h,t)}{h^2} + \end{align*} +\end{frame} + +\begin{frame}{Idea} + From the equation + \begin{align*} + \frac{u_i^{j+1}-u_i^j}{k}= \frac{u_{i+1}^j-2u_{i}^j+u_{i-1}^j}{h^2} + \end{align*} + we find the formula + \begin{align*} + u_i^{j+1} = \frac{k}{h^2}\left(u_{i+1}^j - 2u_i^j + u_{i-1}^j\right) + + u_i^j + \end{align*} +\end{frame} + +\begin{frame}{Finite difference method for the heat equation} + \begin{block}{Algorithm} + \textbf{Input:} $u_{(0)}^j$, $u_{(1)}^j$ (boundary) + and $u_i^0$ (initial). + + \vspace{0.3cm} + \textbf{Output:} values $u_i^j$ approximating a solution. + + \vspace{0.3cm} + \begin{enumerate} + \item Let $m=\operatorname{len}(u_0)-1$, + $n=\operatorname{len}(u^0)-1$ and $k=1/m$, $h=1/n$ + %\begin{align*} + % \begin{array}{cccc} + % k=\frac{t_1-t_0}{m}, & h=\frac{x_1-x_0}{n}, & + % r^j = t_0 +jk, & s_i = x_0+ih + % \end{array} + %\end{align*} + \item For $j=0,\dots, m-1$ do the following: + \begin{itemize} + \item For $i=1,\dots, n-1$ compute + \begin{align*} + u_i^{j+1} = \frac{k}{h^2}\left(u_{i+1}^j - + 2u_i^j + u_{i-1}^j\right) + u_i^j + \end{align*} + \end{itemize} + \item Return the $u_i^j$ + \end{enumerate} + \end{block} +\end{frame} + +\begin{frame}{Other PDEs} + \begin{itemize} + \item In general, there is no generic method + \item You might need to write specific code for your equation + \item Some packages exists + (e.g. \href{https://wiki.octave.org/Fem-fenics}{fem-fenics} for + \href{https://www.gnu.org/software/octave/index}{Gnu Octave}) + \end{itemize} +\end{frame} + +\end{document} diff --git a/src/Lecture7/slides/X2-StudentsRequests.toc b/src/Lecture7/slides/X2-StudentsRequests.toc diff --git a/src/Lecture7/slides/X2-StudentsRequests.vrb b/src/Lecture7/slides/X2-StudentsRequests.vrb @@ -0,0 +1,10 @@ +\frametitle{Fibonacci with memorization} +\begin{adjustbox}{scale={0.85}{0.9},center} + \begin{tikzcd}[column sep=1mm] + & & & & & & & & F(5) \ar[drrr] \ar[dlll]\\ + & & & & & F(4)\ar[dll]\ar[dr] & & & & & & {\color{blue}F(3)}\\ + & & & F(3) \ar[dl]\ar[dr] & & & {\color{blue}F(2)}\\ + & & F(2) \ar[dl]\ar[dr] & & {\color{blue}F(1)} \\ + & F(1) & & F(0) + \end{tikzcd} + \end{adjustbox} diff --git a/src/Lecture7/slides/img/DH.svg b/src/Lecture7/slides/img/DH.svg @@ -0,0 +1,181 @@ +<svg width="426.5" height="641" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <g id="k" style=""> + <ellipse id="o" cx="45.75" cy="630.2" rx="45" ry="10" fill="#796300" stroke="#000" stroke-width="1.5"/> + <path fill="#796300" stroke="#000" stroke-width="1.5" d="m0.75 630.2v-60h90v60"/> + <use transform="translate(0,-60)" style="" xlink:href="#o"/> + </g> + <use transform="translate(335)" style="" xlink:href="#k"/> + <g id="j" style=""> + <ellipse id="n" cx="45.75" cy="520.2" rx="45" ry="10" fill="#ff5a00" stroke="#000" stroke-width="1.5"/> + <path fill="#ff5a00" stroke="#000" stroke-width="1.5" d="m0.75 520.2v-20h90v20"/> + <use transform="translate(0,-20)" style="" xlink:href="#n"/> + </g> + <g id="i" style=""> + <ellipse id="m" cx="380.8" cy="520.2" rx="45" ry="10" fill="#5dcac5" stroke="#000" stroke-width="1.5"/> + <path fill="#5dcac5" stroke="#000" stroke-width="1.5" d="m335.8 520.2v-20h90v20"/> + <use transform="translate(0,-20)" style="" xlink:href="#m"/> + </g> + <g id="h" style=""> + <g id="c" style=""> + <path fill="#fff" stroke="#000" stroke-width="1.5" d="m0.75 450.2v-60h90v60"/> + <ellipse cx="45.75" cy="390.2" rx="45" ry="10" fill="#fff" stroke="#000" stroke-width="1.5"/> + </g> + <g style=""> + <ellipse id="l" cx="45.75" cy="450.2" rx="45" ry="10" fill="#93bbff" stroke="#000" stroke-width="1.5"/> + <path fill="#93bbff" stroke="#000" stroke-width="1.5" d="m0.75 450.2v-40h90v40"/> + <use transform="translate(0,-40)" style="" xlink:href="#l"/> + </g> + </g> + <g id="g" style=""> + <use transform="translate(335)" style="" xlink:href="#c"/> + <g style=""> + <ellipse id="p" cx="380.8" cy="450.2" rx="45" ry="10" fill="#ffbf61" stroke="#000" stroke-width="1.5"/> + <path fill="#ffbe60" stroke="#000" stroke-width="1.5" d="m335.8 450.2v-40h90v40"/> + <use transform="translate(0,-40)" style="" xlink:href="#p"/> + </g> + </g> + <use transform="translate(-335,-160)" style="" xlink:href="#g"/> + <use transform="translate(335,-160)" style="" xlink:href="#h"/> + <use transform="translate(0,-340)" style="" xlink:href="#j"/> + <use transform="translate(0,-340)" style="" xlink:href="#i"/> + <g id="f" style=""> + <use transform="translate(0,-340)" style="" xlink:href="#c"/> + <g style=""> + <use transform="translate(0,20)" style="" xlink:href="#q"/> + <path fill="#ff0" stroke="#000" stroke-width="1.5" d="m0.75 110.2v-20h90v20"/> + <ellipse id="q" cx="45.75" cy="90.25" rx="45" ry="10" fill="#ff0" stroke="#000" stroke-width="1.5"/> + </g> + </g> + <use transform="translate(335)" style="" xlink:href="#f"/> + <g id="e" style=""> + <path stroke="#000" stroke-width="1.5" d="m91.5 301 243.5 78.5"/> + <path d="m326.4 372.8 2.406 4.719-4.719 2.406 13.66 0.4687" style=""/> + </g> + <use transform="matrix(-1,0,0,1,427.5,0)" style="" xlink:href="#e"/> + <g aria-label="Common secret"> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + </g> + <use transform="translate(0 340)" style="" xlink:href="#a"/> + <use transform="translate(335 340)" style="" xlink:href="#a"/> + <use width="100%" height="100%" transform="translate(0,340)" xlink:href="#d"/> + <use transform="translate(0,340)" style="" xlink:href="#b"/> + <use transform="translate(335,340)" style="" xlink:href="#b"/> + <g aria-label="Public transport"> + <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"/> + <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"/> + <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"/> + <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"/> + <path d="m180.5 298v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + </g> + <g id="a" aria-label="="> + <path d="m41.47 204.4v-2.124h8.568v2.124zm0 4.14v-2.124h8.568v2.124z"/> + </g> + <use transform="translate(335)" style="" xlink:href="#a"/> + <g id="d" aria-label="Secret colours"> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + </g> + <g id="b" aria-label="+"> + <path d="m44.6 139.8v-3.312h-3.132v-2.124h3.132v-3.312h2.304v3.312h3.132v2.124h-3.132v3.312z"/> + </g> + <use transform="translate(335)" style="" xlink:href="#b"/> + <g aria-label="Common paint"> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <path d="m257.4 71.74v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/> + <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"/> + <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"/> + </g> + <g aria-label="Alice"> + <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"/> + <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"/> + <path d="m44.23 0.7225v5.056h-5.088v-5.056zm-4.928 7.328h4.736v16.51h-4.736z"/> + <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"/> + <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"/> + </g> + <g aria-label="Bob"> + <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"/> + <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"/> + <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"/> + </g> + <g aria-label="(assume that mixture separation is expensive)"> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <path d="m145.3 390.5v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <path d="m277.5 390.5v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/> + <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"/> + <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"/> + <path d="m153.3 413v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <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"/> + <path d="m242.4 413v2.844h-2.862v-2.844zm-2.772 4.122h2.664v9.288h-2.664z"/> + <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"/> + <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"/> + <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"/> + </g> +</svg> +\ No newline at end of file diff --git a/src/Lecture7/slides/img/plot1.png 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 Binary files differ. diff --git a/src/Lecture7/slides/img/plot3.png 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 Binary files differ. diff --git a/src/Lecture7/slides/img/plot5.png 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 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 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 @@ -0,0 +1,58 @@ +%% Creator: Inkscape inkscape 0.92.5, www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'DH_svg-tex.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{<filename>.pdf_tex} +%% instead of +%% \includegraphics{<filename>.pdf} +%% To scale the image, write +%% \def\svgwidth{<desired width>} +%% \input{<filename>.pdf_tex} +%% instead of +%% \includegraphics[width=<desired width>]{<filename>.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{<path to file>}{<filename>.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{<path to file>/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \newcommand*\fsize{\dimexpr\f@size pt\relax}% + \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{319.9125bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,1.50094365)% + \lineheight{1}% + \setlength\tabcolsep{0pt}% + \put(0,0){\includegraphics[width=\unitlength,page=1]{DH_svg-tex.pdf}}% + \end{picture}% +\endgroup%