first commit

This commit is contained in:
Meik Hellmund 2023-05-12 20:12:56 +02:00
commit 9f546da17c
69 changed files with 13975 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/.quarto/

22
.luarc.json Normal file
View File

@ -0,0 +1,22 @@
{
"Generator": [
"Quarto",
"This file provides type information for Lua completion and diagnostics.",
"Quarto will automatically update this file to reflect the current path",
"of your Quarto installation, and the file will also be added to .gitignore",
"since it points to the absolute path of Quarto on the local system.",
"Remove the 'Generator' key to manage this file's contents manually."
],
"Lua.runtime.version": "Lua 5.3",
"Lua.workspace.checkThirdParty": false,
"Lua.workspace.library": [
"/home/hellmund/W/quarto-cli/src/resources/lua-types"
],
"Lua.runtime.plugin": "/home/hellmund/W/quarto-cli/src/resources/lua-plugin/plugin.lua",
"Lua.completion.showWord": "Disable",
"Lua.completion.keywordSnippet": "Both",
"Lua.diagnostics.disable": [
"lowercase-global",
"trailing-space"
]
}

22
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,22 @@
{
"julia.environmentPath": "/home/hellmund/Julia/23",
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
"**/Thumbs.db": true,
"**/*.ipynb": true,
"**/*.md": false
},
"explorerExclude.backup": {},
"ltex.enabled": false,
"ltex.language": "de-DE",
"ltex.markdown.nodes": {
"CodeBlock": "ignore",
"FencedCodeBlock": "ignore",
"AutoLink": "dummy",
"Code": "dummy"
}
}

129
_quarto.yml Normal file
View File

@ -0,0 +1,129 @@
project:
type: book
resources:
- fonts/
- js/
- images/
lang: de
language:
title-block-published: "Updated"
title-block-author-single: "Autor"
toc-title-document: "Auf dieser Seite"
book:
title: "Julia für Numerik"
subtitle: "Einführung in die wissenschaftliche Programmierung"
author: "Meik Hellmund"
site-url: "https://www.math.uni-leipzig.de/~hellmund/juliabook"
favicon: "images/favicon-32x32.png"
sidebar:
logo: "images/julia-logo-color.svg"
tools:
- icon: download
href: "Julia-f%C3%BCr-Numerik.pdf"
search: false
downloads: [pdf]
date: today
page-footer:
left: |
All content licenced under [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/).
right: |
Created with [Quarto](https://quarto.org/)
background: "#f8f9fa"
chapters:
- index.qmd
- chapters/entwicklungsumgebungen.qmd
- chapters/first_contact.qmd
- chapters/Erste_Bsp.qmd
- chapters/syntax.qmd
- chapters/5_TricksHelp.qmd
- chapters/numerictypes.qmd
- chapters/Pi2.qmd
- chapters/types.qmd
- chapters/pcomplex.qmd
- chapters/9_functs.qmd
- chapters/6_ArraysEtcP1.qmd
- chapters/7_ArraysP2.qmd
- chapters/10_Strings.qmd
# - chapters/makie.qmd
# - chapters/ablaufsteuerung.qmd
# - chapters/example.qmd
# - chapters/intro.qmd
# - chapters/summary.qmd
format:
julia-html:
theme:
light: [cosmo, css/light.scss]
dark: [superhero, css/dark.scss]
css:
- css/styles.css
highlight-style: github # arrow ?????
mainfont: "Roboto Condensed" # Ubuntu # "Atkinson Hyperlegible" # Ubuntu # Verdana #Quicksand
toc: true # change for Vorlesung
toc-depth: 3
number-depth: 3
email-obfuscation: javascript
smooth-scroll: false
grid:
sidebar-width: 250px
body-width: 1150px # 800
margin-width: 250px
gutter-width: 1.5em
cap-location: bottom
julia-pdf:
pdf-engine: xelatex
papersize: a4
documentclass: scrreprt
classoption: [notitlepage,DIV=16,BCOR=5mm,10pt]
toc: false
number-depth: 2
fig-cap-location: bottom
fig-pos: H
tbl-cap-location: bottom
hyperrefoptions:
- linktoc=all
colorlinks: true
linkcolor: "blue"
keep-tex: true
keep-ipynb: true
keep-md: true
code-block-bg: "#e0e0e0"
code-block-border-left: "#e0e0e0"
code-overflow: wrap
include-in-header:
- file: macros.tex
latex-auto-install: false
execute:
cache: true
output: true
echo: true
warning: true
error: true
eval: true
freeze: auto
daemon: 3600
keep-ipynb: true
keep-tex: true
keep-md: true
jupyter: julia-1.8
filters:
- code-visibility
- julia
- latex-environment
environments: [quote,indentb]

33
css/dark.scss Normal file
View File

@ -0,0 +1,33 @@
/*-- scss:defaults --*/
$border-radius: 0;
/* bug in superhero theme? */
h1,h2,h3,h4,h5,h6 {color: #f0f0f0 !important;}
/* for output of ?help cells */
.cell-output h1,h2,h3,h4,h5,h6 {color: #101010;}
.cell-output code span {color: #000;}
/*-- scss:rules --*/
div.cell-output { background-color: #dbdbdb; }
p code:not(.sourceCode), li code:not(sourceCode) {
background-color: #d9dbc4 !important;
}
a code {
color: #7f36a3 !important;
}
img.sidebar-logo {
/* display: none; */
content: url("images/julia-logo-dark.svg");
}
/*
img.sidebar-logo::after {
}*/

17
css/light.scss Normal file
View File

@ -0,0 +1,17 @@
/*-- scss:defaults --*/
$border-radius: 0;
/* $code-block-border-left: #909090; */
/* $code-block-bg: #f3f3f3; */
$code-block-bg: #f7f7f7;
/*-- scss:rules --*/
div.cell-output { background-color: #ffffff; }
code {color: #202020;}
p code:not(.sourceCode), li code:not(sourceCode) {
background-color: #f3f3f3 !important;
}

210
css/styles.css Normal file
View File

@ -0,0 +1,210 @@
/* https://google-webfonts-helper.herokuapp.com/fonts/ubuntu?subsets=cyrillic,greek,latin,latin-ext */
/* ubuntu-regular - latin-ext_latin_greek_cyrillic */
@font-face {
font-family: 'Ubuntu';
font-style: normal;
font-weight: 400;
src: url('../fonts/ubuntu-v20-latin-ext_latin_greek_cyrillic-regular.eot'); /* IE9 Compat Modes */
src: local(''),
url('../fonts/ubuntu-v20-latin-ext_latin_greek_cyrillic-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('../fonts/ubuntu-v20-latin-ext_latin_greek_cyrillic-regular.woff2') format('woff2'), /* Super Modern Browsers */
url('../fonts/ubuntu-v20-latin-ext_latin_greek_cyrillic-regular.woff') format('woff'), /* Modern Browsers */
url('../fonts/ubuntu-v20-latin-ext_latin_greek_cyrillic-regular.ttf') format('truetype'), /* Safari, Android, iOS */
url('../fonts/ubuntu-v20-latin-ext_latin_greek_cyrillic-regular.svg#Ubuntu') format('svg'); /* Legacy iOS */
}
/* roboto-condensed-regular - latin-ext_latin_greek_cyrillic */
@font-face {
font-family: 'Roboto Condensed';
font-style: normal;
font-weight: 400;
src: url('../fonts/roboto-condensed-v25-latin-ext_latin_greek_cyrillic-regular.eot'); /* IE9 Compat Modes */
src: local(''),
url('../fonts/roboto-condensed-v25-latin-ext_latin_greek_cyrillic-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('../fonts/roboto-condensed-v25-latin-ext_latin_greek_cyrillic-regular.woff2') format('woff2'), /* Super Modern Browsers */
url('../fonts/roboto-condensed-v25-latin-ext_latin_greek_cyrillic-regular.woff') format('woff'), /* Modern Browsers */
url('../fonts/roboto-condensed-v25-latin-ext_latin_greek_cyrillic-regular.ttf') format('truetype'), /* Safari, Android, iOS */
url('../fonts/roboto-condensed-v25-latin-ext_latin_greek_cyrillic-regular.svg#RobotoCondensed') format('svg'); /* Legacy iOS */
}
/* roboto-regular - latin-ext_latin_greek_cyrillic */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: url('../fonts/roboto-v30-latin-ext_latin_greek_cyrillic-regular.eot'); /* IE9 Compat Modes */
src: local(''),
url('../fonts/roboto-v30-latin-ext_latin_greek_cyrillic-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('../fonts/roboto-v30-latin-ext_latin_greek_cyrillic-regular.woff2') format('woff2'), /* Super Modern Browsers */
url('../fonts/roboto-v30-latin-ext_latin_greek_cyrillic-regular.woff') format('woff'), /* Modern Browsers */
url('../fonts/roboto-v30-latin-ext_latin_greek_cyrillic-regular.ttf') format('truetype'), /* Safari, Android, iOS */
url('../fonts/roboto-v30-latin-ext_latin_greek_cyrillic-regular.svg#Roboto') format('svg'); /* Legacy iOS */
}
/* quicksand-regular - latin-ext_latin */
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 400;
src: url('../fonts/quicksand-v30-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */
src: local(''),
url('../fonts/quicksand-v30-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('../fonts/quicksand-v30-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
url('../fonts/quicksand-v30-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */
url('../fonts/quicksand-v30-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
url('../fonts/quicksand-v30-latin-ext_latin-regular.svg#Quicksand') format('svg'); /* Legacy iOS */
}
/* atkinson-hyperlegible-regular - latin-ext_latin */
@font-face {
font-family: 'Atkinson Hyperlegible';
font-style: normal;
font-weight: 400;
src: url('../fonts/atkinson-hyperlegible-v10-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */
src: local(''),
url('../fonts/atkinson-hyperlegible-v10-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('../fonts/atkinson-hyperlegible-v10-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
url('../fonts/atkinson-hyperlegible-v10-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */
url('../fonts/atkinson-hyperlegible-v10-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
url('../fonts/atkinson-hyperlegible-v10-latin-ext_latin-regular.svg#AtkinsonHyperlegible') format('svg'); /* Legacy iOS */
}
/* https://stackoverflow.com/questions/65480036/bootstrap-5-underline-default-changed */
/* Bootstrap 5 tweak: do not underline links unless hovered over */
a:not([class*="btn"]) {
text-decoration: none;
}
a:not([class*="btn"]):hover {
text-decoration: underline;
}
/* Code cells -------------------------------------------------- */
pre, .cell-output {
color: #202020;
}
pre.sourceCode {
font-size: 0.90em !important;
}
div:has(pre.sourceCode.default) { /* not-julia cells */
margin-bottom: 1.0em;
}
div.cell {
/* border: 2px solid #f0f0f0!important; */
margin-bottom: 1em;
border: 1px #ccc solid;
border-left-color: green;
border-left-width: medium;
}
div.sourceCode{
border-radius: 0;
margin: 0;
}
div.cell-output {
margin-bottom: 0.4em;
/* font-family: JuliaMono; */
padding-left:0.5em;
}
.cell-output code {
padding-left: .5em;
}
.cell-output pre {
margin: 0;
padding-top: 0.3em;
font-size: 0.9em !important;
}
code {
/* color: #202020; nur in light theme*/
font-size: 0.9em !important;
font-variant-ligatures: no-contextual;
}
p code:not(.sourceCode), li code:not(sourceCode) {
/* background-color: #f3f3f3 !important; */
padding: 0.05em 0.2em 0.05em 0.2em !important;
}
/* markdown: > text ---------------------------------- */
.blockquote {
line-height: 120%;
margin-left: 0;
font-size: 0.925rem;
}
/* my own environment ------------------------------- */
.indentb {
margin-left:3.5em;
font-size:.9rem;
border-left: 3px solid #f0f0f0;
padding-left:1em;
}
/* class for callout header with non-bold title --------------*/
.titlenormal div.callout-header {
font-weight: 400 !important;
}
/* nehmen wir nicht wg Farbe in dark theme
kbd {
padding: 0.05rem !important;
}
*/
/* Julia ?name output 'Example' ------------------*/
div.cell-output h6 {
font-weight: bold !important;
margin-left: 1em !important;
font-size: 0.9em !important;
}
/* code cell in callout: no border -------*/
div.callout .cell {
border-left-width: 0 !important;
border-right-width: 0 !important;
border-top-width: 0 !important;
border-bottom-width: 0 !important;
}
/* code cells ```julia (ohne exec) */
:not(.cell) div.sourceCode:not(.cell-code){
margin-bottom: 1em;
}
/* my own div, esp. for tables*/
div.narrow {
width: 70%;
margin-left: auto;
margin-right: auto;
}
/* my own div for phaistos */
div.cellmerge div.cell:first-of-type {
margin-bottom: 0;
border-bottom: 0;
}
div.cellmerge div.cell:nth-of-type(2) {
border-top: 0;
}
.math.inline .MathJax {
font-size: 100% !important;
}
.math.display .MathJax {
font-size: 104% !important;
}

7
deploy.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/bash
# falls nicht richtig upgedated:
# rm -rf .quarto _freeze
# quarto render
rsync -avch --delete _book/ ~/HTML/juliabook

View File

@ -0,0 +1,306 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<defs >
<font id="RobotoCondensed" horiz-adv-x="1021" ><font-face
font-family="Roboto Condensed"
units-per-em="2048"
panose-1="2 0 0 0 0 0 0 0 0 0"
ascent="1900"
descent="-500"
alphabetic="0" />
<glyph unicode=" " horiz-adv-x="469" />
<glyph unicode="!" horiz-adv-x="503" d="M332 411H173L160 1456H346L332 411ZM257 199Q307 199 332 169T358 93T333 19T257 -11Q206 -11 181 18T156 93T181 168T257 199Z" />
<glyph unicode="&quot;" horiz-adv-x="655" d="M277 1400L247 1042H136L137 1536H277V1400ZM547 1400L517 1042H406L407 1536H547V1400Z" />
<glyph unicode="#" horiz-adv-x="1122" d="M666 410H460L392 0H258L326 410H131V547H349L408 901H195V1040H431L500 1456H634L565 1040H771L840 1456H975L906 1040H1068V901H883L824 547H1005V410H801L733 0H598L666 410ZM483 547H689L748 901H542L483 547Z" />
<glyph unicode="$" horiz-adv-x="1011" d="M724 375Q724 466 674 528T502 644Q323 709 241 813T159 1079Q159 1243 238 1346T455 1472V1692H596V1471Q736 1446 812 1329T889 1008H714Q714 1147 663 1231T523 1315T385 1254T335 1082Q335 981 388 921T563 809Q744
741 822 640T901 377Q901 213 817 109T576 -16V-208H437V-16Q279 7 195 122T111 429H287Q287 290 343 215T501 140Q605 140 664 202T724 375Z" />
<glyph unicode="%" horiz-adv-x="1296" d="M107 1176Q107 1306 177 1391T361 1477Q473 1477 544 1393T616 1172V1099Q616 968 546 884T363 800T179 884T107 1105V1176ZM236 1099Q236 1019 271 970T363 920Q418 920 452 968T487 1103V1176Q487 1257 452 1306T361
1356Q304 1356 270 1306T236 1173V1099ZM695 357Q695 488 766 572T949 657T1133 573T1205 350V279Q1205 147 1133 63T951 -21Q839 -21 767 63T695 284V357ZM824 279Q824 198 859 149T951 99Q1007 99 1041 149T1075 282V357Q1075 438 1040 487T949 536Q894 536 859
488T824 354V279ZM399 110L302 176L899 1314L997 1248L399 110Z" />
<glyph unicode="&amp;" horiz-adv-x="1113" d="M103 391Q103 494 152 581T342 785Q260 900 230 974T199 1122Q199 1289 284 1382T514 1476Q646 1476 731 1388T816 1168Q816 1082 782 1009T662 861L559 773L815 404Q862 523 862 672H1020Q1020 420 918 256L1096
0H884L810 107Q753 48 672 14T504 -20Q321 -20 212 94T103 391ZM504 131Q621 131 719 241L430 662L400 637Q279 522 279 391Q279 275 339 203T504 131ZM375 1128Q375 1074 402 1017T472 896L549 962Q610 1011 632 1056T654 1168T614 1279T513 1324Q448 1324 412
1268T375 1128Z" />
<glyph unicode="&apos;" horiz-adv-x="357" d="M253 1425L232 1057H103L104 1536H253V1425Z" />
<glyph unicode="(" horiz-adv-x="643" d="M129 591Q129 853 200 1084T401 1489Q480 1594 553 1643L588 1521Q468 1406 391 1175T307 660L306 579Q306 227 405 -43Q480 -246 588 -357L553 -470Q461 -408 366 -266Q129 91 129 591Z" />
<glyph unicode=")" horiz-adv-x="652" d="M513 581Q513 135 313 -208Q205 -392 89 -470L54 -357Q180 -236 257 12T336 557V593Q336 973 211 1273Q142 1437 54 1530L89 1643Q199 1569 302 1400Q513 1052 513 581Z" />
<glyph unicode="*" horiz-adv-x="882" d="M330 983L28 1073L74 1224L376 1112L367 1456H520L510 1107L807 1217L853 1065L546 974L744 703L620 609L434 897L254 616L129 707L330 983Z" />
<glyph unicode="+" horiz-adv-x="1017" d="M596 781H925V606H596V146H418V606H86V781H418V1206H596V781Z" />
<glyph unicode="," horiz-adv-x="402" d="M134 -290L29 -218Q123 -87 127 52V219H308V74Q308 -27 259 -128T134 -290Z" />
<glyph unicode="-" horiz-adv-x="508" d="M460 543H47V694H460V543Z" />
<glyph unicode="." horiz-adv-x="539" d="M144 97Q144 145 172 177T258 209T344 177T374 97Q374 51 345 20T258 -11T173 20T144 97Z" />
<glyph unicode="/" horiz-adv-x="759" d="M181 -125H31L542 1456H691L181 -125Z" />
<glyph unicode="0" horiz-adv-x="1011" d="M895 621Q895 299 801 140T506 -20Q311 -20 215 133T115 593V843Q115 1162 209 1319T504 1476Q701 1476 795 1327T895 876V621ZM718 874Q718 1105 667 1214T504 1324Q395 1324 344 1217T291 892V592Q291 362 344 247T506
131Q614 131 665 240T718 573V874Z" />
<glyph unicode="1" horiz-adv-x="1011" d="M644 0H466V1233L160 1096V1264L616 1463H644V0Z" />
<glyph unicode="2" horiz-adv-x="1011" d="M931 0H117V133L532 683Q626 810 662 891T699 1064Q699 1180 645 1252T503 1324Q392 1324 332 1248T271 1027H94Q94 1228 204 1352T503 1476Q677 1476 777 1370T877 1086Q877 870 652 575L328 151H931V0Z" />
<glyph unicode="3" horiz-adv-x="1011" d="M343 818H456Q565 818 624 885T683 1068Q683 1324 485 1324Q390 1324 336 1255T282 1074H106Q106 1249 212 1362T485 1476Q657 1476 758 1369T859 1064Q859 963 807 876T670 747Q876 671 876 406Q876 211 768 96T484
-20Q311 -20 205 89T98 384H275Q275 268 331 200T484 131Q583 131 641 198T700 402Q700 667 449 667H343V818Z" />
<glyph unicode="4" horiz-adv-x="1011" d="M787 489H949V338H787V0H610V338H60V447L601 1456H787V489ZM256 489H610V1181L256 489Z" />
<glyph unicode="5" horiz-adv-x="1011" d="M189 730L252 1456H885V1285H401L367 888Q457 951 561 951Q731 951 828 819T925 464Q925 238 820 109T530 -20Q366 -20 263 87T145 383H311Q326 258 382 195T530 131Q633 131 691 220T749 462Q749 605 687 695T518 785Q430
785 377 739L330 692L189 730Z" />
<glyph unicode="6" horiz-adv-x="1011" d="M733 1457V1300H704Q527 1296 427 1181T312 833Q409 955 560 955Q721 955 815 823T910 475Q910 246 806 113T525 -20Q348 -20 240 137T132 554V625Q132 925 197 1103T388 1367T703 1457H733ZM530 801Q458 801 397 746T309
606V533Q309 356 371 245T525 133Q624 133 680 224T736 466Q736 614 680 707T530 801Z" />
<glyph unicode="7" horiz-adv-x="1011" d="M920 1352L419 0H234L734 1304H85V1456H920V1352Z" />
<glyph unicode="8" horiz-adv-x="1011" d="M866 1076Q866 967 818 882T687 749Q784 699 839 606T894 393Q894 205 788 93T505 -20T223 92T116 393Q116 513 170 607T319 750Q237 798 190 882T143 1076Q143 1260 242 1368T505 1476Q667 1476 766 1369T866 1076ZM717
397Q717 522 658 597T503 673Q405 673 349 597T292 397Q292 271 347 201T505 131T662 201T717 397ZM690 1073Q690 1184 638 1254T505 1324Q420 1324 370 1255T320 1073Q320 959 371 892T505 825Q590 825 640 893T690 1073Z" />
<glyph unicode="9" horiz-adv-x="1011" d="M699 622Q593 487 451 487Q292 487 198 621T104 972Q104 1200 206 1338T486 1476Q670 1476 773 1317T877 875V820Q877 578 841 428T733 186T552 47T277 -1V155H308Q496 159 593 269T699 622ZM481 640Q545 640 606 693T701
834V912Q701 1093 638 1207T486 1322Q390 1322 334 1228T277 982T332 736T481 640Z" />
<glyph unicode=":" horiz-adv-x="478" d="M394 97Q394 145 422 177T508 209T594 177T624 97Q624 51 595 20T508 -11T423 20T394 97ZM139 980Q139 1028 167 1060T253 1092T339 1060T369 980Q369 934 340 903T253 872T168 903T139 980Z" />
<glyph unicode=";" horiz-adv-x="415" d="M115 980Q115 1028 143 1060T229 1092T315 1060T345 980Q345 934 316 903T229 872T144 903T115 980ZM148 -290L43 -218Q137 -87 141 52V219H322V74Q322 -27 273 -128T148 -290Z" />
<glyph unicode="&lt;" horiz-adv-x="913" d="M253 644L763 391V195L79 574V720L763 1098V902L253 644Z" />
<glyph unicode="=" horiz-adv-x="981" d="M849 814H148V975H849V814ZM849 399H148V559H849V399Z" />
<glyph unicode="&gt;" horiz-adv-x="942" d="M678 651L136 909V1099L856 721V575L136 196V388L678 651Z" />
<glyph unicode="?" horiz-adv-x="864" d="M314 410Q314 530 339 605T461 796L531 886Q601 984 601 1090Q601 1195 558 1254T433 1314Q357 1314 307 1260T256 1115H80Q82 1280 180 1378T433 1476Q594 1476 686 1375T778 1096Q778 926 639 755L547 644Q490 563 490
410H314ZM410 199Q460 199 485 169T511 93T486 19T410 -11Q359 -11 335 18T310 93T334 168T410 199Z" />
<glyph unicode="@" horiz-adv-x="1575" d="M1474 502Q1466 267 1375 124T1124 -20Q969 -20 921 139Q876 59 821 20T708 -20Q586 -20 525 96T480 417Q492 580 543 710T675 915T842 989Q913 989 968 967T1091 883L1046 329Q1030 98 1145 98Q1234 98 1290 206T1354
502Q1369 893 1234 1096T826 1299Q658 1299 532 1200T334 913T253 478Q239 99 376 -114T772 -328Q849 -328 925 -306T1051 -249L1084 -364Q1031 -403 945 -428T769 -453Q560 -453 409 -341T182 -18T116 478Q125 753 218 973T471 1312T830 1431Q1036 1431 1186 1319T1410
997T1474 502ZM630 417Q619 275 652 199T754 123Q798 123 838 171T906 309L908 329L947 838Q903 861 858 861Q765 861 704 741T630 417Z" />
<glyph unicode="A" horiz-adv-x="1180" d="M836 380H344L231 0H43L512 1456H669L1139 0H951L836 380ZM392 538H789L590 1200L392 538Z" />
<glyph unicode="B" horiz-adv-x="1117" d="M157 0V1456H572Q771 1456 871 1359T972 1068Q972 966 921 888T783 767Q883 737 941 644T1000 420Q1000 224 893 112T586 0H157ZM340 681V157H590Q694 157 755 225T816 418Q816 681 594 681H340ZM340 835H575Q670 835
728 899T787 1069Q787 1189 734 1243T572 1298H340V835Z" />
<glyph unicode="C" horiz-adv-x="1161" d="M1070 462Q1058 228 939 104T601 -20Q382 -20 253 146T124 598V862Q124 1146 256 1311T618 1476Q829 1476 944 1350T1070 988H885Q873 1166 810 1242T618 1318Q469 1318 389 1202T309 860V593Q309 372 383 254T601 136T807
207T885 462H1070Z" />
<glyph unicode="D" horiz-adv-x="1169" d="M157 0V1456H504Q759 1456 900 1297T1041 848V604Q1041 315 898 158T483 0H157ZM340 1298V157H487Q680 157 769 267T860 595V853Q860 1083 772 1190T504 1298H340Z" />
<glyph unicode="E" horiz-adv-x="1017" d="M855 673H340V157H940V0H157V1456H930V1298H340V830H855V673Z" />
<glyph unicode="F" horiz-adv-x="984" d="M832 643H340V0H157V1456H915V1298H340V800H832V643Z" />
<glyph unicode="G" horiz-adv-x="1210" d="M1068 181L1036 141Q898 -20 632 -20Q396 -20 262 136T124 579V865Q124 1171 246 1323T613 1476Q821 1476 938 1360T1068 1029H885Q874 1165 810 1241T614 1318Q457 1318 384 1216T308 888V591Q308 371 392 254T633 136Q781
136 858 208L885 233V569H619V725H1068V181Z" />
<glyph unicode="H" horiz-adv-x="1270" d="M1110 0H926V673H340V0H157V1456H340V830H926V1456H1110V0Z" />
<glyph unicode="I" horiz-adv-x="512" d="M348 0H165V1456H348V0Z" />
<glyph unicode="J" horiz-adv-x="990" d="M659 1456H843V425Q843 216 737 98T450 -20Q265 -20 162 92T59 402H242Q242 277 297 207T450 137Q545 137 602 213T659 426V1456Z" />
<glyph unicode="K" horiz-adv-x="1116" d="M483 671L340 498V0H157V1456H340V753L460 912L852 1456H1072L599 815L1109 0H890L483 671Z" />
<glyph unicode="L" horiz-adv-x="973" d="M341 157H912V0H157V1456H341V157Z" />
<glyph unicode="M" horiz-adv-x="1547" d="M393 1456L773 268L1153 1456H1389V0H1206V567L1223 1135L842 0H702L323 1131L340 567V0H157V1456H393Z" />
<glyph unicode="N" horiz-adv-x="1268" d="M1108 0H924L341 1122V0H157V1456H341L926 329V1456H1108V0Z" />
<glyph unicode="O" horiz-adv-x="1230" d="M1104 600Q1104 302 977 141T616 -20Q391 -20 261 136T125 579V853Q125 1145 254 1310T614 1476Q844 1476 972 1318T1104 865V600ZM921 855Q921 1086 846 1198T614 1311Q463 1311 386 1197T307 861V600Q307 377 384 260T616
143T844 251T921 582V855Z" />
<glyph unicode="P" horiz-adv-x="1135" d="M340 570V0H157V1456H621Q824 1456 940 1335T1056 1011Q1056 801 946 688T634 570H340ZM340 727H621Q743 727 808 800T873 1009Q873 1140 806 1219T622 1298H340V727Z" />
<glyph unicode="Q" horiz-adv-x="1230" d="M1096 601Q1096 409 1045 277T898 70L1115 -125L991 -246L729 -7Q666 -20 607 -20Q380 -20 250 139T116 588V853Q116 1147 245 1311T605 1476Q838 1476 966 1316T1096 861V601ZM913 855Q913 1086 838 1198T605 1311Q455
1311 378 1197T299 861V601Q299 377 376 260T607 143Q759 143 834 249T913 576V855Z" />
<glyph unicode="R" horiz-adv-x="1087" d="M597 589H341V0H157V1456H565Q779 1456 889 1345T999 1018Q999 883 940 783T771 631L1053 12V0H856L597 589ZM341 746H563Q678 746 746 820T815 1018Q815 1298 561 1298H341V746Z" />
<glyph unicode="S" horiz-adv-x="1061" d="M793 368Q793 477 734 535T521 648T286 763T164 901T123 1079Q123 1252 238 1364T541 1476Q669 1476 769 1419T923 1259T977 1035H793Q793 1170 728 1244T541 1318Q430 1318 369 1256T308 1082Q308 990 374 928T578 817Q793
746 885 642T978 370Q978 193 863 87T550 -20Q423 -20 316 35T147 191T85 422H269Q269 287 344 212T550 137Q671 137 732 199T793 368Z" />
<glyph unicode="T" horiz-adv-x="1066" d="M1008 1298H625V0H442V1298H60V1456H1008V1298Z" />
<glyph unicode="U" horiz-adv-x="1150" d="M1025 1456V421Q1023 214 905 97T576 -20Q360 -20 246 94T130 421V1456H312V428Q312 281 374 209T576 136Q716 136 778 208T841 428V1456H1025Z" />
<glyph unicode="V" horiz-adv-x="1147" d="M573 281L906 1456H1107L654 0H494L42 1456H242L573 281Z" />
<glyph unicode="W" horiz-adv-x="1560" d="M435 459L454 296L483 440L716 1456H869L1095 440L1124 292L1145 460L1323 1456H1506L1216 0H1051L808 1061L793 1147L778 1061L526 0H360L71 1456H254L435 459Z" />
<glyph unicode="X" horiz-adv-x="1128" d="M566 898L840 1456H1055L676 734L1063 0H846L566 568L285 0H68L457 734L76 1456H290L566 898Z" />
<glyph unicode="Y" horiz-adv-x="1074" d="M536 725L834 1456H1041L627 543V0H444V543L30 1456H238L536 725Z" />
<glyph unicode="Z" horiz-adv-x="1070" d="M294 157H985V0H91V144L754 1298H98V1456H958V1315L294 157Z" />
<glyph unicode="[" horiz-adv-x="513" d="M469 1512H314V-160H469V-312H137V1664H469V1512Z" />
<glyph unicode="\" horiz-adv-x="756" d="M51 1456H218L728 -125H562L51 1456Z" />
<glyph unicode="]" horiz-adv-x="513" d="M30 1664H363V-312H30V-160H187V1512H30V1664Z" />
<glyph unicode="^" horiz-adv-x="760" d="M379 1211L232 729H69L321 1456H439L689 729H528L379 1211Z" />
<glyph unicode="_" horiz-adv-x="829" d="M805 -151H24V0H805V-151Z" />
<glyph unicode="`" horiz-adv-x="633" d="M474 1242H315L57 1536H280L474 1242Z" />
<glyph unicode="a" horiz-adv-x="981" d="M689 0Q673 35 666 118Q572 -20 426 -20Q279 -20 197 62T114 295Q114 460 226 557T533 656H663V771Q663 868 620 909T489 950Q409 950 359 903T309 782H132Q132 865 181 940T313 1059T498 1102Q664 1102 750 1020T839
779V233Q840 108 873 16V0H689ZM453 141Q518 141 577 177T663 267V525H563Q437 523 364 469T291 316Q291 224 328 183T453 141Z" />
<glyph unicode="b" horiz-adv-x="1010" d="M916 489Q916 236 825 108T561 -20Q389 -20 303 128L294 0H133V1536H309V963Q396 1102 559 1102Q737 1102 826 976T916 596V489ZM740 590Q740 782 687 863T513 945Q376 945 309 797V282Q375 136 515 136Q635 136 687
220T740 481V590Z" />
<glyph unicode="c" horiz-adv-x="946" d="M508 131Q596 131 649 185T707 341H874Q868 185 764 83T508 -20Q307 -20 202 106T96 483V602Q96 847 201 974T507 1102Q673 1102 770 997T874 710H707Q701 830 650 890T507 950Q389 950 332 873T273 618V480Q273 289 329
210T508 131Z" />
<glyph unicode="d" horiz-adv-x="1016" d="M95 590Q95 840 188 971T457 1102Q612 1102 699 976V1536H876V0H714L705 116Q618 -20 456 -20Q288 -20 193 110T95 479V590ZM272 489Q272 307 326 222T502 136Q634 136 699 269V815Q631 945 503 945Q381 945 327 860T272
597V489Z" />
<glyph unicode="e" horiz-adv-x="959" d="M519 -20Q317 -20 209 100T99 454V585Q99 827 204 964T499 1102Q689 1102 783 981T879 604V488H275V463Q275 289 340 210T529 131Q607 131 666 160T778 254L870 142Q755 -20 519 -20ZM499 950Q389 950 336 875T276 640H702V664Q695
818 647 884T499 950Z" />
<glyph unicode="f" horiz-adv-x="648" d="M210 0V939H69V1082H210V1207Q213 1372 293 1464T521 1557Q574 1557 628 1540L619 1390Q581 1399 538 1399Q387 1399 387 1184V1082H572V939H387V0H210Z" />
<glyph unicode="g" horiz-adv-x="1009" d="M97 590Q97 843 189 972T458 1102Q623 1102 709 961L718 1082H878V-10Q878 -211 775 -318T488 -426Q408 -426 309 -387T159 -289L231 -167Q341 -275 474 -275Q695 -275 701 -34V107Q615 -20 457 -20Q289 -20 195 106T97
470V590ZM274 489Q274 307 327 222T503 136Q635 136 701 271V812Q632 945 505 945Q383 945 329 860T274 597V489Z" />
<glyph unicode="h" horiz-adv-x="989" d="M309 971Q410 1102 567 1102Q854 1102 858 719V0H682V711Q682 838 640 891T512 945Q446 945 394 901T309 786V0H132V1536H309V971Z" />
<glyph unicode="i" horiz-adv-x="469" d="M323 0H146V1082H323V0ZM337 1369Q337 1324 312 1294T236 1264Q186 1264 161 1294T136 1369T161 1445T236 1476T311 1445T337 1369Z" />
<glyph unicode="j" horiz-adv-x="458" d="M313 1082V-136Q310 -437 75 -437Q21 -437 -22 -419L-23 -271Q4 -279 46 -279Q91 -279 113 -246T136 -129V1082H313ZM321 1369Q321 1324 296 1294T220 1264Q170 1264 146 1294T121 1369T145 1445T220 1476T295 1445T321 1369Z" />
<glyph unicode="k" horiz-adv-x="923" d="M404 495L310 387V0H133V1536H310V617L647 1082H859L515 630L904 0H698L404 495Z" />
<glyph unicode="l" horiz-adv-x="469" d="M323 0H146V1536H323V0Z" />
<glyph unicode="m" horiz-adv-x="1541" d="M299 1082L303 982Q402 1102 564 1102Q745 1102 817 945Q919 1102 1101 1102Q1400 1102 1407 729V0H1231V712Q1231 830 1189 887T1047 945Q967 945 917 883T859 725V0H681V720Q678 945 498 945Q364 945 309 811V0H133V1082H299Z" />
<glyph unicode="n" horiz-adv-x="991" d="M299 1082L304 965Q407 1102 567 1102Q854 1102 858 719V0H682V711Q682 838 640 891T512 945Q446 945 394 901T309 786V0H132V1082H299Z" />
<glyph unicode="o" horiz-adv-x="1028" d="M95 591Q95 827 209 964T512 1102T814 968T932 603V489Q932 254 818 117T514 -20Q326 -20 213 113T95 473V591ZM272 489Q272 322 337 227T514 131Q748 131 755 469V591Q755 757 689 853T512 950Q403 950 338 854T272 592V489Z" />
<glyph unicode="p" horiz-adv-x="1010" d="M914 489Q914 232 822 106T560 -20Q397 -20 309 103V-416H133V1082H293L302 962Q391 1102 557 1102Q735 1102 823 978T914 607V489ZM738 590Q738 772 682 858T502 945Q375 945 309 818V255Q374 131 504 131Q624 131 680
217T738 482V590Z" />
<glyph unicode="q" horiz-adv-x="1025" d="M95 590Q95 843 187 972T461 1102Q618 1102 705 976L713 1082H875V-416H698V95Q612 -20 460 -20Q285 -20 191 107T95 479V590ZM272 489Q272 307 328 219T506 131Q630 131 698 250V830Q626 950 507 950Q385 950 329 862T272
597V489Z" />
<glyph unicode="r" horiz-adv-x="623" d="M579 916Q542 923 499 923Q363 923 309 774V0H132V1082H304L307 972Q378 1102 508 1102Q550 1102 578 1088L579 916Z" />
<glyph unicode="s" horiz-adv-x="933" d="M658 277Q658 334 615 375T449 471Q306 530 248 572T160 667T131 795Q131 927 227 1014T474 1102Q632 1102 728 1010T824 774H648Q648 847 599 898T474 950Q396 950 352 910T307 801Q307 747 339 714T496 627Q693 550
764 477T835 290Q835 149 738 65T478 -20Q309 -20 204 77T99 323H277Q280 233 332 182T478 131Q566 131 612 170T658 277Z" />
<glyph unicode="t" horiz-adv-x="605" d="M364 1344V1082H527V939H364V268Q364 204 385 171T457 138Q492 138 528 150L526 0Q466 -20 403 -20Q298 -20 243 55T188 267V939H23V1082H188V1344H364Z" />
<glyph unicode="u" horiz-adv-x="990" d="M684 95Q596 -20 427 -20Q280 -20 205 81T129 377V1082H305V390Q305 137 457 137Q618 137 679 281V1082H856V0H688L684 95Z" />
<glyph unicode="v" horiz-adv-x="876" d="M439 269L644 1082H824L503 0H371L46 1082H226L439 269Z" />
<glyph unicode="w" horiz-adv-x="1331" d="M939 311L1103 1082H1278L1013 0H872L661 774L455 0H313L50 1082H224L392 330L593 1082H733L939 311Z" />
<glyph unicode="x" horiz-adv-x="899" d="M445 687L630 1082H835L541 547L842 0H639L448 405L256 0H52L353 547L60 1082H263L445 687Z" />
<glyph unicode="y" horiz-adv-x="853" d="M428 294L625 1082H813L459 -153Q419 -292 346 -364T180 -437Q144 -437 88 -421V-271L127 -275Q204 -275 247 -239T318 -112L353 9L35 1082H228L428 294Z" />
<glyph unicode="z" horiz-adv-x="899" d="M296 151H818V0H94V136L590 929H98V1082H798V951L296 151Z" />
<glyph unicode="{" horiz-adv-x="627" d="M549 -366Q398 -316 322 -203T244 95V302Q244 543 72 543V688Q244 688 244 929V1135Q245 1319 320 1432T549 1597L585 1482Q425 1419 421 1147V931Q421 705 274 615Q421 525 421 298V79Q426 -189 584 -251L549 -366Z" />
<glyph unicode="|" horiz-adv-x="499" d="M324 -270H175V1456H324V-270Z" />
<glyph unicode="}" horiz-adv-x="627" d="M39 -251Q199 -188 204 80V301Q204 532 363 615Q204 697 204 933V1140Q202 1418 39 1482L75 1597Q225 1548 300 1438T380 1149V913Q385 688 552 688V543Q380 543 380 302V98Q380 -266 75 -366L39 -251Z" />
<glyph unicode="~" horiz-adv-x="1207" d="M1084 777Q1084 622 1003 512T803 402Q739 402 681 432T552 541Q512 588 478 613T406 639Q344 639 311 586T278 438L125 436Q125 594 205 698T406 802Q478 802 536 766T656 663Q697 613 730 589T803 565Q862 565 901
623T940 776L1084 777Z" />
<glyph unicode="&#xa0;" horiz-adv-x="469" />
<glyph unicode="&#xa1;" horiz-adv-x="474" d="M161 684H321L334 -360H148L161 684ZM237 889Q186 889 161 920T136 996T161 1071T237 1101Q287 1101 312 1071T338 996T313 920T237 889Z" />
<glyph unicode="&#xa2;" horiz-adv-x="982" d="M514 131Q592 131 650 191T714 341H881Q875 216 793 117T592 -11V-245H416V-8Q269 27 187 167T104 525V562Q104 769 186 911T416 1090V1318H592V1094Q718 1069 796 965T881 710H714Q708 815 653 882T514 950Q401
950 341 851T280 555V520Q280 329 340 230T514 131Z" />
<glyph unicode="&#xa3;" horiz-adv-x="1046" d="M411 622L418 402Q416 249 363 157H978L977 0H99V157H157Q191 167 212 234T233 401L227 622H96V779H222L215 1039Q215 1237 321 1356T601 1476Q762 1476 857 1371T953 1087H771Q771 1197 720 1257T584 1318Q502
1318 451 1240T399 1039L407 779H667V622H411Z" />
<glyph unicode="&#xa4;" horiz-adv-x="1460" d="M1103 112Q944 -20 735 -20Q528 -20 369 110L235 -26L105 109L244 250Q140 406 140 608Q140 814 252 977L105 1128L235 1264L382 1114Q540 1234 735 1234Q931 1234 1090 1113L1239 1265L1371 1128L1220 974Q1330
811 1330 608Q1330 412 1228 253L1371 109L1239 -27L1103 112ZM311 608Q311 485 368 379T524 212T735 151T946 212T1100 379T1157 608Q1157 730 1101 835T946 1001T735 1062Q622 1062 524 1002T369 836T311 608Z" />
<glyph unicode="&#xa5;" horiz-adv-x="949" d="M476 832L717 1456H920L615 736H824V611H563V446H824V322H563V0H379V322H123V446H379V611H123V736H335L30 1456H236L476 832Z" />
<glyph unicode="&#xa6;" horiz-adv-x="491" d="M147 -270V521H333V-270H147ZM333 698H147V1456H333V698Z" />
<glyph unicode="&#xa7;" horiz-adv-x="1100" d="M990 431Q990 241 832 157Q891 108 921 40T952 -128Q952 -297 841 -396T536 -495Q330 -495 211 -383T92 -64L269 -62Q269 -193 340 -268T536 -343Q644 -343 709 -284T775 -130Q775 -41 717 11T486 126Q267 195 182
293T97 551Q97 644 137 713T251 824Q134 925 134 1110Q134 1276 248 1376T551 1476Q749 1476 859 1363T970 1045H794Q794 1169 728 1247T551 1325T376 1268T312 1112Q312 1012 367 963T594 855T840 744T953 615T990 431ZM528 691Q443 718 390 741Q274 702 274 553Q274
452 328 401T556 289Q644 260 690 239Q750 261 781 310T813 428Q813 517 757 571T528 691Z" />
<glyph unicode="&#xa8;" horiz-adv-x="856" d="M101 1371Q101 1416 128 1446T210 1477T292 1447T320 1371T292 1296T210 1266T129 1296T101 1371ZM531 1369Q531 1414 558 1445T640 1476T722 1445T750 1369T722 1294T640 1264T559 1294T531 1369Z" />
<glyph unicode="&#xa9;" horiz-adv-x="1609" d="M1119 597Q1119 444 1033 364T788 283Q631 283 537 388T442 676V786Q442 962 537 1067T788 1173Q948 1173 1034 1091T1120 860H974Q974 959 927 1001T788 1044Q694 1044 640 975T586 783V670Q586 550 640 481T788
412Q880 412 926 454T973 597H1119ZM206 729Q206 557 286 411T503 181T801 98T1098 181T1315 410T1395 729Q1395 899 1316 1044T1100 1272T801 1356Q641 1356 503 1274T286 1045T206 729ZM91 729Q91 931 184 1104T443 1376T801 1476T1158 1377T1416 1104T1510 729Q1510
532 1420 360T1165 84T801 -21Q604 -21 439 82T182 358T91 729Z" />
<glyph unicode="&#xaa;" horiz-adv-x="811" d="M529 705L515 773Q452 691 349 691Q248 691 194 753T140 918Q140 1145 419 1149H509V1201Q509 1336 417 1336Q365 1336 336 1309T307 1231L154 1243Q154 1347 227 1411T417 1476Q531 1476 597 1405T663 1200V886Q663
790 685 705H529ZM388 828Q453 828 509 889V1037H439Q294 1037 294 922Q294 828 388 828Z" />
<glyph unicode="&#xab;" horiz-adv-x="856" d="M521 804L732 407H603L355 795V814L603 1203H732L521 804ZM549 548L760 151H631L383 539V558L631 947H760L549 548Z" />
<glyph unicode="&#xac;" horiz-adv-x="998" d="M832 375H654V639H127V800H832V375Z" />
<glyph unicode="&#xad;" horiz-adv-x="508" d="M460 543H47V694H460V543Z" />
<glyph unicode="&#xae;" horiz-adv-x="1610" d="M90 729Q90 931 183 1104T442 1376T800 1476T1157 1377T1415 1104T1509 729Q1509 532 1419 360T1164 84T800 -21Q603 -21 438 82T181 358T90 729ZM205 729Q205 557 285 411T502 181T800 98Q961 98 1099 182T1315
412T1394 729Q1394 900 1316 1044T1099 1272T800 1356Q640 1356 502 1274T285 1045T205 729ZM653 654V316H512V1165H788Q941 1165 1025 1100T1110 909Q1110 786 982 721Q1104 671 1105 517V456Q1105 370 1122 332V316H977Q963 352 963 444T960 554Q944 650 829
654H653ZM653 782H809Q881 784 925 817T969 904Q969 977 930 1007T791 1038H653V782Z" />
<glyph unicode="&#xaf;" horiz-adv-x="848" d="M722 1302H141V1445H722V1302Z" />
<glyph unicode="&#xb0;" horiz-adv-x="765" d="M130 1216Q130 1320 204 1398T385 1476Q489 1476 562 1399T636 1216Q636 1110 563 1035T385 960Q280 960 205 1035T130 1216ZM385 1088Q439 1088 476 1123T513 1216Q513 1274 476 1311T385 1349Q330 1349 293 1310T255
1216T292 1125T385 1088Z" />
<glyph unicode="&#xb1;" horiz-adv-x="962" d="M578 854H875V703H578V289H420V703H105V854H420V1267H578V854ZM837 0H135V152H837V0Z" />
<glyph unicode="&#xb2;" horiz-adv-x="675" d="M599 667H87V775L343 1063Q425 1160 425 1228Q425 1277 401 1307T332 1338Q274 1338 248 1300T221 1205H72Q72 1319 143 1393T328 1467Q444 1467 509 1404T574 1230Q574 1123 477 1011L276 795H599V667Z" />
<glyph unicode="&#xb3;" horiz-adv-x="675" d="M242 1126H308Q425 1126 425 1235Q425 1279 401 1308T324 1338Q282 1338 254 1314T226 1246H77Q77 1343 146 1405T322 1467Q440 1467 507 1407T574 1242Q574 1187 545 1142T459 1071Q584 1031 584 887Q584 779 510
718T321 656Q207 656 138 719T69 889H219Q219 844 247 814T327 784Q381 784 408 814T436 895Q436 1009 317 1010H242V1126Z" />
<glyph unicode="&#xb4;" horiz-adv-x="642" d="M316 1536H540L272 1242H123L316 1536Z" />
<glyph unicode="&#xb5;" d="M323 1082V440Q325 281 364 206T494 130Q641 130 696 264V1082H874V0H715L707 102Q633 -20 501 -20Q386 -20 323 47V-416H147V1082H323Z" />
<glyph unicode="&#xb6;" horiz-adv-x="890" d="M551 0V520H482Q357 520 264 578T121 743T71 988Q71 1201 183 1328T486 1456H729V0H551Z" />
<glyph unicode="&#xb7;" horiz-adv-x="498" d="M138 729Q138 777 164 809T244 841T324 809T351 729Q351 682 324 651T244 619T165 650T138 729Z" />
<glyph unicode="&#xb8;" horiz-adv-x="469" d="M272 0L262 -52Q322 -65 354 -110T386 -225Q386 -321 320 -378T129 -435L123 -328Q251 -328 251 -229Q251 -184 225 -164T119 -134L147 0H272Z" />
<glyph unicode="&#xb9;" horiz-adv-x="675" d="M446 667H297V1268L121 1211V1339L429 1456H446V667Z" />
<glyph unicode="&#xba;" horiz-adv-x="825" d="M118 1123Q118 1277 198 1376T412 1476T626 1378T706 1118V1043Q706 886 626 788T413 690Q278 690 198 789T118 1047V1123ZM273 1043Q273 942 311 886T413 829T514 886T551 1046V1123Q551 1222 514 1279T412 1336Q349
1336 312 1281T273 1126V1043Z" />
<glyph unicode="&#xbb;" horiz-adv-x="856" d="M232 949L480 560V541L232 152H101L312 550L101 949H232ZM535 949L783 560V541L535 152H404L615 550L404 949H535Z" />
<glyph unicode="&#xbc;" horiz-adv-x="1305" d="M407 664H258V1265L82 1208V1336L390 1453H407V664ZM401 118L305 184L902 1322L999 1256L401 118ZM1142 299H1226V169H1142V0H994V169H686L681 271L991 789H1142V299ZM827 299H994V578L984 560L827 299Z" />
<glyph unicode="&#xbd;" horiz-adv-x="1388" d="M364 118L268 184L865 1322L962 1256L364 118ZM406 664H257V1265L81 1208V1336L389 1453H406V664ZM1278 0H766V108L1022 396Q1104 493 1104 561Q1104 610 1080 640T1011 671Q953 671 927 633T900 538H751Q751 652
822 726T1007 800Q1123 800 1188 737T1253 563Q1253 456 1156 344L955 128H1278V0Z" />
<glyph unicode="&#xbe;" horiz-adv-x="1379" d="M502 118L406 184L1003 1322L1100 1256L502 118ZM1211 299H1295V169H1211V0H1063V169H755L750 271L1060 789H1211V299ZM896 299H1063V578L1053 560L896 299ZM284 1126H350Q467 1126 467 1235Q467 1279 443 1308T366
1338Q324 1338 296 1314T268 1246H119Q119 1343 188 1405T364 1467Q482 1467 549 1407T616 1242Q616 1187 587 1142T501 1071Q626 1031 626 887Q626 779 552 718T363 656Q249 656 180 719T111 889H261Q261 844 289 814T369 784Q423 784 450 814T478 895Q478 1009
359 1010H284V1126Z" />
<glyph unicode="&#xbf;" horiz-adv-x="863" d="M526 680Q525 577 507 513T445 388L377 298L322 223Q247 118 247 0Q247 -109 292 -166T424 -224Q498 -224 549 -168T601 -20H777Q775 -184 677 -284T424 -385Q257 -385 164 -286T71 -5Q71 164 205 342L291 452Q349
536 349 680H526ZM530 997Q530 952 505 921T430 890T355 921T329 997Q329 1041 354 1071T430 1101T505 1071T530 997Z" />
<glyph unicode="&#xc0;" horiz-adv-x="1180" d="M836 380H344L231 0H43L512 1456H669L1139 0H951L836 380ZM392 538H789L590 1200L392 538ZM700 1552H541L283 1846H506L700 1552Z" />
<glyph unicode="&#xc1;" horiz-adv-x="1180" d="M836 380H344L231 0H43L512 1456H669L1139 0H951L836 380ZM392 538H789L590 1200L392 538ZM685 1846H909L641 1552H492L685 1846Z" />
<glyph unicode="&#xc2;" horiz-adv-x="1180" d="M836 380H344L231 0H43L512 1456H669L1139 0H951L836 380ZM392 538H789L590 1200L392 538ZM856 1572V1562H714L594 1732L474 1562H332V1574L541 1846H646L856 1572Z" />
<glyph unicode="&#xc3;" horiz-adv-x="1180" d="M836 380H344L231 0H43L512 1456H669L1139 0H951L836 380ZM392 538H789L590 1200L392 538ZM896 1814Q896 1709 844 1641T710 1572Q675 1572 650 1582T585 1623T527 1660T486 1667Q452 1667 430 1635T407 1555L292
1562Q292 1671 345 1740T477 1809Q507 1809 531 1798T591 1760T651 1724T701 1713Q735 1713 758 1745T781 1826L896 1814Z" />
<glyph unicode="&#xc4;" horiz-adv-x="1180" d="M836 380H344L231 0H43L512 1456H669L1139 0H951L836 380ZM392 538H789L590 1200L392 538ZM272 1681Q272 1726 299 1756T381 1787T463 1757T491 1681T463 1606T381 1576T300 1606T272 1681ZM702 1679Q702 1724 729
1755T811 1786T893 1755T921 1679T893 1604T811 1574T730 1604T702 1679Z" />
<glyph unicode="&#xc5;" horiz-adv-x="1180" d="M836 380H344L231 0H43L512 1456H669L1139 0H951L836 380ZM392 538H789L590 1200L392 538ZM809 1729Q809 1642 747 1584T594 1525Q502 1525 441 1584T379 1729T440 1876T594 1937T747 1876T809 1729ZM478 1729Q478
1682 511 1648T594 1614Q642 1614 676 1647T710 1729T677 1812T594 1847Q544 1847 511 1812T478 1729Z" />
<glyph unicode="&#xc6;" horiz-adv-x="1663" d="M1616 0H853L840 353H382L214 0H-2L737 1456H1564V1304H984L1001 833H1496V682H1006L1025 151H1616V0ZM465 527H834L809 1250L465 527Z" />
<glyph unicode="&#xc7;" horiz-adv-x="1161" d="M1070 462Q1058 228 939 104T601 -20Q382 -20 253 146T124 598V862Q124 1146 256 1311T618 1476Q829 1476 944 1350T1070 988H885Q873 1166 810 1242T618 1318Q469 1318 389 1202T309 860V593Q309 372 383 254T601
136T807 207T885 462H1070ZM659 -9L649 -61Q709 -74 741 -119T773 -234Q773 -330 707 -387T516 -444L510 -337Q638 -337 638 -238Q638 -193 612 -173T506 -143L534 -9H659Z" />
<glyph unicode="&#xc8;" horiz-adv-x="1017" d="M855 673H340V157H940V0H157V1456H930V1298H340V830H855V673ZM646 1564H487L229 1858H452L646 1564Z" />
<glyph unicode="&#xc9;" horiz-adv-x="1017" d="M855 673H340V157H940V0H157V1456H930V1298H340V830H855V673ZM631 1858H855L587 1564H438L631 1858Z" />
<glyph unicode="&#xca;" horiz-adv-x="1017" d="M855 673H340V157H940V0H157V1456H930V1298H340V830H855V673ZM802 1584V1574H660L540 1744L420 1574H278V1586L487 1858H592L802 1584Z" />
<glyph unicode="&#xcb;" horiz-adv-x="1017" d="M855 673H340V157H940V0H157V1456H930V1298H340V830H855V673ZM218 1693Q218 1738 245 1768T327 1799T409 1769T437 1693T409 1618T327 1588T246 1618T218 1693ZM648 1691Q648 1736 675 1767T757 1798T839 1767T867
1691T839 1616T757 1586T676 1616T648 1691Z" />
<glyph unicode="&#xcc;" horiz-adv-x="512" d="M348 0H165V1456H348V0ZM362 1564H203L-55 1858H168L362 1564Z" />
<glyph unicode="&#xcd;" horiz-adv-x="512" d="M348 0H165V1456H348V0ZM346 1858H570L302 1564H153L346 1858Z" />
<glyph unicode="&#xce;" horiz-adv-x="512" d="M348 0H165V1456H348V0ZM518 1584V1574H376L256 1744L136 1574H-6V1586L203 1858H308L518 1584Z" />
<glyph unicode="&#xcf;" horiz-adv-x="512" d="M348 0H165V1456H348V0ZM-66 1693Q-66 1738 -39 1768T43 1799T125 1769T153 1693T125 1618T43 1588T-38 1618T-66 1693ZM364 1691Q364 1736 391 1767T473 1798T555 1767T583 1691T555 1616T473 1586T392 1616T364 1691Z" />
<glyph unicode="&#xd0;" horiz-adv-x="1199" d="M187 0V666H18V817H187V1456H534Q789 1456 930 1297T1071 848V604Q1071 315 928 158T513 0H187ZM560 666H370V157H517Q710 157 799 267T890 595V853Q890 1083 802 1190T534 1298H370V817H560V666Z" />
<glyph unicode="&#xd1;" horiz-adv-x="1268" d="M1108 0H924L341 1122V0H157V1456H341L926 329V1456H1108V0ZM932 1814Q932 1709 880 1641T746 1572Q711 1572 686 1582T621 1623T563 1660T522 1667Q488 1667 466 1635T443 1555L328 1562Q328 1671 381 1740T513
1809Q543 1809 567 1798T627 1760T687 1724T737 1713Q771 1713 794 1745T817 1826L932 1814Z" />
<glyph unicode="&#xd2;" horiz-adv-x="1230" d="M1104 600Q1104 302 977 141T616 -20Q391 -20 261 136T125 579V853Q125 1145 254 1310T614 1476Q844 1476 972 1318T1104 865V600ZM921 855Q921 1086 846 1198T614 1311Q463 1311 386 1197T307 861V600Q307 377
384 260T616 143T844 251T921 582V855ZM724 1554H565L307 1848H530L724 1554Z" />
<glyph unicode="&#xd3;" horiz-adv-x="1230" d="M1104 600Q1104 302 977 141T616 -20Q391 -20 261 136T125 579V853Q125 1145 254 1310T614 1476Q844 1476 972 1318T1104 865V600ZM921 855Q921 1086 846 1198T614 1311Q463 1311 386 1197T307 861V600Q307 377
384 260T616 143T844 251T921 582V855ZM709 1848H933L665 1554H516L709 1848Z" />
<glyph unicode="&#xd4;" horiz-adv-x="1230" d="M1104 600Q1104 302 977 141T616 -20Q391 -20 261 136T125 579V853Q125 1145 254 1310T614 1476Q844 1476 972 1318T1104 865V600ZM921 855Q921 1086 846 1198T614 1311Q463 1311 386 1197T307 861V600Q307 377
384 260T616 143T844 251T921 582V855ZM880 1574V1564H738L618 1734L498 1564H356V1576L565 1848H670L880 1574Z" />
<glyph unicode="&#xd5;" horiz-adv-x="1230" d="M1104 600Q1104 302 977 141T616 -20Q391 -20 261 136T125 579V853Q125 1145 254 1310T614 1476Q844 1476 972 1318T1104 865V600ZM921 855Q921 1086 846 1198T614 1311Q463 1311 386 1197T307 861V600Q307 377
384 260T616 143T844 251T921 582V855ZM920 1816Q920 1711 868 1643T734 1574Q699 1574 674 1584T609 1625T551 1662T510 1669Q476 1669 454 1637T431 1557L316 1564Q316 1673 369 1742T501 1811Q531 1811 555 1800T615 1762T675 1726T725 1715Q759 1715 782 1747T805
1828L920 1816Z" />
<glyph unicode="&#xd6;" horiz-adv-x="1230" d="M1104 600Q1104 302 977 141T616 -20Q391 -20 261 136T125 579V853Q125 1145 254 1310T614 1476Q844 1476 972 1318T1104 865V600ZM921 855Q921 1086 846 1198T614 1311Q463 1311 386 1197T307 861V600Q307 377
384 260T616 143T844 251T921 582V855ZM296 1683Q296 1728 323 1758T405 1789T487 1759T515 1683T487 1608T405 1578T324 1608T296 1683ZM726 1681Q726 1726 753 1757T835 1788T917 1757T945 1681T917 1606T835 1576T754 1606T726 1681Z" />
<glyph unicode="&#xd7;" horiz-adv-x="964" d="M93 329L368 663L91 1000L204 1123L476 793L748 1123L860 1000L582 663L858 329L745 206L475 533L206 206L93 329Z" />
<glyph unicode="&#xd8;" horiz-adv-x="1230" d="M1112 681Q1112 358 978 169T616 -20Q476 -20 366 58L287 -93H156L278 140Q117 333 117 689V773Q117 981 178 1141T352 1388T614 1476Q793 1476 916 1357L1000 1516H1131L995 1258Q1108 1077 1112 792V681ZM299
681Q299 453 369 313L832 1195Q750 1311 614 1311Q466 1311 383 1167T299 773V681ZM930 775Q930 942 893 1063L445 209Q517 143 616 143Q766 143 848 281T930 681V775Z" />
<glyph unicode="&#xd9;" horiz-adv-x="1150" d="M1025 1456V421Q1023 214 905 97T576 -20Q360 -20 246 94T130 421V1456H312V428Q312 281 374 209T576 136Q716 136 778 208T841 428V1456H1025ZM681 1552H522L264 1846H487L681 1552Z" />
<glyph unicode="&#xda;" horiz-adv-x="1150" d="M1025 1456V421Q1023 214 905 97T576 -20Q360 -20 246 94T130 421V1456H312V428Q312 281 374 209T576 136Q716 136 778 208T841 428V1456H1025ZM666 1846H890L622 1552H473L666 1846Z" />
<glyph unicode="&#xdb;" horiz-adv-x="1150" d="M1025 1456V421Q1023 214 905 97T576 -20Q360 -20 246 94T130 421V1456H312V428Q312 281 374 209T576 136Q716 136 778 208T841 428V1456H1025ZM837 1572V1562H695L575 1732L455 1562H313V1574L522 1846H627L837 1572Z" />
<glyph unicode="&#xdc;" horiz-adv-x="1150" d="M1025 1456V421Q1023 214 905 97T576 -20Q360 -20 246 94T130 421V1456H312V428Q312 281 374 209T576 136Q716 136 778 208T841 428V1456H1025ZM253 1681Q253 1726 280 1756T362 1787T444 1757T472 1681T444 1606T362
1576T281 1606T253 1681ZM683 1679Q683 1724 710 1755T792 1786T874 1755T902 1679T874 1604T792 1574T711 1604T683 1679Z" />
<glyph unicode="&#xdd;" horiz-adv-x="1074" d="M536 725L834 1456H1041L627 543V0H444V543L30 1456H238L536 725ZM631 1846H855L587 1552H438L631 1846Z" />
<glyph unicode="&#xde;" horiz-adv-x="1055" d="M331 1456V1163H554Q745 1161 855 1045T965 738Q965 546 854 430T544 313H331V0H154V1456H331ZM331 1012V465H549Q661 465 724 540T788 736Q788 859 725 934T553 1011H332L331 1012Z" />
<glyph unicode="&#xdf;" horiz-adv-x="1069" d="M309 0H133V1111Q133 1320 224 1437T473 1554Q629 1554 714 1466T800 1216Q800 1091 746 990T691 819Q691 767 722 720T831 600T945 460T980 317Q980 152 895 66T654 -20Q588 -20 513 1T404 52L443 207Q476 179
533 155T635 131Q804 131 804 307Q804 360 773 409T665 528T551 669T514 821Q514 881 533 926T574 1013T616 1099T635 1201Q635 1301 592 1351T482 1402Q312 1402 309 1120V0Z" />
<glyph unicode="&#xe0;" horiz-adv-x="981" d="M689 0Q673 35 666 118Q572 -20 426 -20Q279 -20 197 62T114 295Q114 460 226 557T533 656H663V771Q663 868 620 909T489 950Q409 950 359 903T309 782H132Q132 865 181 940T313 1059T498 1102Q664 1102 750 1020T839
779V233Q840 108 873 16V0H689ZM453 141Q518 141 577 177T663 267V525H563Q437 523 364 469T291 316Q291 224 328 183T453 141ZM615 1242H456L198 1536H421L615 1242Z" />
<glyph unicode="&#xe1;" horiz-adv-x="981" d="M689 0Q673 35 666 118Q572 -20 426 -20Q279 -20 197 62T114 295Q114 460 226 557T533 656H663V771Q663 868 620 909T489 950Q409 950 359 903T309 782H132Q132 865 181 940T313 1059T498 1102Q664 1102 750 1020T839
779V233Q840 108 873 16V0H689ZM453 141Q518 141 577 177T663 267V525H563Q437 523 364 469T291 316Q291 224 328 183T453 141ZM600 1536H824L556 1242H407L600 1536Z" />
<glyph unicode="&#xe2;" horiz-adv-x="981" d="M689 0Q673 35 666 118Q572 -20 426 -20Q279 -20 197 62T114 295Q114 460 226 557T533 656H663V771Q663 868 620 909T489 950Q409 950 359 903T309 782H132Q132 865 181 940T313 1059T498 1102Q664 1102 750 1020T839
779V233Q840 108 873 16V0H689ZM453 141Q518 141 577 177T663 267V525H563Q437 523 364 469T291 316Q291 224 328 183T453 141ZM771 1262V1252H629L509 1422L389 1252H247V1264L456 1536H561L771 1262Z" />
<glyph unicode="&#xe3;" horiz-adv-x="981" d="M689 0Q673 35 666 118Q572 -20 426 -20Q279 -20 197 62T114 295Q114 460 226 557T533 656H663V771Q663 868 620 909T489 950Q409 950 359 903T309 782H132Q132 865 181 940T313 1059T498 1102Q664 1102 750 1020T839
779V233Q840 108 873 16V0H689ZM453 141Q518 141 577 177T663 267V525H563Q437 523 364 469T291 316Q291 224 328 183T453 141ZM811 1504Q811 1399 759 1331T625 1262Q590 1262 565 1272T500 1313T442 1350T401 1357Q367 1357 345 1325T322 1245L207 1252Q207 1361
260 1430T392 1499Q422 1499 446 1488T506 1450T566 1414T616 1403Q650 1403 673 1435T696 1516L811 1504Z" />
<glyph unicode="&#xe4;" horiz-adv-x="981" d="M689 0Q673 35 666 118Q572 -20 426 -20Q279 -20 197 62T114 295Q114 460 226 557T533 656H663V771Q663 868 620 909T489 950Q409 950 359 903T309 782H132Q132 865 181 940T313 1059T498 1102Q664 1102 750 1020T839
779V233Q840 108 873 16V0H689ZM453 141Q518 141 577 177T663 267V525H563Q437 523 364 469T291 316Q291 224 328 183T453 141ZM187 1371Q187 1416 214 1446T296 1477T378 1447T406 1371T378 1296T296 1266T215 1296T187 1371ZM617 1369Q617 1414 644 1445T726
1476T808 1445T836 1369T808 1294T726 1264T645 1294T617 1369Z" />
<glyph unicode="&#xe5;" horiz-adv-x="981" d="M689 0Q673 35 666 118Q572 -20 426 -20Q279 -20 197 62T114 295Q114 460 226 557T533 656H663V771Q663 868 620 909T489 950Q409 950 359 903T309 782H132Q132 865 181 940T313 1059T498 1102Q664 1102 750 1020T839
779V233Q840 108 873 16V0H689ZM453 141Q518 141 577 177T663 267V525H563Q437 523 364 469T291 316Q291 224 328 183T453 141ZM724 1419Q724 1332 662 1274T509 1215Q417 1215 356 1274T294 1419T355 1566T509 1627T662 1566T724 1419ZM393 1419Q393 1372 426
1338T509 1304Q557 1304 591 1337T625 1419T592 1502T509 1537Q459 1537 426 1502T393 1419Z" />
<glyph unicode="&#xe6;" horiz-adv-x="1491" d="M1079 -20Q859 -20 744 152Q688 70 592 25T381 -20Q242 -20 163 65T83 304Q83 461 179 548T462 635H639V720Q639 827 596 888T472 950Q391 950 337 896T282 759L107 778Q107 920 209 1011T472 1102Q670 1102 757
949Q868 1102 1038 1102Q1218 1102 1316 973T1415 611V497H813Q818 323 887 227T1079 130Q1205 130 1303 206L1342 237L1401 101Q1350 46 1264 13T1079 -20ZM417 130Q511 130 609 218L639 248V495H462Q371 494 316 440T260 300Q260 219 301 175T417 130ZM1038 950Q947
950 888 863T816 640H1239V671Q1239 806 1187 878T1038 950Z" />
<glyph unicode="&#xe7;" horiz-adv-x="946" d="M508 131Q596 131 649 185T707 341H874Q868 185 764 83T508 -20Q307 -20 202 106T96 483V602Q96 847 201 974T507 1102Q673 1102 770 997T874 710H707Q701 830 650 890T507 950Q389 950 332 873T273 618V480Q273
289 329 210T508 131ZM532 -9L522 -61Q582 -74 614 -119T646 -234Q646 -330 580 -387T389 -444L383 -337Q511 -337 511 -238Q511 -193 485 -173T379 -143L407 -9H532Z" />
<glyph unicode="&#xe8;" horiz-adv-x="959" d="M519 -20Q317 -20 209 100T99 454V585Q99 827 204 964T499 1102Q689 1102 783 981T879 604V488H275V463Q275 289 340 210T529 131Q607 131 666 160T778 254L870 142Q755 -20 519 -20ZM499 950Q389 950 336 875T276
640H702V664Q695 818 647 884T499 950ZM600 1242H441L183 1536H406L600 1242Z" />
<glyph unicode="&#xe9;" horiz-adv-x="959" d="M519 -20Q317 -20 209 100T99 454V585Q99 827 204 964T499 1102Q689 1102 783 981T879 604V488H275V463Q275 289 340 210T529 131Q607 131 666 160T778 254L870 142Q755 -20 519 -20ZM499 950Q389 950 336 875T276
640H702V664Q695 818 647 884T499 950ZM585 1536H809L541 1242H392L585 1536Z" />
<glyph unicode="&#xea;" horiz-adv-x="959" d="M519 -20Q317 -20 209 100T99 454V585Q99 827 204 964T499 1102Q689 1102 783 981T879 604V488H275V463Q275 289 340 210T529 131Q607 131 666 160T778 254L870 142Q755 -20 519 -20ZM499 950Q389 950 336 875T276
640H702V664Q695 818 647 884T499 950ZM756 1262V1252H614L494 1422L374 1252H232V1264L441 1536H546L756 1262Z" />
<glyph unicode="&#xeb;" horiz-adv-x="959" d="M519 -20Q317 -20 209 100T99 454V585Q99 827 204 964T499 1102Q689 1102 783 981T879 604V488H275V463Q275 289 340 210T529 131Q607 131 666 160T778 254L870 142Q755 -20 519 -20ZM499 950Q389 950 336 875T276
640H702V664Q695 818 647 884T499 950ZM172 1371Q172 1416 199 1446T281 1477T363 1447T391 1371T363 1296T281 1266T200 1296T172 1371ZM602 1369Q602 1414 629 1445T711 1476T793 1445T821 1369T793 1294T711 1264T630 1294T602 1369Z" />
<glyph unicode="&#xec;" horiz-adv-x="481" d="M323 0H146V1082H323V0ZM602 1497H443L185 1791H408L602 1497Z" />
<glyph unicode="&#xed;" horiz-adv-x="481" d="M323 0H146V1082H323V0ZM330 1791H554L286 1497H137L330 1791Z" />
<glyph unicode="&#xee;" horiz-adv-x="481" d="M323 0H146V1082H323V0ZM502 1261V1251H360L240 1421L120 1251H-22V1263L187 1535H292L502 1261Z" />
<glyph unicode="&#xef;" horiz-adv-x="481" d="M323 0H146V1082H323V0ZM-82 1370Q-82 1415 -55 1445T27 1476T109 1446T137 1370T109 1295T27 1265T-54 1295T-82 1370ZM348 1368Q348 1413 375 1444T457 1475T539 1444T567 1368T539 1293T457 1263T376 1293T348 1368Z" />
<glyph unicode="&#xf0;" horiz-adv-x="1051" d="M705 1302Q922 1036 922 627V535Q922 376 872 250T729 52T521 -20Q408 -20 315 43T170 219T118 467Q118 614 166 731T303 912T498 977Q623 977 721 877Q679 1062 569 1194L388 1051L320 1150L484 1280Q374 1371
221 1421L275 1580Q473 1527 622 1390L781 1516L849 1416L705 1302ZM746 635L744 695Q718 754 664 789T542 825Q428 825 362 729T295 467Q295 326 360 229T525 131Q623 131 683 241T746 525V635Z" />
<glyph unicode="&#xf1;" horiz-adv-x="991" d="M299 1082L304 965Q407 1102 567 1102Q854 1102 858 719V0H682V711Q682 838 640 891T512 945Q446 945 394 901T309 786V0H132V1082H299ZM802 1504Q802 1399 750 1331T616 1262Q581 1262 556 1272T491 1313T433 1350T392
1357Q358 1357 336 1325T313 1245L198 1252Q198 1361 251 1430T383 1499Q413 1499 437 1488T497 1450T557 1414T607 1403Q641 1403 664 1435T687 1516L802 1504Z" />
<glyph unicode="&#xf2;" horiz-adv-x="1028" d="M95 591Q95 827 209 964T512 1102T814 968T932 603V489Q932 254 818 117T514 -20Q326 -20 213 113T95 473V591ZM272 489Q272 322 337 227T514 131Q748 131 755 469V591Q755 757 689 853T512 950Q403 950 338 854T272
592V489ZM610 1242H451L193 1536H416L610 1242Z" />
<glyph unicode="&#xf3;" horiz-adv-x="1028" d="M95 591Q95 827 209 964T512 1102T814 968T932 603V489Q932 254 818 117T514 -20Q326 -20 213 113T95 473V591ZM272 489Q272 322 337 227T514 131Q748 131 755 469V591Q755 757 689 853T512 950Q403 950 338 854T272
592V489ZM595 1536H819L551 1242H402L595 1536Z" />
<glyph unicode="&#xf4;" horiz-adv-x="1028" d="M95 591Q95 827 209 964T512 1102T814 968T932 603V489Q932 254 818 117T514 -20Q326 -20 213 113T95 473V591ZM272 489Q272 322 337 227T514 131Q748 131 755 469V591Q755 757 689 853T512 950Q403 950 338 854T272
592V489ZM766 1262V1252H624L504 1422L384 1252H242V1264L451 1536H556L766 1262Z" />
<glyph unicode="&#xf5;" horiz-adv-x="1028" d="M95 591Q95 827 209 964T512 1102T814 968T932 603V489Q932 254 818 117T514 -20Q326 -20 213 113T95 473V591ZM272 489Q272 322 337 227T514 131Q748 131 755 469V591Q755 757 689 853T512 950Q403 950 338 854T272
592V489ZM806 1504Q806 1399 754 1331T620 1262Q585 1262 560 1272T495 1313T437 1350T396 1357Q362 1357 340 1325T317 1245L202 1252Q202 1361 255 1430T387 1499Q417 1499 441 1488T501 1450T561 1414T611 1403Q645 1403 668 1435T691 1516L806 1504Z" />
<glyph unicode="&#xf6;" horiz-adv-x="1028" d="M95 591Q95 827 209 964T512 1102T814 968T932 603V489Q932 254 818 117T514 -20Q326 -20 213 113T95 473V591ZM272 489Q272 322 337 227T514 131Q748 131 755 469V591Q755 757 689 853T512 950Q403 950 338 854T272
592V489ZM182 1371Q182 1416 209 1446T291 1477T373 1447T401 1371T373 1296T291 1266T210 1296T182 1371ZM612 1369Q612 1414 639 1445T721 1476T803 1445T831 1369T803 1294T721 1264T640 1294T612 1369Z" />
<glyph unicode="&#xf7;" horiz-adv-x="1024" d="M918 600H79V784H918V600ZM396 1098Q396 1146 422 1178T502 1210T582 1178T609 1098Q609 1051 582 1020T502 989T423 1020T396 1098ZM396 281Q396 329 422 361T502 393T582 361T609 281Q609 235 582 204T502 172T423
203T396 281Z" />
<glyph unicode="&#xf8;" d="M97 551Q97 796 212 949T512 1102Q602 1102 680 1063L740 1208H854L768 1002Q931 847 931 529Q931 286 816 133T514 -20Q433 -20 358 12L297 -134H183L268 71Q97 219 97 551ZM273 529Q273 349 338 239L619 917Q572 950 512 950Q404
950 339 842T273 529ZM753 551Q753 719 696 827L418 156Q462 131 514 131Q625 131 689 239T753 551Z" />
<glyph unicode="&#xf9;" horiz-adv-x="990" d="M684 95Q596 -20 427 -20Q280 -20 205 81T129 377V1082H305V390Q305 137 457 137Q618 137 679 281V1082H856V0H688L684 95ZM600 1242H441L183 1536H406L600 1242Z" />
<glyph unicode="&#xfa;" horiz-adv-x="990" d="M684 95Q596 -20 427 -20Q280 -20 205 81T129 377V1082H305V390Q305 137 457 137Q618 137 679 281V1082H856V0H688L684 95ZM585 1536H809L541 1242H392L585 1536Z" />
<glyph unicode="&#xfb;" horiz-adv-x="990" d="M684 95Q596 -20 427 -20Q280 -20 205 81T129 377V1082H305V390Q305 137 457 137Q618 137 679 281V1082H856V0H688L684 95ZM756 1262V1252H614L494 1422L374 1252H232V1264L441 1536H546L756 1262Z" />
<glyph unicode="&#xfc;" horiz-adv-x="990" d="M684 95Q596 -20 427 -20Q280 -20 205 81T129 377V1082H305V390Q305 137 457 137Q618 137 679 281V1082H856V0H688L684 95ZM172 1371Q172 1416 199 1446T281 1477T363 1447T391 1371T363 1296T281 1266T200 1296T172
1371ZM602 1369Q602 1414 629 1445T711 1476T793 1445T821 1369T793 1294T711 1264T630 1294T602 1369Z" />
<glyph unicode="&#xfd;" horiz-adv-x="853" d="M428 294L625 1082H813L459 -153Q419 -292 346 -364T180 -437Q144 -437 88 -421V-271L127 -275Q204 -275 247 -239T318 -112L353 9L35 1082H228L428 294ZM536 1536H760L492 1242H343L536 1536Z" />
<glyph unicode="&#xfe;" horiz-adv-x="1041" d="M923 529Q923 282 828 131T569 -20Q412 -20 318 88V-416H142V1536H318V989Q410 1102 566 1102Q734 1102 828 954T923 529ZM747 550Q747 730 685 837T511 945Q385 945 318 807V265Q383 131 513 131Q622 131 684 238T747
550Z" />
<glyph unicode="&#xff;" horiz-adv-x="853" d="M428 294L625 1082H813L459 -153Q419 -292 346 -364T180 -437Q144 -437 88 -421V-271L127 -275Q204 -275 247 -239T318 -112L353 9L35 1082H228L428 294ZM123 1371Q123 1416 150 1446T232 1477T314 1447T342 1371T314
1296T232 1266T151 1296T123 1371ZM553 1369Q553 1414 580 1445T662 1476T744 1445T772 1369T744 1294T662 1264T581 1294T553 1369Z" />
<glyph unicode="&#x2013;" horiz-adv-x="1172" d="M1259 651H417V802H1259V651Z" />
<glyph unicode="&#x2014;" horiz-adv-x="1389" d="M1537 651H415V802H1537V651Z" />
<glyph unicode="&#x2018;" horiz-adv-x="398" d="M257 1555L357 1483Q278 1353 275 1211V1073H100V1189Q100 1290 144 1391T257 1555Z" />
<glyph unicode="&#x2019;" horiz-adv-x="398" d="M155 1046L56 1118Q134 1249 137 1390V1536H312V1401Q310 1305 268 1207T155 1046Z" />
<glyph unicode="&#x201a;" horiz-adv-x="399" d="M148 -283L48 -210Q128 -79 128 73V181H305V81Q305 -17 262 -117T148 -283Z" />
<glyph unicode="&#x201c;" horiz-adv-x="684" d="M266 1555L366 1483Q287 1353 284 1211V1073H109V1189Q109 1290 153 1391T266 1555ZM551 1555L651 1483Q572 1353 569 1211V1073H394V1189Q394 1290 438 1391T551 1555Z" />
<glyph unicode="&#x201d;" horiz-adv-x="691" d="M167 1046L68 1118Q146 1249 149 1390V1536H324V1401Q322 1305 280 1207T167 1046ZM445 1046L346 1118Q424 1249 427 1390V1536H602V1401Q600 1305 558 1207T445 1046Z" />
<glyph unicode="&#x201e;" horiz-adv-x="668" d="M148 -301L48 -229Q125 -93 128 59V246H305V82Q305 -23 262 -127T148 -301ZM416 -301L317 -229Q394 -93 397 59V246H574V82Q574 -23 531 -128T416 -301Z" />
<glyph unicode="&#x2022;" horiz-adv-x="690" d="M138 772Q138 859 193 915T341 971Q432 971 489 917T546 769V732Q546 645 491 590T342 535Q249 535 194 590T138 734V772Z" />
<glyph unicode="&#x2039;" horiz-adv-x="557" d="M277 550L488 153H359L111 541V560L359 949H488L277 550Z" />
<glyph unicode="&#x203a;" horiz-adv-x="557" d="M223 949L471 560V541L223 152H92L303 550L92 949H223Z" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -0,0 +1,308 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<defs >
<font id="Roboto" horiz-adv-x="1158" ><font-face
font-family="Roboto"
units-per-em="2048"
panose-1="2 0 0 0 0 0 0 0 0 0"
ascent="1900"
descent="-500"
alphabetic="0" />
<glyph unicode=" " horiz-adv-x="507" />
<glyph unicode="!" horiz-adv-x="527" d="M347 411H180L167 1456H361L347 411ZM160 93Q160 138 187 168T269 199T351 169T379 93T351 19T269 -11T188 18T160 93Z" />
<glyph unicode="&quot;" horiz-adv-x="655" d="M277 1400L247 1042H136L137 1536H277V1400ZM547 1400L517 1042H406L407 1536H547V1400Z" />
<glyph unicode="#" horiz-adv-x="1261" d="M765 410H501L421 0H278L358 410H119V547H384L453 901H195V1040H480L562 1456H705L623 1040H887L969 1456H1113L1031 1040H1235V901H1004L935 547H1160V410H909L829 0H685L765 410ZM527 547H791L860 901H596L527 547Z" />
<glyph unicode="$" horiz-adv-x="1150" d="M856 375Q856 467 792 530T574 644Q361 709 264 813T166 1079Q166 1243 261 1348T524 1473V1692H673V1472Q841 1449 934 1331T1028 1008H844Q844 1149 777 1232T596 1315Q477 1315 414 1254T351 1082Q351 980 417 920T636
810T874 701T1000 562T1041 377Q1041 208 940 105T655 -17V-208H507V-17Q321 0 216 115T110 429H295Q295 290 368 215T575 140Q706 140 781 203T856 375Z" />
<glyph unicode="%" horiz-adv-x="1500" d="M105 1176Q105 1307 188 1392T403 1477Q536 1477 618 1392T701 1170V1099Q701 967 618 884T405 800Q275 800 190 883T105 1106V1176ZM243 1099Q243 1021 287 971T405 920Q476 920 519 969T563 1103V1176Q563 1254 520
1305T403 1356T286 1305T243 1172V1099ZM814 357Q814 488 897 572T1112 657T1327 573T1411 350V279Q1411 148 1328 64T1114 -21T899 62T814 285V357ZM952 279Q952 200 996 150T1114 99Q1186 99 1229 148T1272 283V357Q1272 436 1229 486T1112 536Q1041 536 997
487T952 353V279ZM447 110L342 176L1053 1314L1158 1248L447 110Z" />
<glyph unicode="&amp;" horiz-adv-x="1273" d="M101 391Q101 496 159 584T383 789Q286 907 253 979T220 1122Q220 1288 318 1382T584 1476Q734 1476 832 1389T930 1168Q930 1080 886 1006T730 849L623 770L947 383Q1015 513 1015 672H1182Q1182 417 1059 249L1267
0H1045L948 115Q874 49 775 15T572 -20Q359 -20 230 93T101 391ZM572 131Q719 131 841 243L486 668L453 644Q286 521 286 391Q286 273 362 202T572 131ZM405 1128Q405 1032 523 888L641 971Q709 1019 734 1062T759 1168Q759 1235 709 1279T583 1324Q501 1324 453
1269T405 1128Z" />
<glyph unicode="&apos;" horiz-adv-x="357" d="M253 1425L232 1057H103L104 1536H253V1425Z" />
<glyph unicode="(" horiz-adv-x="700" d="M133 591Q133 817 193 1025T374 1403T623 1643L661 1521Q515 1409 422 1179T319 664L318 579Q318 193 459 -91Q544 -261 661 -357L623 -470Q490 -396 369 -222Q133 118 133 591Z" />
<glyph unicode=")" horiz-adv-x="712" d="M567 581Q567 358 509 154T330 -224T77 -470L38 -357Q192 -239 285 9T381 561V593Q381 803 337 983T215 1307T38 1530L77 1643Q209 1570 328 1399T507 1022T567 581Z" />
<glyph unicode="*" horiz-adv-x="882" d="M330 983L28 1073L74 1224L376 1112L367 1456H520L510 1107L807 1217L853 1065L546 974L744 703L620 609L434 897L254 616L129 707L330 983Z" />
<glyph unicode="+" horiz-adv-x="1161" d="M670 781H1076V606H670V146H484V606H78V781H484V1206H670V781Z" />
<glyph unicode="," horiz-adv-x="402" d="M134 -290L29 -218Q123 -87 127 52V219H308V74Q308 -27 259 -128T134 -290Z" />
<glyph unicode="-" horiz-adv-x="565" d="M525 543H37V694H525V543Z" />
<glyph unicode="." horiz-adv-x="539" d="M144 97Q144 145 172 177T258 209T344 177T374 97Q374 51 345 20T258 -11T173 20T144 97Z" />
<glyph unicode="/" horiz-adv-x="844" d="M177 -125H18L626 1456H784L177 -125Z" />
<glyph unicode="0" horiz-adv-x="1150" d="M1034 621Q1034 296 923 138T576 -20Q343 -20 231 134T115 596V843Q115 1164 226 1320T574 1476Q809 1476 920 1326T1034 861V621ZM849 874Q849 1109 783 1216T574 1324Q432 1324 367 1217T300 888V592Q300 356 368 244T576
131Q713 131 779 237T849 571V874Z" />
<glyph unicode="1" horiz-adv-x="1150" d="M729 0H543V1233L170 1096V1264L700 1463H729V0Z" />
<glyph unicode="2" horiz-adv-x="1150" d="M1075 0H121V133L625 693Q737 820 779 899T822 1064Q822 1178 753 1251T569 1324Q431 1324 355 1246T278 1027H93Q93 1228 222 1352T569 1476Q772 1476 890 1370T1008 1086Q1008 871 734 574L344 151H1075V0Z" />
<glyph unicode="3" horiz-adv-x="1150" d="M390 818H529Q660 820 735 887T810 1068Q810 1324 555 1324Q435 1324 364 1256T292 1074H107Q107 1247 233 1361T555 1476Q761 1476 878 1367T995 1064Q995 969 934 880T766 747Q886 709 951 621T1017 406Q1017 210 889
95T556 -20T223 91T94 384H280Q280 269 355 200T556 131Q690 131 761 201T832 402Q832 529 754 597T529 667H390V818Z" />
<glyph unicode="4" horiz-adv-x="1150" d="M902 489H1104V338H902V0H716V338H53V447L705 1456H902V489ZM263 489H716V1203L694 1163L263 489Z" />
<glyph unicode="5" horiz-adv-x="1150" d="M206 730L280 1456H1026V1285H437L393 888Q500 951 636 951Q835 951 952 820T1069 464Q1069 239 948 110T608 -20Q415 -20 293 87T154 383H329Q346 258 418 195T608 131Q737 131 810 219T884 462Q884 608 805 696T593
785Q472 785 403 732L354 692L206 730Z" />
<glyph unicode="6" horiz-adv-x="1150" d="M847 1457V1300H813Q597 1296 469 1172T321 823Q436 955 635 955Q825 955 938 821T1052 475Q1052 250 930 115T601 -20Q392 -20 262 140T132 554V625Q132 1027 303 1239T814 1457H847ZM604 801Q509 801 429 744T318 601V533Q318
353 399 243T601 133Q726 133 797 225T869 466Q869 616 797 708T604 801Z" />
<glyph unicode="7" horiz-adv-x="1150" d="M1061 1352L458 0H264L865 1304H77V1456H1061V1352Z" />
<glyph unicode="8" horiz-adv-x="1150" d="M1004 1076Q1004 967 947 882T791 749Q905 700 971 606T1038 393Q1038 204 911 92T575 -20Q365 -20 239 92T112 393Q112 511 176 606T355 750Q258 798 202 883T146 1076Q146 1260 264 1368T575 1476Q767 1476 885 1368T1004
1076ZM853 397Q853 519 776 596T573 673T373 597T297 397T370 202T575 131Q705 131 779 202T853 397ZM575 1324Q466 1324 399 1257T331 1073Q331 962 397 894T575 825T752 893T819 1073T750 1254T575 1324Z" />
<glyph unicode="9" horiz-adv-x="1150" d="M830 640Q772 571 692 529T515 487Q389 487 296 549T151 723T100 972Q100 1118 155 1235T313 1414T551 1476Q767 1476 891 1315T1016 874V820Q1016 395 848 200T341 -1H305V155H344Q573 159 696 274T830 640ZM545 640Q638
640 716 697T831 838V912Q831 1094 752 1208T552 1322Q430 1322 356 1229T282 982Q282 833 353 737T545 640Z" />
<glyph unicode=":" horiz-adv-x="496" d="M390 97Q390 145 418 177T504 209T590 177T620 97Q620 51 591 20T504 -11T419 20T390 97ZM135 980Q135 1028 163 1060T249 1092T335 1060T365 980Q365 934 336 903T249 872T164 903T135 980Z" />
<glyph unicode=";" horiz-adv-x="433" d="M111 980Q111 1028 139 1060T225 1092T311 1060T341 980Q341 934 312 903T225 872T140 903T111 980ZM146 -290L41 -218Q135 -87 139 52V219H320V74Q320 -27 271 -128T146 -290Z" />
<glyph unicode="&lt;" horiz-adv-x="1041" d="M264 644L890 391V195L72 574V720L890 1098V902L264 644Z" />
<glyph unicode="=" horiz-adv-x="1124" d="M986 814H152V975H986V814ZM986 399H152V559H986V399Z" />
<glyph unicode="&gt;" horiz-adv-x="1070" d="M795 650L134 909V1099L988 721V575L134 196V388L795 650Z" />
<glyph unicode="?" horiz-adv-x="967" d="M357 410Q359 529 384 598T486 751L617 886Q701 981 701 1090Q701 1195 646 1254T486 1314Q384 1314 322 1260T260 1115H75Q77 1277 190 1376T486 1476Q675 1476 780 1375T886 1096Q886 921 724 751L615 643Q542 562 542
410H357ZM349 93Q349 138 376 168T458 199T540 169T568 93T540 19T458 -11T377 18T349 93Z" />
<glyph unicode="@" horiz-adv-x="1839" d="M1738 502Q1726 260 1618 120T1329 -20Q1142 -20 1089 148Q1035 63 966 22T822 -20Q680 -20 607 96T553 417Q568 582 628 711T784 915T985 989Q1066 989 1130 968T1274 883L1222 329Q1203 98 1350 98Q1463 98 1533 210T1609
502Q1628 891 1465 1095T967 1299Q766 1299 610 1200T364 912T263 478Q251 230 323 48T542 -231T899 -328Q989 -328 1079 -306T1230 -249L1267 -364Q1205 -403 1103 -428T895 -453Q645 -453 465 -341T196 -17T118 478Q130 753 241 972T542 1311T971 1431Q1220 1431
1398 1319T1663 996T1738 502ZM712 417Q698 275 738 199T867 123Q927 123 982 174T1074 320L1075 329L1121 832Q1065 861 1001 861Q884 861 808 742T712 417Z" />
<glyph unicode="A" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538Z" />
<glyph unicode="B" horiz-adv-x="1275" d="M169 0V1456H645Q882 1456 1001 1358T1121 1068Q1121 966 1063 888T905 766Q1023 733 1091 641T1160 420Q1160 224 1033 112T674 0H169ZM361 681V157H678Q812 157 889 226T967 418Q967 681 681 681H361ZM361 835H651Q777
835 852 898T928 1069Q928 1189 858 1243T645 1298H361V835Z" />
<glyph unicode="C" horiz-adv-x="1333" d="M1240 462Q1213 231 1070 106T688 -20Q430 -20 275 165T119 660V800Q119 1003 191 1157T397 1393T705 1476Q937 1476 1077 1347T1240 988H1047Q1022 1162 939 1240T705 1318Q521 1318 417 1182T312 795V654Q312 417 411
277T688 137Q848 137 933 209T1047 462H1240Z" />
<glyph unicode="D" horiz-adv-x="1343" d="M169 0V1456H580Q770 1456 916 1372T1141 1133T1222 777V684Q1222 478 1143 323T916 85T572 0H169ZM361 1298V157H563Q785 157 908 295T1032 688V773Q1032 1021 916 1158T585 1298H361Z" />
<glyph unicode="E" horiz-adv-x="1164" d="M992 673H361V157H1094V0H169V1456H1084V1298H361V830H992V673Z" />
<glyph unicode="F" horiz-adv-x="1132" d="M972 643H361V0H169V1456H1071V1298H361V800H972V643Z" />
<glyph unicode="G" horiz-adv-x="1395" d="M1244 191Q1170 85 1038 33T729 -20Q551 -20 413 63T200 301T122 658V785Q122 1114 275 1295T707 1476Q935 1476 1074 1360T1244 1029H1052Q998 1318 708 1318Q515 1318 416 1183T315 790V671Q315 426 427 282T730 137Q838
137 919 161T1053 242V569H716V725H1244V191Z" />
<glyph unicode="H" horiz-adv-x="1460" d="M1288 0H1095V673H361V0H169V1456H361V830H1095V1456H1288V0Z" />
<glyph unicode="I" horiz-adv-x="557" d="M375 0H183V1456H375V0Z" />
<glyph unicode="J" horiz-adv-x="1130" d="M779 1456H972V425Q972 216 847 98T512 -20Q295 -20 174 91T53 402H245Q245 277 313 207T512 137Q631 137 704 212T779 422V1456Z" />
<glyph unicode="K" horiz-adv-x="1284" d="M539 677L361 492V0H169V1456H361V736L1008 1456H1240L667 813L1285 0H1055L539 677Z" />
<glyph unicode="L" horiz-adv-x="1102" d="M362 157H1052V0H169V1456H362V157Z" />
<glyph unicode="M" horiz-adv-x="1788" d="M417 1456L893 268L1369 1456H1618V0H1426V567L1444 1179L966 0H819L342 1176L361 567V0H169V1456H417Z" />
<glyph unicode="N" horiz-adv-x="1460" d="M1288 0H1095L362 1122V0H169V1456H362L1097 329V1456H1288V0Z" />
<glyph unicode="O" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521 1311
417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775Z" />
<glyph unicode="P" horiz-adv-x="1292" d="M361 570V0H169V1456H706Q945 1456 1080 1334T1216 1011Q1216 799 1084 685T704 570H361ZM361 727H706Q860 727 942 799T1024 1009Q1024 1139 942 1217T717 1298H361V727Z" />
<glyph unicode="Q" horiz-adv-x="1408" d="M1281 681Q1281 470 1214 318T1026 79L1286 -125L1155 -246L848 -2Q776 -20 696 -20Q524 -20 391 64T185 305T109 668V773Q109 983 182 1144T388 1390T694 1476Q870 1476 1003 1391T1209 1147T1281 774V681ZM1089 775Q1089
1032 987 1171T694 1311Q513 1311 409 1173T301 788V681Q301 431 405 287T696 143T984 278T1089 667V775Z" />
<glyph unicode="R" horiz-adv-x="1261" d="M703 589H361V0H168V1456H650Q896 1456 1028 1344T1161 1018Q1161 882 1088 781T883 630L1225 12V0H1019L703 589ZM361 746H656Q799 746 883 820T968 1018Q968 1153 888 1225T655 1298H361V746Z" />
<glyph unicode="S" horiz-adv-x="1215" d="M598 649Q351 720 239 823T126 1079Q126 1251 263 1363T621 1476Q771 1476 888 1418T1070 1258T1135 1035H942Q942 1167 858 1242T621 1318Q479 1318 400 1256T320 1082Q320 993 395 932T652 819T936 707T1088 563T1138
370Q1138 193 1000 87T631 -20Q481 -20 351 37T151 195T80 422H273Q273 290 370 214T631 137Q783 137 864 199T945 368T870 533T598 649Z" />
<glyph unicode="T" horiz-adv-x="1222" d="M1175 1298H707V0H516V1298H49V1456H1175V1298Z" />
<glyph unicode="U" horiz-adv-x="1328" d="M1194 1456V466Q1193 260 1065 129T716 -18L665 -20Q426 -20 284 109T140 464V1456H330V470Q330 312 417 225T665 137Q828 137 914 224T1001 469V1456H1194Z" />
<glyph unicode="V" horiz-adv-x="1303" d="M651 255L1067 1456H1277L737 0H567L28 1456H237L651 255Z" />
<glyph unicode="W" horiz-adv-x="1817" d="M483 459L511 267L552 440L840 1456H1002L1283 440L1323 264L1354 460L1580 1456H1773L1420 0H1245L945 1061L922 1172L899 1061L588 0H413L61 1456H253L483 459Z" />
<glyph unicode="X" horiz-adv-x="1284" d="M644 898L993 1456H1219L759 734L1230 0H1002L644 568L284 0H57L529 734L68 1456H293L644 898Z" />
<glyph unicode="Y" horiz-adv-x="1230" d="M613 725L993 1456H1211L709 543V0H517V543L15 1456H235L613 725Z" />
<glyph unicode="Z" horiz-adv-x="1226" d="M313 157H1146V0H86V144L884 1298H99V1456H1114V1315L313 157Z" />
<glyph unicode="[" horiz-adv-x="543" d="M523 1512H332V-160H523V-312H146V1664H523V1512Z" />
<glyph unicode="\" horiz-adv-x="840" d="M40 1456H216L824 -125H648L40 1456Z" />
<glyph unicode="]" horiz-adv-x="543" d="M9 1664H387V-312H9V-160H202V1512H9V1664Z" />
<glyph unicode="^" horiz-adv-x="856" d="M426 1211L236 729H64L363 1456H490L788 729H617L426 1211Z" />
<glyph unicode="_" horiz-adv-x="924" d="M920 -151H4V0H920V-151Z" />
<glyph unicode="`" horiz-adv-x="633" d="M474 1242H315L57 1536H280L474 1242Z" />
<glyph unicode="a" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141Z" />
<glyph unicode="b" horiz-adv-x="1149" d="M1056 529Q1056 281 942 131T636 -20Q431 -20 319 125L310 0H140V1536H325V963Q437 1102 634 1102T943 953T1056 545V529ZM871 550Q871 739 798 842T588 945Q405 945 325 775V307Q410 137 590 137Q723 137 797 240T871 550Z" />
<glyph unicode="c" horiz-adv-x="1072" d="M574 131Q673 131 747 191T829 341H1004Q999 248 940 164T783 30T574 -20Q353 -20 223 127T92 531V562Q92 720 150 843T316 1034T573 1102Q755 1102 875 993T1004 710H829Q821 815 750 882T573 950Q432 950 355 849T277
555V520Q277 333 354 232T574 131Z" />
<glyph unicode="d" horiz-adv-x="1155" d="M95 550Q95 799 213 950T522 1102Q712 1102 823 972V1536H1008V0H838L829 116Q718 -20 520 -20Q332 -20 214 134T95 536V550ZM280 529Q280 345 356 241T566 137Q742 137 823 295V792Q740 945 568 945Q432 945 356 840T280 529Z" />
<glyph unicode="e" horiz-adv-x="1085" d="M589 -20Q369 -20 231 124T93 511V545Q93 706 154 832T326 1030T566 1102Q777 1102 894 963T1011 565V488H278Q282 328 371 230T599 131Q697 131 765 171T884 277L997 189Q861 -20 589 -20ZM566 950Q454 950 378 869T284
640H826V654Q818 795 750 872T566 950Z" />
<glyph unicode="f" horiz-adv-x="711" d="M231 0V939H60V1082H231V1193Q231 1367 324 1462T587 1557Q651 1557 714 1540L704 1390Q657 1399 604 1399Q514 1399 465 1347T416 1196V1082H647V939H416V0H231Z" />
<glyph unicode="g" horiz-adv-x="1149" d="M96 550Q96 803 213 952T523 1102Q721 1102 832 962L841 1082H1010V26Q1010 -184 886 -305T551 -426Q434 -426 322 -376T151 -239L247 -128Q366 -275 538 -275Q673 -275 748 -199T824 15V108Q713 -20 521 -20Q331 -20
214 133T96 550ZM282 529Q282 346 357 242T567 137Q742 137 824 296V790Q739 945 569 945Q434 945 358 840T282 529Z" />
<glyph unicode="h" horiz-adv-x="1128" d="M325 951Q448 1102 645 1102Q988 1102 991 715V0H806V716Q805 833 753 889T589 945Q499 945 431 897T325 771V0H140V1536H325V951Z" />
<glyph unicode="i" horiz-adv-x="497" d="M341 0H156V1082H341V0ZM141 1369Q141 1414 168 1445T250 1476T332 1445T360 1369T332 1294T250 1264T169 1294T141 1369Z" />
<glyph unicode="j" horiz-adv-x="489" d="M331 1082V-125Q331 -437 48 -437Q-13 -437 -65 -419V-271Q-33 -279 19 -279Q81 -279 113 -246T146 -129V1082H331ZM127 1369Q127 1413 154 1444T235 1476Q289 1476 317 1445T345 1369T317 1294T235 1264T154 1294T127 1369Z" />
<glyph unicode="k" horiz-adv-x="1038" d="M442 501L326 380V0H141V1536H326V607L425 726L762 1082H987L566 630L1036 0H819L442 501Z" />
<glyph unicode="l" horiz-adv-x="497" d="M341 0H156V1536H341V0Z" />
<glyph unicode="m" horiz-adv-x="1795" d="M314 1082L319 962Q438 1102 640 1102Q867 1102 949 928Q1003 1006 1089 1054T1294 1102Q1650 1102 1656 725V0H1471V714Q1471 830 1418 887T1240 945Q1137 945 1069 884T990 718V0H804V709Q804 945 573 945Q391 945
324 790V0H139V1082H314Z" />
<glyph unicode="n" horiz-adv-x="1130" d="M315 1082L321 946Q445 1102 645 1102Q988 1102 991 715V0H806V716Q805 833 753 889T589 945Q499 945 431 897T325 771V0H140V1082H315Z" />
<glyph unicode="o" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729 807
839T582 950Q445 950 361 841T277 529Z" />
<glyph unicode="p" horiz-adv-x="1149" d="M1054 529Q1054 282 941 131T635 -20Q438 -20 325 105V-416H140V1082H309L318 962Q431 1102 632 1102Q827 1102 940 955T1054 546V529ZM869 550Q869 733 791 839T577 945Q409 945 325 796V279Q408 131 579 131Q712 131
790 236T869 550Z" />
<glyph unicode="q" horiz-adv-x="1164" d="M95 550Q95 805 212 953T526 1102Q718 1102 829 973L837 1082H1007V-416H822V100Q710 -20 524 -20Q328 -20 212 132T95 537V550ZM280 529Q280 343 358 237T570 131Q735 131 822 277V807Q734 950 572 950Q438 950 359
844T280 529Z" />
<glyph unicode="r" horiz-adv-x="693" d="M663 916Q621 923 572 923Q390 923 325 768V0H140V1082H320L323 957Q414 1102 581 1102Q635 1102 663 1088V916Z" />
<glyph unicode="s" horiz-adv-x="1056" d="M770 287Q770 362 714 403T517 475T294 547T172 647T132 785Q132 918 244 1010T532 1102Q716 1102 830 1007T945 764H759Q759 840 695 895T532 950Q431 950 374 906T317 791Q317 724 370 690T561 625T786 551T913 448T955
300Q955 155 839 68T538 -20Q408 -20 308 26T152 154T95 333H280Q285 240 354 186T538 131Q643 131 706 173T770 287Z" />
<glyph unicode="t" horiz-adv-x="669" d="M391 1344V1082H593V939H391V268Q391 203 418 171T510 138Q542 138 598 150V0Q525 -20 456 -20Q332 -20 269 55T206 268V939H9V1082H206V1344H391Z" />
<glyph unicode="u" horiz-adv-x="1129" d="M808 107Q700 -20 491 -20Q318 -20 228 80T136 378V1082H321V383Q321 137 521 137Q733 137 803 295V1082H988V0H812L808 107Z" />
<glyph unicode="v" horiz-adv-x="992" d="M497 251L765 1082H954L566 0H425L33 1082H222L497 251Z" />
<glyph unicode="w" horiz-adv-x="1539" d="M1098 255L1306 1082H1491L1176 0H1026L763 820L507 0H357L43 1082H227L440 272L692 1082H841L1098 255Z" />
<glyph unicode="x" horiz-adv-x="1015" d="M503 687L743 1082H959L605 547L970 0H756L506 405L256 0H41L406 547L52 1082H266L503 687Z" />
<glyph unicode="y" horiz-adv-x="969" d="M494 271L746 1082H944L509 -167Q408 -437 188 -437L153 -434L84 -421V-271L134 -275Q228 -275 280 -237T367 -98L408 12L22 1082H224L494 271Z" />
<glyph unicode="z" horiz-adv-x="1015" d="M314 151H947V0H88V136L685 929H97V1082H917V951L314 151Z" />
<glyph unicode="{" horiz-adv-x="693" d="M632 -366Q455 -316 366 -202T276 101V300Q276 543 64 543V688Q276 688 276 930V1138Q278 1321 365 1433T632 1597L670 1482Q461 1415 461 1133V931Q461 704 294 615Q461 525 461 296V90Q464 -185 670 -251L632 -366Z" />
<glyph unicode="|" horiz-adv-x="499" d="M324 -270H175V1456H324V-270Z" />
<glyph unicode="}" horiz-adv-x="693" d="M19 -251Q222 -186 229 80V300Q229 531 410 615Q229 697 229 930V1133Q229 1415 20 1482L58 1597Q235 1547 324 1435T414 1137V927Q414 688 626 688V543Q414 543 414 300V98Q414 -90 324 -203T58 -366L19 -251Z" />
<glyph unicode="~" horiz-adv-x="1393" d="M1263 777Q1263 619 1170 511T939 402Q867 402 803 428T655 529T533 621T454 639Q376 639 334 586T292 438L131 436Q131 596 223 699T454 802Q530 802 600 770T758 658T910 567L939 565Q1015 565 1062 623T1110 776L1263 777Z" />
<glyph unicode="&#xa0;" horiz-adv-x="507" />
<glyph unicode="&#xa1;" horiz-adv-x="499" d="M170 684H338L351 -360H157L170 684ZM358 996Q358 951 331 920T249 889T167 920T139 996T167 1071T249 1101T330 1071T358 996Z" />
<glyph unicode="&#xa2;" horiz-adv-x="1120" d="M586 131Q686 131 760 191T842 341H1017Q1011 215 912 115T669 -12V-245H484V-11Q305 23 205 165T105 527V562Q105 774 206 916T484 1092V1318H669V1095Q819 1072 915 966T1017 710H842Q834 815 763 882T586 950Q445
950 368 849T290 555V520Q290 333 367 232T586 131Z" />
<glyph unicode="&#xa3;" horiz-adv-x="1190" d="M449 622L457 402Q457 248 395 157H1128L1127 0H95V157H172Q212 166 237 231T264 393V401L256 622H91V779H251L242 1039Q242 1238 364 1357T687 1476Q877 1476 988 1370T1099 1087H908Q908 1194 845 1256T670 1318Q565
1318 500 1241T435 1039L444 779H763V622H449Z" />
<glyph unicode="&#xa4;" horiz-adv-x="1460" d="M1103 112Q944 -20 735 -20Q528 -20 369 110L235 -26L105 109L244 250Q140 406 140 608Q140 814 252 977L105 1128L235 1264L382 1114Q540 1234 735 1234Q931 1234 1090 1113L1239 1265L1371 1128L1220 974Q1330
811 1330 608Q1330 412 1228 253L1371 109L1239 -27L1103 112ZM311 608Q311 485 368 379T524 212T735 151T946 212T1100 379T1157 608Q1157 730 1101 835T946 1001T735 1062Q622 1062 524 1002T369 836T311 608Z" />
<glyph unicode="&#xa5;" horiz-adv-x="1075" d="M539 793L847 1456H1060L693 736H954V611H630V446H954V322H630V0H437V322H119V446H437V611H119V736H382L15 1456H231L539 793Z" />
<glyph unicode="&#xa6;" horiz-adv-x="491" d="M147 -270V521H333V-270H147ZM333 698H147V1456H333V698Z" />
<glyph unicode="&#xa7;" horiz-adv-x="1256" d="M1145 431Q1145 242 959 157Q1028 108 1064 40T1100 -128Q1100 -296 970 -395T612 -495Q500 -495 400 -467T229 -382Q90 -269 90 -64L276 -62Q276 -192 366 -267T612 -343Q748 -343 831 -285T914 -130Q914 -41 843
11T563 126Q381 174 285 229T143 362T96 551Q96 737 278 825Q212 874 177 942T141 1110Q141 1276 274 1376T630 1476Q862 1476 992 1363T1122 1045H937Q937 1170 853 1247T630 1325Q488 1325 408 1268T327 1112Q327 1043 355 1003T450 931T661 858T889 782T1030
698T1116 585T1145 431ZM602 691Q512 715 437 742Q357 723 320 673T282 553Q282 483 309 443T402 370T611 296T797 238Q875 258 917 308T959 428Q959 516 890 570T602 691Z" />
<glyph unicode="&#xa8;" horiz-adv-x="856" d="M101 1371Q101 1416 128 1446T210 1477T292 1447T320 1371T292 1296T210 1266T129 1296T101 1371ZM531 1369Q531 1414 558 1445T640 1476T722 1445T750 1369T722 1294T640 1264T559 1294T531 1369Z" />
<glyph unicode="&#xa9;" horiz-adv-x="1609" d="M1119 597Q1119 444 1033 364T788 283Q631 283 537 388T442 676V786Q442 962 537 1067T788 1173Q948 1173 1034 1091T1120 860H974Q974 959 927 1001T788 1044Q694 1044 640 975T586 783V670Q586 550 640 481T788
412Q880 412 926 454T973 597H1119ZM206 729Q206 557 286 411T503 181T801 98T1098 181T1315 410T1395 729Q1395 899 1316 1044T1100 1272T801 1356Q641 1356 503 1274T286 1045T206 729ZM91 729Q91 931 184 1104T443 1376T801 1476T1158 1377T1416 1104T1510 729Q1510
532 1420 360T1165 84T801 -21Q604 -21 439 82T182 358T91 729Z" />
<glyph unicode="&#xaa;" horiz-adv-x="915" d="M618 705Q606 739 600 777Q524 691 396 691Q277 691 212 753T147 918Q147 1029 230 1089T486 1149H594V1201Q594 1336 470 1336Q401 1336 362 1309T322 1231L161 1243Q161 1346 247 1411T470 1476Q603 1476 680 1405T757
1199V883Q757 786 783 705H618ZM435 828Q478 828 522 848T594 895V1037H482Q399 1036 355 1005T310 922Q310 828 435 828Z" />
<glyph unicode="&#xab;" horiz-adv-x="961" d="M536 804L794 407H653L358 795V814L653 1203H794L536 804ZM610 548L868 151H727L432 539V558L727 947H868L610 548Z" />
<glyph unicode="&#xac;" horiz-adv-x="1134" d="M958 375H772V639H127V800H958V375Z" />
<glyph unicode="&#xad;" horiz-adv-x="565" d="M525 543H37V694H525V543Z" />
<glyph unicode="&#xae;" horiz-adv-x="1610" d="M90 729Q90 931 183 1104T442 1376T800 1476T1157 1377T1415 1104T1509 729Q1509 532 1419 360T1164 84T800 -21Q603 -21 438 82T181 358T90 729ZM205 729Q205 557 285 411T502 181T800 98Q961 98 1099 182T1315
412T1394 729Q1394 900 1316 1044T1099 1272T800 1356Q640 1356 502 1274T285 1045T205 729ZM653 654V316H512V1165H788Q941 1165 1025 1100T1110 909Q1110 786 982 721Q1104 671 1105 517V456Q1105 370 1122 332V316H977Q963 352 963 444T960 554Q944 650 829
654H653ZM653 782H809Q881 784 925 817T969 904Q969 977 930 1007T791 1038H653V782Z" />
<glyph unicode="&#xaf;" horiz-adv-x="938" d="M814 1302H142V1445H814V1302Z" />
<glyph unicode="&#xb0;" horiz-adv-x="765" d="M130 1216Q130 1320 204 1398T385 1476Q489 1476 562 1399T636 1216Q636 1110 563 1035T385 960Q280 960 205 1035T130 1216ZM385 1088Q439 1088 476 1123T513 1216Q513 1274 476 1311T385 1349Q330 1349 293 1310T255
1216T292 1125T385 1088Z" />
<glyph unicode="&#xb1;" horiz-adv-x="1094" d="M649 854H1013V703H649V289H482V703H97V854H482V1267H649V854ZM970 0H135V152H970V0Z" />
<glyph unicode="&#xb2;" horiz-adv-x="751" d="M683 667H84V775L384 1057Q493 1159 493 1228Q493 1277 461 1307T369 1338Q294 1338 259 1300T223 1205H66Q66 1319 149 1393T365 1467T574 1404T651 1230Q651 1126 544 1019L460 940L284 795H683V667Z" />
<glyph unicode="&#xb3;" horiz-adv-x="751" d="M265 1126H349Q423 1126 459 1156T495 1235Q495 1280 464 1309T362 1338Q305 1338 268 1313T230 1246H73Q73 1344 154 1405T360 1467Q497 1467 575 1407T653 1242Q653 1187 618 1142T517 1071Q666 1030 666 887Q666
781 581 719T360 656Q228 656 145 719T62 889H220Q220 844 259 814T366 784Q436 784 472 814T509 895Q509 1008 353 1010H265V1126Z" />
<glyph unicode="&#xb4;" horiz-adv-x="642" d="M316 1536H540L272 1242H123L316 1536Z" />
<glyph unicode="&#xb5;" horiz-adv-x="1160" d="M339 1082V449Q340 286 391 208T559 130Q758 130 820 282V1082H1006V0H839L830 115Q737 -20 567 -20Q420 -20 339 53V-416H154V1082H339Z" />
<glyph unicode="&#xb6;" horiz-adv-x="1001" d="M646 0V520H562Q332 520 200 647T67 988Q67 1201 200 1328T563 1456H832V0H646Z" />
<glyph unicode="&#xb7;" horiz-adv-x="534" d="M147 729Q147 777 175 809T261 841T347 809T377 729Q377 682 348 651T261 619T176 650T147 729Z" />
<glyph unicode="&#xb8;" horiz-adv-x="507" d="M285 0L273 -52Q426 -79 426 -225Q426 -322 346 -378T123 -435L116 -328Q195 -328 238 -302T282 -229Q282 -185 250 -164T120 -134L152 0H285Z" />
<glyph unicode="&#xb9;" horiz-adv-x="751" d="M495 667H338V1268L122 1211V1339L477 1456H495V667Z" />
<glyph unicode="&#xba;" horiz-adv-x="931" d="M122 1123Q122 1281 216 1378T464 1476Q619 1476 713 1380T807 1117V1043Q807 884 714 787T466 690T217 787T122 1049V1123ZM285 1043Q285 943 333 886T466 829Q549 829 596 886T644 1045V1123Q644 1222 596 1279T464
1336Q383 1336 335 1281T285 1129V1043Z" />
<glyph unicode="&#xbb;" horiz-adv-x="960" d="M244 949L539 560V541L244 152H102L360 550L102 949H244ZM593 949L888 560V541L593 152H451L709 550L451 949H593Z" />
<glyph unicode="&#xbc;" horiz-adv-x="1500" d="M458 664H301V1265L85 1208V1336L440 1453H458V664ZM443 118L339 184L1050 1322L1154 1256L443 118ZM1318 299H1425V169H1318V0H1161V169H786L780 271L1157 789H1318V299ZM938 299H1161V588L1144 560L938 299Z" />
<glyph unicode="&#xbd;" horiz-adv-x="1589" d="M399 118L295 184L1006 1322L1110 1256L399 118ZM453 664H296V1265L80 1208V1336L435 1453H453V664ZM1481 0H882V108L1182 390Q1291 492 1291 561Q1291 610 1259 640T1167 671Q1092 671 1057 633T1021 538H864Q864
652 947 726T1163 800T1372 737T1449 563Q1449 459 1342 352L1258 273L1082 128H1481V0Z" />
<glyph unicode="&#xbe;" horiz-adv-x="1593" d="M570 118L466 184L1177 1322L1281 1256L570 118ZM1410 299H1517V169H1410V0H1253V169H878L872 271L1249 789H1410V299ZM1030 299H1253V588L1236 560L1030 299ZM314 1126H398Q472 1126 508 1156T544 1235Q544 1280
513 1309T411 1338Q354 1338 317 1313T279 1246H122Q122 1344 203 1405T409 1467Q546 1467 624 1407T702 1242Q702 1187 667 1142T566 1071Q715 1030 715 887Q715 781 630 719T409 656Q277 656 194 719T111 889H269Q269 844 308 814T415 784Q485 784 521 814T558
895Q558 1008 402 1010H314V1126Z" />
<glyph unicode="&#xbf;" horiz-adv-x="969" d="M588 680Q587 574 567 511T498 388T358 233T255 37L253 0Q253 -109 311 -166T478 -224Q578 -224 640 -168T703 -20H888Q886 -181 774 -283T478 -385Q282 -385 175 -285T68 -5Q68 168 228 343L337 456Q403 534 403
680H588ZM596 997Q596 952 569 921T487 890T405 921T377 997Q377 1041 405 1071T487 1101T568 1071T596 997Z" />
<glyph unicode="&#xc0;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM778 1552H619L361 1846H584L778 1552Z" />
<glyph unicode="&#xc1;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM763 1846H987L719 1552H570L763 1846Z" />
<glyph unicode="&#xc2;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM975 1572V1562H822L672 1732L523 1562H370V1574L616 1846H728L975 1572Z" />
<glyph unicode="&#xc3;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM1027 1814Q1027 1706 966 1639T812 1572Q771 1572 741 1582T663 1623T593 1660T543 1667Q502 1667 473 1636T444 1555L320
1562Q320 1669 380 1739T534 1809Q569 1809 597 1799T673 1760T746 1722T803 1713Q846 1713 874 1747T903 1826L1027 1814Z" />
<glyph unicode="&#xc4;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM350 1681Q350 1726 377 1756T459 1787T541 1757T569 1681T541 1606T459 1576T378 1606T350 1681ZM780 1679Q780 1724
807 1755T889 1786T971 1755T999 1679T971 1604T889 1574T808 1604T780 1679Z" />
<glyph unicode="&#xc5;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM887 1729Q887 1642 825 1584T672 1525Q580 1525 519 1584T457 1729T518 1876T672 1937T825 1876T887 1729ZM556 1729Q556
1682 589 1648T672 1614Q720 1614 754 1647T788 1729T755 1812T672 1847Q622 1847 589 1812T556 1729Z" />
<glyph unicode="&#xc6;" horiz-adv-x="1914" d="M1879 0H996L981 353H417L212 0H-14L866 1456H1817V1304H1126L1146 833H1736V682H1152L1174 151H1879V0ZM518 527H974L943 1260L518 527Z" />
<glyph unicode="&#xc7;" horiz-adv-x="1333" d="M1240 462Q1213 231 1070 106T688 -20Q430 -20 275 165T119 660V800Q119 1003 191 1157T397 1393T705 1476Q937 1476 1077 1347T1240 988H1047Q1022 1162 939 1240T705 1318Q521 1318 417 1182T312 795V654Q312
417 411 277T688 137Q848 137 933 209T1047 462H1240ZM751 -9L739 -61Q892 -88 892 -234Q892 -331 812 -387T589 -444L582 -337Q661 -337 704 -311T748 -238Q748 -194 716 -173T586 -143L618 -9H751Z" />
<glyph unicode="&#xc8;" horiz-adv-x="1164" d="M992 673H361V157H1094V0H169V1456H1084V1298H361V830H992V673ZM725 1564H566L308 1858H531L725 1564Z" />
<glyph unicode="&#xc9;" horiz-adv-x="1164" d="M992 673H361V157H1094V0H169V1456H1084V1298H361V830H992V673ZM710 1858H934L666 1564H517L710 1858Z" />
<glyph unicode="&#xca;" horiz-adv-x="1164" d="M992 673H361V157H1094V0H169V1456H1084V1298H361V830H992V673ZM922 1584V1574H769L619 1744L470 1574H317V1586L563 1858H675L922 1584Z" />
<glyph unicode="&#xcb;" horiz-adv-x="1164" d="M992 673H361V157H1094V0H169V1456H1084V1298H361V830H992V673ZM297 1693Q297 1738 324 1768T406 1799T488 1769T516 1693T488 1618T406 1588T325 1618T297 1693ZM727 1691Q727 1736 754 1767T836 1798T918 1767T946
1691T918 1616T836 1586T755 1616T727 1691Z" />
<glyph unicode="&#xcc;" horiz-adv-x="557" d="M375 0H183V1456H375V0ZM385 1564H226L-32 1858H191L385 1564Z" />
<glyph unicode="&#xcd;" horiz-adv-x="557" d="M375 0H183V1456H375V0ZM369 1858H593L325 1564H176L369 1858Z" />
<glyph unicode="&#xce;" horiz-adv-x="557" d="M375 0H183V1456H375V0ZM582 1584V1574H429L279 1744L130 1574H-23V1586L223 1858H335L582 1584Z" />
<glyph unicode="&#xcf;" horiz-adv-x="557" d="M375 0H183V1456H375V0ZM-43 1693Q-43 1738 -16 1768T66 1799T148 1769T176 1693T148 1618T66 1588T-15 1618T-43 1693ZM387 1691Q387 1736 414 1767T496 1798T578 1767T606 1691T578 1616T496 1586T415 1616T387 1691Z" />
<glyph unicode="&#xd0;" horiz-adv-x="1373" d="M199 0V666H7V817H199V1456H610Q800 1456 946 1372T1171 1133T1252 777V684Q1252 478 1173 323T946 85T602 0H199ZM643 666H391V157H592Q814 157 937 294T1062 680V773Q1062 1021 946 1158T615 1298H391V817H643V666Z" />
<glyph unicode="&#xd1;" horiz-adv-x="1460" d="M1288 0H1095L362 1122V0H169V1456H362L1097 329V1456H1288V0ZM1081 1814Q1081 1706 1020 1639T866 1572Q825 1572 795 1582T717 1623T647 1660T597 1667Q556 1667 527 1636T498 1555L374 1562Q374 1669 434 1739T588
1809Q623 1809 651 1799T727 1760T800 1722T857 1713Q900 1713 928 1747T957 1826L1081 1814Z" />
<glyph unicode="&#xd2;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521
1311 417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775ZM812 1554H653L395 1848H618L812 1554Z" />
<glyph unicode="&#xd3;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521
1311 417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775ZM797 1848H1021L753 1554H604L797 1848Z" />
<glyph unicode="&#xd4;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521
1311 417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775ZM1009 1574V1564H856L706 1734L557 1564H404V1576L650 1848H762L1009 1574Z" />
<glyph unicode="&#xd5;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521
1311 417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775ZM1061 1816Q1061 1708 1000 1641T846 1574Q805 1574 775 1584T697 1625T627 1662T577 1669Q536 1669 507 1638T478 1557L354 1564Q354 1671 414 1741T568 1811Q603 1811 631 1801T707
1762T780 1724T837 1715Q880 1715 908 1749T937 1828L1061 1816Z" />
<glyph unicode="&#xd6;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521
1311 417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775ZM384 1683Q384 1728 411 1758T493 1789T575 1759T603 1683T575 1608T493 1578T412 1608T384 1683ZM814 1681Q814 1726 841 1757T923 1788T1005 1757T1033 1681T1005 1606T923
1576T842 1606T814 1681Z" />
<glyph unicode="&#xd7;" horiz-adv-x="1092" d="M89 329L419 665L91 1000L210 1123L539 788L868 1123L987 1000L659 665L989 329L870 206L539 543L208 206L89 329Z" />
<glyph unicode="&#xd8;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q534 -20 403 62L306 -93H164L308 138Q118 330 118 690V773Q118 983 191 1144T397 1390T703 1476Q917 1476 1065 1351L1168 1516H1309L1150 1261Q1287 1074 1289 780V681ZM309
681Q309 437 407 296L971 1200Q869 1311 703 1311Q521 1311 417 1173T309 788V681ZM1098 775Q1098 957 1042 1088L493 207Q584 143 705 143Q891 143 993 278T1098 667V775Z" />
<glyph unicode="&#xd9;" horiz-adv-x="1328" d="M1194 1456V466Q1193 260 1065 129T716 -18L665 -20Q426 -20 284 109T140 464V1456H330V470Q330 312 417 225T665 137Q828 137 914 224T1001 469V1456H1194ZM773 1552H614L356 1846H579L773 1552Z" />
<glyph unicode="&#xda;" horiz-adv-x="1328" d="M1194 1456V466Q1193 260 1065 129T716 -18L665 -20Q426 -20 284 109T140 464V1456H330V470Q330 312 417 225T665 137Q828 137 914 224T1001 469V1456H1194ZM758 1846H982L714 1552H565L758 1846Z" />
<glyph unicode="&#xdb;" horiz-adv-x="1328" d="M1194 1456V466Q1193 260 1065 129T716 -18L665 -20Q426 -20 284 109T140 464V1456H330V470Q330 312 417 225T665 137Q828 137 914 224T1001 469V1456H1194ZM970 1572V1562H817L667 1732L518 1562H365V1574L611
1846H723L970 1572Z" />
<glyph unicode="&#xdc;" horiz-adv-x="1328" d="M1194 1456V466Q1193 260 1065 129T716 -18L665 -20Q426 -20 284 109T140 464V1456H330V470Q330 312 417 225T665 137Q828 137 914 224T1001 469V1456H1194ZM345 1681Q345 1726 372 1756T454 1787T536 1757T564
1681T536 1606T454 1576T373 1606T345 1681ZM775 1679Q775 1724 802 1755T884 1786T966 1755T994 1679T966 1604T884 1574T803 1604T775 1679Z" />
<glyph unicode="&#xdd;" horiz-adv-x="1230" d="M613 725L993 1456H1211L709 543V0H517V543L15 1456H235L613 725ZM708 1846H932L664 1552H515L708 1846Z" />
<glyph unicode="&#xde;" horiz-adv-x="1210" d="M352 1456V1163H631Q778 1163 888 1111T1057 961T1117 738Q1117 544 985 429T626 313H352V0H166V1456H352ZM352 1011V465H629Q771 465 851 540T931 736Q931 859 851 934T635 1011H352Z" />
<glyph unicode="&#xdf;" horiz-adv-x="1218" d="M324 0H139V1111Q139 1319 242 1436T532 1554Q712 1554 810 1465T909 1216Q909 1091 845 990T781 819Q781 768 818 721T950 601T1087 461T1130 317Q1130 158 1029 69T745 -20Q664 -20 574 2T445 52L488 207Q537
175 604 153T725 131Q832 131 888 178T945 307Q945 359 908 407T777 528T639 671T595 821Q595 910 664 1013T734 1201Q734 1295 682 1348T542 1402Q324 1402 324 1109V0Z" />
<glyph unicode="&#xe0;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM687 1242H528L270 1536H493L687 1242Z" />
<glyph unicode="&#xe1;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM672 1536H896L628 1242H479L672 1536Z" />
<glyph unicode="&#xe2;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM884 1262V1252H731L581 1422L432 1252H279V1264L525 1536H637L884 1262Z" />
<glyph unicode="&#xe3;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM936 1504Q936 1396 875 1329T721 1262Q680 1262 650 1272T572 1313T502 1350T452 1357Q411 1357 382 1326T353 1245L229 1252Q229 1359 289
1429T443 1499Q478 1499 506 1489T582 1450T655 1412T712 1403Q755 1403 783 1437T812 1516L936 1504Z" />
<glyph unicode="&#xe4;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM259 1371Q259 1416 286 1446T368 1477T450 1447T478 1371T450 1296T368 1266T287 1296T259 1371ZM689 1369Q689 1414 716 1445T798 1476T880
1445T908 1369T880 1294T798 1264T717 1294T689 1369Z" />
<glyph unicode="&#xe5;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM796 1419Q796 1332 734 1274T581 1215Q489 1215 428 1274T366 1419T427 1566T581 1627T734 1566T796 1419ZM465 1419Q465 1372 498 1338T581
1304Q629 1304 663 1337T697 1419T664 1502T581 1537Q531 1537 498 1502T465 1419Z" />
<glyph unicode="&#xe6;" horiz-adv-x="1729" d="M1262 -20Q1001 -20 865 160Q800 74 687 27T433 -20Q266 -20 172 66T78 304Q78 461 191 548T526 635H749V720Q749 827 694 888T535 950Q430 950 360 895T290 759L106 778Q106 921 227 1011T535 1102Q650 1102 738
1061T876 936Q939 1015 1026 1058T1218 1102Q1428 1102 1544 974T1660 612V497H932Q939 321 1026 226T1262 130Q1410 130 1531 206L1578 237L1642 101Q1484 -20 1262 -20ZM469 130Q541 130 620 167T749 258V495H521Q404 493 334 438T264 300Q264 223 317 177T469
130ZM1218 950Q1103 950 1029 865T937 640H1475V671Q1475 803 1408 876T1218 950Z" />
<glyph unicode="&#xe7;" horiz-adv-x="1072" d="M574 131Q673 131 747 191T829 341H1004Q999 248 940 164T783 30T574 -20Q353 -20 223 127T92 531V562Q92 720 150 843T316 1034T573 1102Q755 1102 875 993T1004 710H829Q821 815 750 882T573 950Q432 950 355
849T277 555V520Q277 333 354 232T574 131ZM604 -9L592 -61Q745 -88 745 -234Q745 -331 665 -387T442 -444L435 -337Q514 -337 557 -311T601 -238Q601 -194 569 -173T439 -143L471 -9H604Z" />
<glyph unicode="&#xe8;" horiz-adv-x="1085" d="M589 -20Q369 -20 231 124T93 511V545Q93 706 154 832T326 1030T566 1102Q777 1102 894 963T1011 565V488H278Q282 328 371 230T599 131Q697 131 765 171T884 277L997 189Q861 -20 589 -20ZM566 950Q454 950 378
869T284 640H826V654Q818 795 750 872T566 950ZM671 1242H512L254 1536H477L671 1242Z" />
<glyph unicode="&#xe9;" horiz-adv-x="1085" d="M589 -20Q369 -20 231 124T93 511V545Q93 706 154 832T326 1030T566 1102Q777 1102 894 963T1011 565V488H278Q282 328 371 230T599 131Q697 131 765 171T884 277L997 189Q861 -20 589 -20ZM566 950Q454 950 378
869T284 640H826V654Q818 795 750 872T566 950ZM656 1536H880L612 1242H463L656 1536Z" />
<glyph unicode="&#xea;" horiz-adv-x="1085" d="M589 -20Q369 -20 231 124T93 511V545Q93 706 154 832T326 1030T566 1102Q777 1102 894 963T1011 565V488H278Q282 328 371 230T599 131Q697 131 765 171T884 277L997 189Q861 -20 589 -20ZM566 950Q454 950 378
869T284 640H826V654Q818 795 750 872T566 950ZM868 1262V1252H715L565 1422L416 1252H263V1264L509 1536H621L868 1262Z" />
<glyph unicode="&#xeb;" horiz-adv-x="1085" d="M589 -20Q369 -20 231 124T93 511V545Q93 706 154 832T326 1030T566 1102Q777 1102 894 963T1011 565V488H278Q282 328 371 230T599 131Q697 131 765 171T884 277L997 189Q861 -20 589 -20ZM566 950Q454 950 378
869T284 640H826V654Q818 795 750 872T566 950ZM243 1371Q243 1416 270 1446T352 1477T434 1447T462 1371T434 1296T352 1266T271 1296T243 1371ZM673 1369Q673 1414 700 1445T782 1476T864 1445T892 1369T864 1294T782 1264T701 1294T673 1369Z" />
<glyph unicode="&#xec;" horiz-adv-x="506" d="M341 0H155V1082H341V0ZM615 1497H456L198 1791H421L615 1497Z" />
<glyph unicode="&#xed;" horiz-adv-x="506" d="M341 0H155V1082H341V0ZM343 1791H567L299 1497H150L343 1791Z" />
<glyph unicode="&#xee;" horiz-adv-x="506" d="M341 0H155V1082H341V0ZM556 1261V1251H403L253 1421L104 1251H-49V1263L197 1535H309L556 1261Z" />
<glyph unicode="&#xef;" horiz-adv-x="506" d="M341 0H155V1082H341V0ZM-69 1370Q-69 1415 -42 1445T40 1476T122 1446T150 1370T122 1295T40 1265T-41 1295T-69 1370ZM361 1368Q361 1413 388 1444T470 1475T552 1444T580 1368T552 1293T470 1263T389 1293T361 1368Z" />
<glyph unicode="&#xf0;" horiz-adv-x="1200" d="M820 1301Q1069 1037 1069 628V535Q1069 377 1011 251T844 52T602 -20Q467 -20 357 44T187 221T126 467Q126 614 182 730T341 912T574 977Q737 977 858 863Q810 1058 669 1199L451 1051L378 1150L570 1281Q438 1372
255 1421L312 1580Q551 1526 726 1387L915 1516L988 1416L820 1301ZM884 635L882 691Q849 752 780 788T618 825Q473 825 392 730T311 467Q311 327 394 229T606 131Q731 131 807 244T884 541V635Z" />
<glyph unicode="&#xf1;" horiz-adv-x="1130" d="M315 1082L321 946Q445 1102 645 1102Q988 1102 991 715V0H806V716Q805 833 753 889T589 945Q499 945 431 897T325 771V0H140V1082H315ZM927 1504Q927 1396 866 1329T712 1262Q671 1262 641 1272T563 1313T493 1350T443
1357Q402 1357 373 1326T344 1245L220 1252Q220 1359 280 1429T434 1499Q469 1499 497 1489T573 1450T646 1412T703 1403Q746 1403 774 1437T803 1516L927 1504Z" />
<glyph unicode="&#xf2;" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729
807 839T582 950Q445 950 361 841T277 529ZM681 1242H522L264 1536H487L681 1242Z" />
<glyph unicode="&#xf3;" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729
807 839T582 950Q445 950 361 841T277 529ZM666 1536H890L622 1242H473L666 1536Z" />
<glyph unicode="&#xf4;" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729
807 839T582 950Q445 950 361 841T277 529ZM878 1262V1252H725L575 1422L426 1252H273V1264L519 1536H631L878 1262Z" />
<glyph unicode="&#xf5;" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729
807 839T582 950Q445 950 361 841T277 529ZM930 1504Q930 1396 869 1329T715 1262Q674 1262 644 1272T566 1313T496 1350T446 1357Q405 1357 376 1326T347 1245L223 1252Q223 1359 283 1429T437 1499Q472 1499 500 1489T576 1450T649 1412T706 1403Q749 1403 777
1437T806 1516L930 1504Z" />
<glyph unicode="&#xf6;" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729
807 839T582 950Q445 950 361 841T277 529ZM253 1371Q253 1416 280 1446T362 1477T444 1447T472 1371T444 1296T362 1266T281 1296T253 1371ZM683 1369Q683 1414 710 1445T792 1476T874 1445T902 1369T874 1294T792 1264T711 1294T683 1369Z" />
<glyph unicode="&#xf7;" horiz-adv-x="1169" d="M1069 600H71V784H1069V600ZM461 1098Q461 1146 489 1178T575 1210T661 1178T691 1098Q691 1051 662 1020T575 989T490 1020T461 1098ZM461 281Q461 329 489 361T575 393T661 361T691 281Q691 235 662 204T575 172T490
203T461 281Z" />
<glyph unicode="&#xf8;" horiz-adv-x="1160" d="M91 551Q91 710 152 836T326 1032T582 1102Q692 1102 786 1060L859 1208H983L881 1003Q1076 849 1076 529Q1076 371 1014 244T840 49T584 -20Q480 -20 394 15L320 -134H196L296 69Q91 218 91 551ZM276 529Q276 335
373 224L716 918Q654 950 582 950Q444 950 360 841T276 529ZM890 551Q890 733 803 844L463 156Q518 131 584 131Q723 131 806 240T890 535V551Z" />
<glyph unicode="&#xf9;" horiz-adv-x="1129" d="M808 107Q700 -20 491 -20Q318 -20 228 80T136 378V1082H321V383Q321 137 521 137Q733 137 803 295V1082H988V0H812L808 107ZM673 1242H514L256 1536H479L673 1242Z" />
<glyph unicode="&#xfa;" horiz-adv-x="1129" d="M808 107Q700 -20 491 -20Q318 -20 228 80T136 378V1082H321V383Q321 137 521 137Q733 137 803 295V1082H988V0H812L808 107ZM658 1536H882L614 1242H465L658 1536Z" />
<glyph unicode="&#xfb;" horiz-adv-x="1129" d="M808 107Q700 -20 491 -20Q318 -20 228 80T136 378V1082H321V383Q321 137 521 137Q733 137 803 295V1082H988V0H812L808 107ZM870 1262V1252H717L567 1422L418 1252H265V1264L511 1536H623L870 1262Z" />
<glyph unicode="&#xfc;" horiz-adv-x="1129" d="M808 107Q700 -20 491 -20Q318 -20 228 80T136 378V1082H321V383Q321 137 521 137Q733 137 803 295V1082H988V0H812L808 107ZM245 1371Q245 1416 272 1446T354 1477T436 1447T464 1371T436 1296T354 1266T273 1296T245
1371ZM675 1369Q675 1414 702 1445T784 1476T866 1445T894 1369T866 1294T784 1264T703 1294T675 1369Z" />
<glyph unicode="&#xfd;" horiz-adv-x="969" d="M494 271L746 1082H944L509 -167Q408 -437 188 -437L153 -434L84 -421V-271L134 -275Q228 -275 280 -237T367 -98L408 12L22 1082H224L494 271ZM599 1536H823L555 1242H406L599 1536Z" />
<glyph unicode="&#xfe;" horiz-adv-x="1180" d="M1063 529Q1063 282 950 131T644 -20Q447 -20 334 105V-416H149V1536H334V970Q447 1102 641 1102Q836 1102 949 955T1063 546V529ZM878 550Q878 733 800 839T586 945Q418 945 334 796V279Q417 131 588 131Q721 131
799 236T878 550Z" />
<glyph unicode="&#xff;" horiz-adv-x="969" d="M494 271L746 1082H944L509 -167Q408 -437 188 -437L153 -434L84 -421V-271L134 -275Q228 -275 280 -237T367 -98L408 12L22 1082H224L494 271ZM186 1371Q186 1416 213 1446T295 1477T377 1447T405 1371T377 1296T295
1266T214 1296T186 1371ZM616 1369Q616 1414 643 1445T725 1476T807 1445T835 1369T807 1294T725 1264T644 1294T616 1369Z" />
<glyph unicode="&#x2013;" horiz-adv-x="1344" d="M1421 651H419V802H1421V651Z" />
<glyph unicode="&#x2014;" horiz-adv-x="1599" d="M1737 651H401V802H1737V651Z" />
<glyph unicode="&#x2018;" horiz-adv-x="409" d="M270 1555L376 1483Q283 1356 280 1209V1073H96V1189Q96 1291 144 1391T270 1555Z" />
<glyph unicode="&#x2019;" horiz-adv-x="409" d="M153 1046L48 1118Q141 1248 144 1392V1536H327V1406Q326 1306 278 1207T153 1046Z" />
<glyph unicode="&#x201a;" horiz-adv-x="407" d="M141 -283L36 -210Q127 -83 130 63V181H315V81Q315 -20 266 -121T141 -283Z" />
<glyph unicode="&#x201c;" horiz-adv-x="724" d="M278 1555L384 1483Q291 1356 288 1209V1073H104V1189Q104 1291 152 1391T278 1555ZM593 1555L699 1483Q606 1356 603 1209V1073H419V1189Q419 1291 467 1391T593 1555Z" />
<glyph unicode="&#x201d;" horiz-adv-x="731" d="M165 1046L60 1118Q153 1248 156 1392V1536H339V1406Q338 1306 290 1207T165 1046ZM472 1046L367 1118Q460 1248 463 1392V1536H646V1406Q645 1306 597 1207T472 1046Z" />
<glyph unicode="&#x201e;" horiz-adv-x="705" d="M141 -301L36 -229Q127 -92 130 61V246H315V82Q315 -26 266 -131T141 -301ZM437 -301L332 -229Q423 -92 426 61V246H612V82Q612 -25 564 -129T437 -301Z" />
<glyph unicode="&#x2022;" horiz-adv-x="690" d="M138 772Q138 859 193 915T341 971Q432 971 489 917T546 769V732Q546 645 491 590T342 535Q249 535 194 590T138 734V772Z" />
<glyph unicode="&#x2039;" horiz-adv-x="614" d="M286 550L544 153H403L108 541V560L403 949H544L286 550Z" />
<glyph unicode="&#x203a;" horiz-adv-x="614" d="M231 949L526 560V541L231 152H89L347 550L89 949H231Z" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

3
images/Int4.aux Normal file
View File

@ -0,0 +1,3 @@
\relax
\@gobbletwo \sa@multi@setnumpages {0}
\gdef \@abspage@last{1}

386
images/Int4.log Normal file
View File

@ -0,0 +1,386 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/Debian) (preloaded format=pdflatex 2023.3.29) 28 APR 2023 13:54
entering extended mode
\write18 enabled.
file:line:error style messages enabled.
%&-line parsing enabled.
**/home/hellmund/Julia/23/Book/images/Int4
(/home/hellmund/Julia/23/Book/images/Int4.tex
LaTeX2e <2022-11-01> patch level 1
L3 programming layer <2023-01-16> (/usr/share/texlive/texmf-dist/tex/latex/standalone/standalone.cls
Document Class: standalone 2022/10/10 v1.3b Class to compile TeX sub-files standalone
(/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/generic/iftex/ifluatex.sty
Package: ifluatex 2019/10/25 v1.5 ifluatex legacy package. Use iftex instead.
(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
Package: iftex 2022/02/03 v1.0f TeX engine tests
)) (/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
Package: xkeyval 2022/06/16 v2.9 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=\toks16
\XKV@tempa@toks=\toks17
(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/keyval.tex))
\XKV@depth=\count185
File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
))
\sa@internal=\count186
\c@sapage=\count187
(/usr/share/texlive/texmf-dist/tex/latex/standalone/standalone.cfg
File: standalone.cfg 2022/10/10 v1.3b Default configuration file for 'standalone' class
) (/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2022/07/02 v1.4n Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo
File: size10.clo 2022/07/02 v1.4n Standard LaTeX file (size option)
)
\c@part=\count188
\c@section=\count189
\c@subsection=\count190
\c@subsubsection=\count191
\c@paragraph=\count192
\c@subparagraph=\count193
\c@figure=\count194
\c@table=\count195
\abovecaptionskip=\skip48
\belowcaptionskip=\skip49
\bibindent=\dimen140
)
\sa@box=\box51
runsystem(pdflatex -shell-escape -jobname 'Int4' '\expandafter\def\csname sa@internal@run\endcsname{1}\input{Int4}')...executed.
\sa@read=\read2
Executing command:
convert -density 300 -units PixelsPerInch Int4.pdf -quality 90 Int4.png
runsystem(convert -density 300 -units PixelsPerInch Int4.pdf -quality 90 Int4.png)...executed.
Class standalone:
Output written on Int4.png.
) )
Here is how much of TeX's memory you used:
852 strings out of 476091
14416 string characters out of 5794081
1849330 words of memory out of 5000000
21292 multiletter control sequences out of 15000+600000
512287 words of font info for 32 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
57i,1n,71p,215b,58s stack positions out of 10000i,1000n,20000p,200000b,200000s
No pages of output.
PDF statistics:
0 PDF objects out of 1000 (max. 8388607)
0 named destinations out of 1000 (max. 500000)
1 words of extra memory for PDF output out of 10000 (max. 10000000)
ls on input line 1234.
\MT@outer@kern=\dimen141
LaTeX Info: Redefining \textmicrotypecontext on input line 1858.
\MT@listname@count=\count198
(/usr/share/texlive/texmf-dist/tex/latex/microtype/microtype-pdftex.def
File: microtype-pdftex.def 2022/06/23 v3.0f Definitions specific to pdftex (RS)
LaTeX Info: Redefining \lsstyle on input line 900.
LaTeX Info: Redefining \lslig on input line 900.
\MT@outer@space=\skip50
)
Package microtype Info: Loading configuration file microtype.cfg.
(/usr/share/texlive/texmf-dist/tex/latex/microtype/microtype.cfg
File: microtype.cfg 2022/06/23 v3.0f microtype main configuration file (RS)
)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty (/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.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=\toks19
\pgfutil@tempdima=\dimen142
\pgfutil@tempdimb=\dimen143
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
\pgfutil@abb=\box53
) (/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 2023-01-15 v3.1.10 (3.1.10)
))
Package: pgf 2023-01-15 v3.1.10 (3.1.10)
(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR)
(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
Package: graphics 2022/03/10 v1.4e Standard LaTeX Graphics (DPC,SPQR)
(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
Package: trig 2021/08/11 v1.11 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 107.
(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
File: pdftex.def 2022/09/22 v1.2b Graphics/color driver for pdftex
))
\Gin@req@height=\dimen144
\Gin@req@width=\dimen145
) (/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
Package: pgfsys 2023-01-15 v3.1.10 (3.1.10)
(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
\pgfkeys@pathtoks=\toks20
\pgfkeys@temptoks=\toks21
(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfiltered.code.tex
\pgfkeys@tmptoks=\toks22
))
\pgf@x=\dimen146
\pgf@y=\dimen147
\pgf@xa=\dimen148
\pgf@ya=\dimen149
\pgf@xb=\dimen150
\pgf@yb=\dimen151
\pgf@xc=\dimen152
\pgf@yc=\dimen153
\pgf@xd=\dimen154
\pgf@yd=\dimen155
\w@pgf@writea=\write3
\r@pgf@reada=\read2
\c@pgf@counta=\count199
\c@pgf@countb=\count266
\c@pgf@countc=\count267
\c@pgf@countd=\count268
\t@pgf@toka=\toks23
\t@pgf@tokb=\toks24
\t@pgf@tokc=\toks25
\pgf@sys@id@count=\count269
(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
File: pgf.cfg 2023-01-15 v3.1.10 (3.1.10)
)
Driver file for pgf: pgfsys-pdftex.def
(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
File: pgfsys-pdftex.def 2023-01-15 v3.1.10 (3.1.10)
(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
File: pgfsys-common-pdf.def 2023-01-15 v3.1.10 (3.1.10)
))) (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
File: pgfsyssoftpath.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgfsyssoftpath@smallbuffer@items=\count270
\pgfsyssoftpath@bigbuffer@items=\count271
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
File: pgfsysprotocol.code.tex 2023-01-15 v3.1.10 (3.1.10)
)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
Package: xcolor 2022/06/12 v2.14 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 227.
(/usr/share/texlive/texmf-dist/tex/latex/graphics/mathcolor.ltx)
Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1353.
Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1357.
Package xcolor Info: Model `RGB' extended on input line 1369.
Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1371.
Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1372.
Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1373.
Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1374.
Package xcolor Info: Model `Gray' substituted by `gray' on input line 1375.
Package xcolor Info: Model `wave' substituted by `hsb' on input line 1376.
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
Package: pgfcore 2023-01-15 v3.1.10 (3.1.10)
(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.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=\dimen156
\pgfmath@count=\count272
\pgfmath@box=\box54
\pgfmath@toks=\toks26
\pgfmath@stack@operand=\toks27
\pgfmath@stack@operation=\toks28
) (/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.trigonometric.code.tex) (/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.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.integerarithmetics.code.tex) (/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex) (/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
\c@pgfmathroundto@lastzeros=\count273
)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
File: pgfcorepoints.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgf@picminx=\dimen157
\pgf@picmaxx=\dimen158
\pgf@picminy=\dimen159
\pgf@picmaxy=\dimen160
\pgf@pathminx=\dimen161
\pgf@pathmaxx=\dimen162
\pgf@pathminy=\dimen163
\pgf@pathmaxy=\dimen164
\pgf@xx=\dimen165
\pgf@xy=\dimen166
\pgf@yx=\dimen167
\pgf@yy=\dimen168
\pgf@zx=\dimen169
\pgf@zy=\dimen170
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
File: pgfcorepathconstruct.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgf@path@lastx=\dimen171
\pgf@path@lasty=\dimen172
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
File: pgfcorepathusage.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgf@shorten@end@additional=\dimen173
\pgf@shorten@start@additional=\dimen174
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
File: pgfcorescopes.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgfpic=\box55
\pgf@hbox=\box56
\pgf@layerbox@main=\box57
\pgf@picture@serial@count=\count274
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
File: pgfcoregraphicstate.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgflinewidth=\dimen175
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex
File: pgfcoretransformations.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgf@pt@x=\dimen176
\pgf@pt@y=\dimen177
\pgf@pt@temp=\dimen178
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
File: pgfcorequick.code.tex 2023-01-15 v3.1.10 (3.1.10)
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
File: pgfcoreobjects.code.tex 2023-01-15 v3.1.10 (3.1.10)
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.tex
File: pgfcorepathprocessing.code.tex 2023-01-15 v3.1.10 (3.1.10)
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
File: pgfcorearrows.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgfarrowsep=\dimen179
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
File: pgfcoreshade.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgf@max=\dimen180
\pgf@sys@shading@range@num=\count275
\pgf@shadingcount=\count276
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
File: pgfcoreimage.code.tex 2023-01-15 v3.1.10 (3.1.10)
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
File: pgfcoreexternal.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgfexternal@startupbox=\box58
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
File: pgfcorelayers.code.tex 2023-01-15 v3.1.10 (3.1.10)
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
File: pgfcoretransparency.code.tex 2023-01-15 v3.1.10 (3.1.10)
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
File: pgfcorepatterns.code.tex 2023-01-15 v3.1.10 (3.1.10)
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
File: pgfcorerdf.code.tex 2023-01-15 v3.1.10 (3.1.10)
))) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
File: pgfmoduleshapes.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgfnodeparttextbox=\box59
) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
File: pgfmoduleplot.code.tex 2023-01-15 v3.1.10 (3.1.10)
) (/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
Package: pgfcomp-version-0-65 2023-01-15 v3.1.10 (3.1.10)
\pgf@nodesepstart=\dimen181
\pgf@nodesepend=\dimen182
) (/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
Package: pgfcomp-version-1-18 2023-01-15 v3.1.10 (3.1.10)
)) (/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 2023-01-15 v3.1.10 (3.1.10)
\pgffor@iter=\dimen183
\pgffor@skip=\dimen184
\pgffor@stack=\toks29
\pgffor@toks=\toks30
)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
Package: tikz 2023-01-15 v3.1.10 (3.1.10)
(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex
File: pgflibraryplothandlers.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgf@plot@mark@count=\count277
\pgfplotmarksize=\dimen185
)
\tikz@lastx=\dimen186
\tikz@lasty=\dimen187
\tikz@lastxsaved=\dimen188
\tikz@lastysaved=\dimen189
\tikz@lastmovetox=\dimen190
\tikz@lastmovetoy=\dimen191
\tikzleveldistance=\dimen192
\tikzsiblingdistance=\dimen193
\tikz@figbox=\box60
\tikz@figbox@bg=\box61
\tikz@tempbox=\box62
\tikz@tempbox@bg=\box63
\tikztreelevel=\count278
\tikznumberofchildren=\count279
\tikznumberofcurrentchild=\count280
\tikz@fig@count=\count281
(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
File: pgfmodulematrix.code.tex 2023-01-15 v3.1.10 (3.1.10)
\pgfmatrixcurrentrow=\count282
\pgfmatrixcurrentcolumn=\count283
\pgf@matrix@numberofcolumns=\count284
)
\tikz@expandcount=\count285
(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex
File: tikzlibrarytopaths.code.tex 2023-01-15 v3.1.10 (3.1.10)
))) (/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
File: l3backend-pdftex.def 2023-01-16 L3 backend support: PDF output (pdfTeX)
\l__color_backend_stack_int=\count286
\l__pdf_internal_box=\box64
) (./Int4.aux)
\openout1 = `Int4.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 Info: Redefining \microtypecontext on input line 16.
Package microtype Info: Applying patch `item' on input line 16.
Package microtype Info: Applying patch `toc' on input line 16.
Package microtype Info: Applying patch `eqnum' on input line 16.
Package microtype Info: Applying patch `footnote' on input line 16.
Package microtype Info: Generating PDF output.
Package microtype Info: Character protrusion enabled (level 2).
Package microtype Info: Using default protrusion set `alltext'.
Package microtype Info: Automatic font expansion enabled (level 2),
(microtype) stretch: 20, shrink: 20, step: 1, non-selected.
Package microtype Info: Using default expansion set `alltext-nott'.
LaTeX Info: Redefining \showhyphens on input line 16.
Package microtype Info: No adjustment of tracking.
Package microtype Info: No adjustment of interword spacing.
Package microtype Info: No adjustment of character kerning.
(/usr/share/texlive/texmf-dist/tex/latex/microtype/mt-cmr.cfg
File: mt-cmr.cfg 2013/05/19 v2.2 microtype config. file: Computer Modern Roman (RS)
) (/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count287
\scratchdimen=\dimen194
\scratchbox=\box65
\nofMPsegments=\count288
\nofMParguments=\count289
\everyMPshowfont=\toks31
\MPscratchCnt=\count290
\MPscratchDim=\dimen195
\MPnumerator=\count291
\makeMPintoPDFobject=\count292
\everyMPtoPDFconversion=\toks32
) (/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 485.
(/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 Live
))
LaTeX Font Info: Trying to load font information for OT1+qhv on input line 26.
(/usr/share/texmf/tex/latex/tex-gyre/ot1qhv.fd
File: ot1qhv.fd 2009/09/25 v1.2 font definition file for OT1/qhv
)
Package microtype Info: Loading generic protrusion settings for font family
(microtype) `qhv' (encoding: OT1).
(microtype) For optimal results, create family-specific settings.
(microtype) See the microtype manual for details.
Missing character: There is no ; in font nullfont!
Missing character: There is no ; in font nullfont!
Package microtype Info: Loading generic protrusion settings for font family
(microtype) `cmtt' (encoding: OT1).
(microtype) For optimal results, create family-specific settings.
(microtype) See the microtype manual for details.
[1
{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./Int4.aux) )
Here is how much of TeX's memory you used:
15055 strings out of 476091
304803 string characters out of 5794081
1866330 words of memory out of 5000000
35195 multiletter control sequences out of 15000+600000
518900 words of font info for 41 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
106i,7n,107p,1057b,637s stack positions out of 10000i,1000n,20000p,200000b,200000s
{/usr/share/texmf/fonts/enc/dvips/tex-gyre/q-rm.enc}</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt12.pfb></usr/share/texmf/fonts/type1/public/tex-gyre/qhvr.pfb>
Output written on Int4.pdf (1 page, 25695 bytes).
PDF statistics:
22 PDF objects out of 1000 (max. 8388607)
14 compressed objects within 1 object stream
0 named destinations out of 1000 (max. 500000)
6669 words of extra memory for PDF output out of 10000 (max. 10000000)

BIN
images/Int4.pdf Normal file

Binary file not shown.

BIN
images/Int4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

57
images/Int4.tex Normal file
View File

@ -0,0 +1,57 @@
% LTeX: enabled=false
\documentclass[border={10pt},convert=true]{standalone}
%%%% pdftoppm -r 1200 TypeTree1.pdf TypeTree1 -png
%%% convert und pdf2svg sehen schlecht aus
\usepackage[]{tgheros}
\usepackage{microtype}
\usepackage{tikz}
\begin{document}
\def\radius{3}
\def\fak{.83}
\begin{tikzpicture}[
font=\sffamily,
]
\draw[line width=2.3] (0,0) circle [radius=\radius];
\foreach \angle [count=\xi from 0] in {90, 67.5,...,-67.5} {
\node[] at (\angle:1.1*\radius) {\textsf{+\xi}};
\draw[line width=1pt] (\angle:0.97*\radius) -- (\angle:1.03*\radius);
};
\foreach \angle [count=\xi] in {112.5, 135,...,270} {
\node[] at (\angle:1.1*\radius) {\textsf{-\xi}};
\draw[line width=1pt] (\angle:0.97*\radius) -- (\angle:1.03*\radius);
};
\node at (90:\fak *\radius ){0000};
\node at (90-1*90/4:\fak *\radius ){0001};
\node at (90-2*90/4:\fak *\radius ){0010};
\node at (90-3*90/4:\fak *\radius ){0011};
\node at (90-4*90/4:\fak *\radius ){0100};
\node at (90-5*90/4:\fak*\radius ){0101};
\node at (90-6*90/4:\fak *\radius ){0110};
\node at (90-7*90/4:\fak*\radius ){0111};
\node at (90-8*90/4:\fak*\radius ){1000};
\node at (90-9*90/4:\fak*\radius ){1001};
\node at (90-10*90/4:\fak*\radius ){1010};
\node at (90-11*90/4:\fak*\radius ){1011};
\node at (90-12*90/4:\fak*\radius ){1100};
\node at (90-13*90/4:\fak*\radius ){1101};
\node at (90-14*90/4:\fak*\radius ){1110};
\node at (90-15*90/4:\fak*\radius ){1111};
\node at (0:0) {\LARGE{\texttt{Int4}}};
\end{tikzpicture}
\end{document}
%%% Local Variables:
%%% TeX-master: t
%%% End:

BIN
images/TypeTree2.pdf Normal file

Binary file not shown.

BIN
images/TypeTree2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

61
images/TypeTree2.tex Normal file
View File

@ -0,0 +1,61 @@
\documentclass[border={10pt},convert=true]{standalone}
%%%% pdftoppm -r 1200 TypeTree1.pdf TypeTree1 -png
%%% convert und pdf2svg sehen schlecht aus
\usepackage[]{tgheros}
\usepackage{microtype}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
%\usetikzlibrary{graphs, graphdrawing}
%\usegdlibrary{trees}
\usetikzlibrary{trees}
\begin{document}
\begin{tikzpicture}[
font=\sffamily,
level 1/.style={sibling distance=11em},
level 2/.style={sibling distance=10em},
level 3/.style={sibling distance=5em, level distance=5em},
level 4/.style={sibling distance=5em, level distance=7em},
level distance=5em,
every node/.style={shape=rectangle, rounded corners, draw, align=center, fill=blue!30},
leaf/.style={fill=green!30},
parametr/.style={fill=red!30}
]
\node {Number}
child{ node [parametr] {Complex}}
child{ node {Real}
child{ node {AbstractIrrational}
child{ node [leaf] {Irrational}}}
child{ node [parametr] {Rational}}
child{ node {AbstractFloat}
child{ node [leaf] {Float16\\Float32\\Float64\\BigFloat}}}
child{ node {Integer}
child{ node {Signed}
child{ node [leaf] {Int8\\Int16\\Int32\\Int64\\Int128\\BigInt}}}
child{ node {Unsigned}
child{ node [leaf] {UInt8\\UInt16\\UInt32\\UInt64\\UInt128}}}
child{ node [leaf] {Bool}}}
}
;
\node[draw=black,thick,below left=2mm, fill=white, sharp corners] at (.1,-7) {%
\begin{tabular}{@{}l@{ }l@{}}
blue: & abstract type\\
green:& concrete type\\
red:& parametric type
\end{tabular}};
\end{tikzpicture}
\end{document}
%%% Local Variables:
%%% TeX-master: t
%%% End:

BIN
images/TypeTree2old.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 KiB

BIN
images/cache.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
images/favicon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
images/notebook001.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
images/notebook002.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
images/notebook003.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

BIN
images/pi1.pdf Normal file

Binary file not shown.

BIN
images/pi1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

21
images/pi1.tex Normal file
View File

@ -0,0 +1,21 @@
\documentclass[tikz, border=10pt,convert=true]{standalone}
\usepackage[]{tkz-euclide}
%\usetikzlibrary{shapes.geometric,calc}
\begin{document}
\begin{tikzpicture}[scale=3]
\tkzDefPoints{0/0/M, 1/1/B}
\tkzDefRegPolygon[center,sides=4,name=P](M,B)
\tkzDrawPolygon[very thick,red](P1,P...,P4)
\tkzDefRegPolygon[center,sides=8,name=Q](M,B)
\tkzDrawPolygon[very thick,blue](Q1,Q...,Q8)
\tkzDefRegPolygon[center,sides=16,name=R](M,B)
\tkzDrawPolygon[very thick,green](R1,R...,R16)
\tkzDrawCircle[very thick,black](M,B)
\foreach \j in {1,...,16} {
\tkzDrawSegment[gray](R\j, M)
}
\end{tikzpicture}
\end{document}

BIN
images/pi2.pdf Normal file

Binary file not shown.

BIN
images/pi2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

39
images/pi2.tex Normal file
View File

@ -0,0 +1,39 @@
\documentclass[tikz, border=10pt,convert=true]{standalone}
\usepackage[]{tkz-euclide}
%\usetikzlibrary{shapes.geometric,calc}
\begin{document}
\begin{tikzpicture}[scale=3]
\tkzDefPoints{0/0/M}
\tkzDefShiftPoint[M](40:2){A} % polar coord rel.to M: 40deg, r=2
\tkzDefShiftPoint[M](-40:2){C} % rel. to M: -40deg, r=2
\tkzDefShiftPoint[M](0:2){B} % just 2 steps to the right
\tkzInterLL(A,C)(M,B)
\tkzGetPoint{N} % intersection of lines
\tkzDrawArc[delta=10,very thick](M,C)(A) % arc
\tkzDrawPoints(M,A,B,C,N)
\tkzLabelPoints[below](M,C)
\tkzLabelPoints[above right](A)
\tkzLabelPoints[right](B)
\tkzLabelPoints[below left](N)
\tkzDrawSegment[green, very thick](A,B)
\tkzDrawSegment[green, very thick](B,C)
\tkzDrawSegment[blue, very thick](A,C)
\tkzDrawSegment[black, very thick](M,B)
\tkzDrawSegment[black, very thick](M,A)
\tkzDrawSegment[black, very thick](M,C)
\tkzLabelSegment[above,pos=.5](M,A){$1$}
\tkzLabelSegment[above,pos=.5](M,C){$1$}
\tkzMarkRightAngle[size=.08](M,N,A)
\tkzLabelSegment[above,pos=.5](M,N){$a$}
\tkzLabelSegment[above,pos=.5](N,B){$1-a$}
\tkzLabelSegment[below right,pos=.45](A,B){$s_{2n}$}
\tkzLabelSegment[left,pos=.4](A,C){$s_{n}$}
\tkzLabelSegment[below left,pos=.3](B,C){$s_{2n}$}
\end{tikzpicture}
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

8
js/plotly-latest.min.js vendored Normal file

File diff suppressed because one or more lines are too long

53
macros.tex Normal file
View File

@ -0,0 +1,53 @@
% LTeX: enabled=false
\usepackage[sb]{libertine}
%\usepackage{textcomp}
%\usepackage[lcgreekalpha]{libertinust1math}
\usepackage{etoolbox}
\usepackage{setspace}
%\usepackage{ftnxtra} % footnotes in captions
%\usepackage{sidenotes}
%\usepackage{marginnote}
\usepackage{scrhack}
\makeatletter
\newcommand*{\toccontents}{\@starttoc{toc}}%
\let\oldmaketitle\maketitle%
\renewcommand{\maketitle}{\oldmaketitle\toccontents}%
\makeatother
\KOMAoptions{DIV=16}
\AtBeginEnvironment{quote}{\par\singlespace\vspace{-0.\topsep}\small}
\AtEndEnvironment{quote}{\vspace{-0.\topsep}\endsinglespace}
\usepackage[many]{tcolorbox}
%\usepackage[skins, breakable]{tcolorbox}
\newtcolorbox{indentb}{enhanced,breakable,boxrule=0pt,%
frame hidden,interior hidden,sharp corners,grow to left by=-3.5em,%
borderline west={3pt}{-1em}{gray!25},fontupper=\small,fontlower=\small}
\setcounter{tocdepth}{0}
\tcbset{fontupper=\small,fontlower=\small,fonttitle=\small}
\usepackage{steinmetz} %versor \phase does not work with mathjax
\newcommand*{\enclose}[2]{\phase{#2}}
\newcommand*{\mysmall}[1]{{\scriptsize #1}}
%\RequirePackage{myunicode}
\usepackage{newunicodechar}
\newfontfamily{\emo}{Noto Emoji Medium}
\newunicodechar{😄}{{\emo 😄}}
\newunicodechar{🎶}{{\emo 🎶}}
\newunicodechar{🕒}{{\emo 🕒}}
\newunicodechar{🌍}{{\emo 🌍}}
\newunicodechar{🎷}{{\emo 🎷}}
\newunicodechar{🌈}{{\emo 🌈}}
%\usepackage{fancyvrb}
%\renewenvironment{verbatim}%
% {\begin{Verbatim}[xleftmargin=2em]}%
% {\end{Verbatim}}
% nochmal, weil von libertine-pkg ueberschrieben
\setmonofont{JuliaMono}[
Scale = MatchLowercase,
UprightFont = *-Regular,
BoldFont = *-Bold,
ItalicFont = *-RegularItalic,
BoldItalicFont = *-BoldItalic,
Contextuals = AlternateOff,
%CharacterVariant=1,
]

987
nb/10_Strings.ipynb Normal file
View File

@ -0,0 +1,987 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "29fd19a8",
"metadata": {},
"source": [
"# Zeichen, Strings und Unicode\n",
"\n",
"## Zeichencodierungen (Frühgeschichte)\n",
"\n",
"Es gab - abhängig von Hersteller, Land, Programmiersprache, Betriebsssystem,... - eine große Vielzahl von Codierungen. \n",
"\n",
"Bis heute relevant sind:\n",
"\n",
"\n",
"### ASCII \n",
"Der _American Standard Code for Information Interchange_ wurde 1963 in den USA als Standard veröffentlicht. \n",
"\n",
"- Er definiert $2^7=128$ Zeichen, und zwar: \n",
" - 33 Steuerzeichen, wie `newline`, `escape`, `end of transmission/file`, `delete`\n",
" - 95 graphisch darstellbare Zeichen:\n",
" - 52 lateinische Buchstaben `a-z, A-Z`\n",
" - 10 Ziffern `0-9`\n",
" - 7 Satzzeichen `.,:;?!\"`\n",
" - 1 Leerzeichen ` `\n",
" - 6 Klammern `[{()}]`\n",
" - 7 mathematische Operationen `+-*/<>=`\n",
" - 12 Sonderzeichen ``` #$%&'\\^_|~`@ ``` \n",
"\n",
"- ASCII ist heute noch der \"kleinste gemeinsame Nenner\" im Codierungs-Chaos.\n",
"- Die ersten 128 Unicode-Zeichen sind identisch mit ASCII.\n",
"\n",
"### ISO 8859-Zeichensätze\n",
"\n",
"- ASCII nutzt nur 7 Bits. \n",
"- In einem Byte kann man durch Setzen des 8. Bits weitere 128 Zeichen unterbringen. \n",
"- 1987/88 wurden im ISO 8859-Standard verschiedene 1-Byte-Codierungen festgelegt, die alle ASCII-kompatibel sind, darunter:\n",
"\n",
":::{.narrow}\n",
" |Codierung | Region | Sprachen|\n",
" |:-----------|:----------|:-------|\n",
" |ISO 8859-1 (Latin-1) | Westeuropa | Deutsch, Französisch,...,Isländisch\n",
" |ISO 8859-2 (Latin-2) | Osteuropa | slawische Sprachen mit lateinischer Schrift\n",
" |ISO 8859-3 (Latin-3) | Südeuropa | Türkisch, Maltesisch,...\n",
" |ISO 8859-4 (Latin-4) | Nordeuropa | Estnisch, Lettisch, Litauisch, Grönländisch, Sami\n",
" |ISO 8859-5 (Latin/Cyrillic) | Osteuropa | slawische Sprachen mit kyrillischer Schrift\n",
" |ISO 8859-6 (Latin/Arabic) | |\n",
" |ISO 8859-7 (Latin/Greek) | |\n",
" |...| | \n",
" |ISO 8859-15 (Latin-9)| | 1999: Revision von Latin-1: jetzt mit Euro-Zeichen! \n",
" \n",
":::\n",
" \n",
"## Unicode \n",
"\n",
"Das Ziel des Unicode-Consortiums ist eine einheitliche Codierung für alle Schriften der Welt.\n",
"\n",
"- Unicode Version 1 erschien 1991\n",
"- Unicode Version 15 erschien 2021 mit 149 186 Zeichen (das sind 4489 mehr als Unicode 14), darunter: \n",
" - 161 Schriften \n",
" - mathematische und technische Symbole\n",
" - Emojis und andere Symbole, Steuer- und Formatierungszeichen\n",
"- davon entfallen über 90 000 Zeichen auf die CJK-Schriften (Chinesisch/Japanisch/Koreanisch) \n",
" \n",
" \n",
"### technische Details\n",
"\n",
"- Jedem Zeichen wird ein `codepoint` zugeordnet. Das ist einfach eine fortlaufende Nummer.\n",
"- Diese Nummer wird hexadezimal notiert\n",
" - entweder 4-stellig als `U+XXXX` (0-te Ebene) \n",
" - oder 5...6-stellig als `U+XXXXXX` (weitere Ebenen)\n",
"- Jede Ebene geht von `U+XY0000` bis `U+XYFFFF`, kann also $2^{16}=65\\;534$ Zeichen enthalten. \n",
"- Vorgesehen sind bisher 17 Ebenen `XY=00` bis `XY=10`, also der Wertebereich von `U+0000` bis `U+10FFFF`.\n",
"- Damit sind maximal 21 Bits pro Zeichen nötig.\n",
"- Die Gesamtzahl der damit möglichen Codepoints ist etwas kleiner als 0x10FFFF, da aus technischen Gründen gewisse Bereiche nicht verwendet werden. Sie beträgt etwa 1.1 Millionen, es ist also noch viel Platz. \n",
"- Bisher wurden nur Codepoints aus den Ebenen \n",
" - Ebene 0 = BMP _Basic Multilingual Plane_ `U+0000 - U+FFFF`,\n",
" - Ebene 1 = SMP _Supplementary Multilingual Plane_ `U+010000 - U+01FFFF`,\n",
" - Ebene 2 = SIP _Supplementary Ideographic Plane_ `U+020000 - U+02FFFF`, \n",
" - Ebene 3 = TIP _Tertiary Ideographic Plane_ `U+030000 - U+03FFFF` und\n",
" - Ebene 14 = SSP _Supplementary Special-purpose Plane_ `U+0E0000 - U+0EFFFF` vergeben.\n",
"- `U+0000` bis `U+007F` ist identisch mit ASCII\n",
"- `U+0000` bis `U+00FF` ist identisch mit ISO 8859-1 (Latin-1)\n",
"\n",
"### Eigenschaften von Unicode-Zeichen\n",
"\n",
"Im Standard wird jedes Zeichen beschrieben duch\n",
"\n",
" - seinen Codepoint (Nummer) \n",
" - einen Namen (welcher nur aus ASCII-Großbuchstaben, Ziffern und Minuszeichen besteht) und \n",
" - verschiedene Attributen wie\n",
" - Laufrichtung der Schrift \n",
" - Kategorie: Großbuchstabe, Kleinbuchstabe, modifizierender Buchstabe, Ziffer, Satzzeichen, Symbol, Seperator,....\n",
"\n",
"Im Unicode-Standard sieht das dann so aus: (zur Vereinfachung nur Codepoint und Name)\n",
"```\n",
"...\n",
"U+0041 LATIN CAPITAL LETTER A\n",
"U+0042 LATIN CAPITAL LETTER B\n",
"U+0043 LATIN CAPITAL LETTER C\n",
"U+0044 LATIN CAPITAL LETTER D\n",
"...\n",
"U+00E9 LATIN SMALL LETTER E WITH ACUTE\n",
"U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX\n",
"...\n",
"U+0641 ARABIC LETTER FEH\n",
"U+0642 ARABIC LETTER QAF\n",
"...\n",
"U+21B4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS\n",
"...\n",
"```\n",
"\n",
"Wie sieht 'RIGHTWARDS ARROW WITH CORNER DOWNWARDS' aus?\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8eaf4a41",
"metadata": {},
"outputs": [],
"source": [
"'\\U21b4'"
]
},
{
"cell_type": "markdown",
"id": "1c1f742a",
"metadata": {},
"source": [
"### Eine Auswahl an Schriften \n",
"\n",
"::: {.content-visible when-format=\"html\"}\n",
"\n",
":::{.callout-note}\n",
"Falls im Folgenden einzelne Zeichen oder Schriften in Ihrem Browser nicht darstellbar sind, müssen Sie geeignete \n",
"Fonts auf Ihrem Rechner installieren. \n",
"\n",
"Alternativ können Sie die PDF-Version dieser Seite verwenden. Dort sind alle Fonts eingebunden.\n",
":::\n",
"\n",
":::\n",
"\n",
"Eine kleine Hilfsfunktion:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "823bfab7",
"metadata": {},
"outputs": [],
"source": [
"\"\"\"\n",
"printuc(c, n):\n",
"print n characters from unicode table, starting with character c \n",
"\"\"\"\n",
"function printuc(c, n)\n",
" for i in 0:n-1\n",
" print(c + i)\n",
" end\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "50893728",
"metadata": {},
"source": [
"__Kyrillisch__\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8caca4e0",
"metadata": {},
"outputs": [],
"source": [
"printuc('\\U0400', 100)"
]
},
{
"cell_type": "markdown",
"id": "4400710f",
"metadata": {},
"source": [
"__Tamilisch__\n",
"\n",
":::{.cellmerge}\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "85bb89e4",
"metadata": {},
"outputs": [],
"source": [
"#| echo: true\n",
"#| output: false\n",
"printuc('\\U0be7',20)"
]
},
{
"cell_type": "markdown",
"id": "3904378b",
"metadata": {},
"source": [
"\\begingroup\\setmonofont{Noto Sans Tamil}\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "13461be4",
"metadata": {},
"outputs": [],
"source": [
"#| echo: false\n",
"#| output: true\n",
"printuc('\\U0be7',20)"
]
},
{
"cell_type": "markdown",
"id": "e8ed18a7",
"metadata": {},
"source": [
"\\endgroup\n",
"\n",
":::\n",
"\n",
"__Schach__\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8f6b4cee",
"metadata": {},
"outputs": [],
"source": [
"printuc('\\U2654', 12)"
]
},
{
"cell_type": "markdown",
"id": "f9ca81ef",
"metadata": {},
"source": [
"__Mathematische Operatoren__\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "60c00c29",
"metadata": {},
"outputs": [],
"source": [
"printuc('\\U2200', 255)"
]
},
{
"cell_type": "markdown",
"id": "1e023c33",
"metadata": {},
"source": [
"__Runen__\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "361517d3",
"metadata": {},
"outputs": [],
"source": [
"printuc('\\U16a0', 40)"
]
},
{
"cell_type": "markdown",
"id": "067f18ed",
"metadata": {},
"source": [
":::{.cellmerge}\n",
"\n",
"__Scheibe (Diskus) von Phaistos__\n",
"\n",
"- Diese Schrift ist nicht entziffert. \n",
"- Es ist unklar, welche Sprache dargestellt wird.\n",
"- Es gibt nur ein einziges Dokument in dieser Schrift: die Tonscheibe von Phaistos aus der Bronzezeit \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9ac8d6c5",
"metadata": {},
"outputs": [],
"source": [
"#| echo: true\n",
"#| output: false\n",
"printuc('\\U101D0', 46 )"
]
},
{
"cell_type": "markdown",
"id": "ab85dc8a",
"metadata": {},
"source": [
"\\begingroup\\setmonofont{Phaistos.otf}\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "599a342d",
"metadata": {},
"outputs": [],
"source": [
"#| echo: false\n",
"#| output: true\n",
"printuc('\\U101D0', 46 )"
]
},
{
"cell_type": "markdown",
"id": "c5ccd262",
"metadata": {},
"source": [
"\\endgroup\n",
"\n",
":::\n",
"\n",
"### Unicode transformation formats: UTF-8, UTF-16, UTF-32\n",
"\n",
"_Unicode transformation formats_ legen fest, wie eine Folge von Codepoints als eine Folge von Bytes dargestellt wird. \n",
"\n",
"Da die Codepoints unterschiedlich lang sind, kann man sie nicht einfach hintereinander schreiben. Wo hört einer auf und fängt der nächste an? \n",
"\n",
"- __UTF-32__: Das einfachste, aber auch speicheraufwändigste, ist, sie alle auf gleiche Länge zu bringen. Jeder Codepoint wird in 4 Bytes = 32 Bit kodiert. \n",
"- Bei __UTF-16__ wird ein Codepoint entweder mit 2 Bytes oder mit 4 Bytes dargestellt. \n",
"- Bei __UTF-8__ wird ein Codepoint mit 1,2,3 oder 4 Bytes dargestellt. \n",
"- __UTF-8__ ist das Format mit der höchsten Verbreitung. Es wird auch von Julia verwendet. \n",
"\n",
"\n",
"### UTF-8\n",
"\n",
"- Für jeden Codepoint werden 1, 2, 3 oder 4 volle Bytes verwendet. \n",
"\n",
"- Bei einer Codierung mit variabler Länge muss man erkennen können, welche Bytefolgen zusammengehören:\n",
" - Ein Byte der Form 0xxxxxxx steht für einen ASCII-Codepoint der Länge 1.\n",
" - Ein Byte der Form 110xxxxx startet einen 2-Byte-Code.\n",
" - Ein Byte der Form 1110xxxx startet einen 3-Byte-Code.\n",
" - Ein Byte der Form 11110xxx startet einen 4-Byte-Code.\n",
" - Alle weiteren Bytes eines 2-,3- oder 4-Byte-Codes haben die Form 10xxxxxx. \n",
"\n",
"- Damit ist der Platz, der für den Codepoint zur Verfügung steht (Anzahl der x):\n",
" - Ein-Byte-Code: 7 Bits\n",
" - Zwei-Byte-Code: 5 + 6 = 11 Bits\n",
" - Drei-Byte-Code: 4 + 6 + 6 = 16 Bits\n",
" - Vier-Byte-Code: 3 + 6 + 6 + 6 = 21 Bits\n",
"\n",
"- Damit ist jeder ASCII-Text automatisch auch ein korrekt codierter UTF-8-Text.\n",
"\n",
"- Sollten die bisher für Unicode festgelegten 17 Ebenen = 21 Bit = 1.1 Mill. mögliche Zeichen mal erweitert werden, dann wird UTF-8 auf 5- und 6-Byte-Codes erweitert. \n",
" \n",
"\n",
"## Zeichen und Zeichenketten in Julia\n",
"\n",
"### Zeichen: `Char` \n",
"\n",
"Der Datentyp `Char` kodiert ein einzelnes Unicode-Zeichen. \n",
"\n",
"- Julia verwendet dafür einfachen Anführungszeichen: `'a'`. \n",
"- Ein `Char` belegt 4 Bytes Speicher und \n",
"- repräsentiert einen Unicode-Codepoint.\n",
"- `Char`s können von/zu `UInt`s umgewandelt werden und \n",
"- der Integer-Wert ist gleich dem Unicode-codepoint.\n",
"\n",
"\n",
"### Zeichenketten: `String`\n",
"\n",
"- Für Strings verwendet Julia doppelte Anführungszeichen: `\"a\"`.\n",
"- Sie sind UTF-8-codiert, d.h., ein Zeichen kann zwischen 1 und 4 Bytes lang sein.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a8ea6e75",
"metadata": {},
"outputs": [],
"source": [
"@show typeof('a') sizeof('a') typeof(\"a\") sizeof(\"a\");"
]
},
{
"cell_type": "markdown",
"id": "ab924ce4",
"metadata": {},
"source": [
"- `Char`s können von/zu `UInt`s umgewandelt werden.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dac49645",
"metadata": {},
"outputs": [],
"source": [
"UInt('a')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "98bd57af",
"metadata": {},
"outputs": [],
"source": [
"b = Char(0x2656)"
]
},
{
"cell_type": "markdown",
"id": "74470851",
"metadata": {},
"source": [
"__Bei einem Nicht-ASCII-String unterscheiden sich Anzahl der Bytes und Anzahl der Zeichen:__\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0edfc402",
"metadata": {},
"outputs": [],
"source": [
"asciistr = \"Hello World!\"\n",
"@show length(asciistr) ncodeunits(asciistr);"
]
},
{
"cell_type": "markdown",
"id": "2c2ce448",
"metadata": {},
"source": [
"(Das Leerzeichen zählt natürlich auch.)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c171aa8d",
"metadata": {},
"outputs": [],
"source": [
"str = \"😄 Hellö 🎶\"\n",
"@show length(str) ncodeunits(str);"
]
},
{
"cell_type": "markdown",
"id": "e0467145",
"metadata": {},
"source": [
"__Iteration über einen String iteriert über die Zeichen:__\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "802e421f",
"metadata": {},
"outputs": [],
"source": [
"for i in str\n",
" println(i, \" \", typeof(i))\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "b434c61b",
"metadata": {},
"source": [
"### Verkettung von Strings\n",
"\n",
"\"Strings mit Verkettung bilden ein nichtkommutatives Monoid.\"\n",
"\n",
"Deshalb wird in Julia die Verkettung multiplikativ geschrieben.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dba97090",
"metadata": {},
"outputs": [],
"source": [
" str * asciistr * str"
]
},
{
"cell_type": "markdown",
"id": "c2f3a520",
"metadata": {},
"source": [
"Damit sind auch Potenzen mit natürlichem Exponenten definiert.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e8804720",
"metadata": {},
"outputs": [],
"source": [
"str^3, str^0"
]
},
{
"cell_type": "markdown",
"id": "ffd0fd4c",
"metadata": {},
"source": [
"### Stringinterpolation\n",
"\n",
"Das Dollarzeichen hat in Strings eine Sonderfunktion, die wir schon oft in \n",
"`print()`-Anweisungen genutzt haben. MAn kann damit eine Variable oder einen Ausdruck interpolieren:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b8248a55",
"metadata": {},
"outputs": [],
"source": [
"a = 33.4\n",
"b = \"x\"\n",
"\n",
"s = \"Das Ergebnis für $b ist gleich $a und die verdoppelte Wurzel daraus ist $(2sqrt(a))\\n\""
]
},
{
"cell_type": "markdown",
"id": "b2039521",
"metadata": {},
"source": [
"### Backslash escape sequences \n",
"\n",
"Der _backslash_ `\\` hat in Stringkonstanten ebenfalls eine Sonderfunktion. \n",
"Julia benutzt die von C und anderen Sprachen bekannten _backslash_-Codierungen für Sonderzeichen und für Dollarzeichen und Backslash selbst:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f896516b",
"metadata": {},
"outputs": [],
"source": [
"s = \"So bekommt man \\'Anführungszeichen\\\" und ein \\$-Zeichen und einen\\nZeilenumbruch und ein \\\\ usw... \"\n",
"print(s)"
]
},
{
"cell_type": "markdown",
"id": "6258cdb2",
"metadata": {},
"source": [
"### Triple-Quotes\n",
"\n",
"Man kann Strings auch mit Triple-Quotes begrenzen. \n",
"In dieser Form bleiben Zeilenumbrüche und Anführungszeichen erhalten:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e7913161",
"metadata": {},
"outputs": [],
"source": [
"s = \"\"\"\n",
" Das soll\n",
"ein \"längerer\" \n",
" 'Text' sein.\n",
"\"\"\"\n",
"\n",
"print(s)"
]
},
{
"cell_type": "markdown",
"id": "15de1886",
"metadata": {},
"source": [
"### Raw strings\n",
"\n",
"In einem `raw string` sind alle backslash-Codierungen außer `\\\"` abgeschaltet:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a040859a",
"metadata": {},
"outputs": [],
"source": [
"s = raw\"Ein $ und ein \\ und zwei \\\\ und ein 'bla'...\"\n",
"print(s)"
]
},
{
"cell_type": "markdown",
"id": "6e24746e",
"metadata": {},
"source": [
"## Weitere Funktionen für Zeichen und Strings (Auswahl)\n",
"\n",
"### Tests für Zeichen\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f79e914f",
"metadata": {},
"outputs": [],
"source": [
"@show isdigit('0') isletter('Ψ') isascii('\\U2655') islowercase('α') \n",
"@show isnumeric('½') iscntrl('\\n') ispunct(';');"
]
},
{
"cell_type": "markdown",
"id": "d39076f7",
"metadata": {},
"source": [
"### Anwendung auf Strings\n",
"\n",
"Diese Tests lassen sich z.B. mit `all()`, `any()` oder `count()` auf Strings anwenden:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b6055040",
"metadata": {},
"outputs": [],
"source": [
"all(ispunct, \";.:\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "29fd91ef",
"metadata": {},
"outputs": [],
"source": [
"any(isdigit, \"Es ist 3 Uhr! 🕒\" )"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "73a589b9",
"metadata": {},
"outputs": [],
"source": [
"count(islowercase, \"Hello, du!!\")"
]
},
{
"cell_type": "markdown",
"id": "5bdff431",
"metadata": {},
"source": [
"### Weitere String-Funktionen\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a24b1569",
"metadata": {},
"outputs": [],
"source": [
"@show startswith(\"Lampenschirm\", \"Lamp\") occursin(\"pensch\", \"Lampenschirm\") \n",
"@show endswith(\"Lampenschirm\", \"irm\"); "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "89003024",
"metadata": {},
"outputs": [],
"source": [
"@show uppercase(\"Eis\") lowercase(\"Eis\") titlecase(\"eiSen\");"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "01910748",
"metadata": {},
"outputs": [],
"source": [
"# remove newline from end of string\n",
"\n",
"@show chomp(\"Eis\\n\") chomp(\"Eis\");"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d618c466",
"metadata": {},
"outputs": [],
"source": [
"split(\"π ist irrational.\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "da05d6b9",
"metadata": {},
"outputs": [],
"source": [
"replace(\"π ist irrational.\", \"ist\" => \"ist angeblich\")"
]
},
{
"cell_type": "markdown",
"id": "4e198e74",
"metadata": {},
"source": [
"## Indizierung von Strings\n",
"\n",
"Strings sind nicht mutierbar aber indizierbar. Dabei gibt es ein paar Besonderheiten.\n",
"\n",
"- Der Index nummeriert die Bytes des Strings. \n",
"- Bei einem nicht-ASCII-String sind nicht alle Indizes gültig, denn\n",
"- ein gültiger Index adressiert immer ein Unicode-Zeichen.\n",
"\n",
"Unser Beispielstring:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4686b303",
"metadata": {},
"outputs": [],
"source": [
"str"
]
},
{
"cell_type": "markdown",
"id": "6c1a2fe1",
"metadata": {},
"source": [
"Das erste Zeichen\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "eb0e9898",
"metadata": {},
"outputs": [],
"source": [
"str[1]"
]
},
{
"cell_type": "markdown",
"id": "50049fee",
"metadata": {},
"source": [
"Dieses Zeichen ist in UTF8-Kodierung 4 Bytes lang. Damit sind 2,3 und 4 ungültige Indizes. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a6a3005a",
"metadata": {},
"outputs": [],
"source": [
"str[2]"
]
},
{
"cell_type": "markdown",
"id": "5c428767",
"metadata": {},
"source": [
"Erst das 5. Byte ist ein neues Zeichen:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "29febb49",
"metadata": {},
"outputs": [],
"source": [
"str[5]"
]
},
{
"cell_type": "markdown",
"id": "0daa1973",
"metadata": {},
"source": [
"Auch bei der Adressierung von Substrings müssen Anfang und Ende jeweils gültige Indizes sein, d.h., der Endindex muss ebenfalls das erste Byte eines Zeichens indizieren und dieses Zeichen ist das letzte des Teilstrings. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dbbc0c47",
"metadata": {},
"outputs": [],
"source": [
"str[1:7]"
]
},
{
"cell_type": "markdown",
"id": "b7fd7042",
"metadata": {},
"source": [
"Die Funktion `eachindex()` liefert einen Iterator über die gültigen Indizes:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6e2b8427",
"metadata": {},
"outputs": [],
"source": [
"for i in eachindex(str)\n",
" c = str[i]\n",
" println(\"$i: $c\")\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "f651e9bf",
"metadata": {},
"source": [
"Wie üblich macht collect() aus einem Iterator einen Vektor.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a591c148",
"metadata": {},
"outputs": [],
"source": [
"collect(eachindex(str))"
]
},
{
"cell_type": "markdown",
"id": "a7f9cb60",
"metadata": {},
"source": [
"Die Funktion `nextind()` liefert den nächsten gültigen Index.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d568dd47",
"metadata": {},
"outputs": [],
"source": [
"@show nextind(str, 1) nextind(str, 2); "
]
},
{
"cell_type": "markdown",
"id": "91af5e34",
"metadata": {},
"source": [
"Warum verwendet Julia einen Byte-Index und keinen Zeichenindex? Der Hauptgrund dürfte die Effizienz der Indizierung sein.\n",
"\n",
"- In einem langen String, z.B. einem Buchtext, ist die Stelle `s[123455]` mit einem Byte-Index schnell zu finden. \n",
"- Ein Zeichen-Index müsste in der UTF-8-Codierung den ganzen String durchlaufen, um das n-te Zeichen zu finden, da die Zeichen 1,2,3 oder 4 Bytes lang sein können.\n",
"\n",
"\n",
"Einige Funktionen liefern Indizes oder Ranges als Resultat. Sie liefern immer gültige Indizes:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b62bbd82",
"metadata": {},
"outputs": [],
"source": [
"findfirst('l', str)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "93def2b5",
"metadata": {},
"outputs": [],
"source": [
"findfirst(\"Hel\", str)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e96565a7",
"metadata": {},
"outputs": [],
"source": [
"str2 = \"αβγδϵ\"^3"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e251544c",
"metadata": {},
"outputs": [],
"source": [
"n = findfirst('γ', str2)"
]
},
{
"cell_type": "markdown",
"id": "be81789e",
"metadata": {},
"source": [
"So kann man ab dem nächsten nach `n=5` gültigen Index weitersuchen:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ad89b2c9",
"metadata": {},
"outputs": [],
"source": [
"findnext('γ', str2, nextind(str2, n))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

562
nb/5_TricksHelp.ipynb Normal file
View File

@ -0,0 +1,562 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "2ffe347c",
"metadata": {},
"source": [
"# Julia Dokumentation\n",
"\n",
"[https://docs.julialang.org/](https://docs.julialang.org/) die offizielle Dokumentation\n",
"\n",
"Einige Seiten mit Übersichten:\n",
"\n",
" - [https://docs.julialang.org/en/v1/base/punctuation/](https://docs.julialang.org/en/v1/base/punctuation/) Verzeichnis der Symbole\n",
" - [https://docs.julialang.org/en/v1/manual/unicode-input/](https://docs.julialang.org/en/v1/manual/unicode-input/) Verzeichnis spezieller Unicode-Symbole und deren Eingabe in Julia via Tab-Vervollständigung\n",
" - [https://docs.julialang.org/en/v1/manual/mathematical-operations/#Rounding-functions](https://docs.julialang.org/en/v1/manual/mathematical-operations/#Rounding-functions) Liste mathematischer Funktionen \n",
"\n",
"---------\n",
"\n",
"\n",
"\n",
"# Hilfe und praktische Tipps\n",
"\n",
"----\n",
"\n",
"\n",
"## Julia REPL (Read - Eval - Print - Loop)\n",
"\n",
"Start von Julia in einem Terminal:\n",
"```\n",
"julia>\n",
"```\n",
"\n",
"| Kommando | Wirkung |\n",
"| :----------------------------| :------------------------ |\n",
"| `exit()` oder `Ctrl-d` | exit Julia |\n",
"| `Ctrl-c` | interrupt |\n",
"| `Ctrl-l` | clear screen |\n",
"| Kommando mit `;` beenden | Ausgabe unterdrückt |\n",
"| `include(\"filename.jl\")` | Datei mit Julia-Code einlesen und ausführen |\n",
"\n",
"\n",
"-----\n",
"\n",
"Der REPL hat verschiedene Modi: \n",
"\n",
"| Modus | Prompt | Modus starten | Modus verlassen |\n",
"| :- | :- | :- | :- |\n",
"|||||\n",
"| default| `julia>` | | |\n",
"|||||\n",
"| Package manager | `pkg>` | `]` | `backspace` |\n",
"|||||\n",
"| Help | `help?>` | `?`| `backspace `|\n",
"|||||\n",
"|Shell | `shell>` | `;` | `backspace`|\n",
"|||||\n",
"\n",
"--------\n",
"\n",
"\n",
"## Jupyter notebooks (IJulia)\n",
"\n",
"Die Modi sind als Einzeiler in einer eigenen Input-Zelle nutzbar: \n",
"\n",
"(i) ein Kommando des Paket-Managers:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d6c200e5",
"metadata": {},
"outputs": [],
"source": [
"] status "
]
},
{
"cell_type": "markdown",
"id": "9caf3630",
"metadata": {},
"source": [
"(ii) eine Help-Abfrage:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c923aa16",
"metadata": {},
"outputs": [],
"source": [
"?sin"
]
},
{
"cell_type": "markdown",
"id": "bfc75d15",
"metadata": {},
"source": [
"(iii) Ein Shell-Kommando:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3617aff8",
"metadata": {},
"outputs": [],
"source": [
";ls .."
]
},
{
"cell_type": "markdown",
"id": "bdce3ab2",
"metadata": {},
"source": [
"## Der Paket-Manager\n",
"\n",
"- Über 7000 Pakete, siehe [https://julialang.org/packages/](https://julialang.org/packages/)\n",
"- Bevor sie mit `using Module` verwendet werden können, müssen sie heruntergeladen und installiert werden.\n",
"- Dazu dient der `package manager`\n",
"- 2 Betriebsarten: \n",
" - als normale Julia-Anweisungen, die auch in einer `.jl`-Programmdatei stehen können:\n",
" ```\n",
" using Pkg\n",
" Pkg.add(\"TollesPaket\")\n",
" ```\n",
" - im speziellen pkg-Modus des Julia-REPLs:\n",
" ```\n",
" ] add TollesPaket\n",
" ```\n",
"----- \n",
"\n",
"### Einige Funktionen\n",
"\n",
"| Funktion | `pkg` - Mode | Erklärung |\n",
"|:------------------------|:----------------------|:----------------------------------------------------------|\n",
"| `Pkg.add(\"MyPack\")` | `pkg> add MyPack` | add `MyPack.jl` to current environment |\n",
"| `Pkg.rm(\"MyPack\")` | `pkg> remove MyPack` | remove `MyPack.jl` from current environment |\n",
"| `Pkg.update()` | `pkg> update` | update packages in current environment |\n",
"| `Pkg.activate(\"mydir\")` | `pkg> activate mydir` | activate directory as current environment |\n",
"| `Pkg.status()` | `pkg> status` | list packages |\n",
"\n",
"\n",
"### Installierte Pakete und Environments \n",
"\n",
"- Julia und der Paketmanager verwalten \n",
" 1. eine Liste der mit dem Kommando `Pkg.add()` bzw. `]add` explizit installierten Pakete mit genauer Versionsbezeichnung in einer Datei `Project.toml` und \n",
" 2. eine Liste aller dabei auch als implizite Abhängigkeiten installierten Pakete in der Datei `Manifest.toml`. \n",
"- Das Verzeichnis, in dem diese Dateien stehen, ist das `environment` und wird mit `Pkg.status()` bzw. `]status` angezeigt. \n",
"- Im Normalfall sieht das so aus: \n",
"```\n",
"(@v1.7) pkg> status\n",
" Status `~/.julia/environments/v1.7/Project.toml`\n",
" [1dea7af3] OrdinaryDiffEq v6.7.1\n",
" [91a5bcdd] Plots v1.27.1\n",
" [438e738f] PyCall v1.93.1\n",
"```\n",
"- Man kann für verschiedene Projekte eigene `environments` benutzen. Dazu kann man entweder Julia mit \n",
"```\n",
"julia --project=path/to/myproject\n",
"```\n",
"starten oder in Julia das environment mit `Pkg.activate(\"path/to/myproject\")` aktivieren. Dann werden `Project.toml, Manifest.toml` dort angelegt und verwaltet. (Die Installation der Paketdateien erfolgt weiterhin irgendwo unter `$HOME/.julia`) \n",
"\n",
"\n",
"### Zum Installieren von Paketen auf unserem Jupyter-Server `misun103`:\n",
"- Es gibt ein zentrales Repository, in dem alle von mir erwähnten Pakete bereits installiert sind. \n",
"- Dort haben Sie keine Schreibrechte.\n",
"- Sie können aber zusätzliche Pakete in Ihrem `Home` installieren. Dazu ist als erster Befehl nötig, das aktuelle Verzeichnis zu aktivieren: \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "103bd8a1",
"metadata": {},
"outputs": [],
"source": [
"] activate ."
]
},
{
"cell_type": "markdown",
"id": "077e93f2",
"metadata": {},
"source": [
"(Man beachte den Punkt!)\n",
"\n",
"----\n",
"\n",
"Danach können Sie mit `add` im Pkg-Modus auch Pakete installieren:\n",
"\n",
"```\n",
"] add TollesPaket\n",
"```\n",
"\n",
"\n",
"Achtung! Das kann dauern! Viele Pakete haben komplexe Abhängigkeiten und lösen die Installation von weiteren Paketen aus. Viele Pakete werden beim Installieren vorkompiliert. Im REPL sieht man den Installationsfortschritt, im Jupyter-Notebook nicht.\n",
"\n",
"\n",
"## Eingebaute Hilfe und Informationen\n",
"Mit `?` und der `Tab`-Taste kommt man oft weiter. \n",
"\n",
"\n",
"\n",
"### weitere Hilfe: `@which`, `fieldnames()`, `methods()`, `names()`, `pwd()`\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4f099673",
"metadata": {},
"outputs": [],
"source": [
"# Die Zuordnung zu einem Modul zeigt @which an:\n",
"\n",
"@which(sqrt)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "44276c0d",
"metadata": {},
"outputs": [],
"source": [
"# Die Komponenten einer struct oder eines anderen zusammengesetzten Typs:\n",
"\n",
"fieldnames(Rational)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a200a34f",
"metadata": {},
"outputs": [],
"source": [
"fieldnames(Complex)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d99bfda9",
"metadata": {},
"outputs": [],
"source": [
"# alle Methoden einer Funktion\n",
"\n",
"methods(sqrt)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b3e6f127",
"metadata": {},
"outputs": [],
"source": [
"# alle Methoden einer Funktion bei bestimmten Argumenttypen. Die Argumenttypen müssen als Tupel angegeben werden\n",
"\n",
"methods(sqrt, (Number,)) # Komma nötig für 1-elementiges Tupel "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e74572ad",
"metadata": {},
"outputs": [],
"source": [
"# für einen Typ gibt methods() alle Konstruktoren aus\n",
"\n",
"methods(Int64)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e4de6078",
"metadata": {},
"outputs": [],
"source": [
"# names(Module) gibt alle von einem Modul exportierte Namen aus. \n",
"# genau wie auch\n",
"#\n",
"# ?Module \n",
"#\n",
"# funktioniert es erst, wenn das Modul mit 'using Module' geladen ist.\n",
"# Oft ist es besser, wenn die using-Anweisung in einer eigenen Zelle steht.\n",
"\n",
"using Plots"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f1df8377",
"metadata": {},
"outputs": [],
"source": [
"names(Plots)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3654fab2",
"metadata": {},
"outputs": [],
"source": [
"# Julia kürzt den interaktiven Output. \n",
"# ein explizites print() zeigt alles:\n",
"\n",
"print(names(Plots))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dc9ca3b6",
"metadata": {},
"outputs": [],
"source": [
"# eine andere Möglichkeit der Ausgabe mit Überlänge in Jupyter\n",
"\n",
"show(stdout, MIME(\"text/plain\"), names(Plots))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9fa0f216",
"metadata": {},
"outputs": [],
"source": [
"# pwd() \"print working directory\" zeigt, in welchem Verzeichnis Julia gerade operiert. \n",
"#\n",
"# Wichtig für die Ein/Ausgabe mit Dateien, z.B. include()\n",
"\n",
"pwd()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "99c19918",
"metadata": {},
"outputs": [],
"source": [
"include(\"Jupyter.jl\") # Datei mit Julia-Code einlesen und abarbeiten"
]
},
{
"cell_type": "markdown",
"id": "1464d951",
"metadata": {},
"source": [
"## Informationen zu Typen\n",
"\n",
"### `subtypes()`, `supertypes()`, `typemax()`, `typemin()`, `fieldnames()`, `Base.return_types()`, `dump()`\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1358c363",
"metadata": {},
"outputs": [],
"source": [
"subtypes(Real) # die letzten zwei sind durch das 'using Plots' dazugekommen"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e35fb7da",
"metadata": {},
"outputs": [],
"source": [
"supertypes(Real)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "53be4687",
"metadata": {},
"outputs": [],
"source": [
"typemax(Int64), typemin(Int64), fieldnames(Complex)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3a9ed940",
"metadata": {},
"outputs": [],
"source": [
"Base.return_types(sqrt, (Float64,))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "207af4bd",
"metadata": {},
"outputs": [],
"source": [
"Base.return_types(sqrt, (Complex{Int64},))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "66b42304",
"metadata": {},
"outputs": [],
"source": [
"# dump() zeigt alle Teile eines zusammengesetzten Objekts\n",
"\n",
"x = 3//4 + 75im\n",
"dump(x)"
]
},
{
"cell_type": "markdown",
"id": "9c6edfea",
"metadata": {},
"source": [
"## Der Julia JIT _(just in time)_ Compiler\n",
"\n",
"Julia baut auf die Werkzeuge des _LLVM Compiler Infrastructure Projects_ auf.\n",
"\n",
"\n",
"Stages of Compilation \n",
"\n",
"| stage & result | introspection command |\n",
"| :--- | :--- |\n",
"|Parse ==> Abstract Syntax Tree (AST) | `Meta.parse()` |\n",
"| Lowering: transform AST ==> Static Single Assignment (SSA) form | `@code_lowered`|\n",
"| Type Inference | `@code_warntype`, `@code_typed` |\n",
"| Generate LLVM intermediate representation | `@code_llvm`|\n",
"| Generate native machine code | `@code_native` |\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4d433ab8",
"metadata": {},
"outputs": [],
"source": [
"function f(x,y)\n",
" z = x^2 + log(y)\n",
" return 2z\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "de444d8a",
"metadata": {},
"outputs": [],
"source": [
"p = Meta.parse( \"function f(x,y); z=x^2+log(y); return 2x; end \")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1ddf17aa",
"metadata": {},
"outputs": [],
"source": [
"using TreeView"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "70d267d7",
"metadata": {},
"outputs": [],
"source": [
"walk_tree(p)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b19b64ec",
"metadata": {},
"outputs": [],
"source": [
"@code_lowered f(2,4)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "57eb03f9",
"metadata": {},
"outputs": [],
"source": [
"@code_warntype f(2,4)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cf273a25",
"metadata": {},
"outputs": [],
"source": [
"@code_typed f(2,4)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "28779f6b",
"metadata": {},
"outputs": [],
"source": [
"@code_llvm f(2,4)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "02711d1f",
"metadata": {},
"outputs": [],
"source": [
"@code_native f(2,4)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

303
nb/6_ArraysEtcP1.ipynb Normal file
View File

@ -0,0 +1,303 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "fcc03529",
"metadata": {},
"source": [
"# Container\n",
"\n",
"\n",
"Julia bietet eine große Auswahl von Containertypen mit weitgehend ähnlichem Interface an. \n",
"Wir stellen hier `Tuple`, `Range`, `Array`, `Vector` und `Matrix` vor. \n",
"\n",
"Diese Container sind: \n",
"\n",
"- **iterierbar:** Man kann über die Elemente des Containers iterieren: \n",
"```julia \n",
"for x ∈ container ... end\n",
"```\n",
"- **indizierbar:** Man kann auf Elemente über ihren Index zugreifen: \n",
"```julia\n",
"x = container[i]\n",
"``` \n",
"und einige sind \n",
"\n",
"- **mutierbar** (nur `Array`, `Vector` und `Matrix`): Man kann Elemente hinzufügen, entfernen und ändern.\n",
"\n",
"Weiterhin gibt es eine Reihe gemeinsamer Funktionen, z.B.\n",
"\n",
"- `length(container)` --- Anzahl der Elemente\n",
"- `eltype(container)` --- Typ der Elemente\n",
"- `isempty(container)` --- Test, ob Container leer ist\n",
"- `empty!(container)` --- leert Container (nur wenn mutierbar)\n",
"\n",
"\n",
"## Tupeln\n",
"\n",
"Ein Tupel ist ein nicht mutierbarer Container von Elementen. Es ist also nicht möglich, neue Elemente dazuzufügen oder den Wert eines Elements zu ändern. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3b33212e",
"metadata": {},
"outputs": [],
"source": [
"t = (33, 4.5, \"Hello\")\n",
"\n",
"@show t[2] # indizierbar\n",
"\n",
"for i ∈ t println(i) end # iterierbar"
]
},
{
"cell_type": "markdown",
"id": "e65e4da8",
"metadata": {},
"source": [
"Ein Tupel ist ein **inhomogener** Typ. Jedes Element hat seinen eigenen Typ und das zeigt sich auch im Typ des Tupels:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3d21cc5b",
"metadata": {},
"outputs": [],
"source": [
"typeof(t)"
]
},
{
"cell_type": "markdown",
"id": "74fcc47e",
"metadata": {},
"source": [
"Man verwendet Tupel gerne als Rückgabewerte von Funktionen, um mehr als ein Objekt zurückzulieferen.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6ffc0cdc",
"metadata": {},
"outputs": [],
"source": [
"# Ganzzahldivision und Rest: \n",
"# Quotient und Rest werden den Variablen q und r zugewiesen\n",
"\n",
"q, r = divrem(71, 6)\n",
"@show q r;"
]
},
{
"cell_type": "markdown",
"id": "e7a04cdd",
"metadata": {},
"source": [
"Wie man hier sieht, kann man in bestimmten Konstrukten die Klammern auch weglassen.\n",
"Dieses *implict tuple packing/unpacking* verwendet man auch gerne in Mehrfachzuweisungen:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2a260b6e",
"metadata": {},
"outputs": [],
"source": [
"x, y, z = 12, 17, 203"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3447dffb",
"metadata": {},
"outputs": [],
"source": [
"y"
]
},
{
"cell_type": "markdown",
"id": "8694ec4a",
"metadata": {},
"source": [
"Manche Funktionen bestehen auf Tupeln als Argument oder geben immer Tupeln zurück. Dann braucht man manchmal ein Tupel aus einem Element. \n",
"\n",
"Das notiert man so:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "24856f9b",
"metadata": {},
"outputs": [],
"source": [
"x = (13,) # ein 1-Element-Tupel"
]
},
{
"cell_type": "markdown",
"id": "11ac465d",
"metadata": {},
"source": [
"Das Komma - und nicht die Klammern -- macht das Tupel. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "87474e9d",
"metadata": {},
"outputs": [],
"source": [
"x= (13) # kein Tupel"
]
},
{
"cell_type": "markdown",
"id": "da35087d",
"metadata": {},
"source": [
"## Ranges\n",
"\n",
"Wir haben *range*-Objekte schon in numerischen `for`-Schleifen verwendet.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3bfc9415",
"metadata": {},
"outputs": [],
"source": [
"r = 1:1000\n",
"typeof(r)"
]
},
{
"cell_type": "markdown",
"id": "7d2c6838",
"metadata": {},
"source": [
"Es gibt verschiedene *range*-Typen. Wie man sieht, sind es über den Zahlentyp parametrisierte Typen und `UnitRange` ist z.B. ein *range* mit der Schrittweite 1. Ihre Konstruktoren heißen in der Regel `range()`. \n",
"\n",
"Der Doppelpunkt ist eine spezielle Syntax. \n",
"\n",
"- `a:b` wird vom Parser umgesetzt zu `range(a, b)` \n",
"- `a:b:c` wird umgesetzt zu `range(a, c, step=b)`\n",
"\n",
"\n",
"*Ranges* sind offensichtlich iterierbar, nicht mutierbar aber indizierbar.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "28aecb9e",
"metadata": {},
"outputs": [],
"source": [
"(3:100)[20] # das zwanzigste Element"
]
},
{
"cell_type": "markdown",
"id": "350affb7",
"metadata": {},
"source": [
"Wir erinnern an die Semantik der `for`-Schleife: `for i in 1:1000` heißt **nicht**:\n",
"\n",
"- 'Die Schleifenvariable `i` wird bei jedem Durchlauf um eins erhöht' **sondern** \n",
"- 'Der Schleifenvariable werden nacheinander die Werte 1,2,3,...,1000 aus dem Container zugewiesen'. \n",
"\n",
"Allerdings wäre es sehr ineffektiv, diesen Container tatsächlich explizit anzulegen. \n",
"\n",
"- _Ranges_ sind \"lazy\" Vektoren, die nie wirklich irgendwo als konkrete Liste abgespeichert werden. Das macht sie als Iteratoren in `for`-Schleifen so nützlich: speichersparend und schnell.\n",
"- Sie sind 'Rezepte' oder Generatoren, die auf die Abfrage 'Gib mir dein nächstes Element!' antworten.\n",
"- Tatsächlich ist der Muttertyp `AbstractRange` ein Subtyp von `AbstractVector`.\n",
"\n",
"Das Macro `@allocated` gibt aus, wieviel Bytes an Speicher bei der Auswertung eines Ausdrucks alloziert wurden.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "14ea84bd",
"metadata": {},
"outputs": [],
"source": [
"@allocated [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c900fd32",
"metadata": {},
"outputs": [],
"source": [
"@allocated 1:20"
]
},
{
"cell_type": "markdown",
"id": "0a763f8b",
"metadata": {},
"source": [
"Zum Umwandeln in einen 'richtigen' Vektor dient die Funktion `collect()`.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0e0be9dd",
"metadata": {},
"outputs": [],
"source": [
"collect(20:-3:1)"
]
},
{
"cell_type": "markdown",
"id": "568f2f9f",
"metadata": {},
"source": [
"Recht nützlich, z.B. beim Vorbereiten von Daten zum Plotten, ist der *range*-Typ `LinRange`.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8596862b",
"metadata": {},
"outputs": [],
"source": [
"LinRange(2, 50, 300)"
]
},
{
"cell_type": "markdown",
"id": "f148954b",
"metadata": {},
"source": [
"`LinRange(start, stop, n)` erzeugt eine äquidistante Liste von `n` Werten von denen der erste und der letzte die vorgegebenen Grenzen sind. \n",
"Mit `collect()` kann man bei Bedarf auch daraus den entsprechenden Vektor gewinnen.\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

2054
nb/7_ArraysP2.ipynb Normal file

File diff suppressed because it is too large Load Diff

1142
nb/9_functs.ipynb Normal file

File diff suppressed because it is too large Load Diff

341
nb/Erste_Bsp.ipynb Normal file
View File

@ -0,0 +1,341 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "9bb241ad",
"metadata": {},
"source": [
"# Erste Miniprogramme\n",
"\n",
"\n",
"## Was sollte man zum Programmieren können?\n",
"\n",
"\n",
"- **Denken in Algorithmen:** \n",
" Welche Schritte sind zur Lösung des Problems nötig? Welche Daten müssen gespeichert, welche Datenstrukturen angelegt werden? Welche Fälle können auftreten und müssen erkannt und behandelt werden? \n",
"- **Umsetzung des Algorithmus in ein Programm:** \n",
" Welche Datenstrukturen, Konstrukte, Funktionen... stellt die Programmiersprache bereit? \n",
"- **Formale Syntax:** \n",
" Menschen verstehen 'broken English'; Computer verstehen kein 'broken C++' oder 'broken Julia'. Die Syntax muss beherrscht werden.\n",
"- **„Ökosystem“ der Sprache:** \n",
" Wie führe ich meinen Code aus? Wie funktionieren die Entwicklungsumgebungen? Welche Optionen versteht der Compiler? Wie installiere ich Zusatzbibliotheken? Wie lese ich Fehlermeldungen? Wo kann ich mich informieren? \n",
"- **die Kunst des Debugging:** \n",
" Programmieranfänger sind oft glücklich, wenn sie alle Syntaxfehler eliminiert haben und das Programm endlich 'durchläuft'. Bei komplexeren Programmen fängt die Arbeit jetzt erst an, denn nun muss getestet und die Fehler im Algorithmus gefunden und behoben werden. \n",
"- **Gefühl für die Effizienz und Komplexität von Algorithmen**\n",
"- **Besonderheiten der Computerarithmetik**, insbesondere der Gleitkommazahlen\n",
"\n",
"Das erschließt sich nicht alles auf einmal. Haben Sie Geduld mit sich und 'spielen' Sie mit der Sprache. \n",
"\n",
"Das Folgende soll eine kleine Anregung dazu sein.\n",
"\n",
"## Project Euler\n",
"\n",
"Eine hübsche Quelle für Programmieraufgaben mit mathematischem Charakter und sehr unterschiedlichen Schwierigkeitsgraden ist [Project Euler](https://projecteuler.net/). \n",
"Die Aufgaben sind so gestaltet, dass keinerlei Eingaben notwendig und das gesuchte Ergebnis eine einzige Zahl ist. So kann man sich voll auf das Programmieren des Algorithmus konzentrieren. \n",
"\n",
"---------\n",
"\n",
"### Beispiel 1\n",
"\n",
"::::::{.content-hidden unless-format=\"xxx\"}\n",
"\n",
"https://github.com/luckytoilet/projecteuler-solutions/blob/master/Solutions.md\n",
"https://math.stackexchange.com/questions/3370978/iterating-sum-of-squares-of-decimal-digits-of-an-integer-how-big-can-it-grow\n",
"aufg. 92\n",
"\n",
":::\n",
"\n",
"::: {.callout-note icon=false .titlenormal}\n",
"## Project Euler Problem No 1\n",
"\n",
"If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.\n",
"\n",
"Find the sum of all the multiples of 3 or 5 below 1000.\n",
"\n",
":::\n",
"\n",
"1. Algorithmus: \n",
" - Teste alle natürlichen Zahlen <1000 auf Teilbarkeit durch 3 oder durch 5 und\n",
" - summiere die teilbaren Zahlen auf.\n",
"\n",
"2. Umsetzung:\n",
"\n",
" Wie liefert Julia den Rest der Ganzzahldivision? Solche Funktionen heißen typischerweise `rem()` (für *remainder*) oder `mod()`. [Nachlesen in der Doku](https://docs.julialang.org/en/v1/base/math/#Base.rem) oder ausprobieren von `?rem` und `?mod` in der Julia-REPL zeigt, dass es beides gibt. Der Unterschied liegt in der Behandlung negativer ganzer Zahlen. Für natürliche Zahlen `n,m` liefern `mod(n,m)` und `rem(n,m)` dasselbe und letzteres hat auch noch die Infix-Form `n % m`. \n",
" \n",
" Wie testet man eine Reihe von Werten durch und summiert auf? Da gibt es ein Standardmuster: `for`-Schleife und Akkumulatorvariable: \n",
"\n",
":::{.callout-caution icon=\"false\" collapse=\"true\" .titlenormal}\n",
"\n",
"## Eine Lösungsvariante:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b5ec6b90",
"metadata": {},
"outputs": [],
"source": [
"s = 0 # Akkumulatorvariable initialisieren\n",
"for i in 1:999 # Schleife \n",
" if i % 3 == 0 || i % 5 == 0 # Test\n",
" s += i # Zu Akkumulator addieren \n",
" end # Ende Test\n",
"end # Ende Schleife\n",
"println(\" Die Antwort ist: $s\") # Ausgabe des Ergebnisses "
]
},
{
"cell_type": "markdown",
"id": "e4de7d69",
"metadata": {},
"source": [
":::\n",
"\n",
"Natürlich geht das auch etwas kürzer:\n",
"\n",
":::{.callout-caution icon=\"false\" collapse=\"true\" .titlenormal}\n",
"\n",
"## Noch eine Lösungsvariante:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "772bbe68",
"metadata": {},
"outputs": [],
"source": [
"sum([i for i in 1:999 if i%3==0||i%5==0])"
]
},
{
"cell_type": "markdown",
"id": "b9b95d73",
"metadata": {},
"source": [
":::\n",
"\n",
"\n",
"-----------\n",
"\n",
"### Beispiel 2\n",
"\n",
"\n",
"::: {.callout-note icon=false .titlenormal}\n",
"## Project Euler Problem No 92\n",
"A number chain is created by continuously adding the square of the digits in a number to form a new number until it has been seen before.\n",
"\n",
"For example,\n",
"\n",
"| 44 → 32 → 13 → 10 → **1** → **1**\n",
"| 85 → **89** → 145 → 42 → 20 → 4 → 16 → 37 → 58 → **89**\n",
"\n",
"Therefore any chain that arrives at 1 or 89 will become stuck in an endless loop. What is most amazing is that EVERY starting number will eventually arrive at 1 or 89.\n",
"\n",
"How many starting numbers below ten million will arrive at 89?\n",
":::\n",
"\n",
"Programme kann man [*top-down* und *bottom-up*](https://de.wikipedia.org/wiki/Top-Down-_und_Bottom-Up-Design) entwickeln.\n",
"*Top-down* würde hier wohl bedeuten: „Wir fangen mit einer Schleife `for i = 1:9999999` an.“ Der andere Weg führt über einzeln testbare Komponenten und ist oft zielführender. (Und ab einer gewissen Projektgröße nähert man sich sowieso von 'top' und 'bottom' gleichzeitig dem Ziel.)\n",
"\n",
"##### Funktion Nr. 1\n",
"Es soll untersucht werden, wie sich die Zahlen unter dem wiederholten Berechnen der 'Quadratquersumme' (Summe der Quadrate der Ziffern) verhalten. Also sollte man eine Funktion schreiben und testen, die diese 'Quadratquersumme' berechnet. \n",
"\n",
"\n",
":::{.callout-caution icon=\"false\" collapse=\"true\" .titlenormal}\n",
"\n",
"## `q2sum(n)` berechnet die Summe der Quadrate der Ziffern von n im Dezimalsystem:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c0730a2a",
"metadata": {},
"outputs": [],
"source": [
"#| output: false\n",
"function q2sum(n)\n",
" s = 0 # Akkumulator für die Summe\n",
" while n > 9 # solange noch mehrstellig...\n",
" q, r = divrem(n, 10) # berechne Ganzzahlquotient und Rest bei Division durch 10\n",
" s += r^2 # addiere quadrierte Ziffer zum Akkumulator\n",
" n = q # mache weiter mit der durch 10 geteilten Zahl\n",
" end\n",
" s += n^2 # addiere das Quadrat der letzten Ziffer\n",
" return s\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "1caa208b",
"metadata": {},
"source": [
":::\n",
"... und das testen wir jetzt natürlich:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "72341556",
"metadata": {},
"outputs": [],
"source": [
"for i in [1, 7, 33, 111, 321, 1000, 73201]\n",
" j = q2sum(i)\n",
" println(\"Quadratquersumme von $i = $j\")\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "5eeb2626",
"metadata": {},
"source": [
"Im Sinne der Aufgabe wenden wir die Funktion wiederholt an:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "da47c136",
"metadata": {},
"outputs": [],
"source": [
"n = 129956799\n",
"for i in 1:14\n",
" n = q2sum(n)\n",
" println(n)\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "e67b1670",
"metadata": {},
"source": [
"... und haben hier einen der '89er Zyklen' getroffen.\n",
"\n",
"\n",
"#### Funktion Nr. 2\n",
"\n",
"Wir müssen testen, ob die wiederholte Anwendung der Funktion `q2sum()` schließlich zu **1** führt oder in diesem **89er**-Zyklus endet.\n",
"\n",
":::{.callout-caution icon=\"false\" collapse=\"true\" .titlenormal}\n",
"\n",
"## `q2test(n)` ermittelt, ob wiederholte Quadratquersummenbildung in den 89er-Zyklus führt:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3868d34e",
"metadata": {},
"outputs": [],
"source": [
"#| output: false\n",
"function q2test(n)\n",
" while n !=1 && n != 89 # solange wir nicht bei 1 oder 89 angekommen sind....\n",
" n = q2sum(n) # wiederholen \n",
" end\n",
" if n==1 return false end # keine 89er-Zahl\n",
" return true # 89er-Zahl gefunden\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "10ce44d1",
"metadata": {},
"source": [
":::\n",
"\n",
"... und damit können wir die Aufgabe lösen:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "54521e6a",
"metadata": {},
"outputs": [],
"source": [
"c = 0 # mal wieder ein Akkumulator\n",
"for i = 1 : 10_000_000 - 1 # so kann man in Julia Tausenderblöcke zur besseren Lesbarkeit abtrennen\n",
" if q2test(i) # q2test() gibt einen Boolean zurück, kein weiterer Test nötig \n",
" c += 1 # 'if x == true' ist redundant, 'if x' reicht völlig \n",
" end \n",
"end\n",
"println(\"$c numbers below ten million arrive at 89.\")"
]
},
{
"cell_type": "markdown",
"id": "4a545b8c",
"metadata": {},
"source": [
"Zahlen, bei denen die iterierte Quadratquersummenbildung bei 1 endet, heißen übrigens [fröhliche Zahlen](https://de.wikipedia.org/wiki/Fr%C3%B6hliche_Zahl) und wir haben gerade die Anzahl der traurigen Zahlen kleiner als 10.000.000 berechnet.\n",
"\n",
"Hier nochmal das vollständige Programm:\n",
"\n",
":::{.callout-caution icon=\"false\" collapse=\"true\" .titlenormal}\n",
"## unsere Lösung von Project Euler No 92:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a7253bc1",
"metadata": {},
"outputs": [],
"source": [
"function q2sum(n)\n",
" s = 0 \n",
" while n > 9 \n",
" q, r = divrem(n, 10)\n",
" s += r^2 \n",
" n = q \n",
" end\n",
" s += n^2 \n",
" return s\n",
"end\n",
"\n",
"function q2test(n)\n",
" while n !=1 && n != 89 \n",
" n = q2sum(n) \n",
" end\n",
" if n==1 return false end \n",
" return true \n",
"end\n",
"\n",
"c = 0\n",
"for i = 1 : 10_000_000 - 1 \n",
" if q2test(i)\n",
" c += 1\n",
" end \n",
"end\n",
"println(\"$c numbers below ten million arrive at 89.\")"
]
},
{
"cell_type": "markdown",
"id": "772bec11",
"metadata": {},
"source": [
":::"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

233
nb/Pi.ipynb Normal file
View File

@ -0,0 +1,233 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "0b96655f",
"metadata": {},
"source": [
"# Ein Beispiel zur Stabilität von Gleitkommaarithmetik\n",
"\n",
"## Berechnung von $\\pi$ nach Archimedes\n",
"\n",
"\n",
"\n",
"Eine untere Schranke für $2\\pi$, den Umfang des Einheitskreises, erhält man durch die\n",
"Summe der Seitenlängen eines dem Einheitskreis eingeschriebenen regelmäßigen $n$-Ecks.\n",
" Die Abbildung links zeigt, wie man beginnend mit einem Viereck der Seitenlänge $s_4=\\sqrt{2}$ die Eckenzahl iterativ verdoppelt.\n",
"\n",
"| Abb. 1 | Abb.2 |\n",
"| :-: | :-: |\n",
"| ![](../images/pi1.png) | ![](../images/pi2.png) |\n",
"\n",
"Die zweite Abbildung zeigt die Geometrie der Eckenverdoppelung.\n",
"\n",
"Mit\n",
"$|\\overline{AC}|= s_{n},\\quad |\\overline{AB}|= |\\overline{BC}|= s_{2n},\\quad |\\overline{MN}| =a, \\quad |\\overline{NB}| =1-a,$ liefert Pythagoras für die Dreiecke $MNA$ und\n",
" $NBA$ jeweils\n",
"$$\n",
" a^2 + \\left(\\frac{s_{n}}{2}\\right)^2 = 1\\qquad\\text{bzw.} \\qquad\n",
" (1-a)^2 + \\left(\\frac{s_{n}}{2}\\right)^2 = s_{2n}^2\n",
"$$\n",
"Elimination von $a$ liefert die Rekursion\n",
"$$\n",
" s_{2n} = \\sqrt{2-\\sqrt{4-s_n^2}} \\qquad\\text{mit Startwert}\\qquad\n",
" s_4=\\sqrt{2}\n",
"$$\n",
"für die Länge $s_n$ **einer** Seite des eingeschriebenen regelmäßigen\n",
"$n$-Ecks.\n",
"\n",
"\n",
"Die Folge $(n\\cdot s_n)$\n",
"konvergiert monoton von unten gegen den\n",
"Grenzwert $2\\pi$:\n",
"$$\n",
" n\\, s_n \\rightarrow 2\\pi % \\qquad\\text{und} \\qquad {n c_n}\\downarrow 2\\pi\n",
"$$\n",
"Der relative Fehler der Approximation von 2π durch ein $n$-Eck ist:\n",
"$$\n",
" \\epsilon_n = \\left| \\frac{n\\, s_n-2 \\pi}{2\\pi} \\right|\n",
"$$\n",
"\n",
"\n",
"## Zwei Iterationsvorschriften^[nach: Christoph Überhuber, „Computer-Numerik“ Bd. 1, Springer 1995, Kap. 2.3]\n",
"Die Gleichung\n",
"$$\n",
" s_{2n} = \\sqrt{2-\\sqrt{4-s_n^2}}\\qquad \\qquad \\textrm{(Iteration A)}\n",
"$$\n",
"ist mathematisch äquivalent zu\n",
"$$\n",
" s_{2n} = \\frac{s_n}{\\sqrt{2+\\sqrt{4-s_n^2}}} \\qquad \\qquad \\textrm{(Iteration B)}\n",
"$$\n",
"\n",
"(Bitte nachrechnen!) \n",
"\n",
"\n",
"\n",
"Allerdings ist Iteration A schlecht konditioniert und numerisch instabil, wie der folgende Code zeigt. Ausgegeben wird die jeweils berechnete Näherung für π.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fa3be89a",
"metadata": {},
"outputs": [],
"source": [
"using Printf\n",
"\n",
"iterationA(s) = sqrt(2 - sqrt(4 - s^2))\n",
"iterationB(s) = s / sqrt(2 + sqrt(4 - s^2))\n",
"\n",
"s_B = s_A = sqrt(2) # Startwert \n",
"\n",
"ϵ(x) = abs(x - 2π)/2π # rel. Fehler \n",
"\n",
"ϵ_A = Float64[] # Vektoren für den Plot\n",
"ϵ_B = Float64[]\n",
"is = Float64[]\n",
"\n",
"@printf \"\"\" approx. Wert von π\n",
" n-Eck Iteration A Iteration B\n",
"\"\"\"\n",
"\n",
"for i in 3:35\n",
" push!(is, i)\n",
" s_A = iterationA(s_A) \n",
" s_B = iterationB(s_B) \n",
" doublePi_A = 2^i * s_A\n",
" doublePi_B = 2^i * s_B\n",
" push!(ϵ_A, ϵ(doublePi_A))\n",
" push!(ϵ_B, ϵ(doublePi_B))\n",
" @printf \"%14i %20.15f %20.15f\\n\" 2^i doublePi_A/2 doublePi_B/2 \n",
"end"
]
},
{
"cell_type": "markdown",
"id": "7ce50a85",
"metadata": {},
"source": [
"Während Iteration B sich stabilisiert bei einem innerhalb der Maschinengenauigkeit korrekten Wert für π, wird Iteration A schnell instabil. Ein Plot der relativen Fehler $\\epsilon_i$ bestätigt das:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5004b70e",
"metadata": {},
"outputs": [],
"source": [
"using CairoMakie\n",
"\n",
"F = Figure(resolution=(800,500))\n",
"ax = Axis(F[1, 1], xlabel = \"Iterationsschritte\", ylabel = \"rel. Fehler\",\n",
" yscale = log10, xticks=2:2:35, yticks=LogTicks(-20:0))\n",
"\n",
"scatterlines!(ax, is, ϵ_A, label = \"Iteration A\" )\n",
"scatterlines!(ax, is, ϵ_B, marker=:xcross, label = \"Iteration B\" )\n",
"\n",
"axislegend(position=:rc)\n",
"F"
]
},
{
"cell_type": "markdown",
"id": "7a93c5e3",
"metadata": {},
"source": [
"## Stabilität und Auslöschung\n",
"\n",
"Bei $i=26$ erreicht Iteration B einen relativen Fehler in der Größe des Maschinenepsilons:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "527eee0e",
"metadata": {},
"outputs": [],
"source": [
"ϵ_B[22:28]"
]
},
{
"cell_type": "markdown",
"id": "6f2f4475",
"metadata": {},
"source": [
"Weitere Iterationen verbessern das Ergebnis nicht mehr. Sie stabilisieren sich bei einem relativen Fehler von etwa 2.5 Maschinenepsilon:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3b2a8b77",
"metadata": {},
"outputs": [],
"source": [
"ϵ_B[end]/eps(Float64)"
]
},
{
"cell_type": "markdown",
"id": "6ff2d4b8",
"metadata": {},
"source": [
"Die Form Iteration A ist instabil. Bereits bei $i=16$ beginnt der relative Fehler wieder zu wachsen.\n",
"\n",
"Ursache ist eine typische Auslöschung. Die Seitenlängen $s_n$ werden sehr schnell klein. Damit ist\n",
"$a_n=\\sqrt{4-s_n^2}$ nur noch wenig kleiner als 2 und bei der Berechnung von $s_{2n}=\\sqrt{2-a_n}$ tritt ein typischer Auslöschungseffekt auf.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ca6c5ca2",
"metadata": {},
"outputs": [],
"source": [
"setprecision(80) # precision für BigFloat\n",
"\n",
"s = sqrt(BigFloat(2))\n",
"\n",
"@printf \" a = √(4-s^2) als BigFloat und als Float64\\n\\n\"\n",
"\n",
"for i = 3:44\n",
" s = iterationA(s)\n",
" x = sqrt(4-s^2)\n",
" if i > 20\n",
" @printf \"%i %30.26f %20.16f \\n\" i x Float64(x)\n",
" end \n",
"end\n"
]
},
{
"cell_type": "markdown",
"id": "5e4994b3",
"metadata": {},
"source": [
"Man sieht die Abnahme der Zahl der signifikanten Ziffern. Man sieht auch, dass eine Verwendung von `BigFloat` mit einer Mantissenlänge von hier 80 Bit das Einsetzen des Auslöschungseffekts nur etwas hinaussschieben kann. \n",
"\n",
"**Gegen instabile Algorithmen helfen in der Regel nur bessere, stabile Algorithmen und nicht genauere Maschinenzahlen!**\n",
"\n",
":::{.content-hidden unless-format=\"xxx\"}\n",
"\n",
"Offensichtlich tritt bei der Berechnung von $2-a_n$ bereits relativ früh\n",
"eine Abnahme der Anzahl der signifikanten Ziffern (Auslöschung) auf, \n",
"bevor schließlich bei der Berechnung von $a_n=\\sqrt{4-s_n^2}$ \n",
"selbst schon Auslöschung zu einem unbrauchbaren Ergebnis führt.\n",
"\n",
":::"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

313
nb/Pi2.ipynb Normal file
View File

@ -0,0 +1,313 @@
{
"cells": [
{
"cell_type": "raw",
"id": "9d63401b",
"metadata": {},
"source": [
"---\n",
"format:\n",
" html:\n",
" include-in-header:\n",
" text: |\n",
" <script type=\"application/javascript\">\n",
" window.PlotlyConfig = {MathJaxConfig: 'local'}\n",
" </script>\n",
"---"
]
},
{
"cell_type": "markdown",
"id": "405d242e",
"metadata": {},
"source": [
"# Ein Beispiel zur Stabilität von Gleitkommaarithmetik\n",
"\n",
"## Berechnung von $\\pi$ nach Archimedes\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f17a5fcb",
"metadata": {},
"outputs": [],
"source": [
"#| error: false\n",
"#| echo: false\n",
"#| output: false\n",
"using PlotlyJS, Random\n",
"using HypertextLiteral\n",
"using JSON, UUIDs\n",
"using Base64\n",
"\n",
"\n",
"## see https://github.com/JuliaPlots/PlotlyJS.jl/blob/master/src/PlotlyJS.jl\n",
"## https://discourse.julialang.org/t/encode-a-plot-to-base64/27765/3\n",
"function IJulia.display_dict(p::PlotlyJS.SyncPlot)\n",
" Dict(\n",
" # \"application/vnd.plotly.v1+json\" => JSON.lower(p),\n",
" # \"text/plain\" => sprint(show, \"text/plain\", p),\n",
" \"text/html\" => let\n",
" buf = IOBuffer()\n",
" show(buf, MIME(\"text/html\"), p)\n",
" #close(buf)\n",
" #String(resize!(buf.data, buf.size))\n",
" String(take!(buf))\n",
" end,\n",
" \"image/png\" => let\n",
" buf = IOBuffer()\n",
" buf64 = Base64EncodePipe(buf)\n",
" show(buf64, MIME(\"image/png\"), p)\n",
" close(buf64)\n",
" #String(resize!(buf.data, buf.size))\n",
" String(take!(buf))\n",
" end,\n",
"\n",
" )\n",
" end\n",
"\n",
" function Base.show(io::IO, mimetype::MIME\"text/html\", p::PlotlyJS.SyncPlot)\n",
" uuid = string(UUIDs.uuid4())\n",
" show(io,mimetype,@htl(\"\"\"\n",
" <div style=\"height: auto\" id=\\\"$(uuid)\\\"></div>\n",
" <script>\n",
" require(['../js/plotly-latest.min.js'], function(plotly) { \n",
" plotly.newPlot($(uuid),\n",
" $(HypertextLiteral.JavaScript(json(p.plot.data))),\n",
" $(HypertextLiteral.JavaScript(json(p.plot.layout))),{responsive: true});\n",
" });\n",
" </script>\n",
"\"\"\"))\n",
"end "
]
},
{
"cell_type": "markdown",
"id": "7745166c",
"metadata": {},
"source": [
"Eine untere Schranke für $2\\pi$, den Umfang des Einheitskreises, erhält man durch die\n",
"Summe der Seitenlängen eines dem Einheitskreis eingeschriebenen regelmäßigen $n$-Ecks.\n",
" Die Abbildung links zeigt, wie man beginnend mit einem Viereck der Seitenlänge $s_4=\\sqrt{2}$ die Eckenzahl iterativ verdoppelt.\n",
"\n",
":::{.narrow}\n",
"\n",
"| Abb. 1 | Abb.2 |\n",
"| :-: | :-: |\n",
"| ![](../images/pi1.png) | ![](../images/pi2.png) |\n",
": {tbl-colwidths=\"[57,43]\"}\n",
"\n",
":::\n",
"\n",
"\n",
"Die zweite Abbildung zeigt die Geometrie der Eckenverdoppelung.\n",
"\n",
"Mit\n",
"$|\\overline{AC}|= s_{n},\\quad |\\overline{AB}|= |\\overline{BC}|= s_{2n},\\quad |\\overline{MN}| =a, \\quad |\\overline{NB}| =1-a,$ liefert Pythagoras für die Dreiecke $MNA$ und\n",
" $NBA$ jeweils\n",
"$$\n",
" a^2 + \\left(\\frac{s_{n}}{2}\\right)^2 = 1\\qquad\\text{bzw.} \\qquad\n",
" (1-a)^2 + \\left(\\frac{s_{n}}{2}\\right)^2 = s_{2n}^2\n",
"$$\n",
"Elimination von $a$ liefert die Rekursion\n",
"$$\n",
" s_{2n} = \\sqrt{2-\\sqrt{4-s_n^2}} \\qquad\\text{mit Startwert}\\qquad\n",
" s_4=\\sqrt{2}\n",
"$$\n",
"für die Länge $s_n$ **einer** Seite des eingeschriebenen regelmäßigen\n",
"$n$-Ecks.\n",
"\n",
"\n",
"Die Folge $(n\\cdot s_n)$\n",
"konvergiert monoton von unten gegen den\n",
"Grenzwert $2\\pi$:\n",
"$$\n",
" n\\, s_n \\rightarrow 2\\pi % \\qquad\\text{und} \\qquad {n c_n}\\downarrow 2\\pi\n",
"$$\n",
"Der relative Fehler der Approximation von 2π durch ein $n$-Eck ist:\n",
"$$\n",
" \\epsilon_n = \\left| \\frac{n\\, s_n-2 \\pi}{2\\pi} \\right|\n",
"$$\n",
"\n",
"\n",
"## Zwei Iterationsvorschriften^[nach: Christoph Überhuber, „Computer-Numerik“ Bd. 1, Springer 1995, Kap. 2.3]\n",
"Die Gleichung\n",
"$$\n",
" s_{2n} = \\sqrt{2-\\sqrt{4-s_n^2}}\\qquad \\qquad \\textrm{(Iteration A)}\n",
"$$\n",
"ist mathematisch äquivalent zu\n",
"$$\n",
" s_{2n} = \\frac{s_n}{\\sqrt{2+\\sqrt{4-s_n^2}}} \\qquad \\qquad \\textrm{(Iteration B)}\n",
"$$\n",
"\n",
"(Bitte nachrechnen!) \n",
"\n",
"\n",
"\n",
"Allerdings ist Iteration A schlecht konditioniert und numerisch instabil, wie der folgende Code zeigt. Ausgegeben wird die jeweils berechnete Näherung für π.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d83237c5",
"metadata": {},
"outputs": [],
"source": [
"using Printf\n",
"\n",
"iterationA(s) = sqrt(2 - sqrt(4 - s^2))\n",
"iterationB(s) = s / sqrt(2 + sqrt(4 - s^2))\n",
"\n",
"s_B = s_A = sqrt(2) # Startwert \n",
"\n",
"ϵ(x) = abs(x - 2π)/2π # rel. Fehler \n",
"\n",
"ϵ_A = Float64[] # Vektoren für den Plot\n",
"ϵ_B = Float64[]\n",
"is = Float64[]\n",
"\n",
"@printf \"\"\" approx. Wert von π\n",
" n-Eck Iteration A Iteration B\n",
"\"\"\"\n",
"\n",
"for i in 3:35\n",
" push!(is, i)\n",
" s_A = iterationA(s_A) \n",
" s_B = iterationB(s_B) \n",
" doublePi_A = 2^i * s_A\n",
" doublePi_B = 2^i * s_B\n",
" push!(ϵ_A, ϵ(doublePi_A))\n",
" push!(ϵ_B, ϵ(doublePi_B))\n",
" @printf \"%14i %20.15f %20.15f\\n\" 2^i doublePi_A/2 doublePi_B/2 \n",
"end"
]
},
{
"cell_type": "markdown",
"id": "dcdecd41",
"metadata": {},
"source": [
"Während Iteration B sich stabilisiert bei einem innerhalb der Maschinengenauigkeit korrekten Wert für π, wird Iteration A schnell instabil. Ein Plot der relativen Fehler $\\epsilon_i$ bestätigt das:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4404adb1",
"metadata": {},
"outputs": [],
"source": [
"using PlotlyJS\n",
"\n",
"layout = Layout(xaxis_title=\"Iterationsschritte\", yaxis_title=\"rel. Fehler\",\n",
" yaxis_type=\"log\", yaxis_exponentformat=\"power\", \n",
" xaxis_tick0=2, xaxis_dtick=2)\n",
"\n",
"plot([scatter(x=is, y=ϵ_A, mode=\"markers+lines\", name=\"Iteration A\", yscale=:log10), \n",
" scatter(x=is, y=ϵ_B, mode=\"markers+lines\", name=\"Iteration B\", yscale=:log10)],\n",
" layout) \n"
]
},
{
"cell_type": "markdown",
"id": "ac5d56d5",
"metadata": {},
"source": [
"## Stabilität und Auslöschung\n",
"\n",
"Bei $i=26$ erreicht Iteration B einen relativen Fehler in der Größe des Maschinenepsilons:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e807fa2b",
"metadata": {},
"outputs": [],
"source": [
"ϵ_B[22:28]"
]
},
{
"cell_type": "markdown",
"id": "68979310",
"metadata": {},
"source": [
"Weitere Iterationen verbessern das Ergebnis nicht mehr. Sie stabilisieren sich bei einem relativen Fehler von etwa 2.5 Maschinenepsilon:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6a9f7b29",
"metadata": {},
"outputs": [],
"source": [
"ϵ_B[end]/eps(Float64)"
]
},
{
"cell_type": "markdown",
"id": "09be0e03",
"metadata": {},
"source": [
"Die Form Iteration A ist instabil. Bereits bei $i=16$ beginnt der relative Fehler wieder zu wachsen.\n",
"\n",
"Ursache ist eine typische Auslöschung. Die Seitenlängen $s_n$ werden sehr schnell klein. Damit ist\n",
"$a_n=\\sqrt{4-s_n^2}$ nur noch wenig kleiner als 2 und bei der Berechnung von $s_{2n}=\\sqrt{2-a_n}$ tritt ein typischer Auslöschungseffekt auf.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2ccb85ad",
"metadata": {},
"outputs": [],
"source": [
"setprecision(80) # precision für BigFloat\n",
"\n",
"s = sqrt(BigFloat(2))\n",
"\n",
"@printf \" a = √(4-s^2) als BigFloat und als Float64\\n\\n\"\n",
"\n",
"for i = 3:44\n",
" s = iterationA(s)\n",
" x = sqrt(4-s^2)\n",
" if i > 20\n",
" @printf \"%i %30.26f %20.16f \\n\" i x Float64(x)\n",
" end \n",
"end\n"
]
},
{
"cell_type": "markdown",
"id": "27616d4d",
"metadata": {},
"source": [
"Man sieht die Abnahme der Zahl der signifikanten Ziffern. Man sieht auch, dass eine Verwendung von `BigFloat` mit einer Mantissenlänge von hier 80 Bit das Einsetzen des Auslöschungseffekts nur etwas hinaussschieben kann. \n",
"\n",
"**Gegen instabile Algorithmen helfen in der Regel nur bessere, stabile Algorithmen und nicht genauere Maschinenzahlen!**\n",
"\n",
":::{.content-hidden unless-format=\"xxx\"}\n",
"\n",
"Offensichtlich tritt bei der Berechnung von $2-a_n$ bereits relativ früh\n",
"eine Abnahme der Anzahl der signifikanten Ziffern (Auslöschung) auf, \n",
"bevor schließlich bei der Berechnung von $a_n=\\sqrt{4-s_n^2}$ \n",
"selbst schon Auslöschung zu einem unbrauchbaren Ergebnis führt.\n",
"\n",
":::"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

83
nb/ablaufsteuerung.ipynb Normal file
View File

@ -0,0 +1,83 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "cdcef88f",
"metadata": {},
"source": [
"# Verzweigungen\n",
"\n",
"::: {.column-margin}\n",
":::\n",
"\n",
"### If\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "13854f8c",
"metadata": {},
"outputs": [],
"source": [
"x = 3\n",
"y = 66\n",
"\n",
"if x<y \n",
" println(\"yes\")\n",
"else\n",
" x = 10\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "6b04de1f",
"metadata": {},
"source": [
"Suchen wir mal danach:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6a207036",
"metadata": {},
"outputs": [],
"source": [
"methods(sqrt)"
]
},
{
"cell_type": "markdown",
"id": "568d4980",
"metadata": {},
"source": [
"das ist das Ende.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fbe323de",
"metadata": {},
"outputs": [],
"source": [
"using REPL, Markdown\n",
"help = Core.eval(Main, REPL.helpmode(\"mod\"))\n",
"helpstr=Markdown.plaininline(help)\n",
"#print(helpstr)\n",
"print(\"...\\n\", join(split(helpstr,'\\n')[22:30],'\\n'), \"\\n...\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -0,0 +1,167 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "1cb64ccb",
"metadata": {},
"source": [
"# Entwicklungsumgebungen\n",
"\n",
"Für diesen Kurs werden wir die webbasierte Entwicklungsumgebung [Jupyterhub](https://de.wikipedia.org/wiki/Project_Jupyter) verwenden. Sie steht allen Teilnehmerïnnen für die Dauer des Kurses zur Verfügung. \n",
"\n",
"Für langfristiges Arbeiten empfiehlt sich eine eigene Installation. \n",
"\n",
"\n",
"## Installation auf eigenem Rechner (Linux/MacOS/MS Windows)\n",
"\n",
"1. Julia mit dem Installations- und Update-Manager **juliaup** installieren: <https://github.com/JuliaLang/juliaup/>\n",
"2. als Editor/IDE **Visual Studio Code** installieren: <https://code.visualstudio.com/>\n",
"3. im VS Code Editor die **Julia language extension** installieren: <https://www.julia-vscode.org/docs/stable/gettingstarted/>\n",
"\n",
"Einstieg:\n",
"\n",
"- In VS Code eine neue Datei mit der Endung `.jl` anlegen\n",
"- Julia-Code schreiben\n",
"- {{< kbd Shift-Enter >}} oder {{< kbd Ctrl-Enter >}} am Ende einer Anweisung oder eines Blocks startet ein Julia-REPL, Code wird ins REPL kopiert und ausgeführt \n",
"- [Tastenbelegungen für VS Code](https://code.visualstudio.com/docs/getstarted/keybindings#_keyboard-shortcuts-reference)\n",
"und [Julia in VS Code](https://www.julia-vscode.org/docs/stable/userguide/keybindings/)\n",
"\n",
"\n",
"\n",
"## Arbeiten auf dem [Jupyterhub-Webserver](https://misun103.mathematik.uni-leipzig.de/)\n",
"\n",
"### Jupyterhub & Jupyter\n",
"\n",
"- [Jupyterhub](https://de.wikipedia.org/wiki/Project_Jupyter) ist ein Multi-User-Server für Jupyter.\n",
"- Jupyter ist eine web-basierte interaktive Programmierumgebung, die\n",
"- ursprünglich in und für Python geschrieben, inzwischen eine\n",
" Vielzahl von Programmiersprachen nutzen kann.\n",
"- In Jupyter bearbeitet man sogenannte *notebooks*. Das sind strukturiere Textdateien (JSON), erkennbar an der Dateiendung \n",
" `*.ipynb`.\n",
"\n",
"Unser Jupyterhub-Server: <https://misun103.mathematik.uni-leipzig.de/>\n",
"\n",
"Nach dem Einloggen in Jupyterhub erscheint ein Dateimanager:\n",
"\n",
"![Jupyterhub Dateimanager](../images/notebook001.png)\n",
"\n",
"Mit diesem kann man:\n",
"\n",
"- vorhandene *notebooks* öffnen,\n",
"- neue *notebooks* anlegen,\n",
"- Dateien, z.B. *notebooks*, vom lokalen Rechner hochladen,\n",
"- die Sitzung mit `Logout` beenden (bitte nicht vergessen!). \n",
"\n",
"### Jupyter notebooks\n",
"\n",
"![Jupyter Notebook](../images/notebook003.png)\n",
"\n",
"\n",
"*Notebooks* bestehen aus Zellen. Zellen können \n",
"\n",
"- Code oder \n",
"- Text/Dokumentation (Markdown) \n",
"\n",
"enthalten. In Textzellen können mit die Auszeichnungssprache [Markdown](https://de.wikipedia.org/wiki/Markdown) zur Formatierung und LaTeX für mathematische Gleichungen verwendet werden. \n",
"\n",
"Es sei empfohlen, die Punkte `User Interface Tour` und `Keyboard Shortcuts` im `Help`-Menü anzuschauen. Die Zelle, die man gerade bearbeitet, kann im `command mode` oder `edit mode` sein. \n",
"\n",
"\n",
"\n",
"```{html}\n",
"<table>\n",
" <caption>Einige Kommandos</caption>\n",
" <thead>\n",
" <tr>\n",
" <th></th><th>command mode</th><th>edit mode</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr> \n",
" <td>Mode aktivieren</td><td>ESC</td>\n",
" </tr>\n",
" </tbody> \n",
"</table>\n",
"```\n",
"\n",
"\n",
"\n",
"| | *command mode* | *edit mode* |\n",
"|:-------|:---------------:|:-----------:|\n",
"| Mode aktivieren | `ESC` | Doppelklick oder `Enter` in Zelle |\n",
"| neue Zelle | `b` | `Alt-Enter` |\n",
"| Zelle löschen | `dd` | |\n",
"| Notebook speichern | `s` | `Ctrl-s` |\n",
"\n",
"\n",
"\n",
"- Notebook speichern:\n",
"\n",
" - `Ctrl-s` in Edit Mode\n",
" - `s` in Command mode\n",
" - `Menu -> File -> Save & Checkpoint`\n",
" - `Menu -> File -> Rename`: Umbenennen (falls es noch\n",
" \\\"Untitled1\\\" heißt) `<br>`{=html}`<br>`{=html}\n",
"\n",
"- Notebook schließen:\n",
"\n",
" - `Menu -> File -> Close & Halt` `<br>`{=html}`<br>`{=html}\n",
"\n",
"- Ausführen von Julia:\n",
"\n",
" - `Ctrl-Enter`: Run cell\n",
" - `Shift-Enter`: Run cell, move to next cell\n",
" - `Alt-Enter`: run cell, insert new cell below\n",
"\n",
"\n",
"\n",
"bla backslash\n",
"\n",
"![](../images/notebook002.png)\n",
"\n",
"bla backslash\n",
"\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"Wenn eine Zelle \\\"arbeitet\\\", wird ihre Zellen-Nummer zu einem `*` und\n",
"die `kernel busy`-Anzeige (Voller schwarzer Punkt oben rechts neben der\n",
"Julia-Version) erscheint. Falls das zu lange dauert (ein *infinite loop*\n",
"ist schnell programmiert), dann\n",
"\n",
"- `Menu -> Kernel -> Interrupt` anklicken; falls das wirkungslos ist,\n",
"- `Menu -> Kernel -> Restart` anklicken.\n",
"\n",
"Danach müssen alle Zellen, die weiterhin benötigte Definitionen,\n",
"`using`-Anweisungen etc enthalten, wieder ausgeführt werden!\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"**Am Ende der Arbeit bitte immer:**\n",
"\n",
"- `Menu -> File -> Save & Checkpoint`\n",
"- `Menu -> File -> Close & Halt`\n",
"- `Logout`\n",
":::\n",
"\n",
"::: {#73820119 .cell .markdown}\n",
"#### Markdown-Zellen\n",
"\n",
"neben den üblichen Markdown-Elementen können auch diese auch\n",
"`HTML`-Anweisungen und Mathematische Formeln in LaTeX-Form enthalten.\n",
"LaTeX-Formeln werden in `$...$` oder `$$...$$` (Display-Form)\n",
"eingeschlossen.\n",
":::\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

146
nb/example.ipynb Normal file
View File

@ -0,0 +1,146 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "1847e5bc",
"metadata": {},
"source": [
"# Some Julia Code\n",
"\n",
"\n",
"1. ?forvarianrte\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fd1a489b",
"metadata": {},
"outputs": [],
"source": [
"?for"
]
},
{
"cell_type": "markdown",
"id": "62aee612",
"metadata": {},
"source": [
"## Einfache rechnerei\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "23afd224",
"metadata": {},
"outputs": [],
"source": [
"2^33+33"
]
},
{
"cell_type": "markdown",
"id": "d1f050b2",
"metadata": {},
"source": [
"## colored console graphs produced by `Benchmarktools.jl`\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a9b6a7c8",
"metadata": {},
"outputs": [],
"source": [
"using BenchmarkTools\n",
"\n",
"@benchmark sum(rand(1000))"
]
},
{
"cell_type": "markdown",
"id": "948d948e",
"metadata": {},
"source": [
"## structure of floating point numbers\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fbe94ce0",
"metadata": {},
"outputs": [],
"source": [
"function printbitsf64(x::Float64)\n",
" s = bitstring(x)\n",
" printstyled(s[1], color = :blue, reverse=true)\n",
" printstyled(s[2:12], color = :green, reverse=true)\n",
" printstyled(s[13:end], color=:red, bold=true, reverse=true)\n",
" print(\"\\n\")\n",
"end\n",
"\n",
"printbitsf64(27.56640625)"
]
},
{
"cell_type": "markdown",
"id": "611f43fa",
"metadata": {},
"source": [
"### illustrate machine epsilon...\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "294f9e7e",
"metadata": {},
"outputs": [],
"source": [
"Eps=0.5\n",
"while 1 != 1 + Eps\n",
" Eps /= 2\n",
" printbitsf64(1+Eps)\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "34e578b1",
"metadata": {},
"source": [
"### ... some ugly colors\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9771dbc3",
"metadata": {},
"outputs": [],
"source": [
"function printbits2f64(x::Float64)\n",
" s = bitstring(x)\n",
" printstyled(s[1], color = 142, reverse=true)\n",
" printstyled(s[2:12], color = 190, reverse=false, underline=true)\n",
" printstyled(s[13:end], color= 27, bold=true, reverse=true)\n",
" print(\"\\n\")\n",
"end\n",
"\n",
"printbits2f64(27.56640625)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

628
nb/first_contact.ipynb Normal file
View File

@ -0,0 +1,628 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "e009ef80",
"metadata": {},
"source": [
"# First Contact\n",
"\n",
"Dieses Kapitel soll beim 'Loslegen' helfen. Es läßt viele Details weg und die Codebeispiele sind oft eher suboptimal. \n",
"\n",
"\n",
"## Julia als Taschenrechner\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b488cb23",
"metadata": {},
"outputs": [],
"source": [
"#| eval: true\n",
"#| echo: false\n",
"#| output: false\n",
"\n",
"using REPL, Markdown\n",
"\n",
"function mhelp(s,n,m)\n",
" helptxt = Core.eval(Main, REPL.helpmode(s))\n",
" helpstr=Markdown.plaininline(helptxt)\n",
" print(\"...\\n\", join(split(helpstr,'\\n')[n:m],'\\n'), \"\\n...\")\n",
"end;\n",
"\n",
"function Tab(s)\n",
" l = filter(x->startswith(x,s), REPL.doc_completions(s))\n",
" println.(l[2:end])\n",
" return # return nothing, since broadcast println produces empty vector\n",
"end\n",
"\n",
"▷ = |>\n",
"\n",
"# IJulia.set_verbose(true)"
]
},
{
"cell_type": "markdown",
"id": "76000398",
"metadata": {},
"source": [
"Berechne $\\qquad 12^{1/3} + \\frac{3\\sqrt{2}}{\\sin(0.5)-\\cos(\\frac{\\pi}{4})\\log(3)}+ e^5$\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0f9feb86",
"metadata": {},
"outputs": [],
"source": [
"12^(1/3) + 3sqrt(2) / (sin(.5) - cos(pi/4)*log(3)) + exp(5)"
]
},
{
"cell_type": "markdown",
"id": "3e9fad84",
"metadata": {},
"source": [
"Man beachte:\n",
"\n",
"- Potenzen schreibt man `a^b`.\n",
"- Die Konstante `pi` ist vordefiniert.\n",
"- `log()` ist der natürliche Logarithmus.\n",
"- Das Multiplikationszeichen `a*b` kann nach einer Zahl weggelassen werden, wenn eine Variable, Funktion oder Klammer folgt.\n",
"\n",
"\n",
"## Die wichtigsten Tasten: `Tab` und `?`\n",
"\n",
"Man drücke beim Programmieren immer wieder die Tabulatortaste, sobald 2...3 Buchstaben eines Wortes getippt sind. Es werden dann mögliche Ergänzungen angezeigt bzw. ergänzt, wenn die Ergänzung eindeutig ist. Das spart Zeit und bildet ungemein:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "734300ba",
"metadata": {},
"outputs": [],
"source": [
"lo = \"lo\" #| hide_line\n",
"lo ▷ Tab"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "155bc575",
"metadata": {},
"outputs": [],
"source": [
"pri = \"pri\" #| hide_line\n",
"pri ▷ Tab"
]
},
{
"cell_type": "markdown",
"id": "ba74dc32",
"metadata": {},
"source": [
"Die eingebaute Julia-Hilfe `?name` zu allen Funktionen und Konstrukten ist sehr umfassend. Hier ein eher kurzes Beispiel: \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1b941a97",
"metadata": {},
"outputs": [],
"source": [
"?for"
]
},
{
"cell_type": "markdown",
"id": "c8f7da7b",
"metadata": {},
"source": [
":::{.content-hidden unless-format=\"xxx\"}\n",
"\n",
"::: {.cell }\n",
"``` {.julia .cell-code}\n",
"?for\n",
"```\n",
"\n",
"::: {.cell-output .cell-output-stdout}\n",
"```\n",
"search: for foreach foldr floor mapfoldr factorial EOFError OverflowError\n",
"\n",
"for loops repeatedly evaluate a block of statements while iterating over a sequence of values.\n",
"\n",
"Examples\n",
"\n",
"julia> for i in [1, 4, 0]\n",
" println(i)\n",
" end\n",
"1\n",
"4\n",
"0\n",
"\n",
"```\n",
":::\n",
":::\n",
":::\n",
"\n",
"\n",
"## Variablen und Zuweisungen\n",
"\n",
"Variablen entstehen durch Zuweisung *(assignment)* mit dem Zuweisungsoperator `=` . Danach können sie in weiteren Anweisungen verwendet werden.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "da1dc7ec",
"metadata": {},
"outputs": [],
"source": [
"x = 1 + sqrt(5) \n",
"y = x / 2"
]
},
{
"cell_type": "markdown",
"id": "37b29541",
"metadata": {},
"source": [
"Im interaktiven Betrieb zeigt Julia das Ergebnis der letzten Operation an.\n",
"\n",
":::{.callout-note .titlenormal}\n",
"Zuweisungen sind keine mathematischen Gleichungen. Die Semantik des Zuweisungsoperators (Gleichheitszeichens) ist: \n",
"\n",
"- berechne die rechte Seite und\n",
"- weise das Ergebnis der linken Seite zu.\n",
"\n",
"Ausdrücke wie `x + y = sin(2)` sind daher unzulässig. Links darf nur ein Variablenname stehen.\n",
":::\n",
"\n",
"\n",
"## Datentypen\n",
"\n",
"Julia ist eine [stark typisierte](https://de.wikipedia.org/wiki/Starke_Typisierung) Sprache. Alle Objekte haben einen Typ. \n",
"So gibt es unter anderem die Basistypen \n",
"\n",
"- Ganze Zahlen *(integers)*,\n",
"- Gleitkommazahlen *(floating point numbers)*,\n",
"- Zeichenketten *(strings)* und \n",
"- Wahrheitswerte *(booleans)*.\n",
"\n",
"Den Typ einer Variablen kann man mit der Funktion `typeof()` ermitteln. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "173f7324",
"metadata": {},
"outputs": [],
"source": [
"#| warning: true\n",
"#| error: true\n",
"for x ∈ (42, 12.0, 3.3e4, \"Hallo!\", true)\n",
" println(\"x = \", x, \" ..... Typ: \", typeof(x))\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "13a8984f",
"metadata": {},
"source": [
"Die Standard-Gleitkommazahl hat eine Länge von 64 Bit, entspricht also einer `double` in C/C++/Java.\n",
"\n",
"Julia ist eine [dynamisch typisierte](https://de.wikipedia.org/wiki/Dynamische_Typisierung) Sprache. \n",
"Variablen haben keinen Typ. Sie sind typlose Referenzen (Zeiger) auf Objekte. \n",
"Wenn man vom „Typ einer Variablen“ spricht, meint man den Typ des Objektes, das der Variablen gerade zugewiesen ist. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cd3b3e96",
"metadata": {},
"outputs": [],
"source": [
"x = sqrt(2)\n",
"\n",
"println( typeof(x), \" - Wert von x = $x\" )\n",
"\n",
"x = \"Jetzt bin ich keine Gleitkommazahl mehr!\"\n",
"\n",
"println( typeof(x), \" - Wert von x = $x\" )"
]
},
{
"cell_type": "markdown",
"id": "eae463bf",
"metadata": {},
"source": [
"## Druckanweisungen\n",
"Die Funktion `println()` unterscheidet sich von `print()` dadurch, dass sie am Ende einen Zeilenvorschub ausgibt.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "df98312b",
"metadata": {},
"outputs": [],
"source": [
"print(y)\n",
"print(\"...die Zeile geht weiter...\")\n",
"print(\"immernoch...\")\n",
"println(y)\n",
"println(\"Neue Zeile\")\n",
"println(\"Neue Zeile\")"
]
},
{
"cell_type": "markdown",
"id": "b74dcb3f",
"metadata": {},
"source": [
"Beide Funkionen können als Argument eine Liste von *strings* und Variablen bekommen. Man kann Variablen auch in *strings* einbetten, indem man dem Variablennamen ein Dollarzeichen voranstellt *(string interpolation)*.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3b76d855",
"metadata": {},
"outputs": [],
"source": [
"x = 23\n",
"y = 3x + 5\n",
"zz = \"Fertig!\"\n",
"println(\"x= \", x, \" ...und y= \", y, \"...\", zz) # 1. Variante\n",
"println(\"x= $x ...und y= $y...$zz\") # Variante mit string interpolation"
]
},
{
"cell_type": "markdown",
"id": "c06fc5da",
"metadata": {},
"source": [
":::{.callout-note .titlenormal collapse=true icon=false }\n",
"## Wenn man ein Dollarzeichen drucken will...\n",
"\n",
"muss man einen *backslash* voranstellen. Wenn man einen *backslash* drucken will, muss man ihn verdoppeln.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "00a46544",
"metadata": {},
"outputs": [],
"source": [
"println(\"Ein Dollar: 1\\$ und drei backslashs: \\\\\\\\\\\\ \")"
]
},
{
"cell_type": "markdown",
"id": "3ba46a2c",
"metadata": {},
"source": [
":::\n",
"\n",
"## Funktionen\n",
"Funktionsdefinitionen beginnen mit dem Schlüsselwort `function` und enden mit dem Schlüsselwort `end`. In der Regel haben sie eine oder mehrere Argumente und geben beim Aufruf ein berechnetes Objekt mit der `return`-Anweisung zurück.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6e83b8e2",
"metadata": {},
"outputs": [],
"source": [
"function hypotenuse(a, b) # heute besonders umständlich\n",
" c2 = a^2 + b^2\n",
" c = sqrt(c2)\n",
" return c \n",
"end"
]
},
{
"cell_type": "markdown",
"id": "6ae72d3a",
"metadata": {},
"source": [
"Nach ihrer Definition kann die Funktion benutzt (aufgerufen) werden. Die in der Definition verwendeten Variablen `a,b,c,c2` sind lokale Variablen und stehen außerhalb der Funktionsdefinition nicht zur Verfügung. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2b68ec32",
"metadata": {},
"outputs": [],
"source": [
"#| error: true\n",
"x = 3\n",
"z = hypotenuse(x, 4)\n",
"println(\"z = $z\")\n",
"println(\"c = $c\")"
]
},
{
"cell_type": "markdown",
"id": "d62b25c3",
"metadata": {},
"source": [
"Sehr einfache Funktionen können auch als Einzeiler definiert werden.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "436bf54a",
"metadata": {},
"outputs": [],
"source": [
"hypotenuse(a, b) = sqrt(a^2+b^2)"
]
},
{
"cell_type": "markdown",
"id": "13485711",
"metadata": {},
"source": [
"## Tests\n",
"Tests liefern einen Wahrheitswert zurück. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fbfc37d5",
"metadata": {},
"outputs": [],
"source": [
"x = 3^2\n",
"x < 2^3"
]
},
{
"cell_type": "markdown",
"id": "d43e3179",
"metadata": {},
"source": [
"Neben den üblichen arithmetischen Vergleichen `==, !=, <, <= ,> ,>=` \n",
"gibt es noch viele andere Tests. Natürlich kann man das Ergebnis eines Tests auch einer Variablen zuweisen, welche dann vom Typ `Bool` ist. Die logischen Operatoren `&&`, `||` und Negation `!` können in Tests verwendet werden. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7e289c8e",
"metadata": {},
"outputs": [],
"source": [
"test1 = \"Auto\" in [\"Fahrrad\", \"Auto\", \"Bahn\"]\n",
"test2 = x == 100 || !(x <= 30 && x > 8)\n",
"test3 = startswith(\"Lampenschirm\", \"Lamp\") \n",
"println(\"$test1 $test2 $test3\")"
]
},
{
"cell_type": "markdown",
"id": "0ca8fc84",
"metadata": {},
"source": [
"## Verzweigungen\n",
"Verzweigungen (bedingte Anweisungen) haben die Form \n",
"\n",
"```default\n",
"if <Test> \n",
" <Anweisung1> \n",
" <Anweisung2>\n",
" ...\n",
"end\n",
"``` \n",
"\n",
"\n",
"Ein `else`-Zweig und `elseif`-Zweige sind möglich.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6ab36f93",
"metadata": {},
"outputs": [],
"source": [
"x = sqrt(100)\n",
"\n",
"if x > 20\n",
" println(\"Seltsam!\")\n",
"else\n",
" println(\"OK\")\n",
" y = x + 3\n",
"end "
]
},
{
"cell_type": "markdown",
"id": "3247aa40",
"metadata": {},
"source": [
"Einrückungen verbessern die Lesbarkeit, sind aber fakultativ. Zeilenumbrüche trennen Anweisungen. Das ist auch durch Semikolon möglich. Obiger Codeblock ist für Julia identisch zu folgender Zeile:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6b6f3846",
"metadata": {},
"outputs": [],
"source": [
"# Bitte nicht so programmieren! Sie werden es bereuen!\n",
"x=sqrt(100); if x > 20 println(\"Seltsam!\") else println(\"OK\"); y = x + 3 end "
]
},
{
"cell_type": "markdown",
"id": "4f8718ea",
"metadata": {},
"source": [
"Es wird dringend empfohlen, von Anfang an den eigenen Code übersichtlich mit sauberen Einrückungen zu formatieren!\n",
"\n",
"\n",
"## Einfache `for`-Schleifen\n",
"\n",
"zum wiederholten Abarbeiten von Anweisungen haben die Form\n",
"```default\n",
"for <Zähler> = Start:Ende\n",
" <Anweisung1> \n",
" <Anweisung2>\n",
" ...\n",
"end\n",
"```\n",
"Beispiel:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e2518e65",
"metadata": {},
"outputs": [],
"source": [
"sum = 0\n",
"for i = 1:100\n",
" sum = sum + i\n",
"end \n",
"sum"
]
},
{
"cell_type": "markdown",
"id": "3fa36879",
"metadata": {},
"source": [
"## Arrays\n",
"1-dimensionale Arrays (Vektoren) sind eine einfache Form von Containern. Man kann sie mit echigen Klammern anlegen\n",
"und auf die Elemente per Index zugreifen. Die Indizierung beginnt mit 1. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cf56b9fc",
"metadata": {},
"outputs": [],
"source": [
"v = [12, 33.2, 17, 19, 22]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2e6ae1f4",
"metadata": {},
"outputs": [],
"source": [
"typeof(v)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "18a71a80",
"metadata": {},
"outputs": [],
"source": [
"v[1] = v[4] + 10\n",
"v"
]
},
{
"cell_type": "markdown",
"id": "6833c60b",
"metadata": {},
"source": [
"Man kann leere Vektoren anlegen und sie verlängern.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "49a0d406",
"metadata": {},
"outputs": [],
"source": [
"v = [] # leerer Vektor\n",
"push!(v, 42)\n",
"push!(v, 13)\n",
"v"
]
},
{
"cell_type": "markdown",
"id": "ca3e6d8e",
"metadata": {},
"source": [
":::{.callout-note icon=\"false\" .titlenormal collapse=\"true\" font-variant-ligatures=\"no-contextual\" }\n",
"\n",
"## Nachtrag: wie die Wirkung der Tab-Taste auf dieser Seite simuliert wurde...\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "087b10f7",
"metadata": {},
"outputs": [],
"source": [
"using REPL\n",
"\n",
"function Tab(s)\n",
" l = filter(x->startswith(x,s), REPL.doc_completions(s))\n",
" println.(l[2:end])\n",
" return # return nothing, since broadcast println produces empty vector\n",
"end\n",
"\n",
"▷ = |> # https://docs.julialang.org/en/v1/manual/functions/#Function-composition-and-piping\n",
"\n",
"pri = \"pri\";"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0b8be63e",
"metadata": {},
"outputs": [],
"source": [
"pri ▷ Tab"
]
},
{
"cell_type": "markdown",
"id": "cd067cf0",
"metadata": {},
"source": [
":::"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -0,0 +1,493 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "cd3f6abe",
"metadata": {},
"source": [
"# First Contact\n",
"\n",
"Dieses Kapitel enthält einige \"pädagogische Halbwahrheiten\", d.h., es vereinfacht und lässt Details weg.\n",
"\n",
"## Julia als Taschenrechner\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0dbe789e",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:34.132000Z",
"iopub.status.busy": "2023-03-08T16:05:33.746000Z",
"iopub.status.idle": "2023-03-08T16:05:37.286000Z",
"shell.execute_reply": "2023-03-08T16:05:37.175000Z"
}
},
"outputs": [],
"source": [
"#| eval: true\n",
"#| echo: false\n",
"#| output: false\n",
"IJulia.set_verbose(true)"
]
},
{
"cell_type": "markdown",
"id": "a2b52996",
"metadata": {},
"source": [
"Berechne $\\qquad 12^{1/3} + \\frac{3\\sqrt{2}}{\\sin(0.5)-\\cos(\\frac{\\pi}{4})\\log(3)}+ e^5$\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c831420f",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:37.336000Z",
"iopub.status.busy": "2023-03-08T16:05:37.335000Z",
"iopub.status.idle": "2023-03-08T16:05:37.620000Z",
"shell.execute_reply": "2023-03-08T16:05:37.618000Z"
}
},
"outputs": [],
"source": [
"12^(1/3) + 3sqrt(2) / (sin(.5) - cos(pi/4)*log(3)) + exp(5)"
]
},
{
"cell_type": "markdown",
"id": "a9f3359b",
"metadata": {},
"source": [
"Man beachte:\n",
"\n",
"- Potenzen schreibt man `a^b`.\n",
"- Die Konstante `pi` ist vordefiniert.\n",
"- `log()` ist der natürliche Logarithmus.\n",
"- Das Multiplikationszeichen `a*b` kann nach einer Zahl weggelassen werden, wenn eine Variable, Funktion oder Klammer folgt.\n",
"\n",
"\n",
"## Variablen und Zuweisungen\n",
"\n",
"Variablen entstehen durch Zuweisung *(assignment)*. Durch Zuweisung definierte Variablen können danach in weiteren Anweisungen verwendet werden.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5ff20c70",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:37.625000Z",
"iopub.status.busy": "2023-03-08T16:05:37.624000Z",
"iopub.status.idle": "2023-03-08T16:05:37.657000Z",
"shell.execute_reply": "2023-03-08T16:05:37.655000Z"
}
},
"outputs": [],
"source": [
"x = 1 + sqrt(5) \n",
"y = x / 2"
]
},
{
"cell_type": "markdown",
"id": "e7db7bb5",
"metadata": {},
"source": [
":::{.indentb}\n",
"Zuweisungen sind keine mathematischen Gleichungen. Die Semantik des Zuweisungsoperators (d.h., des Gleichheitszeichens) ist: \n",
"\n",
"- berechne die rechte Seite und\n",
"- weise das Ergebnis der linken Seite zu.\n",
"\n",
"Ausdrücke wie `x + y = sin(2)` sind daher unzulässig, links darf nur ein Variablenname stehen.\n",
":::\n",
"\n",
"\n",
"## Datentypen\n",
"\n",
"Julia ist eine [stark typisierte](https://de.wikipedia.org/wiki/Starke_Typisierung) Sprache. Alle Objekte haben einen Typ. \n",
"So gibt es unter anderem die Basistypen \n",
"\n",
"- Ganze Zahlen *(integers)*,\n",
"- Gleitkommazahlen *(floating point numbers)*,\n",
"- Zeichenketten *(strings)* und \n",
"- Wahrheitswerte *(booleans)*.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ae3af394",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:37.662000Z",
"iopub.status.busy": "2023-03-08T16:05:37.661000Z",
"iopub.status.idle": "2023-03-08T16:05:38.219000Z",
"shell.execute_reply": "2023-03-08T16:05:38.217000Z"
}
},
"outputs": [],
"source": [
"#| warning: true\n",
"#| error: true\n",
"for x ∈ (42, 12.0, 3.3e4, \"Hallo!\", true)\n",
" println(\"x = \", x, \" ..... Typ: \", typeof(x))\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "213bef1c",
"metadata": {},
"source": [
"Die Standard-Gleitkommazahl hat eine Länge von 64 Bit, entspricht also einer `double` in C/C++/Java.\n",
"\n",
"Julia ist eine [dynamisch typisierte](https://de.wikipedia.org/wiki/Dynamische_Typisierung) Sprache. \n",
"Variablen haben keinen Typ. Sie sind typlose Referenzen (Zeiger) auf Objekte. \n",
"Wenn man vom „Typ einer Variablen“ spricht, meint man den Typ des Objektes, das der Variablen gerade zugewiesen ist. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2d6c0d1b",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:38.225000Z",
"iopub.status.busy": "2023-03-08T16:05:38.223000Z",
"iopub.status.idle": "2023-03-08T16:05:38.316000Z",
"shell.execute_reply": "2023-03-08T16:05:38.315000Z"
}
},
"outputs": [],
"source": [
"x = sqrt(2)\n",
"println( typeof(x) )\n",
"x = \"Jetzt bin ich keine Gleitkommazahl mehr!\"\n",
"println( typeof(x) )"
]
},
{
"cell_type": "markdown",
"id": "f2329446",
"metadata": {},
"source": [
"## Druckanweisungen\n",
"Die Funktion `println()` unterscheidet sich von `print()` dadurch, dass sie am Ende einen Zeilenvorschub ausgibt.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d4a7260d",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:38.321000Z",
"iopub.status.busy": "2023-03-08T16:05:38.320000Z",
"iopub.status.idle": "2023-03-08T16:05:38.369000Z",
"shell.execute_reply": "2023-03-08T16:05:38.367000Z"
}
},
"outputs": [],
"source": [
"print(y)\n",
"print(\"...die Zeile geht weiter...\")\n",
"print(\"immernoch...\")\n",
"println(y)\n",
"println(\"Neue Zeile\")\n",
"println(\"Neue Zeile\")"
]
},
{
"cell_type": "markdown",
"id": "dccc9577",
"metadata": {},
"source": [
"Beide Funkionen können als Argument eine Liste von *strings* und Variablen bekommen. Man kann Variablen auch in *strings* einbetten, indem man dem Variablennamen ein Dollarzeichen voranstellt *(string interpolation)*.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7a2116bd",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:38.374000Z",
"iopub.status.busy": "2023-03-08T16:05:38.373000Z",
"iopub.status.idle": "2023-03-08T16:05:38.402000Z",
"shell.execute_reply": "2023-03-08T16:05:38.400000Z"
}
},
"outputs": [],
"source": [
"x = 23\n",
"y = 3x + 5\n",
"zz = \"Fertig!\"\n",
"println(\"x= \", x, \" ...und y= \", y, \"...\", zz) # 1. Variante\n",
"println(\"x= $x ...und y= $y...$zz\") # Variante mit string interpolation"
]
},
{
"cell_type": "markdown",
"id": "ae5eaf6f",
"metadata": {},
"source": [
":::{.indentb}\n",
"Wenn man ein Dollarzeichen drucken will, muss man einen *backslash* voranstellen. Wenn man einen *backslash* drucken will, muss man ihn verdoppeln.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f7d26a60",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:38.407000Z",
"iopub.status.busy": "2023-03-08T16:05:38.406000Z",
"iopub.status.idle": "2023-03-08T16:05:38.434000Z",
"shell.execute_reply": "2023-03-08T16:05:38.432000Z"
}
},
"outputs": [],
"source": [
"println(\"Ein Dollar: 1\\$ und drei backslashs: \\\\\\\\\\\\ \")"
]
},
{
"cell_type": "markdown",
"id": "f40cee12",
"metadata": {},
"source": [
":::\n",
"\n",
"## Funktionen\n",
"Funktionsdefinitionen beginnen mit dem Schlüsselwort `function` und enden mit dem Schlüsselwort `end`. In der Regel haben sie eine oder mehrere Argumente und geben beim Aufruf ein berechnetes Objekt mit der `return`-Anweisung zurück.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b6574086",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:38.439000Z",
"iopub.status.busy": "2023-03-08T16:05:38.438000Z",
"iopub.status.idle": "2023-03-08T16:05:38.633000Z",
"shell.execute_reply": "2023-03-08T16:05:38.631000Z"
}
},
"outputs": [],
"source": [
"function hypotenuse(a, b)\n",
" c2 = a^2 + b^2\n",
" c = sqrt(c2)\n",
" return c \n",
"end"
]
},
{
"cell_type": "markdown",
"id": "d70272a0",
"metadata": {},
"source": [
"Nach ihrer Definition kann die Funktion benutzt (aufgerufen) werden. Die in der Definition verwendeten Variablen `a,b,c,c2` sind lokale Variablen und stehen außerhalb der Funktionsdefinition nicht zur Verfügung. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5df842f6",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:38.638000Z",
"iopub.status.busy": "2023-03-08T16:05:38.636000Z",
"iopub.status.idle": "2023-03-08T16:05:39.346000Z",
"shell.execute_reply": "2023-03-08T16:05:39.344000Z"
}
},
"outputs": [],
"source": [
"#| error: true\n",
"x = 3\n",
"z = hypotenuse(x, 4)\n",
"println(z)\n",
"println(c)"
]
},
{
"cell_type": "markdown",
"id": "dc012140",
"metadata": {},
"source": [
"Sehr einfache Funktionen können auch kürzer als Einzeiler definiert werden.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6aec78b0",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:39.351000Z",
"iopub.status.busy": "2023-03-08T16:05:39.350000Z",
"iopub.status.idle": "2023-03-08T16:05:39.381000Z",
"shell.execute_reply": "2023-03-08T16:05:39.379000Z"
}
},
"outputs": [],
"source": [
"hypotenuse(a, b) = sqrt(a^2+b^2)"
]
},
{
"cell_type": "markdown",
"id": "d57bc14f",
"metadata": {},
"source": [
"## Tests\n",
"Tests liefern einen Wahrheitswert zurück. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0e42d502",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:39.387000Z",
"iopub.status.busy": "2023-03-08T16:05:39.386000Z",
"iopub.status.idle": "2023-03-08T16:05:39.420000Z",
"shell.execute_reply": "2023-03-08T16:05:39.418000Z"
}
},
"outputs": [],
"source": [
"x = 2^8\n",
"x < 3"
]
},
{
"cell_type": "markdown",
"id": "814e4e5c",
"metadata": {},
"source": [
"Neben den üblichen arithmetischen Vergleichen `==, !=, <, <= ,> ,>=` \n",
"gibt es noch viele andere Tests. Natürlich kann man das Ergebnis eines Tests auch einer Variablen zuweisen, welche dann vom Typ `Bool` ist. Die logischen Operatoren `&&`, `||` und Negation `!` können in Tests verwendet werden. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3899c1c9",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:39.425000Z",
"iopub.status.busy": "2023-03-08T16:05:39.424000Z",
"iopub.status.idle": "2023-03-08T16:05:39.479000Z",
"shell.execute_reply": "2023-03-08T16:05:39.477000Z"
}
},
"outputs": [],
"source": [
"test1 = \"Auto\" in [\"Fahrrad\", \"Auto\", \"Bahn\"]\n",
"test2 = x == 100 || x in [1,2,4,7]\n",
"test3 = startswith(\"Lampenschirm\", \"Lamp\") \n",
"println(\"$test1 $test2 $test3\")"
]
},
{
"cell_type": "markdown",
"id": "067897ae",
"metadata": {},
"source": [
"## Verzweigungen\n",
"Verzweigungen (bedingte Anweisungen) haben die Form `if <Test> <Anweisungen> end`. Ein `else`-Zweig ist möglich.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "34db87a5",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:39.484000Z",
"iopub.status.busy": "2023-03-08T16:05:39.483000Z",
"iopub.status.idle": "2023-03-08T16:05:39.518000Z",
"shell.execute_reply": "2023-03-08T16:05:39.516000Z"
}
},
"outputs": [],
"source": [
"x = sqrt(100)\n",
"\n",
"if x > 20\n",
" println(\"Seltsam!\")\n",
"else\n",
" println(\"OK\")\n",
" y = x + 3\n",
"end "
]
},
{
"cell_type": "markdown",
"id": "2c0677f6",
"metadata": {},
"source": [
"Einrückungen und Zeilenumbrüche verbessern die Lesbarkeit, sind aber fakultativ. Anweisungen können auch durch Semikolon getrennt werden.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3b169201",
"metadata": {
"execution": {
"iopub.execute_input": "2023-03-08T16:05:39.523000Z",
"iopub.status.busy": "2023-03-08T16:05:39.521000Z",
"iopub.status.idle": "2023-03-08T16:05:39.554000Z",
"shell.execute_reply": "2023-03-08T16:05:39.552000Z"
}
},
"outputs": [],
"source": [
"if x > 20 println(\"Seltsam!\") else println(\"OK\"); y = x + 3 end "
]
},
{
"cell_type": "markdown",
"id": "f225e8eb",
"metadata": {},
"source": [
"## Einfache Schleifen\n",
"\n",
"\n",
"\n",
"## Arrays\n",
"1-dimensionale Arrays (Vektoren) sind eine einfache Form von Containern. Man kann sie mit echigen Klammern anlegen\n",
"\n",
"\n",
"und auf die Elemente per Index zugreifen. Die Indizierung beginnt mit 1. \n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

114
nb/intro.ipynb Normal file
View File

@ -0,0 +1,114 @@
{
"cells": [
{
"cell_type": "raw",
"id": "10c7d783",
"metadata": {},
"source": [
"---\n",
"title: Introduction\n",
"---"
]
},
{
"cell_type": "markdown",
"id": "f2e8fc05",
"metadata": {},
"source": [
"## Noch eine Programmiersprache?\n",
"\n",
"Die Ziele der Schöpfer von Julia kann man in [Why we created Julia](https://julialang.org/blog/2012/02/why-we-created-julia/) nachlesen. Kurzfassung:\n",
"\n",
"“We want a language that is\n",
"\n",
"open source\n",
"with the speed of C\n",
"obvious, familiar mathematical notation like Matlab\n",
"as usable for general programming as Python\n",
"as easy for statistics as R\n",
"as natural for string processing as Perl\n",
"as powerful for linear algebra as Matlab\n",
"as good at gluing programs together as the shell\n",
"dirt simple to learn, yet keeps the most serious hackers happy”\n",
"\n",
"\n",
"\"Wir wollen eine Sprache, die\n",
"\n",
"- *open source* ist \n",
"- die Geschwindigkeit von C hat \n",
"- obvious, familiar mathematical notation like Matlab\n",
"- as usable for general programming as Python\n",
"- as easy for statistics as R\n",
"- as natural for string processing as Perl\n",
"- as powerful for linear algebra as Matlab\n",
"- as good at gluing programs together as the shell\n",
"- dirt simple to learn, yet keeps the most serious hackers happy\"\n",
"\n",
"vs code: erzeuge eine Datei mit der Endung `.jl`, starte ein REPL mit dem Kommando \n",
"Alt-Enter am Ende einer Zeile oder Anweisung f\"uhrt dazu, dass die Anweisung \n",
"is REPL kopiert und ausgefuehrt wird\n",
"\n",
"alt-enter execute in julia Repl\n",
"shift-enter: ex. and move to next line\n",
"\n",
"die Erstinstallation von Paketen kann sehr lange dauern. \n",
"\n",
"im Jupyterhub sind die im Kurs nenötigten Pakete vorinstalliert. \n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"## colored console graphs produced by `Benchmarktools.jl`\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "62fcada8",
"metadata": {},
"outputs": [],
"source": [
"using BenchmarkTools\n",
"\n",
"@benchmark sum(rand(1000))"
]
},
{
"cell_type": "markdown",
"id": "00dc9599",
"metadata": {},
"source": [
"## structure of floating point numbers\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ccc6afab",
"metadata": {},
"outputs": [],
"source": [
"function printbitsf64(x::Float64)\n",
" s = bitstring(x)\n",
" printstyled(s[1], color = :blue, reverse=true)\n",
" printstyled(s[2:12], color = :green, reverse=true)\n",
" printstyled(s[13:end], color=:red, bold=true, reverse=true)\n",
" print(\"\\n\")\n",
"end\n",
"\n",
"printbitsf64(27.56640625)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

77
nb/makie.ipynb Normal file
View File

@ -0,0 +1,77 @@
{
"cells": [
{
"cell_type": "raw",
"id": "7d6e8e63",
"metadata": {},
"source": [
"---\n",
"title: makie\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fff03da7",
"metadata": {},
"outputs": [],
"source": [
"using CairoMakie\n",
"\n",
"\n",
"f = Figure()\n",
"Axis(f[1, 1])\n",
"\n",
"xs = 1:0.2:10\n",
"ys_low = -0.2 .* sin.(xs) .- 0.25\n",
"ys_high = 0.2 .* sin.(xs) .+ 0.25\n",
"\n",
"band!(xs, ys_low, ys_high)\n",
"band!(xs, ys_low .- 1, ys_high .-1, color = :red)\n",
"\n",
"f"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "242380da",
"metadata": {},
"outputs": [],
"source": [
"f = Figure()\n",
"Axis(f[1, 1])\n",
"\n",
"xs = LinRange(0, 10, 100)\n",
"ys = LinRange(0, 15, 100)\n",
"zs = [cos(x) * sin(y) for x in xs, y in ys]\n",
"\n",
"contour!(zs,levels=-1:0.1:1)\n",
"\n",
"f"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ff5c9a2d",
"metadata": {},
"outputs": [],
"source": [
"fig, ax, hm = heatmap(randn(20, 20))\n",
"Colorbar(fig[1, 2], hm)\n",
"fig"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

1407
nb/numerictypes.ipynb Normal file

File diff suppressed because it is too large Load Diff

746
nb/pcomplex.ipynb Normal file
View File

@ -0,0 +1,746 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "3b9e97dc",
"metadata": {},
"source": [
"# Ein Fallbeispiel: Der parametrisierte Datentyp PComplex\n",
"\n",
"Wir wollen als neuen numerischen Typen **komplexe Zahlen in Polardarstellung $z=r e^{i\\phi}=(r,ϕ)$** einführen. \n",
"\n",
"- Der Typ soll sich in die Typhierarchie einfügen als Subtyp von 'Number'.\n",
"- $r$ und $\\phi$ sollen Gleitkommazahlen sein. (Im Unterschied zu komplexen Zahlen in 'kartesischen' Koordinaten hat eine Einschränkung auf ganzzahlige Werte von r oder ϕ mathematisch wenig Sinn.)\n",
"\n",
"## Die Definition von `PComplex`\n",
"\n",
"Ein erster Versuch könnte so aussehen:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b00fa817",
"metadata": {},
"outputs": [],
"source": [
"struct PComplex1{T <: AbstractFloat} <: Number\n",
" r :: T\n",
" ϕ :: T\n",
"end\n",
"\n",
"z1 = PComplex1(-32.0, 33.0)\n",
"z2 = PComplex1{Float32}(12, 13)\n",
"@show z1 z2;"
]
},
{
"cell_type": "markdown",
"id": "00603f51",
"metadata": {},
"source": [
"Julia stellt automatisch *default constructors* zur Verfügung:\n",
"\n",
"- den Konstruktor `PComplex1`, bei dem der Typ `T` von den übergebenen Argumenten abgeleitet wird und\n",
"- Konstruktoren `PComplex{Float64},...` mit expliziter Typangabe. Hier wird versucht, die Argumente in den angeforderten Typ zu konvertieren. \n",
"\n",
"------\n",
"\n",
"Wir wollen nun, dass der Konstruktor noch mehr tut. \n",
"In der Polardarstellung soll $0\\le r$ und $0\\le \\phi<2\\pi$ gelten.\n",
"\n",
"Wenn die übergebenen Argumente das nicht erfüllen, sollten sie entsprechend umgerechnet werden.\n",
"\n",
"Dazu definieren wir einen _inner constructor_, der den _default constructor_ ersetzt.\n",
"\n",
"- Ein _inner constructor_ ist eine Funktion innerhalb der `struct`-Definition.\n",
"- In einem _inner constructor_ kann man die spezielle Funktion `new` verwenden, die wie der _default constructor_ wirkt.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d583f845",
"metadata": {},
"outputs": [],
"source": [
"struct PComplex{T <: AbstractFloat} <: Number\n",
" r :: T\n",
" ϕ :: T\n",
"\n",
" function PComplex{T}(r::T, ϕ::T) where T<:AbstractFloat\n",
" if r<0 # flip the sign of r and correct phi\n",
" r = -r\n",
" ϕ += π\n",
" end\n",
" if r==0 ϕ=0 end # normalize r=0 case to phi=0 \n",
" ϕ = mod(ϕ, 2π) # map phi into interval [0,2pi)\n",
" new(r, ϕ) # new() ist special function,\n",
" end # available only inside inner constructors\n",
"\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e3d6ada4",
"metadata": {},
"outputs": [],
"source": [
"#| echo: false\n",
"#| output: false\n",
"\n",
"#=\n",
"in den ganzen quarto-runs wollen bir hier noch das default-show benutzen\n",
"=#\n",
"zz = @which Base.show(stdout, PComplex{Float64}(2.,3.))\n",
"if zz.module != Base\n",
" Base.delete_method(zz)\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "55f6b7dc",
"metadata": {},
"outputs": [],
"source": [
"z1 = PComplex{Float64}(-3.3, 7π+1)"
]
},
{
"cell_type": "markdown",
"id": "99f6d6e1",
"metadata": {},
"source": [
"Für die explizite Angabe eines *inner constructors* müssen wir allerdings einen Preis zahlen: Die sonst von Julia bereitgestellten *default constructors* fehlen. \n",
"\n",
"Den Konstruktor, der ohne explizite Typangabe in geschweiften Klammern auskommt und den Typ der Argumente übernimmt, wollen wir gerne auch haben:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e6c36f18",
"metadata": {},
"outputs": [],
"source": [
"PComplex(r::T, ϕ::T) where {T<:AbstractFloat} = PComplex{T}(r,ϕ)\n",
"\n",
"z2 = PComplex(2.0, 0.3)"
]
},
{
"cell_type": "markdown",
"id": "5d77812c",
"metadata": {},
"source": [
"## Eine neue Schreibweise\n",
"\n",
"Julia verwendet `//` als Infix-Konstruktor für den Typ `Rational`. Sowas Schickes wollen wir auch. \n",
"\n",
"In der Elektronik/Elektrotechnik werden [Wechselstromgrößen durch komplexe Zahlen beschrieben.](https://de.wikipedia.org/wiki/Komplexe_Wechselstromrechnung). Dabei ist eine Darstellung komplexer Zahlen durch \"Betrag\" und \"Phase\" üblich und sie wird gerne in der sogenannten [Versor-Form](https://de.wikipedia.org/wiki/Versor) (engl. *phasor*) dargestellt:\n",
"$$\n",
" z= r\\enclose{phasorangle}{\\phi} = 3.4\\;\\enclose{phasorangle}{45^\\circ}\n",
"$$\n",
"wobei man in der Regel den Winkel in Grad notiert. \n",
"\n",
":::{.callout-note .titlenormal collapse=\"true\"}\n",
"\n",
"## Mögliche Infix-Operatoren in Julia\n",
"\n",
"In Julia ist eine große Anzahl von Unicode-Zeichen reserviert für die Verwendung als Operatoren. Die definitive Liste ist im [Quellcode des Parsers.](https://github.com/JuliaLang/julia/blob/eaa2c58aeb12f27c1d8c116ab111773a4fc4495f/src/julia-parser.scm#L13-L31)\n",
"\n",
"Auf Details werden wir in einem späteren Kapitel noch eingehen. \n",
"\n",
"Und ja, der Julia-Parser ist in einem Lisp(genauer: Scheme)-Dialekt geschrieben. In Julia ist ein kleiner Scheme-Interpreter namens [femtolisp](https://github.com/JeffBezanson/femtolisp) integriert. Geschrieben hat ihn einer der \"Väter\" von Julia bevor er mit der Arbeit an Julia begann. \n",
"\n",
":::\n",
"\n",
"Das Winkel-Zeichen `∠` steht leider nicht als Operatorsymbol zur Verfügung. Wir weichen aus auf `⋖`. Das kann in Julia als als `\\lessdot<tab>` eingegeben werden.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a4fc6d3c",
"metadata": {},
"outputs": [],
"source": [
" ⋖(r::Real, ϕ::Real) = PComplex(r, π*ϕ/180)\n",
"\n",
"z3 = 2. ⋖ 90."
]
},
{
"cell_type": "markdown",
"id": "c19f6e25",
"metadata": {},
"source": [
"(Die Typ-Annotation -- `Real` statt `AbstractFloat` -- ist ein Vorgriff auf kommende weitere Konstruktoren. Im Moment funktioniert der Operator `⋖` erstmal nur mit `Float`s.)\n",
"\n",
"\n",
"Natürlich wollen wir auch die Ausgabe so schön haben. Details dazu findet man in der [Dokumentation](https://docs.julialang.org/en/v1/manual/types/#man-custom-pretty-printing).\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "13e750ef",
"metadata": {},
"outputs": [],
"source": [
"using Printf\n",
"\n",
"function Base.show(io::IO, z::PComplex)\n",
" # wir drucken die Phase in Grad, auf Zehntelgrad gerundet, \n",
" p = z.ϕ * 180/π\n",
" sp = @sprintf \"%.1f\" p\n",
" print(io, z.r, \"⋖\", sp, '°')\n",
"end\n",
"\n",
"@show z3;"
]
},
{
"cell_type": "markdown",
"id": "e1c7d6fa",
"metadata": {},
"source": [
"## Methoden für `PComplex`\n",
"\n",
"Damit unser Typ ein anständiges Mitglied der von `Number` abstammenden Typfamilie wird, brauchen wir allerdings noch eine ganze Menge mehr. Es müssen Arithmetik, Vergleichsoperatoren, Konvertierungen usw. definiert werden. \n",
"\n",
"\n",
"Wir beschränken uns auf Multiplikation und Quadratwurzeln.\n",
"\n",
"\n",
":::{.callout-note collapse=\"true\"}\n",
"## Module \n",
"\n",
"- Um die `methods` der existierenden Funktionen und Operationen zu ergänzen, muss man diese mit ihrem 'vollen Namen' ansprechen.\n",
"- Alle Objekte gehören zu einem Namensraum oder `module`.\n",
"- Die meisten Basisfunktionen gehören zum Modul `Base`, welches standardmäßig immer ohne explizites `using ...` geladen wird. \n",
"- Solange man keine eigenen Module definiert, sind die eigenen Definitionen im Modul `Main`.\n",
"- Das Macro `@which`, angewendet auf einen Namen, zeigt an, in welchem Modul der Name definiert wurde. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "373829e0",
"metadata": {},
"outputs": [],
"source": [
"f(x) = 3x^3\n",
"@which f"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a4490292",
"metadata": {},
"outputs": [],
"source": [
"wp = @which +\n",
"ws = @which(sqrt)\n",
"println(\"Modul für Addition: $wp, Modul für sqrt: $ws\")"
]
},
{
"cell_type": "markdown",
"id": "d49ec514",
"metadata": {},
"source": [
":::\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d2186aeb",
"metadata": {},
"outputs": [],
"source": [
"qwurzel(z::PComplex) = PComplex(sqrt(z.r), z.ϕ / 2)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5d93d3ca",
"metadata": {},
"outputs": [],
"source": [
"#| echo: false\n",
"#| output: false\n",
"\n",
"#=\n",
"damit das length(methods(sqrt)) klappt\n",
"=#\n",
"if hasmethod(sqrt, (PComplex,))\n",
" zz = @which Base.sqrt(PComplex{Float64}(1.,1.))\n",
" Base.delete_method(zz)\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "07ed8595",
"metadata": {},
"source": [
"Die Funktion `sqrt()` hat schon einige Methoden:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1ecfd1ac",
"metadata": {},
"outputs": [],
"source": [
"length(methods(sqrt))"
]
},
{
"cell_type": "markdown",
"id": "f619c771",
"metadata": {},
"source": [
"Jetzt wird es eine Methode mehr:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "56a4ce0f",
"metadata": {},
"outputs": [],
"source": [
"Base.sqrt(z::PComplex) = qwurzel(z)\n",
"\n",
"length(methods(sqrt))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "195204e7",
"metadata": {},
"outputs": [],
"source": [
"sqrt(z2)"
]
},
{
"cell_type": "markdown",
"id": "c912bcd2",
"metadata": {},
"source": [
"und nun zur Multiplikation:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8c648a2d",
"metadata": {},
"outputs": [],
"source": [
"Base.:*(x::PComplex, y::PComplex) = PComplex(x.r * y.r, x.ϕ + y.ϕ)\n",
"\n",
"@show z1 * z2;"
]
},
{
"cell_type": "markdown",
"id": "79074b01",
"metadata": {},
"source": [
"(Da das Operatorsymbol kein normaler Name ist, muss der Doppelpunkt bei der Zusammensetzung mit `Base.` sein.)\n",
"\n",
"Wir können allerdings noch nicht mit anderen numerischen Typen multiplizieren. Dazu könnte man nun eine Vielzahl von entsprechenden Methoden definieren. Julia stellt *für numerische Typen* noch einen weiteren Mechanismus zur Verfügung, der das etwas vereinfacht.\n",
"\n",
"\n",
"## Typ-Promotion und Konversion \n",
"\n",
"In Julia kann man bekanntlich die verschiedensten numerischen Typen nebeneinander verwenden.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ff3ee027",
"metadata": {},
"outputs": [],
"source": [
"1//3 + 5 + 5.2 + 0xff"
]
},
{
"cell_type": "markdown",
"id": "f43ef8c6",
"metadata": {},
"source": [
"Wenn man in die zahlreichen Methoden schaut, die z.B. für `+` und `*` definiert sind, findet man u.a. eine Art 'catch-all-Definition'\n",
"\n",
"```julia\n",
"+(x::Number, y::Number) = +(promote(x,y)...)\n",
"*(x::Number, y::Number) = *(promote(x,y)...)\n",
"```\n",
"\n",
"\n",
"\n",
"(Die 3 Punkte sind der splat-Operator, der das von promote() zurückgegebene Tupel wieder in seine Bestandteile zerlegt.)\n",
"\n",
"Da die Methode mit den Typen `(Number, Number)` sehr allgemein ist, wird sie erst verwendet, wenn spezifischere Methoden nicht greifen.\n",
"\n",
"Was passiert hier?\n",
"\n",
"### Die Funktion `promote(x,y,...)`\n",
"\n",
"Diese Funktion versucht, alle Argumente in einen gemeinsamen Typen umzuwandeln, der alle Werte (möglichst) exakt darstellen kann.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8f1d4d57",
"metadata": {},
"outputs": [],
"source": [
"promote(12, 34.555, 77/99, 0xff)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "27c2724e",
"metadata": {},
"outputs": [],
"source": [
"z = promote(BigInt(33), 27)\n",
"@show z typeof(z);"
]
},
{
"cell_type": "markdown",
"id": "8347acad",
"metadata": {},
"source": [
"Die Funktion `promote()` verwendet dazu zwei Helfer, die Funktionen\n",
" `promote_type(T1, T2)` und `convert(T, x)`\n",
"\n",
"Wie üblich in Julia, kann man diesen Mechanismus durch [eigene *promotion rules* und `convert(T,x)`-Methoden erweitern.](https://docs.julialang.org/en/v1/manual/conversion-and-promotion/) \n",
"\n",
"\n",
"### Die Funktion `promote_type(T1, T2,...)` \n",
"\n",
"Sie ermittelt, zu welchem Typ umgewandelt werden soll. Argumente sind Typen, nicht Werte.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fe551c95",
"metadata": {},
"outputs": [],
"source": [
"@show promote_type(Rational{Int64}, ComplexF64, Float32);"
]
},
{
"cell_type": "markdown",
"id": "e4c08732",
"metadata": {},
"source": [
"### Die Funktion `convert(T,x)`\n",
"\n",
"Die Methoden von \n",
"`convert(T, x)` wandeln `x` in ein Objekt vom Typ `T` um. Dabei sollte eine solche Umwandlung verlustfrei möglich sein.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5d6aabe4",
"metadata": {},
"outputs": [],
"source": [
"z = convert(Float64, 3)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8b5205d2",
"metadata": {},
"outputs": [],
"source": [
"z = convert(Int64, 23.00)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0d4b80ce",
"metadata": {},
"outputs": [],
"source": [
"z = convert(Int64, 2.3)"
]
},
{
"cell_type": "markdown",
"id": "3e3d953b",
"metadata": {},
"source": [
"Die spezielle Rolle von `convert()` liegt darin, dass es an verschiedenen Stellen _implizit_ und automatisch eingesetzt wird: \n",
"\n",
"> [The following language constructs call convert](https://docs.julialang.org/en/v1/manual/conversion-and-promotion/#When-is-convert-called?):\n",
"> \n",
" - Assigning to an array converts to the array's element type.\n",
" - Assigning to a field of an object converts to the declared type of the field.\n",
" - Constructing an object with new converts to the object's declared field types.\n",
" - Assigning to a variable with a declared type (e.g. local x::T) converts to that type.\n",
" - A function with a declared return type converts its return value to that type.\n",
"\n",
"-- und natürlich in `promote()`\n",
"\n",
"Für selbstdefinierte Datentypen kann man convert() um weitere Methoden ergänzen.\n",
"\n",
"Für Datentypen innerhalb der Number-Hierarchie gibt es wieder eine 'catch-all-Definition'\n",
"```julia\n",
"convert(::Type{T}, x::Number) where {T<:Number} = T(x)\n",
"```\n",
"\n",
"Also: Wenn für einen Typen `T` aus der Hierarchie `T<:Number` ein Konstruktor `T(x)` mit einem numerischen Argument `x` existiert, dann wird dieser Konstruktor `T(x)` automatisch für Konvertierungen benutzt. (Natürlich können auch speziellere Methoden für `convert()` definiert werden, die dann Vorrang haben.)\n",
"\n",
"\n",
"### Weitere Konstruktoren für `PComplex`\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2f9e1ebe",
"metadata": {},
"outputs": [],
"source": [
"## (a) r, ϕ beliebige Reals, z.B. Integers, Rationals\n",
"\n",
"PComplex{T}(r::T1, ϕ::T2) where {T<:AbstractFloat, T1<:Real, T2<: Real} = \n",
" PComplex{T}(convert(T, r), convert(T, ϕ))\n",
"\n",
"PComplex(r::T1, ϕ::T2) where {T1<:Real, T2<: Real} = \n",
" PComplex{promote_type(Float64, T1, T2)}(r, ϕ) \n",
"\n",
"## (b) Zur Umwandlung von Reals: Konstruktor mit \n",
"## nur einem Argument r\n",
"\n",
"PComplex{T}(r::S) where {T<:AbstractFloat, S<:Real} = \n",
" PComplex{T}(convert(T, r), convert(T, 0)) \n",
"\n",
"PComplex(r::S) where {S<:Real} = \n",
" PComplex{promote_type(Float64, S)}(r, 0.0)\n",
"\n",
"## (c) Umwandlung Complex -> PComplex\n",
"\n",
"PComplex{T}(z::Complex{S}) where {T<:AbstractFloat, S<:Real} = \n",
" PComplex{T}(abs(z), angle(z))\n",
"\n",
"PComplex(z::Complex{S}) where {S<:Real} = \n",
" PComplex{promote_type(Float64, S)}(abs(z), angle(z))\n"
]
},
{
"cell_type": "markdown",
"id": "c831e4c3",
"metadata": {},
"source": [
"Ein Test der neuen Konstruktoren:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8103dc03",
"metadata": {},
"outputs": [],
"source": [
"3//5 ⋖ 45, PComplex(Complex(1,1)), PComplex(-13) "
]
},
{
"cell_type": "markdown",
"id": "c85b8d7a",
"metadata": {},
"source": [
"Wir brauchen nun noch *promotion rules*, die festlegen, welcher Typ bei `promote(x::T1, y::T2)` herauskommen soll. Damit wird `promote_type()` intern um die nötigen weiteren Methoden erweitert. \n",
"\n",
"### *Promotion rules* für `PComplex`\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8e6a1e94",
"metadata": {},
"outputs": [],
"source": [
"Base.promote_rule(::Type{PComplex{T}}, ::Type{S}) where {T<:AbstractFloat,S<:Real} = \n",
" PComplex{promote_type(T,S)}\n",
"\n",
"Base.promote_rule(::Type{PComplex{T}}, ::Type{Complex{S}}) where \n",
" {T<:AbstractFloat,S<:Real} = PComplex{promote_type(T,S)}"
]
},
{
"cell_type": "markdown",
"id": "4ad30167",
"metadata": {},
"source": [
"1. Regel:\n",
": Wenn ein `PComplex{T}` und ein `S<:Real` zusammentreffen, dann sollen beide zu `PComplex{U}` umgewandelt werden, wobei `U` der Typ ist, zu dem `S` und `T` beide umgewandelt (_promoted_) werden können. \n",
"\n",
"2. Regel\n",
": Wenn ein `PComplex{T}` und ein `Complex{S}` zusammentreffen, dann sollen beide zu `PComplex{U}` umgewandelt werden, wobei `U` der Typ ist, zu dem `S` und `T` beide umgewandelt werden können. \n",
"\n",
"\n",
"\n",
"Damit klappt nun die Multiplikation mit beliebigen numerischen Typen.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9e72f683",
"metadata": {},
"outputs": [],
"source": [
"z3, 3z3"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f0aec53e",
"metadata": {},
"outputs": [],
"source": [
"(3.0+2im) * (12⋖30.3), 12sqrt(z2) "
]
},
{
"cell_type": "markdown",
"id": "0d881cc4",
"metadata": {},
"source": [
":::{.callout-caution icon=\"false\" collapse=\"true\" .titlenormal}\n",
"\n",
"## Zusammenfassung: unser Typ `PComplex`\n",
"\n",
"```julia\n",
"struct PComplex{T <: AbstractFloat} <: Number\n",
" r :: T\n",
" ϕ :: T\n",
"\n",
" function PComplex{T}(r::T, ϕ::T) where T<:AbstractFloat\n",
" if r<0 # flip the sign of r and correct phi\n",
" r = -r\n",
" ϕ += π\n",
" end\n",
" if r==0 ϕ=0 end # normalize r=0 case to phi=0 \n",
" ϕ = mod(ϕ, 2π) # map phi into interval [0,2pi)\n",
" new(r, ϕ) # new() ist special function,\n",
" end # available only inside inner constructors\n",
"\n",
"end\n",
"\n",
"# additional constructors\n",
"PComplex(r::T, ϕ::T) where {T<:AbstractFloat} = PComplex{T}(r,ϕ)\n",
"\n",
"\n",
"PComplex{T}(r::T1, ϕ::T2) where {T<:AbstractFloat, T1<:Real, T2<: Real} = \n",
" PComplex{T}(convert(T, r), convert(T, ϕ))\n",
"\n",
"PComplex(r::T1, ϕ::T2) where {T1<:Real, T2<: Real} = \n",
" PComplex{promote_type(Float64, T1, T2)}(r, ϕ) \n",
"\n",
"\n",
"PComplex{T}(r::S) where {T<:AbstractFloat, S<:Real} = \n",
" PComplex{T}(convert(T, r), convert(T, 0)) \n",
"\n",
"PComplex(r::S) where {S<:Real} = \n",
" PComplex{promote_type(Float64, S)}(r, 0.0)\n",
"\n",
"\n",
"PComplex{T}(z::Complex{S}) where {T<:AbstractFloat, S<:Real} = \n",
" PComplex{T}(abs(z), angle(z))\n",
"\n",
"PComplex(z::Complex{S}) where {S<:Real} = \n",
" PComplex{promote_type(Float64, S)}(abs(z), angle(z))\n",
"\n",
"# nice input\n",
"⋖(r::Real, ϕ::Real) = PComplex(r, π*ϕ/180)\n",
"\n",
"# nice output\n",
"using Printf\n",
"\n",
"function Base.show(io::IO, z::PComplex)\n",
" # wir drucken die Phase in Grad, auf Zehntelgrad gerundet, \n",
" p = z.ϕ * 180/π\n",
" sp = @sprintf \"%.1f\" p\n",
" print(io, z.r, \"⋖\", sp, '°')\n",
"end\n",
"\n",
"# arithmetic\n",
"Base.sqrt(z::PComplex) = PComplex(sqrt(z.r), z.ϕ / 2)\n",
"\n",
"Base.:*(x::PComplex, y::PComplex) = PComplex(x.r * y.r, x.ϕ + y.ϕ)\n",
"\n",
"# promotion rules\n",
"Base.promote_rule(::Type{PComplex{T}}, ::Type{S}) where \n",
" {T<:AbstractFloat,S<:Real} = PComplex{promote_type(T,S)}\n",
"\n",
"Base.promote_rule(::Type{PComplex{T}}, ::Type{Complex{S}}) where \n",
" {T<:AbstractFloat,S<:Real} = PComplex{promote_type(T,S)}\n",
"```\n",
":::\n",
"\n",
":::{.content-hidden unless-format=\"xxx\"}\n",
"\n",
"Jetzt geht sowas wie `PComplex(1, 0)` noch nicht. Wir wollen auch andere reelle Typen für `r` und `ϕ` zulassen. Der Einfachheit halber wandeln wir hier alles nach `Float64` um. Analog verfahren wir auch, wenn nur ein reelles oder komplexes Argument verwendet wird.\n",
"\n",
"```julia\n",
"PComplex(r::Real, ϕ::Real) = PComplex(Float64(r), Float64(ϕ))\n",
"PComplex(r::Real) = PComplex(Float64(r), 0.0)\n",
"PComplex(z::Complex) = PComplex(abs(z), angle(z))\n",
"\n",
"z3 = PComplex(-2); z4 = PComplex(3im)\n",
"@show z3 z4;\n",
"```\n",
"\n",
":::"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

7
nb/script1.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/bash
cp ../chapters/*.ipynb .
for i in *.ipynb
do
echo $i
jupyter nbconvert --inplace --clear-output --to notebook $i
done

167
nb/summary.ipynb Normal file
View File

@ -0,0 +1,167 @@
{
"cells": [
{
"cell_type": "raw",
"id": "bb4361d9",
"metadata": {},
"source": [
"---\n",
"title: summary\n",
"---"
]
},
{
"cell_type": "markdown",
"id": "58e5805d",
"metadata": {},
"source": [
"format:\n",
" html:\n",
" include-in-header:\n",
" text: |\n",
" <script type=\"application/javascript\">\n",
" requirejs.config({ baseUrl: '.',\n",
" //paths: {\n",
" // Plotly: 'plotly-latest.min.js'\n",
" // }\n",
" });\n",
" </script>\n",
"\n",
"\n",
"https://github.com/JuliaPlots/PlotlyJS.jl/issues/322\n",
"\n",
"In summary, this book has no content whatsoever.\n",
"\n",
"https://discourse.julialang.org/t/seven-lines-of-julia-examples-sought/50416\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "caf6e3b3",
"metadata": {},
"outputs": [],
"source": [
"#| error: false\n",
"using PlotlyJS, Random\n",
"using HypertextLiteral\n",
"using JSON, UUIDs\n",
"using Base64\n",
"\n",
"function IJulia.display_dict(p::PlotlyJS.SyncPlot)\n",
" Dict(\n",
" # \"application/vnd.plotly.v1+json\" => JSON.lower(p),\n",
" # \"text/plain\" => sprint(show, \"text/plain\", p),\n",
" \"text/html\" => let\n",
" buf = IOBuffer()\n",
" show(buf, MIME(\"text/html\"), p)\n",
" String(resize!(buf.data, buf.size))\n",
" end,\n",
" \"image/png\" => let\n",
" buf = IOBuffer()\n",
" buf64 = Base64EncodePipe(buf)\n",
" show(buf64, MIME(\"image/png\"), p)\n",
" String(resize!(buf.data, buf.size))\n",
" end,\n",
"\n",
" )\n",
" end\n",
" \n",
" function Base.show(io::IO, mimetype::MIME\"text/html\", p::PlotlyJS.SyncPlot)\n",
" uuid = string(UUIDs.uuid4())\n",
" show(io,mimetype,@htl(\"\"\"\n",
" <div style=\"height: auto\" id=\\\"$(uuid)\\\"></div>\n",
" <script>\n",
" require(['../js/plotly-latest.min.js'], function(plotly) { \n",
" plotly.newPlot($(uuid),\n",
" $(HypertextLiteral.JavaScript(json(p.plot.data))),\n",
" $(HypertextLiteral.JavaScript(json(p.plot.layout))),{responsive: true});\n",
" });\n",
" </script>\n",
"\"\"\"))\n",
"end "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a6260dc2",
"metadata": {},
"outputs": [],
"source": [
"Random.seed!(42)\n",
"\n",
"N = 100\n",
"random_x = range(0, stop=1, length=N)\n",
"random_y0 = randn(N) .+ 5\n",
"random_y1 = randn(N)\n",
"random_y2 = randn(N) .- 5\n",
"\n",
"plot([\n",
" scatter(x=random_x, y=random_y0, mode=\"markers\", name=\"markers\"),\n",
" scatter(x=random_x, y=random_y1, mode=\"lines\", name=\"lines\"),\n",
" scatter(x=random_x, y=random_y2, mode=\"markers+lines\", name=\"markers+lines\")\n",
"])"
]
},
{
"cell_type": "markdown",
"id": "dd0a1a29",
"metadata": {},
"source": [
"jkjkjkj\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "813b97ce",
"metadata": {},
"outputs": [],
"source": [
"#| warning: false\n",
"\n",
"plot([\n",
" scatter(x=random_x, y=random_y0, mode=\"markers\", name=\"markers\") ])"
]
},
{
"cell_type": "markdown",
"id": "c271b5dc",
"metadata": {},
"source": [
";;l;l;l\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6cb53248",
"metadata": {},
"outputs": [],
"source": [
"#| warning: false\n",
"\n",
"plot([\n",
" scatter(x=random_x, y=random_y2, mode=\"markers\", name=\"markers\") ])"
]
},
{
"cell_type": "markdown",
"id": "7df06b26",
"metadata": {},
"source": [
"lllklk"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

1185
nb/syntax.ipynb Normal file

File diff suppressed because it is too large Load Diff

178
nb/types.ipynb Normal file
View File

@ -0,0 +1,178 @@
{
"cells": [
{
"cell_type": "raw",
"id": "f1724c85",
"metadata": {},
"source": [
"---\n",
"notebook-links: false\n",
"---"
]
},
{
"cell_type": "markdown",
"id": "75a11f86",
"metadata": {},
"source": [
"# Das Typsystem von Julia\n",
"\n",
"Man kann umfangreiche Programme in Julia schreiben, ohne auch nur eine einzige Typdeklaration verwenden zu müssen. Das ist natürlich Absicht und soll die Arbeit der Anwender vereinfachen.\n",
"\n",
"Wir blicken jetzt trotzdem mal unter die Motorhaube.\n",
"\n",
"## Die Typhierarchie\n",
"\n",
"Das Typsystem hat die Struktur eines Baums, dessen Wurzel der Typ `Any` ist. Mit den Funktionen `subtypes()` und `supertype()` kann man den Baum erforschen. Sie zeigen alle Kinder bzw. die Mutter eines Knotens an.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f3f47e9d",
"metadata": {},
"outputs": [],
"source": [
"subtypes(Int64)"
]
},
{
"cell_type": "markdown",
"id": "3cb68ade",
"metadata": {},
"source": [
"Das Ergebnis ist eine leere Liste von Typen. `Int64` ist ein sogenannter **konkreter Typ** und hat keine Untertypen.\n",
"\n",
"Wir klettern jetzt mal die Typhierarchie auf diesem Ast nach oben bis zur Wurzel (Informatiker-Bäume stehen bekanntlich immer auf dem Kopf).\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c7c10d75",
"metadata": {},
"outputs": [],
"source": [
"supertype(Int64)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "15b4e8d6",
"metadata": {},
"outputs": [],
"source": [
"supertype(Signed)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2c62f342",
"metadata": {},
"outputs": [],
"source": [
"supertype(Integer)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ee7eb511",
"metadata": {},
"outputs": [],
"source": [
"supertype(Real)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9ab37b54",
"metadata": {},
"outputs": [],
"source": [
"supertype(Number)"
]
},
{
"cell_type": "markdown",
"id": "d5fe3447",
"metadata": {},
"source": [
"Das wäre übrigens auch schneller gegangen: Die Funktion `supertypes()` (mit Plural-s) zeigt alle Vorfahren an.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "895d4570",
"metadata": {},
"outputs": [],
"source": [
"supertypes(Int64)"
]
},
{
"cell_type": "markdown",
"id": "79a45ce0",
"metadata": {},
"source": [
"Nun kann man sich die Knoten angucken:\n",
"\n",
"<!-- 12A0366C:../notebooks/nb-types.ipynb#nb3 | | echo:false,warning:false,asis:true,eval:false -->\n",
"\n",
"Mit einer kleinen rekursiven Funktion kann man schnell einen ganzen (Unter-)Baum ausdrucken: \n",
"\n",
"<!-- 12A0366C:../notebooks/nb-types.ipynb#nb1 | | echo:false,warning:false,asis:true,eval:false -->\n",
"\n",
"::::{.content-hidden unless-format=\"xxx\"}\n",
"\n",
"...und natürlich gibt es da auch ein Julia-Paket:\n",
"\n",
"<!-- 12A0366C:../notebooks/nb-types.ipynb#nb2 | | echo:false,warning:false,asis:true,eval:false -->\n",
"\n",
":::\n",
"\n",
"\n",
"::: {.content-visible when-format=\"html\"}\n",
"![](../images/TypeTree2.png)\n",
":::\n",
"\n",
"::: {.content-visible when-format=\"pdf\"}\n",
"![The type tree of numbers](../images/TypeTree2.png) {width=50%}\n",
":::\n",
"\n",
"### Abstrakte und Konkrete Typen\n",
"\n",
"- Ein Objekt hat immer einen **konkreten** Typ. \n",
"- Komkrete Typen haben keine Untertypen mehr, sie sind immer „Blätter“ des Baumes.\n",
"- Abstrakte Typen können in der Definition von Funktionstypen, Argumenttypen, Elementtypen von zusammengesetzten Typen,... verwendet werden\n",
"\n",
"https://github.com/carstenbauer/JuliaCologne21/blob/master/Day1/1_types_and_dispatch.ipynb\n",
"\n",
"Zum Deklarieren und Testen der \"Abstammung\" gibt es einen eigenen Operator:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e300c9a9",
"metadata": {},
"outputs": [],
"source": [
"Int64 <: Number "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

182
notebooks/nb-types.ipynb Normal file
View File

@ -0,0 +1,182 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "46e9fc16",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"629"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#| label: nb4\n",
"#| echo: true\n",
"length(subtypes(Any))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "9feb9e06",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number\n",
" Complex\n",
" Real\n",
" AbstractFloat\n",
" BigFloat\n",
" Float16\n",
" Float32\n",
" Float64\n",
" AbstractIrrational\n",
" Irrational\n",
" Integer\n",
" Bool\n",
" Signed\n",
" BigInt\n",
" Int128\n",
" Int16\n",
" Int32\n",
" Int64\n",
" Int8\n",
" Unsigned\n",
" UInt128\n",
" UInt16\n",
" UInt32\n",
" UInt64\n",
" UInt8\n",
" Rational\n"
]
}
],
"source": [
"#| label: nb1\n",
"#| echo: true\n",
"\n",
"function show_subtype_tree(T, i=0)\n",
" println(\" \"^i, T)\n",
" for Ts ∈ subtypes(T)\n",
" show_subtype_tree(Ts, i+1)\n",
" end\n",
"end\n",
"\n",
"show_subtype_tree(Number)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "fe5594b9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number\n",
"├─ Complex\n",
"└─ Real\n",
" ├─ AbstractFloat\n",
" │ ├─ BigFloat\n",
" │ ├─ Float16\n",
" │ ├─ Float32\n",
" │ └─ Float64\n",
" ├─ AbstractIrrational\n",
" │ └─ Irrational\n",
" ├─ Integer\n",
" │ ├─ Bool\n",
" │ ├─ Signed\n",
" │ │ ├─ BigInt\n",
" │ │ ├─ Int128\n",
" │ │ ├─ Int16\n",
" │ │ ├─ Int32\n",
" │ │ ├─ Int64\n",
" │ │ └─ Int8\n",
" │ └─ Unsigned\n",
" │ ├─ UInt128\n",
" │ ├─ UInt16\n",
" │ ├─ UInt32\n",
" │ ├─ UInt64\n",
" │ └─ UInt8\n",
" └─ Rational\n"
]
}
],
"source": [
"#| label: nb2\n",
"#| echo: true\n",
"using AbstractTrees\n",
"\n",
"AbstractTrees.children(x::Type) = subtypes(x)\n",
"print_tree(Number)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "0dcccd86",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"4-element Vector{Any}:\n",
" AbstractFloat\n",
" AbstractIrrational\n",
" Integer\n",
" Rational"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#| label: nb3\n",
"#| echo: true\n",
"subtypes(Real)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dfabcc51",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"@webio": {
"lastCommId": null,
"lastKernelId": null
},
"kernelspec": {
"display_name": "Julia 1.8.5",
"language": "julia",
"name": "julia-1.8"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -0,0 +1,615 @@
<!DOCTYPE html>
<html
xmlns="http://www.w3.org/1999/xhtml"
lang="de"
xml:lang="de"
>
<head>
<meta charset="utf-8" />
<meta name="generator" content="quarto-99.9.9" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>Julia für Numerik nb-types</title> <style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
ul.task-list li input[type="checkbox"] {
width: 0.8em;
margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */
vertical-align: middle;
}
/* CSS for syntax highlighting */
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
}
pre.numberSource { margin-left: 3em; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
</style>
<style>
.quarto-embed-header {
height: 3em;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: solid 1px;
}
.quarto-embed-header h6 {
font-size: 1em;
padding-top: 0.6em;
margin-left: 1em;
margin-right: 1em;
font-weight: 300;
}
.quarto-embed-header a.quarto-download-embed {
font-size: 0.7em;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 1em;
margin-right: 1em;
}
</style>
<!-- htmldependencies:E3FAD763 -->
<script id="quarto-search-options" type="application/json">{
"language": {
"search-no-results-text": "Keine Treffer",
"search-matching-documents-text": "Treffer",
"search-copy-link-title": "Link in die Suche kopieren",
"search-hide-matches-text": "Zusätzliche Treffer verbergen",
"search-more-match-text": "weitere Treffer in diesem Dokument",
"search-more-matches-text": "weitere Treffer in diesem Dokument",
"search-clear-button-title": "Zurücksetzen",
"search-detached-cancel-button-title": "Abbrechen",
"search-submit-button-title": "Abschicken"
}
}</script>
<link rel="stylesheet" href="../css/styles.css" />
</head>
<body>
<div class="quarto-embed-header">
<h6><i class="bi bi-journal-code"></i> nb-types.ipynb</h6>
<a
href="../images/nb-types.ipynb"
class="btn btn-primary quarto-download-embed"
data-noresolveinput="true"
download="nb-types.ipynb"
>Download Notebook</a
>
</div>
<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
<nav class="quarto-secondary-nav">
<div class="container-fluid d-flex">
<button type="button" class="quarto-btn-toggle btn"
data-bs-toggle="collapse" data-bs-target="#quarto-sidebar,#quarto-sidebar-glass"
aria-controls="quarto-sidebar" aria-expanded="false" aria-label="Seitenleiste umschalten"
onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
<i class="bi bi-layout-text-sidebar-reverse"></i>
</button>
<h1 class="quarto-secondary-nav-title"></h1>
<a class="flex-grow-1" role="button" data-bs-toggle="collapse" data-bs-target="#quarto-sidebar,#quarto-sidebar-glass"
aria-controls="quarto-sidebar" aria-expanded="false" aria-label="Seitenleiste umschalten"
onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
</a>
</div>
</nav>
</header>
<!-- content -->
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article">
<!-- sidebar -->
<nav id="quarto-sidebar" class="sidebar collapse collapse-horizontal sidebar-navigation floating overflow-auto">
<div class="pt-lg-2 mt-2 text-left sidebar-header sidebar-header-stacked">
<a href="/index.html" class="sidebar-logo-link">
<img src="/images/julia-logo-color.svg" alt="" class="sidebar-logo py-0 d-lg-inline d-none"/>
</a>
<div class="sidebar-title mb-0 py-0">
<a href="/">
Julia für Numerik
</a>
<div class="sidebar-tools-main tools-wide">
<a href="/Julia-f%C3%BCr-Numerik.pdf" title="" class="quarto-navigation-tool px-1" aria-label=""><i class="bi bi-download"></i></a>
<a href="/Julia-für-Numerik.pdf" title="Download PDF" class="quarto-navigation-tool px-1" aria-label="Download PDF"><i class="bi bi-file-pdf"></i></a>
<a href="" class="quarto-color-scheme-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Dunkelmodus umschalten"><i class="bi"></i></a>
</div>
</div>
</div>
<div class="sidebar-menu-container">
<ul class="list-unstyled mt-1">
<li class="sidebar-item">
<div class="sidebar-item-container">
<a href="/index.html" class="sidebar-item-text sidebar-link">
<span class="menu-text">Was ist Julia?</span></a>
</div>
</li>
<li class="sidebar-item">
<div class="sidebar-item-container">
<a href="/chapters/types.html" class="sidebar-item-text sidebar-link">
<span class="menu-text">&lt;span class=&#39;chapter-number&#39;&gt;1&lt;/span&gt;  &lt;span class=&#39;chapter-title&#39;&gt;Das Typsystem von Julia&lt;/span&gt;</span></a>
</div>
</li>
</ul>
</div>
</nav>
<div id="quarto-sidebar-glass" data-bs-toggle="collapse" data-bs-target="#quarto-sidebar,#quarto-sidebar-glass" ></div>
<!-- margin-sidebar -->
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
<div id="quarto-toc-target"></div>
</div>
<!-- main -->
<main class="content" id="quarto-document-content"> <div id="nb1" class="cell" data-execution_count="1">
<div class="sourceCode" id="cb1"><pre class="sourceCode julia cell-code"><code class="sourceCode julia"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> <span class="fu">show_subtype_tree</span>(T, i<span class="op">=</span><span class="fl">0</span>)</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="fu">println</span>(<span class="st">&quot; &quot;</span><span class="op">^</span>i, T)</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> <span class="cf">for</span> Ts <span class="op"></span> <span class="fu">subtypes</span>(T)</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> <span class="fu">show_subtype_tree</span>(Ts, i<span class="op">+</span><span class="fl">1</span>)</span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="cf">end</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a><span class="fu">show_subtype_tree</span>(<span class="dt">Number</span>)</span></code></pre></div>
<div class="cell-output cell-output-stdout">
<pre class=""><code class=" ansi">Number
Complex
Real
AbstractFloat
BigFloat
Float16
Float32
Float64
AbstractIrrational
Irrational
Integer
Bool
Signed
BigInt
Int128
Int16
Int32
Int64
Int8
Unsigned
UInt128
UInt16
UInt32
UInt64
UInt8
Rational</code></pre>
</div>
</div>
<div id="nb2" class="cell" data-execution_count="2">
<div class="sourceCode" id="cb2"><pre class="sourceCode julia cell-code"><code class="sourceCode julia"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="im">using</span> <span class="bu">AbstractTrees</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a>AbstractTrees.<span class="fu">children</span>(x<span class="op">::</span><span class="dt">Type</span>) <span class="op">=</span> <span class="fu">subtypes</span>(x)</span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="fu">print_tree</span>(<span class="dt">Number</span>)</span></code></pre></div>
<div class="cell-output cell-output-stdout">
<pre class=""><code class=" ansi">Number
├─ Complex
└─ Real
├─ AbstractFloat
│ ├─ BigFloat
│ ├─ Float16
│ ├─ Float32
│ └─ Float64
├─ AbstractIrrational
│ └─ Irrational
├─ Integer
│ ├─ Bool
│ ├─ Signed
│ │ ├─ BigInt
│ │ ├─ Int128
│ │ ├─ Int16
│ │ ├─ Int32
│ │ ├─ Int64
│ │ └─ Int8
│ └─ Unsigned
│ ├─ UInt128
│ ├─ UInt16
│ ├─ UInt32
│ ├─ UInt64
│ └─ UInt8
└─ Rational</code></pre>
</div>
</div>
<div id="quarto-navigation-envelope" class="hidden">
<p><span class="hidden" data-render-id="quarto-int-sidebar-title">Julia für Numerik</span> <span class="hidden" data-render-id="quarto-int-navbar-title">Julia für Numerik</span> <span class="hidden" data-render-id="quarto-int-sidebar:/index.html">Was ist Julia?</span> <span class="hidden" data-render-id="quarto-int-sidebar:/chapters/types.html"><span class="chapter-number">1</span>  <span class="chapter-title">Das Typsystem von Julia</span></span> <span class="hidden" data-render-id="footer-left">All content licenced under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a>.</span> <span class="hidden" data-render-id="footer-right">Created with <a href="https://quarto.org/">Quarto</a><br />
</span></p>
</div>
<div id="quarto-meta-markdown" class="hidden">
<p><span class="hidden" data-render-id="quarto-twittercardtitle"></span> <span class="hidden" data-render-id="quarto-ogcardtitle"></span> <span class="hidden" data-render-id="quarto-metasitename">Julia für Numerik</span> <span class="hidden" data-render-id="quarto-twittercarddesc"></span> <span class="hidden" data-render-id="quarto-ogcardddesc"></span></p>
</div>
</main> <!-- /main --> <script id = "quarto-html-after-body" type="application/javascript">
window.document.addEventListener("DOMContentLoaded", function (event) {
const toggleBodyColorMode = (bsSheetEl) => {
const mode = bsSheetEl.getAttribute("data-mode");
const bodyEl = window.document.querySelector("body");
if (mode === "dark") {
bodyEl.classList.add("quarto-dark");
bodyEl.classList.remove("quarto-light");
} else {
bodyEl.classList.add("quarto-light");
bodyEl.classList.remove("quarto-dark");
}
}
const toggleBodyColorPrimary = () => {
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
if (bsSheetEl) {
toggleBodyColorMode(bsSheetEl);
}
}
toggleBodyColorPrimary();
const disableStylesheet = (stylesheets) => {
for (let i=0; i < stylesheets.length; i++) {
const stylesheet = stylesheets[i];
stylesheet.rel = 'prefetch';
}
}
const enableStylesheet = (stylesheets) => {
for (let i=0; i < stylesheets.length; i++) {
const stylesheet = stylesheets[i];
stylesheet.rel = 'stylesheet';
}
}
const manageTransitions = (selector, allowTransitions) => {
const els = window.document.querySelectorAll(selector);
for (let i=0; i < els.length; i++) {
const el = els[i];
if (allowTransitions) {
el.classList.remove('notransition');
} else {
el.classList.add('notransition');
}
}
}
const toggleColorMode = (alternate) => {
// Switch the stylesheets
const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
manageTransitions('#quarto-margin-sidebar .nav-link', false);
if (alternate) {
enableStylesheet(alternateStylesheets);
for (const sheetNode of alternateStylesheets) {
if (sheetNode.id === "quarto-bootstrap") {
toggleBodyColorMode(sheetNode);
}
}
} else {
disableStylesheet(alternateStylesheets);
toggleBodyColorPrimary();
}
manageTransitions('#quarto-margin-sidebar .nav-link', true);
// Switch the toggles
const toggles = window.document.querySelectorAll('.quarto-color-scheme-toggle');
for (let i=0; i < toggles.length; i++) {
const toggle = toggles[i];
if (toggle) {
if (alternate) {
toggle.classList.add("alternate");
} else {
toggle.classList.remove("alternate");
}
}
}
// Hack to workaround the fact that safari doesn't
// properly recolor the scrollbar when toggling (#1455)
if (navigator.userAgent.indexOf('Safari') > 0 && navigator.userAgent.indexOf('Chrome') == -1) {
manageTransitions("body", false);
window.scrollTo(0, 1);
setTimeout(() => {
window.scrollTo(0, 0);
manageTransitions("body", true);
}, 40);
}
}
const isFileUrl = () => {
return window.location.protocol === 'file:';
}
const hasAlternateSentinel = () => {
let styleSentinel = getColorSchemeSentinel();
if (styleSentinel !== null) {
return styleSentinel === "alternate";
} else {
return false;
}
}
const setStyleSentinel = (alternate) => {
const value = alternate ? "alternate" : "default";
if (!isFileUrl()) {
window.localStorage.setItem("quarto-color-scheme", value);
} else {
localAlternateSentinel = value;
}
}
const getColorSchemeSentinel = () => {
if (!isFileUrl()) {
const storageValue = window.localStorage.getItem("quarto-color-scheme");
return storageValue != null ? storageValue : localAlternateSentinel;
} else {
return localAlternateSentinel;
}
}
let localAlternateSentinel = 'default';
// Dark / light mode switch
window.quartoToggleColorScheme = () => {
// Read the current dark / light value
let toAlternate = !hasAlternateSentinel();
toggleColorMode(toAlternate);
setStyleSentinel(toAlternate);
};
// Ensure there is a toggle, if there isn't float one in the top right
if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
const a = window.document.createElement('a');
a.classList.add('top-right');
a.classList.add('quarto-color-scheme-toggle');
a.href = "";
a.onclick = function() { try { window.quartoToggleColorScheme(); } catch {} return false; };
const i = window.document.createElement("i");
i.classList.add('bi');
a.appendChild(i);
window.document.body.appendChild(a);
}
// Switch to dark mode if need be
if (hasAlternateSentinel()) {
toggleColorMode(true);
} else {
toggleColorMode(false);
}
const icon = "";
const anchorJS = new window.AnchorJS();
anchorJS.options = {
placement: 'right',
icon: icon
};
anchorJS.add('.anchored');
const isCodeAnnotation = (el) => {
for (const clz of el.classList) {
if (clz.startsWith('code-annotation-')) {
return true;
}
}
return false;
}
const clipboard = new window.ClipboardJS('.code-copy-button', {
text: function(trigger) {
const codeEl = trigger.previousElementSibling.cloneNode(true);
for (const childEl of codeEl.children) {
if (isCodeAnnotation(childEl)) {
childEl.remove();
}
}
return codeEl.innerText;
}
});
clipboard.on('success', function(e) {
// button target
const button = e.trigger;
// don't keep focus
button.blur();
// flash "checked"
button.classList.add('code-copy-button-checked');
var currentTitle = button.getAttribute("title");
button.setAttribute("title", "Kopiert");
let tooltip;
if (window.bootstrap) {
button.setAttribute("data-bs-toggle", "tooltip");
button.setAttribute("data-bs-placement", "left");
button.setAttribute("data-bs-title", "Kopiert");
tooltip = new bootstrap.Tooltip(button,
{ trigger: "manual",
customClass: "code-copy-button-tooltip",
offset: [0, -8]});
tooltip.show();
}
setTimeout(function() {
if (tooltip) {
tooltip.hide();
button.removeAttribute("data-bs-title");
button.removeAttribute("data-bs-toggle");
button.removeAttribute("data-bs-placement");
}
button.setAttribute("title", currentTitle);
button.classList.remove('code-copy-button-checked');
}, 1000);
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
appendTo: function(el) {
return el.parentElement;
},
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
};
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
for (var i=0; i<noterefs.length; i++) {
const ref = noterefs[i];
tippyHover(ref, function() {
// use id or data attribute instead here
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
return note.innerHTML;
});
}
let selectedAnnoteEl;
const selectorForAnnotation = ( cell, annotation) => {
let cellAttr = 'data-code-cell="' + cell + '"';
let lineAttr = 'data-code-annotation="' + annotation + '"';
const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
return selector;
}
const selectCodeLines = (annoteEl) => {
const doc = window.document;
const targetCell = annoteEl.getAttribute("data-target-cell");
const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
const lines = annoteSpan.getAttribute("data-code-lines").split(",");
const lineIds = lines.map((line) => {
return targetCell + "-" + line;
})
let top = null;
let height = null;
let parent = null;
if (lineIds.length > 0) {
//compute the position of the single el (top and bottom and make a div)
const el = window.document.getElementById(lineIds[0]);
top = el.offsetTop;
height = el.offsetHeight;
parent = el.parentElement.parentElement;
if (lineIds.length > 1) {
const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
const bottom = lastEl.offsetTop + lastEl.offsetHeight;
height = bottom - top;
}
if (top !== null && height !== null && parent !== null) {
// cook up a div (if necessary) and position it
let div = window.document.getElementById("code-annotation-line-highlight");
if (div === null) {
div = window.document.createElement("div");
div.setAttribute("id", "code-annotation-line-highlight");
div.style.position = 'absolute';
parent.appendChild(div);
}
div.style.top = top - 2 + "px";
div.style.height = height + 4 + "px";
let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
if (gutterDiv === null) {
gutterDiv = window.document.createElement("div");
gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
gutterDiv.style.position = 'absolute';
const codeCell = window.document.getElementById(targetCell);
const gutter = codeCell.querySelector('.code-annotation-gutter');
gutter.appendChild(gutterDiv);
}
gutterDiv.style.top = top - 2 + "px";
gutterDiv.style.height = height + 4 + "px";
}
selectedAnnoteEl = annoteEl;
}
};
const unselectCodeLines = () => {
const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
elementsIds.forEach((elId) => {
const div = window.document.getElementById(elId);
if (div) {
div.remove();
}
});
selectedAnnoteEl = undefined;
};
// Attach click handler to the DT
const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
for (const annoteDlNode of annoteDls) {
annoteDlNode.addEventListener('click', (event) => {
const clickedEl = event.target;
if (clickedEl !== selectedAnnoteEl) {
unselectCodeLines();
const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
if (activeEl) {
activeEl.classList.remove('code-annotation-active');
}
selectCodeLines(clickedEl);
clickedEl.classList.add('code-annotation-active');
} else {
// Unselect the line
unselectCodeLines();
clickedEl.classList.remove('code-annotation-active');
}
});
}
const findCites = (el) => {
const parentEl = el.parentElement;
if (parentEl) {
const cites = parentEl.dataset.cites;
if (cites) {
return {
el,
cites: cites.split(' ')
};
} else {
return findCites(el.parentElement)
}
} else {
return undefined;
}
};
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
for (var i=0; i<bibliorefs.length; i++) {
const ref = bibliorefs[i];
const citeInfo = findCites(ref);
if (citeInfo) {
tippyHover(citeInfo.el, function() {
var popup = window.document.createElement('div');
citeInfo.cites.forEach(function(cite) {
var citeDiv = window.document.createElement('div');
citeDiv.classList.add('hanging-indent');
citeDiv.classList.add('csl-entry');
var biblioDiv = window.document.getElementById('ref-' + cite);
if (biblioDiv) {
citeDiv.innerHTML = biblioDiv.innerHTML;
}
popup.appendChild(citeDiv);
});
return popup.innerHTML;
});
}
}
});
</script> </div> <!-- /content -->
<footer class="footer">
<div class="nav-footer">
<div class="nav-footer-left">
<div class='footer-contents'>All content licenced under [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/).
</div>
</div>
<div class="nav-footer-center">
&nbsp;
</div>
<div class="nav-footer-right">
<div class='footer-contents'>Created with [Quarto](https://quarto.org/)
</div>
</div>
</div>
</footer>
</body>
</html>

87
notebooks/nb-types.md Normal file
View File

@ -0,0 +1,87 @@
::: {#nb1 .cell execution_count=1}
``` {.julia .cell-code}
function show_subtype_tree(T, i=0)
println(" "^i, T)
for Ts ∈ subtypes(T)
show_subtype_tree(Ts, i+1)
end
end
show_subtype_tree(Number)
```
::: {.cell-output .cell-output-stdout}
```
Number
Complex
Real
AbstractFloat
BigFloat
Float16
Float32
Float64
AbstractIrrational
Irrational
Integer
Bool
Signed
BigInt
Int128
Int16
Int32
Int64
Int8
Unsigned
UInt128
UInt16
UInt32
UInt64
UInt8
Rational
```
:::
:::
::: {#nb2 .cell execution_count=2}
``` {.julia .cell-code}
using AbstractTrees
AbstractTrees.children(x::Type) = subtypes(x)
print_tree(Number)
```
::: {.cell-output .cell-output-stdout}
```
Number
├─ Complex
└─ Real
├─ AbstractFloat
│ ├─ BigFloat
│ ├─ Float16
│ ├─ Float32
│ └─ Float64
├─ AbstractIrrational
│ └─ Irrational
├─ Integer
│ ├─ Bool
│ ├─ Signed
│ │ ├─ BigInt
│ │ ├─ Int128
│ │ ├─ Int16
│ │ ├─ Int32
│ │ ├─ Int64
│ │ └─ Int8
│ └─ Unsigned
│ ├─ UInt128
│ ├─ UInt16
│ ├─ UInt32
│ ├─ UInt64
│ └─ UInt8
└─ Rational
```
:::
:::

55
notebooks/nb1.ipynb Normal file
View File

@ -0,0 +1,55 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "8da1eabc",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello!\n"
]
}
],
"source": [
"#| label: cell1\n",
"#| echo: true\n",
"\n",
"\n",
"print(\"Hello!\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8bd33e25",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.11.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}