diff --git a/README.md b/README.md index e69de29..84e8ba4 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,46 @@ +# 📚 Exams Repository + +This repository contains study materials, practice tasks, and lab reports for various university courses. +It is organized by subject, with each subject containing theory notes, practice problems, labs, and supporting assets. + +## 📂 Repository Structure + +### Algebra +- 📖 [Lecture Notes (lec1–lec15)](algebra/theory/) +- ❓ [Questions](algebra/theory/questions.pdf) | [Typst Source](algebra/theory/questions.typ) +- 📝 [Practice Sheets (prac0–prac6)](algebra/practice/) + +### Algorithms +- 📑 [Template](algorithms/templates/template.pdf) +- 🧩 Labs: + - [Lab 6 Report](algorithms/labs/lab6/out/report.docx) | [Task](algorithms/labs/lab6/in/task.pdf) | [Code](algorithms/labs/lab6/code/) + - [Lab 7 Report](algorithms/labs/lab7/out/report.docx) | [Task](algorithms/labs/lab7/in/task.pdf) | [Code](algorithms/labs/lab7/code/) + - [Lab 8 Report](algorithms/labs/lab8/out/report.docx) | [Task](algorithms/labs/lab8/in/task.pdf) | [Code](algorithms/labs/lab8/code/) + +### Calculus +- 📖 [Theory](calculus/theory/theory.pdf) +- ❓ [Questions](calculus/theory/questions.pdf) | [Typst Source](calculus/theory/questions.typ) +- 📝 [Practice Tasks](calculus/practice/tasks.pdf) | [Typst Source](calculus/practice/tasks.typ) + +### Computer Networks +- 📖 [Lectures](computer_networks/theory/lectures.pdf) | [Typst Source](computer_networks/theory/lectures.typ) +- ❓ [Questions](computer_networks/theory/questions.pdf) +- 🧩 Labs: + - [Lab 1 Report](computer_networks/labs/lab1/report.pdf) | [Typst Source](computer_networks/labs/lab1/report.typ) + - [Lab 2 Report](computer_networks/labs/lab2/report.pdf) | [Typst Source](computer_networks/labs/lab2/report.typ) | [Packet](computer_networks/labs/lab2/res.pkt) + - [Lab 3 Report](computer_networks/labs/lab3/report.pdf) | [Typst Source](computer_networks/labs/lab3/report.typ) | [Packets](computer_networks/labs/lab3/) + - [Lab 4 Report](computer_networks/labs/lab4/report.pdf) | [Typst Source](computer_networks/labs/lab4/report.typ) + - [Lab 5 Report](computer_networks/labs/lab5/report.pdf) | [Typst Source](computer_networks/labs/lab5/report.typ) + - [Lab 6 Report](computer_networks/labs/lab6/report.pdf) | [Typst Source](computer_networks/labs/lab6/report.typ) | [Packet](computer_networks/labs/lab6/network.pkt) + +### Physics +- 📖 [Lectures (lec1–lec7)](physics/theory/) +- ❓ [Questions](physics/theory/questions.pdf) | [Typst Source](physics/theory/questions.typ) +- 📝 [Practice Tasks](physics/practice/task.pdf) | [Typst Source](physics/practice/task.typ) | [Prac1–Prac7](physics/practice/) + +--- + +### Root +- 📖 [General Theory Summary](theory.pdf) + + diff --git a/algebra/ppa/TM-2.1_full.pdf b/algebra/ppa/TM-2.1_full.pdf new file mode 100644 index 0000000..2b69f1d Binary files /dev/null and b/algebra/ppa/TM-2.1_full.pdf differ diff --git a/algebra/ppa/TM-2.2_full.pdf b/algebra/ppa/TM-2.2_full.pdf new file mode 100644 index 0000000..2307cc3 Binary files /dev/null and b/algebra/ppa/TM-2.2_full.pdf differ diff --git a/algebra/ppa/TM-2.3_full.pdf b/algebra/ppa/TM-2.3_full.pdf new file mode 100644 index 0000000..27ea213 Binary files /dev/null and b/algebra/ppa/TM-2.3_full.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_1_1_linforms.pdf b/algebra/ppa/Лекции/LecB2_1_1_linforms.pdf new file mode 100644 index 0000000..e4d8162 Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_1_1_linforms.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_1_2_bilinear.pdf b/algebra/ppa/Лекции/LecB2_1_2_bilinear.pdf new file mode 100644 index 0000000..0573bd3 Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_1_2_bilinear.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_1_3_multilinear.pdf b/algebra/ppa/Лекции/LecB2_1_3_multilinear.pdf new file mode 100644 index 0000000..a401fe6 Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_1_3_multilinear.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_1_4_tensor.pdf b/algebra/ppa/Лекции/LecB2_1_4_tensor.pdf new file mode 100644 index 0000000..6db19e4 Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_1_4_tensor.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_1_5_Linear_map.pdf b/algebra/ppa/Лекции/LecB2_1_5_Linear_map.pdf new file mode 100644 index 0000000..bae726d Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_1_5_Linear_map.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_2_1_Linear_operator.pdf b/algebra/ppa/Лекции/LecB2_2_1_Linear_operator.pdf new file mode 100644 index 0000000..681ca1c Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_2_1_Linear_operator.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_2_2_Invariants.pdf b/algebra/ppa/Лекции/LecB2_2_2_Invariants.pdf new file mode 100644 index 0000000..d1e055c Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_2_2_Invariants.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_2_3_Kernel_spaces.pdf b/algebra/ppa/Лекции/LecB2_2_3_Kernel_spaces.pdf new file mode 100644 index 0000000..dc11092 Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_2_3_Kernel_spaces.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_2_4_Jordan_form.pdf b/algebra/ppa/Лекции/LecB2_2_4_Jordan_form.pdf new file mode 100644 index 0000000..6d59392 Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_2_4_Jordan_form.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_2_5_Func.pdf b/algebra/ppa/Лекции/LecB2_2_5_Func.pdf new file mode 100644 index 0000000..6b50780 Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_2_5_Func.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_3_1_Euclid.pdf b/algebra/ppa/Лекции/LecB2_3_1_Euclid.pdf new file mode 100644 index 0000000..7e8a94d Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_3_1_Euclid.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_3_2_Orthogonality.pdf b/algebra/ppa/Лекции/LecB2_3_2_Orthogonality.pdf new file mode 100644 index 0000000..cab7dec Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_3_2_Orthogonality.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_3_3_Euclid_operator.pdf b/algebra/ppa/Лекции/LecB2_3_3_Euclid_operator.pdf new file mode 100644 index 0000000..5db2650 Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_3_3_Euclid_operator.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_3_4_Diag_quad_form_I.pdf b/algebra/ppa/Лекции/LecB2_3_4_Diag_quad_form_I.pdf new file mode 100644 index 0000000..23b8fc9 Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_3_4_Diag_quad_form_I.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_3_5_Diag_quad_form_II.pdf b/algebra/ppa/Лекции/LecB2_3_5_Diag_quad_form_II.pdf new file mode 100644 index 0000000..1b157ce Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_3_5_Diag_quad_form_II.pdf differ diff --git a/algebra/ppa/Лекции/LecB2_3_6_Matrix_decomposition.pdf b/algebra/ppa/Лекции/LecB2_3_6_Matrix_decomposition.pdf new file mode 100644 index 0000000..e451d79 Binary files /dev/null and b/algebra/ppa/Лекции/LecB2_3_6_Matrix_decomposition.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика0.pdf b/algebra/ppa/Практика ЛинАлг/Практика0.pdf new file mode 100644 index 0000000..1bf002f Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика0.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика1.pdf b/algebra/ppa/Практика ЛинАлг/Практика1.pdf new file mode 100644 index 0000000..b1b4320 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика1.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика10.pdf b/algebra/ppa/Практика ЛинАлг/Практика10.pdf new file mode 100644 index 0000000..fa3b0bf Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика10.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика11.docx b/algebra/ppa/Практика ЛинАлг/Практика11.docx new file mode 100644 index 0000000..848e3f3 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика11.docx differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика12.pdf b/algebra/ppa/Практика ЛинАлг/Практика12.pdf new file mode 100644 index 0000000..a323e4d Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика12.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика13.docx b/algebra/ppa/Практика ЛинАлг/Практика13.docx new file mode 100644 index 0000000..2f05c30 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика13.docx differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика14.pdf b/algebra/ppa/Практика ЛинАлг/Практика14.pdf new file mode 100644 index 0000000..b1c64ae Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика14.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика15.pdf b/algebra/ppa/Практика ЛинАлг/Практика15.pdf new file mode 100644 index 0000000..d1f285e Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика15.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика2.pdf b/algebra/ppa/Практика ЛинАлг/Практика2.pdf new file mode 100644 index 0000000..56e4f22 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика2.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика3.pdf b/algebra/ppa/Практика ЛинАлг/Практика3.pdf new file mode 100644 index 0000000..18e9738 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика3.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика4.pdf b/algebra/ppa/Практика ЛинАлг/Практика4.pdf new file mode 100644 index 0000000..033bae5 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика4.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика5.pdf b/algebra/ppa/Практика ЛинАлг/Практика5.pdf new file mode 100644 index 0000000..8a73375 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика5.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика6.pdf b/algebra/ppa/Практика ЛинАлг/Практика6.pdf new file mode 100644 index 0000000..6823b50 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика6.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика7.pdf b/algebra/ppa/Практика ЛинАлг/Практика7.pdf new file mode 100644 index 0000000..39a6218 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика7.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика8.pdf b/algebra/ppa/Практика ЛинАлг/Практика8.pdf new file mode 100644 index 0000000..5956a26 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика8.pdf differ diff --git a/algebra/ppa/Практика ЛинАлг/Практика9.pdf b/algebra/ppa/Практика ЛинАлг/Практика9.pdf new file mode 100644 index 0000000..62202e5 Binary files /dev/null and b/algebra/ppa/Практика ЛинАлг/Практика9.pdf differ diff --git a/algebra/practice/prac0.pdf b/algebra/practice/prac0.pdf new file mode 100644 index 0000000..885a9e9 Binary files /dev/null and b/algebra/practice/prac0.pdf differ diff --git a/algebra/practice/prac1.pdf b/algebra/practice/prac1.pdf new file mode 100644 index 0000000..5db9874 Binary files /dev/null and b/algebra/practice/prac1.pdf differ diff --git a/algebra/practice/prac2.pdf b/algebra/practice/prac2.pdf new file mode 100644 index 0000000..7bc0e88 Binary files /dev/null and b/algebra/practice/prac2.pdf differ diff --git a/algebra/practice/prac3.pdf b/algebra/practice/prac3.pdf new file mode 100644 index 0000000..03a670c Binary files /dev/null and b/algebra/practice/prac3.pdf differ diff --git a/algebra/practice/prac4.pdf b/algebra/practice/prac4.pdf new file mode 100644 index 0000000..345ee61 Binary files /dev/null and b/algebra/practice/prac4.pdf differ diff --git a/algebra/practice/prac5.pdf b/algebra/practice/prac5.pdf new file mode 100644 index 0000000..c7f6682 Binary files /dev/null and b/algebra/practice/prac5.pdf differ diff --git a/algebra/practice/prac6.pdf b/algebra/practice/prac6.pdf new file mode 100644 index 0000000..1907de2 Binary files /dev/null and b/algebra/practice/prac6.pdf differ diff --git a/algebra/theory/lec1.pdf b/algebra/theory/lec1.pdf new file mode 100644 index 0000000..e4d8162 Binary files /dev/null and b/algebra/theory/lec1.pdf differ diff --git a/algebra/theory/lec10.pdf b/algebra/theory/lec10.pdf new file mode 100644 index 0000000..6b50780 Binary files /dev/null and b/algebra/theory/lec10.pdf differ diff --git a/algebra/theory/lec11.pdf b/algebra/theory/lec11.pdf new file mode 100644 index 0000000..7e8a94d Binary files /dev/null and b/algebra/theory/lec11.pdf differ diff --git a/algebra/theory/lec12.pdf b/algebra/theory/lec12.pdf new file mode 100644 index 0000000..cab7dec Binary files /dev/null and b/algebra/theory/lec12.pdf differ diff --git a/algebra/theory/lec13.pdf b/algebra/theory/lec13.pdf new file mode 100644 index 0000000..4887c52 Binary files /dev/null and b/algebra/theory/lec13.pdf differ diff --git a/algebra/theory/lec14.pdf b/algebra/theory/lec14.pdf new file mode 100644 index 0000000..23b8fc9 Binary files /dev/null and b/algebra/theory/lec14.pdf differ diff --git a/algebra/theory/lec15.pdf b/algebra/theory/lec15.pdf new file mode 100644 index 0000000..1b157ce Binary files /dev/null and b/algebra/theory/lec15.pdf differ diff --git a/algebra/theory/lec2.pdf b/algebra/theory/lec2.pdf new file mode 100644 index 0000000..9a44fca Binary files /dev/null and b/algebra/theory/lec2.pdf differ diff --git a/algebra/theory/lec3.pdf b/algebra/theory/lec3.pdf new file mode 100644 index 0000000..a401fe6 Binary files /dev/null and b/algebra/theory/lec3.pdf differ diff --git a/algebra/theory/lec4.pdf b/algebra/theory/lec4.pdf new file mode 100644 index 0000000..6db19e4 Binary files /dev/null and b/algebra/theory/lec4.pdf differ diff --git a/algebra/theory/lec5.pdf b/algebra/theory/lec5.pdf new file mode 100644 index 0000000..bae726d Binary files /dev/null and b/algebra/theory/lec5.pdf differ diff --git a/algebra/theory/lec6.pdf b/algebra/theory/lec6.pdf new file mode 100644 index 0000000..1009b97 Binary files /dev/null and b/algebra/theory/lec6.pdf differ diff --git a/algebra/theory/lec7.pdf b/algebra/theory/lec7.pdf new file mode 100644 index 0000000..d1e055c Binary files /dev/null and b/algebra/theory/lec7.pdf differ diff --git a/algebra/theory/lec8.pdf b/algebra/theory/lec8.pdf new file mode 100644 index 0000000..dc11092 Binary files /dev/null and b/algebra/theory/lec8.pdf differ diff --git a/algebra/theory/lec9.pdf b/algebra/theory/lec9.pdf new file mode 100644 index 0000000..6d59392 Binary files /dev/null and b/algebra/theory/lec9.pdf differ diff --git a/algebra/theory/out.pdf b/algebra/theory/out.pdf new file mode 100644 index 0000000..35832a3 Binary files /dev/null and b/algebra/theory/out.pdf differ diff --git a/algebra/theory/q.pdf b/algebra/theory/q.pdf new file mode 100644 index 0000000..096c46e Binary files /dev/null and b/algebra/theory/q.pdf differ diff --git a/algebra/theory/questions.pdf b/algebra/theory/questions.pdf new file mode 100644 index 0000000..b53c2a2 Binary files /dev/null and b/algebra/theory/questions.pdf differ diff --git a/algebra/theory/questions.typ b/algebra/theory/questions.typ new file mode 100644 index 0000000..0114c81 --- /dev/null +++ b/algebra/theory/questions.typ @@ -0,0 +1,787 @@ += Линейная алгебра + +== Лекция I. Линейные формы. + +=== Понятие линейной формы. + +*Линейной формой* на пространстве $V$ называется такая функция $f : V arrow KK$, что $forall v, space v_1, space v_2 in V, space forall lambda in KK$ выполняется: + +(а) Аддитивность: $f(v_1 + v_2) = f(v_1) + f(v_2)$. + +(б) Однородность: $f(lambda v) = lambda f(v)$. + +#line(length: 100%) +=== Понятие коэффициентов линейной формы. + +*Коэффициентами* $phi_i$ линейной формы $f$ называются значения этой линейной формы на базисных векторах пространства. + +$ +f(e_i) = phi_i +$ + +#line(length: 100%) +=== Теорема. + +Задание линейной формы эквивалентно заданию ее значений на базисных формах, т.е. заданию ее коэффициентов. + +_Доказательство._ Пусть в выбранном базисе ${e_i}_(i = 1)^n$ линейного пространства $V$ линейная форма $f$ задана набором коэффициентов ${phi_i}_(i = 1)^n$. Тогда $forall v = sum_(i = 1)^n v^i e_i in V$: + +$ +f(v) = f(sum_(i = 1)^n v^i e_i) = sum_(i = 1)^n f(v^i e_i) = sum_(i = 1)^n v^i f(e_i) = sum_(i = 1)^n v^i phi_i +$ + +Таким образом получаем, что образ любого вектора однозначно определен координатами этого векторами и коэффициентами линейной формы, где оба набора чисел найдены _в одном и том же базисе_. + +#line(length: 100%) +=== Понятие равных линейных форм + +Линейные формы $f$ и $g$ будем называть *равными*, если + +$ +f = g arrow.double.l.r f(v) = g(v), space.quad forall v in V +$ + +#line(length: 100%) +=== Понятие нулевой линейной формы + +Линейная флома $theta$ называется *нулевой (нуль-формой)*, если + +$ +theta(v) = 0, space.quad forall v in V +$ + +Очевидно, что мы можем определить действия на множестве форм. + +#line(length: 100%) + +=== Понятие суммы линейных форм + +*Суммой* линейных форм $f$ и $g$ называется отображение $h = f + g$, для которого справедливо + +$ +h(v) = f(v) + g(v), space.quad forall v in V +$ + +#line(length: 100%) + +=== Лемма + +Отображение $h$ является линейной формой. + +_Доказательство_. Покажем справедливость свойства аддитивности: + +$ +h(v_1 + v_2) = f(v_1 + v_2) + g(v_1 + v_2) = f(v_1) + f(v_2) + g(v_1) + g(v_2) = +$ + +$ += (f(v_1) + g(v_1)) + (f(v_2) + g(v_2)) = h(v_1) + h(v_2) +$ + +Выполнение свойства однородности показывается аналогично. + +#line(length: 100%) + +=== Понятие произведения линейной формы на число + +*Произведением* линейной формы $f$ на число $alpha in KK$ называется отображение $l = alpha f$ такое, что + +$ +l(v) = alpha dot f(v), space.quad forall v in V +$ + +_Доказательство_. Аналогично лемме о сумме линейных форм. + +#line(length: 100%) + +=== Теорема + +Множество линейных форм $V^*$, заданных на линейном пространстве $V$ образует линейное (сопряженное) пространство. + +Рассмотрим некоторый базис ${e_i}_(i = 1)^n$ в пространстве $V$. Введем набор линейных форм ${f^j}_(j = 1)^n$ следующим образом: + +$ +f^j(v) = v_j, +$ + +которая возвращает $j$-ю координату вектора $v in V$ в базисе ${e_i}_(i = 1)^n$. Очевидно, что для линейных форм из этого набора справедливо + +$ +f^j (e_i) = delta_i^j = cases(1", если " i = j, 0", если " i eq.not j) +$ + +#line(length: 100%) + +=== Лемма + +Набор линейных форм ${f^j}_(j = 1)^n$ является базисом в сопряженном пространстве $V^*$. + +_Доказательство_. Чтобы показать справедливость утверждения, необходимо доказать полноту и линейную независимость этого набора. Покажем сначала полноту: + +$ +f(v) = sum_(i = 1)^n phi_i v^i = sum_(i = 1)^n phi_i f^i (v) = (sum_(i = 1)^n phi_i f^i) (v) +$ + +Аналогично с линейной независимостью. Предположим, что линейная комбинация форм с некоторыми коэффициентами $alpha_i$ равна нуль-форме. + +$ +sum_(i = 1)^n alpha_i f^i = theta +$ + +Применяя эту нуль-форму к произвольному базисному вектору, получим + +$ +(sum_(i = 1)^n alpha_i f^i) (e_k) = theta(e_k) = 0 +$ + +Учитывая также свойства линейности и их определение + +$ +sum_(i = 1)^n alpha_i f^i (e_k) = 0 space.quad arrow.double space.quad alpha_k f^k (e_k) = 0 space.quad arrow.double space.quad alpha_k = 0 +$ + +#line(length: 100%) + +=== Теорема + +Пусть ${f^i}_(i = 1)^n$ и ${tilde(f^l)}_(l = 1)^n$ - базисы $V^*$, сопряженные соответственно базисам ${e^j}_(j = 1)^n$ и ${tilde(e)^k}_(k = 1)^n$. Тогда + +$ +tilde(f^l) = sum_(i = 1)^n sigma_i^l f^i +$ + +где $(sigma_i^l) = S$ - элементы обратной матрицы перехода, полагая $(tau_k^j) = T$ - матрица перехода из ${e^j}_(j = 1)^n$ в ${tilde(e)^k}_(k = 1)^n$. + +_Доказательство_. По определению сопряженных базисов имеем + +$ +tilde(f^l)(tilde(e)_k) = sum_(i = 1)^n sigma_i^l f^i (sum_(i = 1)^n tau_k^j e_j) = sum_(i = 1)^n sum_(j = 1)^n sigma_i^l tau_k^j f^i (e_j) = +$ + +$ += sum_(i = 1)^n sum_(j = 1)^n sigma_i^l tau_k^j delta_j^i = sum_(i = 1)^n sum_(j = 1)^n sigma_i^l tau_k^i = delta_k^l +$ + +Откуда следует, что произведение матрицы, составленной из $sigma_i^l$, на матрицу перехода с элементами $tau_k^i$ должно быть равно единичной матрице. А это есть не что иное как определение обратной матрицы. + +#line(length: 100%) + +=== Теорема + +Преобразование координат формы в $V^*$ при переходе от базиса ${f^i}_(i = 1)^n$ к базису ${tilde(f)}_(l = 1)^n$ имеет вид + +$ +tilde(eta_l) = f(tilde(e_l)) = sum_(i = 1)^n eta_i f^i (sum_(j = 1)^n tau_l^j e_j) = sum_(i = 1)^n sum_(j = 1)^n eta_i tau_l^j f^i (e_j) = +$ + +$ +sum_(i = 1)^n sum_(j = 1)^n eta_i tau_l^j delta_j^i = sum_(i = 1)^n tau_l^i eta_i +$ + +#line(length: 100%) + +=== Лемма + +Пространство $V$ и сопряженное пространство $V^*$ изоморфны. + +_Доказательство_. Справедливость утверждения следует из того, что $dim V = dim V^*$ (мощности базисов равны), а следовательно + +$ +V tilde.eq KK_n tilde.eq V^* +$ + +Изоморфизм устанавливается введенным соответствием между базисами пространств $V$ и $V^*$. + +Отметим, что операцию нахождения сопряженного пространства можно применять итеративно. + +#line(length: 100%) + +=== Понятие второго сопряженного пространства + +Элементами второого сопряженного пространства являются функции, также обладающие линейностью, от линейных форм. + +#line(length: 100%) + +=== Теорема + +Между пространствами $V$ и $V^(**)$ можно установить изоморфизм без использования базиса (канонический изоморфизм). + +_Доказательство_. Рассмотрим элементы второго сопряженного пространства $hat(v), hat(u) in V^(**)$: + +$ +hat(v) : V^* arrow KK, space.quad hat(v)(f) in KK +$ + +$ +hat(v)(f + g) = hat(v)(f) + hat(v)(g), space.quad hat(v)(alpha f) = alpha hat(v) (f) +$ + +$ +(hat(v) + hat(u))(f) = hat(v)(f) + hat(u)(f), space.quad (alpha hat(v))(f) = alpha hat(v)(f) +$ + +Канонический изоморфизм устанавливается отношением + +$ +hat(x) arrow.l.r x : space.quad hat(v)(f) = f(v) space.quad forall f in V^* +$ + +#line(length: 100%) + +=== Понятие билинейной формы + +*Билинейной формой* на линейном пространстве $V(KK)$ называется такая функция $b : V times V arrow KK$, что $forall x, x_1, x_2, y, y_1, y_2 in V, forall lambda_1, lambda_2 in KK$ выполняется: +(а) Линейность по первому аргументу: + +$ +b(lambda_1 x_1 + lambda_2 x_2, y) = lambda_1 b(x_1, y) + lambda_2 b(x_2, y) +$ + +(б) Линейность по второму аргументу: + +$ +b(x, lambda_1 y_1 + lambda_2 y_2) = lambda_1 b(x, y_1) + lambda_2 b(x, y_2) +$ + +#line(length: 100%) + +=== Замечание + +Билинейная форма при фиксировании одного из аргументов есть ничто иное как линейная форма согласно определению, которое было введено ранее. Отсюа сразу следует первый пример. + +#line(length: 100%) + +=== Пример + +Пусть $f, g in V^*$ - линейные формы в пространстве $V(KK)$. Билинейная форма может быть задана как + +$ +b : V times V arrow KK, space.quad b(x, y) = f(x) dot g(y) +$ + +#line(length: 100%) + +=== Пример + +Скалярное произведение геометрических векторов на плоскости (в пространстве) линейно по каждому из аргументов, а следовательно является билинейной формой. + +#line(length: 100%) + +=== Пример + +Пусть $V eq KK^n$ - арифметическое пространство. Билинейную форму можно задать как + +$ +b(x, y) = sum_(i = 1)^n sum_(j = 1)^n beta_(i j)epsilon^i eta^j, +$ + +где $x eq (epsilon^1, epsilon^2, dots, epsilon^n)^T in V$ и $y = (eta^1, eta^2, dots, eta^n)^T in V$. + +#line(length: 100%) + +=== Замечание + +Последний пример примечателен тем, что любую билинейную форму можно представить в таком виде. + +Рассмотрим $"Bil"_KK(V)$ - множество всех билинейных форм с аргументами из $V$. Для этого множества справедливо следующее. + +(а) Билинейные формы $b, b' in "Bil"_KK (V)$ равны тогда и только тогда, когда принимают равные значения на одинаковых парах аргументов: + +$ +b = b' space.quad arrow.double.l.r space.quad b(x, y) = b'(x, y) space.quad forall x, y in V +$ + +(б) Существует нулевая билинейная форма $theta in "Bil"_KK (V)$, принимающая $0 in KK$ на любой паре аргументов. + +$ +theta in "Bil"_KK (V) : space.quad theta(x, y) = 0, space.quad forall x, y in V +$ + +(в) Может быть определена сумма билинейных форм $b, b' in "Bil"_KK (V)$ как отображение вида + +$ +c = b + b' space.quad arrow.double.l.r space.quad c(x, y) = b(x, y) + b'(x, y), space.quad forall x, y in V +$ + +(г) Может быть определено умножение билинейной формы $b in "Bil"_KK (V)$ на скаляр $lambda in KK$ как отображение вида + +$ +d = lambda b space.quad arrow.double.l.r space.quad d(x, y) = lambda b(x, y), space.quad forall x, y in V +$ + +#line(length: 100%) + +=== Лемма + +Отображение $c$ и $d$ являются билинейными формами. + +_Доказательство_. Аналогично соответствующим утверждениям для линейных форм. + +#line(length: 100%) + +=== Лемма + +Множество $"Bil"_KK (V)$ наделено структурой линейного пространства. + +_Доказательство_. Можно убедиться путем прямой проверки аксиом линейного пространства. + +#line(length: 100%) + +=== Понятие симметричной билинейной формы + +Билинейная форма $b in "Bil"_KK (V)$ называется *симметричной*, если выполняется $b(x, y) = b(y, x)$. + +#line(length: 100%) + +=== Понятие антисимметричной билинейной формой + +Билинейная форма $b in "Bil"_KK (V)$ называется *антисимметричной*, если выполняется $b(x, y) = -b(y, x)$. + +#line(length: 100%) + +=== Лемма + +Сумма симметричной и антисимметричной формы, построенных согласно процедуре выше, дает исходную билинейную форму. + +_Доказательство_. Убеждаемся непосредственной проверкой: + +$ +b^S (x, y) + b^(A S)(x, y) = frac(1, 2) (b(x, y) + b(y, x)) + frac(1, 2)(b(x, y) - b(y, x)) = b(x, y) +$ + +#line(length: 100%) + +=== Лемма + +Пространство билинейных форм представляется в виде прямой суммы подпространств симметричных и антисимметричных билинейных форм. + +$ +"Bil"_KK (V) = "Bil"_KK^S (V) xor "Bil"_KK^(A S)(V) +$ + +_Доказательство_. + +Процедура изготовления симметричных (антисимметричных) форм, описанная выше, позволяет заключить, что + +$ +"Bil"_KK (V) = "Bil"_KK^S (V) + "Bil"_KK^(A S) (V) +$ + +Покажем, что сумма будет прямой. Пусть билинейная форма $h(x, y)$ такова, что $h in "Bil"_KK^S (V) inter "Bil"_KK^(A S) (V)$. Тогда имеем + +$ +cases(h(x, y) = h(y, x), h(x, y) = -h(y, x)) space.quad arrow.double h(y, x) = -h(y, x) space.quad arrow.double arrow.quad h(x, y) = 0 space.quad forall x, y in V +$ + +В пересечении подпространств лежит только нулевая билинейная форма. Следовательно сумма является прямой. + + +#line(length: 100%) + +=== Понятие коэффициентов билинейной формы + +*Коэффициентами* $beta_(i j)$ билинейной формы $b(x, y)$ называются значения этой линейной формы на базисных векторах пространства. + +$ +b(e_i, e_j) = beta_(i j) +$ + +#line(length: 100%) + + +=== Теорема + +Задание билинейной формы эквивалентно заданию ее значений на базисных векторах, т. е. заданию ее коэффициентов. + +_Доказательство_. Пусть в выбранном базисе ${e_i}_(i = 1)^n$ линейного пространства $V$ билинейная форма $b(x, y)$ задана набором коэффициентов ${beta_(i j)}_(i, j = 1)^n$. Тогда $forall x = sum_(i = 1)^n xi^i e_i, space y = sum_(j = 1)^n eta^j e_j:$ + +$ +b(x, y) = b(sum_(i = 1)^n xi^i e_i, space sum_(j = 1)^n eta^j e_j) = sum_(i = 1)^n sum_(j = 1)^n xi^i eta^j b(e_i, e_j) = sum_(i = 1)^n sum_(j = 1)^n xi^i eta^j beta_(i j) +$ + +По аналогии с линейными формами, коэффициенты которых можно представить в виде вектора-строки, существует аналогичное представление для билинейной формы. + +=== Понятие матрицы билинейной формы + +Матрицей билинейной формы $b(x, y)$ называется матрица $B$, составленная из ее коэффициентов. + +#line(length: 100%) + +=== Лемма + +Пространство билинейных форм $"Bil"_KK (V)$ изоморфно пространству квадратных матриц $M_n(KK)$. + +_Доказательство_. Изоморфизм устанавливается следующим образом: + +$ +b arrow.l.r B space.quad b' arrow.l.r B' +$ + +$ +b + b' arrow.l.r B + B' +$ + +$ +lambda b arrow.l.r lambda B +$ + +Соответствие между линейными операциями с билинейными формами и матрицами проверяется непосредственной проверкой определений. + +#line(length: 100%) + +=== Теорема + +Матрицы $B$ и $B'$ билинейной формы $b(x, y)$, заданные в базисах ${e_i}_(i = 1)^n$ и ${e_j^'}_(j = 1)^n$ связаны соотношением + +$ +B' = C^T B C, +$ + +где $C = (c_j^i)$ - матрица перехода от базиса ${e_i}_(i = 1)^n$ к базису ${e_j^'}_(j = 1)^n$. + +_Доказательство_. Полагая, что известна матрица перехода $C = (c_j^i)$, компоненты нового базиса можно выразить через векторы старого базиса как + +$ +e_j^' = sum_(i = 1)^n c_j^i e_i +$ + +Воспользуемся этим, чтобы получить компоненты матрицы билинейной формы в новом базисе + +$ +beta_(i j)^' = b(e_i^', e_j^') = b(sum_(k = 1)^n c_i^k e_k, space sum_(l = 1)^n c_j^l e_l) = sum_(k = 1)^n sum_(l = 1)^n c_i^k c_j^l b(e_k, e_l) = sum_(k = 1)^n sum_(l = 1)^n c_i^k c_j^l beta_(k l), +$ + +где $beta_(k l) = b(e_k, e_l)$ для всех $k, l = 1, dots n$ - коэффициенты матрицы билинейной формы в старом базисе. Данное двойное суммирование означает ничто иное как матричное умножение, которое можно записать в виде + +$ +B' = C^T B C +$ + +Данное утверждение легко проверяется прямым раскрытием матричного умножения в индексном виде. + +#line(length: 100%) + +=== Понятие квадратичной формы + +*Квадратичной формой* на линейном пространстве $V$ называется отображение $q(v)$, построенное из билинейной формы $b(x, y)$ следующим образом: + +$ +q : V arrow KK, space.quad q(v) = b(v, v), space.quad forall x in V +$ + +#line(length: 100%) + +=== Лемма + +Квадратичная форма является однородным полиномом степени 2 от координат вектора. + +_Доказательство_. Справедливы следующие рассуждения: + +$ +q(lambda v) = b(lambda v, lambda v) = lambda^2 b(v, v) = lambda^2 q(v) +$ + +Тем самым мы показали, что квадратичная форма является однородной функцией 2-го порядка. Зафиксируем теперь базис ${e_i}_(i = 1)^n$ в пространстве $V$. Произвольный вектор можем разложить по этому базису единственным образом $v = sum_(i = 1)^n v^i e_i$. Тогда квадратичная функция в координатном представлении имеет вид + +$ +q(v) = q(sum_(i = 1)^n v^i e_i) = b(sum_(i = 1)^n v^i e_i, space sum_(j = 1)^n v^j e_j) = +$ + +$ += sum_(i = 1)^n sum_(j = 1)^n v^i v^j b(e_i, e_j) = sum_(i = 1)^n sum_(j = 1)^n v^i v^j beta_(i j), +$ + +где $beta_(i j)$ - коэффициенты билинейной формы, по которой построена квадратичная форма $q(v)$. + +=== Лемма + +По квадратичной форме $q(v)$ однозначно восстанавливается симметричная компонента билинейной формы $b(x, y)$. + +_Доказательство_. Рассмотрим квадратичную форму от суммы векторов $x, y in V$: + + +$ +q(x + y) = b(x + y, x + y) = b(x, x) + b(x, y) + b(y, x) + b(y, y) = q(x) + b(x, y) + b(y, x) + q(y) +$ + +Откуда + +$ +b(x, y) + b(y, x) = q(x + y) - q(x) - q(y) +$ + +Если билинейную форму полагать симметричной, т.е. $b in "Bil"^S(V)$, то имеем + +$ +b(x, y) = frac(1, 2) (q(x + y) - q(x) - q(y)) +$ + +#line(length: 100%) + +=== Понятие полилинейной формы + +*Полилинейной формой* на линейном пространстве $V(KK)$ назовем отображение вида + +$ +cal(A) : V times dots times V times V^* times dots times V^* arrow KK +$ + +обладающее линейностью по каждому из аргументов + +$ +cal(A)(x_1, dots, alpha x_i^' + beta x_i^(''), dots, x_p; phi^1, dots, phi^q) = +$ + +$ += alpha cal(A) (x_1, dots, x_i^', dots, x_p; phi^1, dots, phi^q) + beta cal(A) (x_1, dots, x_i^(''), dots, x_p; phi^1, dots, phi^q), +$ + +где $x_i in V$ и $phi^j in V^*$. + +#line(length: 100%) + +=== Понятие валентности полилинейной формы + +*Валентностью* полилинейной формы называют пару чисел $(p, q)$, определяющих количество векторов и ковекторов (линейных форм), являющихся аргументами данного отображения. + +#line(length: 100%) + +=== Понятие равных полилинейных форм + +Полилинейные формы $cal(A), cal(B) in Omega^p_q$ одинаковой валентности будем называть *равными*, если + +$ +cal(A)(x_1, x_2, dots, x_p; phi^1, phi^2, dots, phi^q) = cal(B)(x_1, x_2, dots, x_p; phi^1, phi^2, dots, phi^q) +$ + +для любых наборов $x_1, x_2, dots, x_p in V$ и $phi^1, phi^2, dots, phi^q in V^*$. + +#line(length: 100%) + +=== Понятие нуль-формы + +*Нуль-формой* $Theta in Omega_q^p$ называется такая полилинейная форма, что + +$ +Theta (x_1, x_2, dots, x_p; phi^1, phi^2, dots, phi^q) = 0 space.quad forall x_i in V, space forall phi^j in V^* +$ + +Пусть $cal(A)$ и $cal(B)$ - полилинейные формы валентности $(p, q)$. Введем операции с ними. + +#line(length: 100%) + +=== Понятие суммы полилинейных форм + +Отображение $cal(C) = cal(A) + cal(B)$ будем называть суммой полилинейных форм $cal(A)$ и $cal(B)$, если + +$ +cal(C)(x_1, x_2, dots, x_p; phi^1, phi^2, dots, phi^q) = +$ + +$ += cal(A)(x_1, x_2, dots, x_p; phi^1, phi^2, dots, phi^q) + cal(B)(x_1, x_2, dots, x_p; phi^1, phi^2, dots, phi^q) +$ + +для любых наборов $x_1, x_2, dots, x_p in V$ и $phi^1, phi^2, dots, phi^q in V^*$. + +#line(length: 100%) + +=== Лемма + +Отображение $cal(C)$, определенное как сумма полилинейных форм $cal(A), cal(B) in Omega_q^p$ является полилинейной формой из $Omega_q^p$ + +_Доказательство_. Доказательство строится также как аналогичное доказательство для линейных и билинейных форм. + +#line(length: 100%) + +=== Понятие произведения полилинейной формы на скаляр + +Отображение $lambda cal(A)$ будем называть произведением полилинейной формы $cal(A)$ на скаляр $lambda$, если + +$ +(lambda cal(A))(x_1, x_2, dots, x_p; phi^1, phi^2, dots, phi^q) = lambda dot cal(A)(x_1, x_2, dots, x_p; phi^1, phi^2, dots, phi^q) +$ + +для любых наборов $x_1, x_2, dots, x_p in V$ и $phi^1, phi^2, dots, phi^q in V^*$. + +#line(length: 100%) + +=== Лемма + +Отображение $lambda cal(A)$, определенное как произведение полилинейной формы $cal(A) in Omega_q^p$ на скаляр $lambda in KK$ является полилинейной формой из $Omega_q^p$ + +_Доказательство_. Доказательство строится также как аналогичное доказательство для линейных и билинейных форм. + +#line(length: 100%) + +=== Теорема + +Множество $Omega_q^p$ полилинейных форм валентности $(p, q)$ образует линейное пространство. + +_Доказательство_. Доказательство сводится к проверке аксиом линейного пространства. + +#line(length: 100%) + +=== Понятие произведения полилинейных форм + +Произведением полилинейных форм $cal(A) in Omega_(q_1)^(p_1)$ и $cal(B) in Omega_(q_2)^(p_2)$ называют отображение $cal(C) = cal(A) dot cal(B)$ определяемое как + +$ +cal(A)(x_1, dots, x_(p_1) ; phi^1, dots, phi^(q_1)) dot cal(B)(x_(p_1 + 1), dots, x_(p_1 + p_2); phi^(q_1 + 1), dots, phi^(q_1 + q_2)) = +$ + +$ += cal(C)(x_1, dots, x_(p_1), x_(p_1 + 1), dots, x_(p_1 + p_2) ; phi^1, dots, phi^(q_1), phi^(q_1 + 1), dots, phi^(q_1 + q_2)) +$ + +#line(length: 100%) + +=== Лемма + +Отображение $cal(C)$, введенное как произведение полилинейных форм, является полилинейной формой. + +$ +cal(C) in Omega_(q_1 + q_2)^(p_1 + p_2) +$ + +_Доказательство_. Не теряя общности, мы можем показать линейность по первому векторному аргументу. Для остальных доказательство может быть построено аналогичным образом, но его запись при этом усложнится значительно. Пусть произведение полилинейных форм задается следующим образом: + +$ +cal(C)(x, dots ; dots) = cal(A)(x, dots ; dots) dot cal(B)(dots, dots ; dots), +$ + +где через многоточия обозначены остальные аргументы всех полилинейных форм согласно определению выше. + +При этом, если аргумент $x$ представлен линейной комбинацией $x = alpha_1 x_1 + alpha_2 x_2$, имеем + +$ +cal(C)(alpha_1 x_1 + alpha_2 x_2, dots ; dots) = cal(A)(alpha_1 x_1 + alpha_2 x_2, dots ; dots) dot cal(B)(dots ; dots) = +$ + +$ +(alpha_1 cal(A)(x_1, dots ; dots) + alpha_2 cal(A)(x_2, dots ; dots)) dot cal(B)(dots ; dots) = +$ + +$ +alpha_1 cal(A)(x_1, dots ; dots) dot cal(B)(dots ; dots) + alpha_2 cal(A)(x_2, dots ; dots) dot cal(B)(dots ; dots) = +$ + +$ +alpha_1 cal(C)(x_1, dots ; dots) + alpha_2 cal(C)(x_2, dots ; dots), +$ + +где мы воспользовались свойством полилинейности отображения $cal(A)$. В силу того, что это отображение линейно по каждому из аргументов, данные рассуждения справедливы по набору его аргументов. А также в силу того, что отображение $cal(B)$ тоже является полилинейным, свойство линейности отображения $cal(C)$ по каждому из аргументов набора из $cal(B)$. + +#line(length: 100%) + +=== Свойства произведения полилинейных форм + +(а) Некоммутативность + +$ +cal(A) dot cal(B) eq.not cal(B) dot cal(A) +$ + +Данное свойство очевидно вытекает из определения произведения в силу того, что порядок произведения $cal(A)$ и $cal(B)$ определяет порядок аргументов в $cal(C)$. Однако продемонстрируем это свойство на более простом примере. Рассмотрим следующие полилинейные формы, определенные как произведения обычных линейных форм $f^1, f^2 in V^*$ + +$ +cal(C)_1 = f^1 dot f^2 space.quad arrow.double space.quad cal(C)_1 (x, y) = f^1(x) dot f^2(y) +$ + +$ +cal(C)_2 = f^2 dot f^1 space.quad arrow.double space.quad cal(C)_2 (x, y) = f^2(x) dot f^1(y) +$ + +(б) Ассоциативность + +$ +cal(A) dot (cal(B) dot cal(C)) = (cal(A) dot cal(B)) dot cal(C) +$ + +(в) Нуль-форма + +$ +cal(A) dot Theta_((p_2, q_2)) = Theta_((p_1, q_1)) dot cal(B) = Theta_((p_1 + p_2, q_1 + q_2)) +$ + +(г) Законы согласования операций (дистрибутивность) + +$ +cal(A) dot (cal(B) + cal(C)) = cal(A) dot cal(B) + cal(A) dot cal(C) +$ + +$ +(cal(A) + cal(B)) dot cal(C) = cal(A) dot cal(C) + cal(B) dot cal(C) +$ + +$ +(alpha cal(A)) dot cal(B) = alpha (cal(A) dot cal(B)) = cal(A) dot (alpha cal(B)) +$ + +=== Понятие тензора полилинейной формы + +Зафиксируем в $V(KK)$ базис ${e_i}_(i = 1)^n$ и построим к нему сопряженный базис ${f^j}_(j = 1)^n$ в пространстве $V^*$. Вспомним, что эти базисы связаны соотношением + +$ +f^j(e_i) = delta_i^j = cases(1", "i = j, 0", "i eq.not j) +$ + +*Тензором* полилинейной формы $cal(C)$ валентности $(p, q)$ называется набор из $n^(p + q)$ скаляров, определяемых как действие полилинейной формы на всевозможных наборах базисных векторов. + +$ +c_(i_1 i_2 dots i_p)^(j_1 j_2 dots j_q) = cal(C)(e_(i_1), e_(i_2), dots, e_(i_p); f^(j_1), f^(j_2), dots, f^(j_q)), +$ + +где индексы $i_1, i_2, dots, i_p$ и $j_1, j_2, dots, j_q$ принимаются значения $1, dots, n$, где $n = dim V$ - это размерность пространства $V$. + +=== Замечание о немом суммировании + +Прежде чем перейдем к дальнейшим рассуждениям, отметим следующий факт. Наличие большого количества индексов в случае анализа линейных объектов нередко приводит к большому количеству суммирований как в теоретических выкладках, так и в практических приложениях тензоров. По этой причине вводится так называемое *правило суммирования Эйнштейна*, или соглашение о немом суммировании. В контексте данной темы договоримся о следующем: + +(а) Если в одночлене присутствует одинаковый верхний и нижний индекс, то подразумевается суммирование по нему: + +$ +a^i b_i = sum_i a^i b_i +$ + +(б) Индекс, по которому происходит суммирование, называют немым в силу того, что его обозначение не принципиально, т. е. + +$ +a^i b_i = a^j b_j = a^k b_k +$ + +(в) Необходимо соблюдение баланса индексов. Если индекс не является немым, то в левой и правой частях равенства должны присутствовать одни и те же индексы, а также должен быть неизменным их порядок, т.е. + +$ +e_(i k)b^(k l) = c_i^l +$ + +#line(length: 100%) + +=== Теорема + +Задание тензора эквивалентно заданию его компонент в паре базисов пространств $V$ и $V^*$. + +_Доказательство_. Рассмотрим набор векторов $x_1, dots, x_p$ и форм $phi^1, dots, phi^q$, заданных своими разложениями по базисам + +$ +x_k = sum_(i = 1)^n xi_k^i e_i = xi^i_k e_i space.quad phi^l = sum_(j = 1)^n eta_j^l f^j = eta_j^l f^j +$ + +Применим к ним тензор $cal(C)(x_1, dots, x_p; pphi^1, dots, phi^q)$ и воспользуемся его линейными свойствами + +$ +cal(C)(x_1, dots, x_p; phi^1, dots, phi^q) = cal(C)(xi_1^(i_1)e_(i_1), dots, xi_p^(i_p)e_(i_p); eta^1_(j_1) f^(j_1), dots, eta_(j_q)^q f^(j_q)) = +$ + +$ += xi_1^(i_1) xi_2^(i_2) dots xi_p^(i_p) eta^1_(j_1) eta^2_(j_2) dots eta^q_(j_q) cal(C)(e_(i_1), e_(i_2), dots, e_(i_p) ; f^(j_1), f^(j_2), dots, f^(j_q)) = +$ + +$ += xi_1^(i_1) xi_2^(i_2) dots xi_p^(i_p) eta^1_(j_1) eta^2_(j_2) dots eta^q_(j_q) c_(i_1 i_2 dots i_p)^(j_1 j_2 dots j_q), +$ + +где в данной записи мы как раз воспользовались соглашением о немом суммировании. + +#line(length: 100%) diff --git a/algorithms/labs/lab6/assets/1.png b/algorithms/labs/lab6/assets/1.png new file mode 100644 index 0000000..79f9c1c Binary files /dev/null and b/algorithms/labs/lab6/assets/1.png differ diff --git a/algorithms/labs/lab6/assets/2.png b/algorithms/labs/lab6/assets/2.png new file mode 100644 index 0000000..19f4319 Binary files /dev/null and b/algorithms/labs/lab6/assets/2.png differ diff --git a/algorithms/labs/lab6/assets/3.png b/algorithms/labs/lab6/assets/3.png new file mode 100644 index 0000000..eb721fa Binary files /dev/null and b/algorithms/labs/lab6/assets/3.png differ diff --git a/algorithms/labs/lab6/code/1.py b/algorithms/labs/lab6/code/1.py new file mode 100644 index 0000000..7ed4a7d --- /dev/null +++ b/algorithms/labs/lab6/code/1.py @@ -0,0 +1,29 @@ +def thief_knapsack(weights, values, M, K): + cap = M * K + n = len(weights) + dp = [0] * (cap + 1) + take = [[False] * (cap + 1) for _ in range(n)] + for i in range(n): + w = weights[i] + v = values[i] + for c in range(cap, w - 1, -1): + if dp[c - w] + v > dp[c]: + dp[c] = dp[c - w] + v + take[i][c] = True + c = cap + items = [] + for i in range(n - 1, -1, -1): + if take[i][c]: + items.append(i) + c -= weights[i] + items.reverse() + return dp[cap], items + + +if __name__ == "__main__": + weights = [2, 3, 4, 5, 9, 7, 3] + values = [3, 4, 5, 8, 10, 7, 6] + M = 2 + K = 10 + best, items = thief_knapsack(weights, values, M, K) + print(best, items) diff --git a/algorithms/labs/lab6/code/2.py b/algorithms/labs/lab6/code/2.py new file mode 100644 index 0000000..01d407e --- /dev/null +++ b/algorithms/labs/lab6/code/2.py @@ -0,0 +1,35 @@ +def matrix_chain_order(p): + n = len(p) - 1 + m = [[0] * n for _ in range(n)] + s = [[0] * n for _ in range(n)] + for L in range(2, n + 1): + for i in range(n - L + 1): + j = i + L - 1 + m[i][j] = 10**18 + for k in range(i, j): + q = m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1] + if q < m[i][j]: + m[i][j] = q + s[i][j] = k + return m, s + + +def build_parenthesization(s, i, j, names): + if i == j: + return names[i] + k = s[i][j] + return ( + "(" + + build_parenthesization(s, i, k, names) + + build_parenthesization(s, k + 1, j, names) + + ")" + ) + + +if __name__ == "__main__": + p = [30, 35, 15, 5, 10, 20, 25] + names = ["A", "B", "C", "D", "E", "F"][: len(p) - 1] + m, s = matrix_chain_order(p) + expr = build_parenthesization(s, 0, len(p) - 2, names) + print(m[0][len(p) - 2]) + print(expr) diff --git a/algorithms/labs/lab6/code/3.py b/algorithms/labs/lab6/code/3.py new file mode 100644 index 0000000..a83b9bc --- /dev/null +++ b/algorithms/labs/lab6/code/3.py @@ -0,0 +1,29 @@ +def longest_increasing_run(a): + if not a: + return 0, -1, -1 + best_len = 1 + best_l = 0 + best_r = 0 + cur_len = 1 + cur_l = 0 + for i in range(1, len(a)): + if a[i] > a[i - 1]: + cur_len += 1 + else: + if cur_len > best_len: + best_len = cur_len + best_l = cur_l + best_r = i - 1 + cur_len = 1 + cur_l = i + if cur_len > best_len: + best_len = cur_len + best_l = cur_l + best_r = len(a) - 1 + return best_len, best_l, best_r + + +if __name__ == "__main__": + a = [1, 2, 3, -1, 0, 1, 1, 2, 3, 4, -5] + length, l, r = longest_increasing_run(a) + print(length, l, r) diff --git a/algorithms/labs/lab6/in/task.pdf b/algorithms/labs/lab6/in/task.pdf new file mode 100644 index 0000000..a1a51a3 Binary files /dev/null and b/algorithms/labs/lab6/in/task.pdf differ diff --git a/algorithms/labs/lab6/in/theory.pdf b/algorithms/labs/lab6/in/theory.pdf new file mode 100644 index 0000000..7b160b4 Binary files /dev/null and b/algorithms/labs/lab6/in/theory.pdf differ diff --git a/algorithms/labs/lab6/leetcode/1/link.txt b/algorithms/labs/lab6/leetcode/1/link.txt new file mode 100644 index 0000000..4c18213 --- /dev/null +++ b/algorithms/labs/lab6/leetcode/1/link.txt @@ -0,0 +1 @@ +https://leetcode.com/problems/regular-expression-matching/submissions/1769086671/?envType=problem-list-v2&envId=dynamic-programming diff --git a/algorithms/labs/lab6/leetcode/1/solution.py b/algorithms/labs/lab6/leetcode/1/solution.py new file mode 100644 index 0000000..7ada0c4 --- /dev/null +++ b/algorithms/labs/lab6/leetcode/1/solution.py @@ -0,0 +1,14 @@ +class Solution: + def isMatch(self, s: str, p: str) -> bool: + from functools import lru_cache + + @lru_cache(None) + def dp(i: int, j: int) -> bool: + if j == len(p): + return i == len(s) + first = i < len(s) and (p[j] == s[i] or p[j] == ".") + if j + 1 < len(p) and p[j + 1] == "*": + return dp(i, j + 2) or (first and dp(i + 1, j)) + return first and dp(i + 1, j + 1) + + return dp(0, 0) diff --git a/algorithms/labs/lab6/leetcode/2/link.txt b/algorithms/labs/lab6/leetcode/2/link.txt new file mode 100644 index 0000000..484dd65 --- /dev/null +++ b/algorithms/labs/lab6/leetcode/2/link.txt @@ -0,0 +1 @@ +https://leetcode.com/problems/longest-valid-parentheses/submissions/1769090768/?envType=problem-list-v2&envId=dynamic-programming diff --git a/algorithms/labs/lab6/leetcode/2/solution.py b/algorithms/labs/lab6/leetcode/2/solution.py new file mode 100644 index 0000000..9a1a837 --- /dev/null +++ b/algorithms/labs/lab6/leetcode/2/solution.py @@ -0,0 +1,15 @@ +class Solution: + def longestValidParentheses(self, s: str) -> int: + n = len(s) + dp = [0] * n + best = 0 + for i in range(1, n): + if s[i] == ")": + if s[i - 1] == "(": + dp[i] = (dp[i - 2] if i >= 2 else 0) + 2 + elif i - dp[i - 1] - 1 >= 0 and s[i - dp[i - 1] - 1] == "(": + dp[i] = dp[i - 1] + 2 + if i - dp[i - 1] - 2 >= 0: + dp[i] += dp[i - dp[i - 1] - 2] + best = max(best, dp[i]) + return best diff --git a/algorithms/labs/lab6/leetcode/3/link.txt b/algorithms/labs/lab6/leetcode/3/link.txt new file mode 100644 index 0000000..3b9a64d --- /dev/null +++ b/algorithms/labs/lab6/leetcode/3/link.txt @@ -0,0 +1 @@ +https://leetcode.com/problems/trapping-rain-water/?envType=problem-list-v2&envId=dynamic-programming diff --git a/algorithms/labs/lab6/leetcode/3/solution.py b/algorithms/labs/lab6/leetcode/3/solution.py new file mode 100644 index 0000000..2e87f2d --- /dev/null +++ b/algorithms/labs/lab6/leetcode/3/solution.py @@ -0,0 +1,20 @@ +from typing import List + + +class Solution: + def trap(self, height: List[int]) -> int: + n = len(height) + if n == 0: + return 0 + left = [0] * n + right = [0] * n + left[0] = height[0] + for i in range(1, n): + left[i] = max(left[i - 1], height[i]) + right[-1] = height[-1] + for i in range(n - 2, -1, -1): + right[i] = max(right[i + 1], height[i]) + ans = 0 + for i in range(n): + ans += min(left[i], right[i]) - height[i] + return ans diff --git a/algorithms/labs/lab6/out/report.docx b/algorithms/labs/lab6/out/report.docx new file mode 100644 index 0000000..ac59fd2 Binary files /dev/null and b/algorithms/labs/lab6/out/report.docx differ diff --git a/algorithms/labs/lab6/out/report.pdf b/algorithms/labs/lab6/out/report.pdf new file mode 100644 index 0000000..cefe22b Binary files /dev/null and b/algorithms/labs/lab6/out/report.pdf differ diff --git a/algorithms/labs/lab7/assets/1.png b/algorithms/labs/lab7/assets/1.png new file mode 100644 index 0000000..5c1cf9d Binary files /dev/null and b/algorithms/labs/lab7/assets/1.png differ diff --git a/algorithms/labs/lab7/assets/2.png b/algorithms/labs/lab7/assets/2.png new file mode 100644 index 0000000..ad7391b Binary files /dev/null and b/algorithms/labs/lab7/assets/2.png differ diff --git a/algorithms/labs/lab7/assets/3.png b/algorithms/labs/lab7/assets/3.png new file mode 100644 index 0000000..e1c0726 Binary files /dev/null and b/algorithms/labs/lab7/assets/3.png differ diff --git a/algorithms/labs/lab7/code/1.py b/algorithms/labs/lab7/code/1.py new file mode 100644 index 0000000..7a955cb --- /dev/null +++ b/algorithms/labs/lab7/code/1.py @@ -0,0 +1,14 @@ +def greedy_change(n, coins): + result = [] + for value, count in sorted(coins, key=lambda x: -x[0]): + while count > 0 and n >= value: + n -= value + count -= 1 + result.append(value) + return result if n == 0 else None + + +if __name__ == "__main__": + coins = [(10, 3), (5, 2), (2, 5), (1, 10)] + N = 28 + print(greedy_change(N, coins)) diff --git a/algorithms/labs/lab7/code/2.py b/algorithms/labs/lab7/code/2.py new file mode 100644 index 0000000..572baff --- /dev/null +++ b/algorithms/labs/lab7/code/2.py @@ -0,0 +1,20 @@ +def greedy_thief(weights, values, M, K): + items = list(zip(weights, values)) + items.sort(key=lambda x: x[1] / x[0], reverse=True) + cap = M * K + total_value = 0 + chosen = [] + for w, v in items: + if w <= cap: + chosen.append((w, v)) + cap -= w + total_value += v + return total_value, chosen + + +if __name__ == "__main__": + weights = [2, 3, 4, 5, 9, 7, 3] + values = [3, 4, 5, 8, 10, 7, 6] + M = 2 + K = 10 + print(greedy_thief(weights, values, M, K)) diff --git a/algorithms/labs/lab7/code/3.py b/algorithms/labs/lab7/code/3.py new file mode 100644 index 0000000..ed53ef0 --- /dev/null +++ b/algorithms/labs/lab7/code/3.py @@ -0,0 +1,26 @@ +import heapq + + +def dijkstra(graph, start): + dist = {v: float("inf") for v in graph} + dist[start] = 0 + pq = [(0, start)] + while pq: + d, v = heapq.heappop(pq) + if d > dist[v]: + continue + for u, w in graph[v]: + if dist[v] + w < dist[u]: + dist[u] = dist[v] + w + heapq.heappush(pq, (dist[u], u)) + return dist + + +if __name__ == "__main__": + graph = { + "Невский": [("Лиговский", 5), ("Гороховая", 3)], + "Лиговский": [("Московский", 7)], + "Гороховая": [("Московский", 4)], + "Московский": [], + } + print(dijkstra(graph, "Невский")) diff --git a/algorithms/labs/lab7/in/task.pdf b/algorithms/labs/lab7/in/task.pdf new file mode 100644 index 0000000..d594cfc Binary files /dev/null and b/algorithms/labs/lab7/in/task.pdf differ diff --git a/algorithms/labs/lab7/in/theory.pdf b/algorithms/labs/lab7/in/theory.pdf new file mode 100644 index 0000000..a620e2e Binary files /dev/null and b/algorithms/labs/lab7/in/theory.pdf differ diff --git a/algorithms/labs/lab7/leetcode/1/link.txt b/algorithms/labs/lab7/leetcode/1/link.txt new file mode 100644 index 0000000..fad2762 --- /dev/null +++ b/algorithms/labs/lab7/leetcode/1/link.txt @@ -0,0 +1 @@ +https://leetcode.com/problems/wildcard-matching/?envType=problem-list-v2&envId=greedy diff --git a/algorithms/labs/lab7/leetcode/1/solution.py b/algorithms/labs/lab7/leetcode/1/solution.py new file mode 100644 index 0000000..33d0461 --- /dev/null +++ b/algorithms/labs/lab7/leetcode/1/solution.py @@ -0,0 +1,26 @@ +from typing import List + + +class Solution: + def isMatch(self, s: str, p: str) -> bool: + i = j = 0 + star = -1 + match = 0 + n, m = len(s), len(p) + while i < n: + if j < m and (p[j] == s[i] or p[j] == "?"): + i += 1 + j += 1 + elif j < m and p[j] == "*": + star = j + match = i + j += 1 + elif star != -1: + j = star + 1 + match += 1 + i = match + else: + return False + while j < m and p[j] == "*": + j += 1 + return j == m diff --git a/algorithms/labs/lab7/leetcode/2/link.txt b/algorithms/labs/lab7/leetcode/2/link.txt new file mode 100644 index 0000000..6b7ce5d --- /dev/null +++ b/algorithms/labs/lab7/leetcode/2/link.txt @@ -0,0 +1 @@ +https://leetcode.com/problems/candy/description/?envType=problem-list-v2&envId=greedy diff --git a/algorithms/labs/lab7/leetcode/2/solution.py b/algorithms/labs/lab7/leetcode/2/solution.py new file mode 100644 index 0000000..5b704bb --- /dev/null +++ b/algorithms/labs/lab7/leetcode/2/solution.py @@ -0,0 +1,14 @@ +from typing import List + + +class Solution: + def candy(self, ratings: List[int]) -> int: + n = len(ratings) + candies = [1] * n + for i in range(1, n): + if ratings[i] > ratings[i - 1]: + candies[i] = candies[i - 1] + 1 + for i in range(n - 2, -1, -1): + if ratings[i] > ratings[i + 1]: + candies[i] = max(candies[i], candies[i + 1] + 1) + return sum(candies) diff --git a/algorithms/labs/lab7/leetcode/3/link.txt b/algorithms/labs/lab7/leetcode/3/link.txt new file mode 100644 index 0000000..e7d77f9 --- /dev/null +++ b/algorithms/labs/lab7/leetcode/3/link.txt @@ -0,0 +1 @@ +https://leetcode.com/problems/create-maximum-number/?envType=problem-list-v2&envId=greedy diff --git a/algorithms/labs/lab7/leetcode/3/solution.py b/algorithms/labs/lab7/leetcode/3/solution.py new file mode 100644 index 0000000..21bc896 --- /dev/null +++ b/algorithms/labs/lab7/leetcode/3/solution.py @@ -0,0 +1,46 @@ +from typing import List + + +class Solution: + def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]: + def pick(arr: List[int], t: int) -> List[int]: + drop = len(arr) - t + st = [] + for x in arr: + while drop and st and st[-1] < x: + st.pop() + drop -= 1 + st.append(x) + return st[:t] + + def greater(a: List[int], i: int, b: List[int], j: int) -> bool: + while i < len(a) and j < len(b) and a[i] == b[j]: + i += 1 + j += 1 + if j == len(b): + return True + if i < len(a) and a[i] > b[j]: + return True + return False + + def merge(a: List[int], b: List[int]) -> List[int]: + i = j = 0 + res = [] + while i < len(a) or j < len(b): + if greater(a, i, b, j): + res.append(a[i]) + i += 1 + else: + res.append(b[j]) + j += 1 + return res + + m, n = len(nums1), len(nums2) + ans = [] + for i in range(max(0, k - n), min(k, m) + 1): + a = pick(nums1, i) + b = pick(nums2, k - i) + cand = merge(a, b) + if not ans or cand > ans: + ans = cand + return ans diff --git a/algorithms/labs/lab7/out/report.docx b/algorithms/labs/lab7/out/report.docx new file mode 100644 index 0000000..259a600 Binary files /dev/null and b/algorithms/labs/lab7/out/report.docx differ diff --git a/algorithms/labs/lab7/out/report.pdf b/algorithms/labs/lab7/out/report.pdf new file mode 100644 index 0000000..da454d9 Binary files /dev/null and b/algorithms/labs/lab7/out/report.pdf differ diff --git a/algorithms/labs/lab8/assets/comp/1.png b/algorithms/labs/lab8/assets/comp/1.png new file mode 100644 index 0000000..0eb495e Binary files /dev/null and b/algorithms/labs/lab8/assets/comp/1.png differ diff --git a/algorithms/labs/lab8/assets/comp/2.png b/algorithms/labs/lab8/assets/comp/2.png new file mode 100644 index 0000000..7707fdd Binary files /dev/null and b/algorithms/labs/lab8/assets/comp/2.png differ diff --git a/algorithms/labs/lab8/assets/comp/3.png b/algorithms/labs/lab8/assets/comp/3.png new file mode 100644 index 0000000..ae72882 Binary files /dev/null and b/algorithms/labs/lab8/assets/comp/3.png differ diff --git a/algorithms/labs/lab8/assets/dp/1.png b/algorithms/labs/lab8/assets/dp/1.png new file mode 100644 index 0000000..09bbe13 Binary files /dev/null and b/algorithms/labs/lab8/assets/dp/1.png differ diff --git a/algorithms/labs/lab8/assets/dp/2.png b/algorithms/labs/lab8/assets/dp/2.png new file mode 100644 index 0000000..bf3c092 Binary files /dev/null and b/algorithms/labs/lab8/assets/dp/2.png differ diff --git a/algorithms/labs/lab8/assets/dp/3.png b/algorithms/labs/lab8/assets/dp/3.png new file mode 100644 index 0000000..79032bf Binary files /dev/null and b/algorithms/labs/lab8/assets/dp/3.png differ diff --git a/algorithms/labs/lab8/assets/greedy/1.png b/algorithms/labs/lab8/assets/greedy/1.png new file mode 100644 index 0000000..5849bd6 Binary files /dev/null and b/algorithms/labs/lab8/assets/greedy/1.png differ diff --git a/algorithms/labs/lab8/assets/greedy/2.png b/algorithms/labs/lab8/assets/greedy/2.png new file mode 100644 index 0000000..0a63984 Binary files /dev/null and b/algorithms/labs/lab8/assets/greedy/2.png differ diff --git a/algorithms/labs/lab8/assets/greedy/3.png b/algorithms/labs/lab8/assets/greedy/3.png new file mode 100644 index 0000000..accda44 Binary files /dev/null and b/algorithms/labs/lab8/assets/greedy/3.png differ diff --git a/algorithms/labs/lab8/assets/hash/1.png b/algorithms/labs/lab8/assets/hash/1.png new file mode 100644 index 0000000..a94833e Binary files /dev/null and b/algorithms/labs/lab8/assets/hash/1.png differ diff --git a/algorithms/labs/lab8/assets/hash/2.png b/algorithms/labs/lab8/assets/hash/2.png new file mode 100644 index 0000000..b06189c Binary files /dev/null and b/algorithms/labs/lab8/assets/hash/2.png differ diff --git a/algorithms/labs/lab8/assets/hash/3.png b/algorithms/labs/lab8/assets/hash/3.png new file mode 100644 index 0000000..9efcddb Binary files /dev/null and b/algorithms/labs/lab8/assets/hash/3.png differ diff --git a/algorithms/labs/lab8/assets/search/1.png b/algorithms/labs/lab8/assets/search/1.png new file mode 100644 index 0000000..34df97b Binary files /dev/null and b/algorithms/labs/lab8/assets/search/1.png differ diff --git a/algorithms/labs/lab8/assets/search/2.png b/algorithms/labs/lab8/assets/search/2.png new file mode 100644 index 0000000..7c692ea Binary files /dev/null and b/algorithms/labs/lab8/assets/search/2.png differ diff --git a/algorithms/labs/lab8/assets/search/3.png b/algorithms/labs/lab8/assets/search/3.png new file mode 100644 index 0000000..88bfde9 Binary files /dev/null and b/algorithms/labs/lab8/assets/search/3.png differ diff --git a/algorithms/labs/lab8/assets/sorting/1.png b/algorithms/labs/lab8/assets/sorting/1.png new file mode 100644 index 0000000..23af46f Binary files /dev/null and b/algorithms/labs/lab8/assets/sorting/1.png differ diff --git a/algorithms/labs/lab8/assets/sorting/2.png b/algorithms/labs/lab8/assets/sorting/2.png new file mode 100644 index 0000000..c1010f1 Binary files /dev/null and b/algorithms/labs/lab8/assets/sorting/2.png differ diff --git a/algorithms/labs/lab8/assets/sorting/3.png b/algorithms/labs/lab8/assets/sorting/3.png new file mode 100644 index 0000000..098f2e1 Binary files /dev/null and b/algorithms/labs/lab8/assets/sorting/3.png differ diff --git a/algorithms/labs/lab8/code/comp/1.py b/algorithms/labs/lab8/code/comp/1.py new file mode 100644 index 0000000..e2ec348 --- /dev/null +++ b/algorithms/labs/lab8/code/comp/1.py @@ -0,0 +1,15 @@ +def choose_search_strategy(n, q): + cost_linear = q * n + cost_binary = n * (n.bit_length()) + q * (n.bit_length()) + cost_hash = n + q + if cost_linear <= cost_binary and cost_linear <= cost_hash: + return "linear" + if cost_binary <= cost_hash: + return "binary_search_with_sort" + return "hash_table" + + +if __name__ == "__main__": + print(choose_search_strategy(10**3, 1)) + print(choose_search_strategy(10**5, 100)) + print(choose_search_strategy(10**6, 10**6)) diff --git a/algorithms/labs/lab8/code/comp/2.py b/algorithms/labs/lab8/code/comp/2.py new file mode 100644 index 0000000..092a8a9 --- /dev/null +++ b/algorithms/labs/lab8/code/comp/2.py @@ -0,0 +1,61 @@ +def longest_common_len_naive(strs, k): + s0 = strs[0] + best = 0 + for i in range(len(s0)): + for j in range(i + 1, len(s0) + 1): + sub = s0[i:j] + cnt = 0 + for s in strs: + if sub in s: + cnt += 1 + if cnt >= k and j - i > best: + best = j - i + return best + + +def longest_common_len_optimized(strs, k): + import sys + + def has_len(L): + if L == 0: + return True + base = 911382323 + mod = 10**9 + 7 + powL = pow(base, L - 1, mod) + commons = None + for s in strs: + if L > len(s): + return False + h = 0 + st = set() + for t in range(L): + h = (h * base + ord(s[t])) % mod + st.add(h) + for t in range(L, len(s)): + h = (h - ord(s[t - L]) * powL) % mod + h = (h * base + ord(s[t])) % mod + st.add(h) + if commons is None: + commons = st + else: + commons &= st + if not commons: + return False + return len(commons) >= k + + lo, hi = 0, min(len(s) for s in strs) + ans = 0 + while lo <= hi: + mid = (lo + hi) // 2 + if has_len(mid): + ans = mid + lo = mid + 1 + else: + hi = mid - 1 + return ans + + +if __name__ == "__main__": + strs = ["abracadabra", "cadabracad", "dabrac"] + print(longest_common_len_naive(strs, 2)) + print(longest_common_len_optimized(strs, 2)) diff --git a/algorithms/labs/lab8/code/comp/3.py b/algorithms/labs/lab8/code/comp/3.py new file mode 100644 index 0000000..82b196b --- /dev/null +++ b/algorithms/labs/lab8/code/comp/3.py @@ -0,0 +1,12 @@ +def choose_mm_algorithm(n): + if n <= 64: + return "classical" + if n <= 512: + return "blocked" + return "strassen" + + +if __name__ == "__main__": + print(choose_mm_algorithm(64)) + print(choose_mm_algorithm(256)) + print(choose_mm_algorithm(1500)) diff --git a/algorithms/labs/lab8/code/dp/1.py b/algorithms/labs/lab8/code/dp/1.py new file mode 100644 index 0000000..fd46d3e --- /dev/null +++ b/algorithms/labs/lab8/code/dp/1.py @@ -0,0 +1,14 @@ +def word_break(s, wordDict): + dp = [True] + [False] * len(s) + for i in range(1, len(s) + 1): + for w in wordDict: + j = i - len(w) + if j >= 0 and dp[j] and s[j:i] == w: + dp[i] = True + break + return dp[-1] + + +if __name__ == "__main__": + print(word_break("applepenapple", ["apple", "pen"])) + print(word_break("catsandog", ["cats", "dog", "sand", "and", "cat"])) diff --git a/algorithms/labs/lab8/code/dp/2.py b/algorithms/labs/lab8/code/dp/2.py new file mode 100644 index 0000000..71df1b5 --- /dev/null +++ b/algorithms/labs/lab8/code/dp/2.py @@ -0,0 +1,18 @@ +def min_cost_to_win(n): + dp = [[0] * (n + 2) for _ in range(n + 2)] + for length in range(2, n + 1): + for i in range(1, n - length + 2): + j = i + length - 1 + best = 10**9 + for p in range(i, j + 1): + left = dp[i][p - 1] if p > i else 0 + right = dp[p + 1][j] if p < j else 0 + best = min(best, p + max(left, right)) + dp[i][j] = best + return dp[1][n] + + +if __name__ == "__main__": + print(min_cost_to_win(1)) + print(min_cost_to_win(2)) + print(min_cost_to_win(10)) diff --git a/algorithms/labs/lab8/code/dp/3.py b/algorithms/labs/lab8/code/dp/3.py new file mode 100644 index 0000000..182e2d1 --- /dev/null +++ b/algorithms/labs/lab8/code/dp/3.py @@ -0,0 +1,14 @@ +def find_max_form(strs, m, n): + dp = [[0] * (n + 1) for _ in range(m + 1)] + for s in strs: + z = s.count("0") + o = len(s) - z + for i in range(m, z - 1, -1): + for j in range(n, o - 1, -1): + dp[i][j] = max(dp[i][j], dp[i - z][j - o] + 1) + return dp[m][n] + + +if __name__ == "__main__": + print(find_max_form(["10", "0001", "111001", "1", "0"], 5, 3)) + print(find_max_form(["10", "0", "1"], 1, 1)) diff --git a/algorithms/labs/lab8/code/greedy/1.py b/algorithms/labs/lab8/code/greedy/1.py new file mode 100644 index 0000000..8486830 --- /dev/null +++ b/algorithms/labs/lab8/code/greedy/1.py @@ -0,0 +1,12 @@ +def max_profit(prices): + profit = 0 + for i in range(1, len(prices)): + if prices[i] > prices[i - 1]: + profit += prices[i] - prices[i - 1] + return profit + + +if __name__ == "__main__": + print(max_profit([7, 1, 5, 3, 6, 4])) + print(max_profit([1, 2, 3, 4, 5])) + print(max_profit([7, 6, 4, 3, 1])) diff --git a/algorithms/labs/lab8/code/greedy/2.py b/algorithms/labs/lab8/code/greedy/2.py new file mode 100644 index 0000000..80c0d93 --- /dev/null +++ b/algorithms/labs/lab8/code/greedy/2.py @@ -0,0 +1,16 @@ +def can_complete_circuit(gas, cost): + if sum(gas) < sum(cost): + return -1 + start = 0 + bal = 0 + for i in range(len(gas)): + bal += gas[i] - cost[i] + if bal < 0: + start = i + 1 + bal = 0 + return start + + +if __name__ == "__main__": + print(can_complete_circuit([1, 2, 3, 4, 5], [3, 4, 5, 1, 2])) + print(can_complete_circuit([2, 3, 4], [3, 4, 3])) diff --git a/algorithms/labs/lab8/code/greedy/3.py b/algorithms/labs/lab8/code/greedy/3.py new file mode 100644 index 0000000..92bba4b --- /dev/null +++ b/algorithms/labs/lab8/code/greedy/3.py @@ -0,0 +1,22 @@ +from functools import cmp_to_key + + +def largest_number(nums): + arr = list(map(str, nums)) + + def cmp(a, b): + if a + b < b + a: + return 1 + if a + b > b + a: + return -1 + return 0 + + arr.sort(key=cmp_to_key(cmp)) + res = "".join(arr) + return "0" if res[0] == "0" else res + + +if __name__ == "__main__": + print(largest_number([10, 2])) + print(largest_number([3, 30, 34, 5, 9])) + print(largest_number([0, 0])) diff --git a/algorithms/labs/lab8/code/hash/1.py b/algorithms/labs/lab8/code/hash/1.py new file mode 100644 index 0000000..e75f4bb --- /dev/null +++ b/algorithms/labs/lab8/code/hash/1.py @@ -0,0 +1,60 @@ +class Node: + def __init__(self, key, val): + self.key = key + self.val = val + self.prev = None + self.next = None + + +class LRUCache: + def __init__(self, capacity: int): + self.cap = capacity + self.cache = {} + self.left = Node(0, 0) + self.right = Node(0, 0) + self.left.next = self.right + self.right.prev = self.left + + def remove(self, node): + p, n = node.prev, node.next + p.next = n + n.prev = p + + def insert(self, node): + p, n = self.right.prev, self.right + p.next = node + node.prev = p + node.next = n + n.prev = node + + def get(self, key: int) -> int: + if key not in self.cache: + return -1 + node = self.cache[key] + self.remove(node) + self.insert(node) + return node.val + + def put(self, key: int, value: int) -> None: + if key in self.cache: + self.remove(self.cache[key]) + node = Node(key, value) + self.cache[key] = node + self.insert(node) + if len(self.cache) > self.cap: + lru = self.left.next + self.remove(lru) + del self.cache[lru.key] + + +if __name__ == "__main__": + lru = LRUCache(2) + lru.put(1, 1) + lru.put(2, 2) + print(lru.get(1)) + lru.put(3, 3) + print(lru.get(2)) + lru.put(4, 4) + print(lru.get(1)) + print(lru.get(3)) + print(lru.get(4)) diff --git a/algorithms/labs/lab8/code/hash/2.py b/algorithms/labs/lab8/code/hash/2.py new file mode 100644 index 0000000..78080d4 --- /dev/null +++ b/algorithms/labs/lab8/code/hash/2.py @@ -0,0 +1,43 @@ +class TrieNode: + def __init__(self): + self.children = {} + self.is_end = False + + +class Trie: + def __init__(self): + self.root = TrieNode() + + def insert(self, word): + node = self.root + for ch in word: + if ch not in node.children: + node.children[ch] = TrieNode() + node = node.children[ch] + node.is_end = True + + def search(self, word): + node = self.root + for ch in word: + if ch not in node.children: + return False + node = node.children[ch] + return node.is_end + + def startsWith(self, prefix): + node = self.root + for ch in prefix: + if ch not in node.children: + return False + node = node.children[ch] + return True + + +if __name__ == "__main__": + t = Trie() + t.insert("apple") + print(t.search("apple")) + print(t.search("app")) + print(t.startsWith("app")) + t.insert("app") + print(t.search("app")) diff --git a/algorithms/labs/lab8/code/hash/3.py b/algorithms/labs/lab8/code/hash/3.py new file mode 100644 index 0000000..68116c0 --- /dev/null +++ b/algorithms/labs/lab8/code/hash/3.py @@ -0,0 +1,50 @@ +import heapq + + +class Twitter: + def __init__(self): + self.time = 0 + self.tweets = {} + self.follows = {} + + def postTweet(self, userId, tweetId): + self.time += 1 + if userId not in self.tweets: + self.tweets[userId] = [] + self.tweets[userId].append((-self.time, tweetId)) + + def getNewsFeed(self, userId): + heap = [] + if userId in self.tweets: + heap.extend(self.tweets[userId][-10:]) + if userId in self.follows: + for v in self.follows[userId]: + if v in self.tweets: + heap.extend(self.tweets[v][-10:]) + heapq.heapify(heap) + res = [] + while heap and len(res) < 10: + res.append(heapq.heappop(heap)[1]) + return res + + def follow(self, followerId, followeeId): + if followerId == followeeId: + return + if followerId not in self.follows: + self.follows[followerId] = set() + self.follows[followerId].add(followeeId) + + def unfollow(self, followerId, followeeId): + if followerId in self.follows and followeeId in self.follows[followerId]: + self.follows[followerId].remove(followeeId) + + +if __name__ == "__main__": + tw = Twitter() + tw.postTweet(1, 5) + print(tw.getNewsFeed(1)) + tw.follow(1, 2) + tw.postTweet(2, 6) + print(tw.getNewsFeed(1)) + tw.unfollow(1, 2) + print(tw.getNewsFeed(1)) diff --git a/algorithms/labs/lab8/code/search/1.py b/algorithms/labs/lab8/code/search/1.py new file mode 100644 index 0000000..821986c --- /dev/null +++ b/algorithms/labs/lab8/code/search/1.py @@ -0,0 +1,38 @@ +def exist(board, word): + rows, cols = len(board), len(board[0]) + visited = set() + + def dfs(r, c, k): + if k == len(word): + return True + if ( + r < 0 + or r >= rows + or c < 0 + or c >= cols + or (r, c) in visited + or board[r][c] != word[k] + ): + return False + visited.add((r, c)) + ok = ( + dfs(r + 1, c, k + 1) + or dfs(r - 1, c, k + 1) + or dfs(r, c + 1, k + 1) + or dfs(r, c - 1, k + 1) + ) + visited.remove((r, c)) + return ok + + for r in range(rows): + for c in range(cols): + if dfs(r, c, 0): + return True + return False + + +if __name__ == "__main__": + board = [["A", "B", "C", "E"], ["S", "F", "C", "S"], ["A", "D", "E", "E"]] + print(exist(board, "ABCCED")) + print(exist(board, "SEE")) + print(exist(board, "ABCB")) diff --git a/algorithms/labs/lab8/code/search/2.py b/algorithms/labs/lab8/code/search/2.py new file mode 100644 index 0000000..cd0bcf6 --- /dev/null +++ b/algorithms/labs/lab8/code/search/2.py @@ -0,0 +1,22 @@ +def search_rotated(nums, target): + l, r = 0, len(nums) - 1 + while l <= r: + m = (l + r) // 2 + if nums[m] == target: + return m + if nums[m] >= nums[l]: + if nums[l] <= target < nums[m]: + r = m - 1 + else: + l = m + 1 + else: + if nums[m] < target <= nums[r]: + l = m + 1 + else: + r = m - 1 + return -1 + + +if __name__ == "__main__": + print(search_rotated([4, 5, 6, 7, 0, 1, 2], 0)) + print(search_rotated([4, 5, 6, 7, 0, 1, 2], 3)) diff --git a/algorithms/labs/lab8/code/search/3.py b/algorithms/labs/lab8/code/search/3.py new file mode 100644 index 0000000..3d5da04 --- /dev/null +++ b/algorithms/labs/lab8/code/search/3.py @@ -0,0 +1,31 @@ +def search_matrix(matrix, target): + if not matrix or not matrix[0]: + return False + top, bot = 0, len(matrix) - 1 + while top <= bot: + mid = (top + bot) // 2 + if matrix[mid][0] <= target <= matrix[mid][-1]: + row = mid + break + if target < matrix[mid][0]: + bot = mid - 1 + else: + top = mid + 1 + else: + return False + l, r = 0, len(matrix[row]) - 1 + while l <= r: + m = (l + r) // 2 + if matrix[row][m] == target: + return True + if matrix[row][m] < target: + l = m + 1 + else: + r = m - 1 + return False + + +if __name__ == "__main__": + matrix = [[1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 60]] + print(search_matrix(matrix, 3)) + print(search_matrix(matrix, 13)) diff --git a/algorithms/labs/lab8/code/sorting/1.py b/algorithms/labs/lab8/code/sorting/1.py new file mode 100644 index 0000000..eec7964 --- /dev/null +++ b/algorithms/labs/lab8/code/sorting/1.py @@ -0,0 +1,25 @@ +def three_sum(nums): + res = [] + nums.sort() + for i in range(len(nums)): + if i > 0 and nums[i] == nums[i - 1]: + continue + j = i + 1 + k = len(nums) - 1 + while j < k: + s = nums[i] + nums[j] + nums[k] + if s > 0: + k -= 1 + elif s < 0: + j += 1 + else: + res.append([nums[i], nums[j], nums[k]]) + j += 1 + while j < k and nums[j] == nums[j - 1]: + j += 1 + return res + + +if __name__ == "__main__": + nums = [-1, 0, 1, 2, -1, -4] + print(three_sum(nums)) diff --git a/algorithms/labs/lab8/code/sorting/2.py b/algorithms/labs/lab8/code/sorting/2.py new file mode 100644 index 0000000..8d5700e --- /dev/null +++ b/algorithms/labs/lab8/code/sorting/2.py @@ -0,0 +1,20 @@ +def sort_colors(nums): + low = 0 + mid = 0 + high = len(nums) - 1 + while mid <= high: + if nums[mid] == 0: + nums[low], nums[mid] = nums[mid], nums[low] + low += 1 + mid += 1 + elif nums[mid] == 1: + mid += 1 + else: + nums[mid], nums[high] = nums[high], nums[mid] + high -= 1 + + +if __name__ == "__main__": + nums = [2, 0, 2, 1, 1, 0] + sort_colors(nums) + print(nums) diff --git a/algorithms/labs/lab8/code/sorting/3.py b/algorithms/labs/lab8/code/sorting/3.py new file mode 100644 index 0000000..6f90826 --- /dev/null +++ b/algorithms/labs/lab8/code/sorting/3.py @@ -0,0 +1,13 @@ +def wiggle_sort(nums): + nums.sort() + mid = (len(nums) + 1) // 2 + left = nums[:mid][::-1] + right = nums[mid:][::-1] + nums[::2] = left + nums[1::2] = right + + +if __name__ == "__main__": + nums = [1, 5, 1, 1, 6, 4] + wiggle_sort(nums) + print(nums) diff --git a/algorithms/labs/lab8/in/task.pdf b/algorithms/labs/lab8/in/task.pdf new file mode 100644 index 0000000..8b141a6 Binary files /dev/null and b/algorithms/labs/lab8/in/task.pdf differ diff --git a/algorithms/labs/lab8/out/report.docx b/algorithms/labs/lab8/out/report.docx new file mode 100644 index 0000000..8c9851c Binary files /dev/null and b/algorithms/labs/lab8/out/report.docx differ diff --git a/algorithms/labs/lab8/out/report.pdf b/algorithms/labs/lab8/out/report.pdf new file mode 100644 index 0000000..de052a9 Binary files /dev/null and b/algorithms/labs/lab8/out/report.pdf differ diff --git a/algorithms/labs/templates/template.pdf b/algorithms/labs/templates/template.pdf new file mode 100644 index 0000000..5632053 Binary files /dev/null and b/algorithms/labs/templates/template.pdf differ diff --git a/calculus/.obsidian/app.json b/calculus/.obsidian/app.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/calculus/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/calculus/.obsidian/appearance.json b/calculus/.obsidian/appearance.json new file mode 100644 index 0000000..fd33326 --- /dev/null +++ b/calculus/.obsidian/appearance.json @@ -0,0 +1,5 @@ +{ + "interfaceFontFamily": "Papyrus", + "textFontFamily": "Papyrus", + "monospaceFontFamily": "Papyrus" +} \ No newline at end of file diff --git a/calculus/.obsidian/community-plugins.json b/calculus/.obsidian/community-plugins.json new file mode 100644 index 0000000..8d0c4e1 --- /dev/null +++ b/calculus/.obsidian/community-plugins.json @@ -0,0 +1,3 @@ +[ + "obsidian-excalidraw-plugin" +] \ No newline at end of file diff --git a/calculus/.obsidian/core-plugins.json b/calculus/.obsidian/core-plugins.json new file mode 100644 index 0000000..b977c25 --- /dev/null +++ b/calculus/.obsidian/core-plugins.json @@ -0,0 +1,31 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": true, + "webviewer": false +} \ No newline at end of file diff --git a/calculus/.obsidian/plugins/obsidian-excalidraw-plugin/data.json b/calculus/.obsidian/plugins/obsidian-excalidraw-plugin/data.json new file mode 100644 index 0000000..64553e6 --- /dev/null +++ b/calculus/.obsidian/plugins/obsidian-excalidraw-plugin/data.json @@ -0,0 +1,805 @@ +{ + "disableDoubleClickTextEditing": false, + "folder": "Excalidraw", + "cropFolder": "", + "annotateFolder": "", + "embedUseExcalidrawFolder": false, + "templateFilePath": "Excalidraw/Template.excalidraw", + "scriptFolderPath": "Excalidraw/Scripts", + "fontAssetsPath": "Excalidraw/CJK Fonts", + "loadChineseFonts": false, + "loadJapaneseFonts": false, + "loadKoreanFonts": false, + "compress": true, + "decompressForMDView": false, + "onceOffCompressFlagReset": true, + "onceOffGPTVersionReset": true, + "autosave": true, + "autosaveIntervalDesktop": 60000, + "autosaveIntervalMobile": 30000, + "drawingFilenamePrefix": "Drawing ", + "drawingEmbedPrefixWithFilename": true, + "drawingFilnameEmbedPostfix": " ", + "drawingFilenameDateTime": "YYYY-MM-DD HH.mm.ss", + "useExcalidrawExtension": true, + "cropPrefix": "cropped_", + "annotatePrefix": "annotated_", + "annotatePreserveSize": false, + "previewImageType": "SVGIMG", + "renderingConcurrency": 3, + "allowImageCache": true, + "allowImageCacheInScene": true, + "displayExportedImageIfAvailable": false, + "previewMatchObsidianTheme": false, + "width": "400", + "height": "", + "overrideObsidianFontSize": false, + "dynamicStyling": "colorful", + "isLeftHanded": false, + "iframeMatchExcalidrawTheme": true, + "matchTheme": false, + "matchThemeAlways": false, + "matchThemeTrigger": false, + "defaultMode": "normal", + "defaultPenMode": "never", + "penModeDoubleTapEraser": true, + "penModeSingleFingerPanning": true, + "penModeCrosshairVisible": true, + "renderImageInMarkdownReadingMode": false, + "renderImageInHoverPreviewForMDNotes": false, + "renderImageInMarkdownToPDF": false, + "allowPinchZoom": false, + "allowWheelZoom": false, + "zoomToFitOnOpen": true, + "zoomToFitOnResize": true, + "zoomToFitMaxLevel": 2, + "linkPrefix": "📍", + "urlPrefix": "🌐", + "parseTODO": false, + "todo": "☐", + "done": "🗹", + "hoverPreviewWithoutCTRL": false, + "linkOpacity": 1, + "openInAdjacentPane": true, + "showSecondOrderLinks": true, + "focusOnFileTab": true, + "openInMainWorkspace": true, + "showLinkBrackets": true, + "allowCtrlClick": true, + "forceWrap": false, + "pageTransclusionCharLimit": 200, + "wordWrappingDefault": 0, + "removeTransclusionQuoteSigns": true, + "iframelyAllowed": true, + "pngExportScale": 1, + "exportWithTheme": true, + "exportWithBackground": true, + "exportPaddingSVG": 10, + "exportEmbedScene": false, + "keepInSync": false, + "autoexportSVG": false, + "autoexportPNG": false, + "autoExportLightAndDark": false, + "autoexportExcalidraw": false, + "embedType": "excalidraw", + "embedMarkdownCommentLinks": true, + "embedWikiLink": true, + "syncExcalidraw": false, + "experimentalFileType": false, + "experimentalFileTag": "✏️", + "experimentalLivePreview": true, + "fadeOutExcalidrawMarkup": false, + "loadPropertySuggestions": true, + "experimentalEnableFourthFont": false, + "experimantalFourthFont": "Virgil", + "addDummyTextElement": false, + "zoteroCompatibility": false, + "fieldSuggester": true, + "compatibilityMode": false, + "drawingOpenCount": 0, + "library": "deprecated", + "library2": { + "type": "excalidrawlib", + "version": 2, + "source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.11.1", + "libraryItems": [] + }, + "imageElementNotice": true, + "mdSVGwidth": 500, + "mdSVGmaxHeight": 800, + "mdFont": "Virgil", + "mdFontColor": "Black", + "mdBorderColor": "Black", + "mdCSS": "", + "scriptEngineSettings": {}, + "defaultTrayMode": true, + "previousRelease": "2.11.1", + "showReleaseNotes": true, + "showNewVersionNotification": true, + "latexBoilerplate": "\\color{blue}", + "latexPreambleLocation": "preamble.sty", + "taskboneEnabled": false, + "taskboneAPIkey": "", + "pinnedScripts": [], + "customPens": [ + { + "type": "default", + "freedrawOnly": false, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 0, + "roughness": 0, + "penOptions": { + "highlighter": false, + "constantPressure": false, + "hasOutline": false, + "outlineWidth": 1, + "options": { + "thinning": 0.6, + "smoothing": 0.5, + "streamline": 0.5, + "easing": "easeOutSine", + "start": { + "cap": true, + "taper": 0, + "easing": "linear" + }, + "end": { + "cap": true, + "taper": 0, + "easing": "linear" + } + } + } + }, + { + "type": "highlighter", + "freedrawOnly": true, + "strokeColor": "#FFC47C", + "backgroundColor": "#FFC47C", + "fillStyle": "solid", + "strokeWidth": 2, + "roughness": null, + "penOptions": { + "highlighter": true, + "constantPressure": true, + "hasOutline": true, + "outlineWidth": 4, + "options": { + "thinning": 1, + "smoothing": 0.5, + "streamline": 0.5, + "easing": "linear", + "start": { + "taper": 0, + "cap": true, + "easing": "linear" + }, + "end": { + "taper": 0, + "cap": true, + "easing": "linear" + } + } + } + }, + { + "type": "finetip", + "freedrawOnly": false, + "strokeColor": "#3E6F8D", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 0.5, + "roughness": 0, + "penOptions": { + "highlighter": false, + "hasOutline": false, + "outlineWidth": 1, + "constantPressure": true, + "options": { + "smoothing": 0.4, + "thinning": -0.5, + "streamline": 0.4, + "easing": "linear", + "start": { + "taper": 5, + "cap": false, + "easing": "linear" + }, + "end": { + "taper": 5, + "cap": false, + "easing": "linear" + } + } + } + }, + { + "type": "fountain", + "freedrawOnly": false, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 2, + "roughness": 0, + "penOptions": { + "highlighter": false, + "constantPressure": false, + "hasOutline": false, + "outlineWidth": 1, + "options": { + "smoothing": 0.2, + "thinning": 0.6, + "streamline": 0.2, + "easing": "easeInOutSine", + "start": { + "taper": 150, + "cap": true, + "easing": "linear" + }, + "end": { + "taper": 1, + "cap": true, + "easing": "linear" + } + } + } + }, + { + "type": "marker", + "freedrawOnly": true, + "strokeColor": "#B83E3E", + "backgroundColor": "#FF7C7C", + "fillStyle": "dashed", + "strokeWidth": 2, + "roughness": 3, + "penOptions": { + "highlighter": false, + "constantPressure": true, + "hasOutline": true, + "outlineWidth": 4, + "options": { + "thinning": 1, + "smoothing": 0.5, + "streamline": 0.5, + "easing": "linear", + "start": { + "taper": 0, + "cap": true, + "easing": "linear" + }, + "end": { + "taper": 0, + "cap": true, + "easing": "linear" + } + } + } + }, + { + "type": "thick-thin", + "freedrawOnly": true, + "strokeColor": "#CECDCC", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 0, + "roughness": null, + "penOptions": { + "highlighter": true, + "constantPressure": true, + "hasOutline": false, + "outlineWidth": 1, + "options": { + "thinning": 1, + "smoothing": 0.5, + "streamline": 0.5, + "easing": "linear", + "start": { + "taper": 0, + "cap": true, + "easing": "linear" + }, + "end": { + "cap": true, + "taper": true, + "easing": "linear" + } + } + } + }, + { + "type": "thin-thick-thin", + "freedrawOnly": true, + "strokeColor": "#CECDCC", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 0, + "roughness": null, + "penOptions": { + "highlighter": true, + "constantPressure": true, + "hasOutline": false, + "outlineWidth": 1, + "options": { + "thinning": 1, + "smoothing": 0.5, + "streamline": 0.5, + "easing": "linear", + "start": { + "cap": true, + "taper": true, + "easing": "linear" + }, + "end": { + "cap": true, + "taper": true, + "easing": "linear" + } + } + } + }, + { + "type": "default", + "freedrawOnly": false, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 0, + "roughness": 0, + "penOptions": { + "highlighter": false, + "constantPressure": false, + "hasOutline": false, + "outlineWidth": 1, + "options": { + "thinning": 0.6, + "smoothing": 0.5, + "streamline": 0.5, + "easing": "easeOutSine", + "start": { + "cap": true, + "taper": 0, + "easing": "linear" + }, + "end": { + "cap": true, + "taper": 0, + "easing": "linear" + } + } + } + }, + { + "type": "default", + "freedrawOnly": false, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 0, + "roughness": 0, + "penOptions": { + "highlighter": false, + "constantPressure": false, + "hasOutline": false, + "outlineWidth": 1, + "options": { + "thinning": 0.6, + "smoothing": 0.5, + "streamline": 0.5, + "easing": "easeOutSine", + "start": { + "cap": true, + "taper": 0, + "easing": "linear" + }, + "end": { + "cap": true, + "taper": 0, + "easing": "linear" + } + } + } + }, + { + "type": "default", + "freedrawOnly": false, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 0, + "roughness": 0, + "penOptions": { + "highlighter": false, + "constantPressure": false, + "hasOutline": false, + "outlineWidth": 1, + "options": { + "thinning": 0.6, + "smoothing": 0.5, + "streamline": 0.5, + "easing": "easeOutSine", + "start": { + "cap": true, + "taper": 0, + "easing": "linear" + }, + "end": { + "cap": true, + "taper": 0, + "easing": "linear" + } + } + } + } + ], + "numberOfCustomPens": 0, + "pdfScale": 4, + "pdfBorderBox": true, + "pdfFrame": false, + "pdfGapSize": 20, + "pdfGroupPages": false, + "pdfLockAfterImport": true, + "pdfNumColumns": 1, + "pdfNumRows": 1, + "pdfDirection": "right", + "pdfImportScale": 0.3, + "gridSettings": { + "DYNAMIC_COLOR": true, + "COLOR": "#000000", + "OPACITY": 50, + "GRID_DIRECTION": { + "horizontal": true, + "vertical": true + } + }, + "laserSettings": { + "DECAY_LENGTH": 50, + "DECAY_TIME": 1000, + "COLOR": "#ff0000" + }, + "embeddableMarkdownDefaults": { + "useObsidianDefaults": false, + "backgroundMatchCanvas": false, + "backgroundMatchElement": true, + "backgroundColor": "#fff", + "backgroundOpacity": 60, + "borderMatchElement": true, + "borderColor": "#fff", + "borderOpacity": 0, + "filenameVisible": false + }, + "markdownNodeOneClickEditing": false, + "canvasImmersiveEmbed": true, + "startupScriptPath": "", + "aiEnabled": true, + "openAIAPIToken": "", + "openAIDefaultTextModel": "gpt-3.5-turbo-1106", + "openAIDefaultVisionModel": "gpt-4o", + "openAIDefaultImageGenerationModel": "dall-e-3", + "openAIURL": "https://api.openai.com/v1/chat/completions", + "openAIImageGenerationURL": "https://api.openai.com/v1/images/generations", + "openAIImageEditsURL": "https://api.openai.com/v1/images/edits", + "openAIImageVariationURL": "https://api.openai.com/v1/images/variations", + "modifierKeyConfig": { + "Mac": { + "LocalFileDragAction": { + "defaultAction": "image-import", + "rules": [ + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "image-import" + }, + { + "shift": true, + "ctrl_cmd": false, + "alt_opt": true, + "meta_ctrl": false, + "result": "link" + }, + { + "shift": true, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "image-url" + }, + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": true, + "meta_ctrl": false, + "result": "embeddable" + } + ] + }, + "WebBrowserDragAction": { + "defaultAction": "image-url", + "rules": [ + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "image-url" + }, + { + "shift": true, + "ctrl_cmd": false, + "alt_opt": true, + "meta_ctrl": false, + "result": "link" + }, + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": true, + "meta_ctrl": false, + "result": "embeddable" + }, + { + "shift": true, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "image-import" + } + ] + }, + "InternalDragAction": { + "defaultAction": "link", + "rules": [ + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "link" + }, + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": true, + "result": "embeddable" + }, + { + "shift": true, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "image" + }, + { + "shift": true, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": true, + "result": "image-fullsize" + } + ] + }, + "LinkClickAction": { + "defaultAction": "new-tab", + "rules": [ + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "active-pane" + }, + { + "shift": false, + "ctrl_cmd": true, + "alt_opt": false, + "meta_ctrl": false, + "result": "new-tab" + }, + { + "shift": false, + "ctrl_cmd": true, + "alt_opt": true, + "meta_ctrl": false, + "result": "new-pane" + }, + { + "shift": true, + "ctrl_cmd": true, + "alt_opt": true, + "meta_ctrl": false, + "result": "popout-window" + }, + { + "shift": false, + "ctrl_cmd": true, + "alt_opt": false, + "meta_ctrl": true, + "result": "md-properties" + } + ] + } + }, + "Win": { + "LocalFileDragAction": { + "defaultAction": "image-import", + "rules": [ + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "image-import" + }, + { + "shift": false, + "ctrl_cmd": true, + "alt_opt": false, + "meta_ctrl": false, + "result": "link" + }, + { + "shift": true, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "image-url" + }, + { + "shift": true, + "ctrl_cmd": true, + "alt_opt": false, + "meta_ctrl": false, + "result": "embeddable" + } + ] + }, + "WebBrowserDragAction": { + "defaultAction": "image-url", + "rules": [ + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "image-url" + }, + { + "shift": false, + "ctrl_cmd": true, + "alt_opt": false, + "meta_ctrl": false, + "result": "link" + }, + { + "shift": true, + "ctrl_cmd": true, + "alt_opt": false, + "meta_ctrl": false, + "result": "embeddable" + }, + { + "shift": true, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "image-import" + } + ] + }, + "InternalDragAction": { + "defaultAction": "link", + "rules": [ + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "link" + }, + { + "shift": true, + "ctrl_cmd": true, + "alt_opt": false, + "meta_ctrl": false, + "result": "embeddable" + }, + { + "shift": true, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "image" + }, + { + "shift": false, + "ctrl_cmd": true, + "alt_opt": true, + "meta_ctrl": false, + "result": "image-fullsize" + } + ] + }, + "LinkClickAction": { + "defaultAction": "new-tab", + "rules": [ + { + "shift": false, + "ctrl_cmd": false, + "alt_opt": false, + "meta_ctrl": false, + "result": "active-pane" + }, + { + "shift": false, + "ctrl_cmd": true, + "alt_opt": false, + "meta_ctrl": false, + "result": "new-tab" + }, + { + "shift": false, + "ctrl_cmd": true, + "alt_opt": true, + "meta_ctrl": false, + "result": "new-pane" + }, + { + "shift": true, + "ctrl_cmd": true, + "alt_opt": true, + "meta_ctrl": false, + "result": "popout-window" + }, + { + "shift": false, + "ctrl_cmd": true, + "alt_opt": false, + "meta_ctrl": true, + "result": "md-properties" + } + ] + } + } + }, + "slidingPanesSupport": false, + "areaZoomLimit": 1, + "longPressDesktop": 500, + "longPressMobile": 500, + "doubleClickLinkOpenViewMode": true, + "isDebugMode": false, + "rank": "Bronze", + "modifierKeyOverrides": [ + { + "modifiers": [ + "Mod" + ], + "key": "Enter" + }, + { + "modifiers": [ + "Mod" + ], + "key": "k" + }, + { + "modifiers": [ + "Mod" + ], + "key": "G" + } + ], + "showSplashscreen": true, + "pdfSettings": { + "pageSize": "A4", + "pageOrientation": "portrait", + "fitToPage": 1, + "paperColor": "white", + "customPaperColor": "#ffffff", + "alignment": "center", + "margin": "normal" + } +} \ No newline at end of file diff --git a/calculus/.obsidian/plugins/obsidian-excalidraw-plugin/main.js b/calculus/.obsidian/plugins/obsidian-excalidraw-plugin/main.js new file mode 100644 index 0000000..1069ef3 --- /dev/null +++ b/calculus/.obsidian/plugins/obsidian-excalidraw-plugin/main.js @@ -0,0 +1,10 @@ +"use strict";var obsidian_module=require("obsidian"),state=require("@codemirror/state"),view=require("@codemirror/view");const INITIAL_TIMESTAMP=Date.now();var LZString=function(){var r=String.fromCharCode,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",e={};function t(r,o){if(!e[r]){e[r]={};for(var n=0;n>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null==o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;e>=1}else{for(t=1,e=0;e>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e>=1;0==--l&&(l=Math.pow(2,h),h++),s[p]=f++,c=String(a)}if(""!==c){if(Object.prototype.hasOwnProperty.call(u,c)){if(c.charCodeAt(0)<256){for(e=0;e>=1}else{for(t=1,e=0;e>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e>=1;0==--l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;e>=1;for(;;){if(m<<=1,v==o-1){d.push(n(m));break}v++}return d.join("")},decompress:function(r){return null==r?"":""==r?null:i._decompress(r.length,32768,function(o){return r.charCodeAt(o)})},_decompress:function(o,n,e){var t,i,s,u,a,p,c,l=[],f=4,h=4,d=3,m="",v=[],g={val:e(0),position:n,index:1};for(t=0;t<3;t+=1)l[t]=t;for(s=0,a=Math.pow(2,2),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 2:return""}for(l[3]=c,i=c,v.push(c);;){if(g.index>o)return"";for(s=0,a=Math.pow(2,d),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(c=s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 2:return v.join("")}if(0==f&&(f=Math.pow(2,d),d++),l[c])m=l[c];else{if(c!==h)return null;m=i+i.charAt(0)}v.push(m),l[h++]=i+m.charAt(0),i=m,0==--f&&(f=Math.pow(2,d),d++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString}); +let REACT_PACKAGES = `!function(){var e,t;e=this,t=function(e){function M(e){return null!==e&&"object"==typeof e&&"function"==typeof(e=ee&&e[ee]||e["@@iterator"])?e:null}function t(e,t,n){this.props=e,this.context=t,this.refs=re,this.updater=n||te}function n(){}function r(e,t,n){this.props=e,this.context=t,this.refs=re,this.updater=n||te}function o(e,t,n){var r,o={},u=null,a=null;if(null!=t)for(r in void 0!==t.ref&&(a=t.ref),void 0!==t.key&&(u=""+t.key),t)ue.call(t,r)&&!ae.hasOwnProperty(r)&&(o[r]=t[r]);var i=arguments.length-2;if(1===i)o.children=n;else if(1>>1,o=e[r];if(!(0>>1;rt)||e&&!q());){var r,o=R.callback;"function"==typeof o?(R.callback=null,P=R.priorityLevel,r=o(R.expirationTime<=t),t=v(),"function"==typeof r?R.callback=r:R===i(C)&&l(C),y(t)):l(C),R=i(C)}var u,a=null!==R||(null!==(u=i(E))&&_(d,u.startTime-t),!1);return a}finally{R=null,P=n,$=!1}}function q(){return!(v()-ye")?l.replace("",n.displayName):l}while(1<=u&&0<=i);break}}}finally{Eo=!1,Error.prepareStackTrace=t}return(n=n?n.displayName||n.name:"")?j(n):""}function q(e){switch(e.tag){case 5:return j(e.type);case 16:return j("Lazy");case 13:return j("Suspense");case 19:return j("SuspenseList");case 0:case 2:case 15:return e=$(e.type,!1);case 11:return e=$(e.type.render,!1);case 1:return e=$(e.type,!0);default:return""}}function K(e){if(null!=e){if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case fo:return"Fragment";case co:return"Portal";case mo:return"Profiler";case po:return"StrictMode";case vo:return"Suspense";case bo:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case go:return(e.displayName||"Context")+".Consumer";case ho:return(e._context.displayName||"Context")+".Provider";case yo:var n=e.render;return e=(e=e.displayName)?e:""!==(e=n.displayName||n.name||"")?"ForwardRef("+e+")":"ForwardRef";case ko:return null!==(n=e.displayName||null)?n:K(e.type)||"Memo";case wo:n=e._payload,e=e._init;try{return K(e(n))}catch(e){}}}return null}function Y(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=n.render).displayName||e.name||"",n.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return K(n);case 8:return n===po?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof n)return n.displayName||n.name||null;if("string"==typeof n)return n}return null}function X(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function G(e){var n=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===n||"radio"===n)}function Z(e){var n,t,r=G(e)?"checked":"value",l=Object.getOwnPropertyDescriptor(e.constructor.prototype,r),a=""+e[r];if(!e.hasOwnProperty(r)&&void 0!==l&&"function"==typeof l.get&&"function"==typeof l.set)return n=l.get,t=l.set,Object.defineProperty(e,r,{configurable:!0,get:function(){return n.call(this)},set:function(e){a=""+e,t.call(this,e)}}),Object.defineProperty(e,r,{enumerable:l.enumerable}),{getValue:function(){return a},setValue:function(e){a=""+e},stopTracking:function(){e._valueTracker=null,delete e[r]}}}function J(e){e._valueTracker||(e._valueTracker=Z(e))}function ee(e){var n,t,r;return!(!e||(n=e._valueTracker)&&(t=n.getValue(),r="",(e=r=e?G(e)?e.checked?"true":"false":e.value:r)===t||(n.setValue(e),0)))}function ne(n){if(void 0===(n=n||("undefined"!=typeof document?document:void 0)))return null;try{return n.activeElement||n.body}catch(e){return n.body}}function te(e,n){var t=n.checked;return g({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=t?t:e._wrapperState.initialChecked})}function re(e,n){var t=null==n.defaultValue?"":n.defaultValue,r=null!=n.checked?n.checked:n.defaultChecked,t=X(null!=n.value?n.value:t);e._wrapperState={initialChecked:r,initialValue:t,controlled:"checkbox"===n.type||"radio"===n.type?null!=n.checked:null!=n.value}}function le(e,n){null!=(n=n.checked)&&H(e,"checked",n,!1)}function ae(e,n){le(e,n);var t=X(n.value),r=n.type;if(null!=t)"number"===r?(0===t&&""===e.value||e.value!=t)&&(e.value=""+t):e.value!==""+t&&(e.value=""+t);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");n.hasOwnProperty("value")?ue(e,n.type,t):n.hasOwnProperty("defaultValue")&&ue(e,n.type,X(n.defaultValue)),null==n.checked&&null!=n.defaultChecked&&(e.defaultChecked=!!n.defaultChecked)}function oe(e,n,t){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var r=n.type;if(("submit"===r||"reset"===r)&&null==n.value)return;n=""+e._wrapperState.initialValue,t||n===e.value||(e.value=n),e.defaultValue=n}""!==(t=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==t&&(e.name=t)}function ue(e,n,t){"number"===n&&ne(e.ownerDocument)===e||(null==t?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+t&&(e.defaultValue=""+t))}function ie(e,n,t,r){if(e=e.options,n){n={};for(var l=0;l>>=0)?32:31-(su(e)/cu|0)|0}function De(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Oe(e,n){var t=e.pendingLanes;if(0===t)return 0;var r,l=0,a=e.suspendedLanes,o=e.pingedLanes,u=268435455&t;if(0!==u?0!==(r=u&~a)?l=De(r):0!==(o&=u)&&(l=De(o)):0!==(u=t&~a)?l=De(u):0!==o&&(l=De(o)),0===l)return 0;if(0!==n&&n!==l&&0==(n&a)&&((o=n&-n)<=(a=l&-l)||16===a&&0!=(4194240&o)))return n;if(0!=(4&l)&&(l|=16&t),0!==(n=e.entangledLanes))for(e=e.entanglements,n&=l;0>=r,a-=r,Gi=1<<32-iu(n)+a|t<u?(i=o,o=null):i=o.sibling;var s=y(n,o,t[u],r);if(null===s){null===o&&(o=i);break}f&&o&&null===s.alternate&&d(n,o),e=h(s,e,u),null===a?l=s:a.sibling=s,a=s,o=i}if(u===t.length)p(n,o);else if(null===o)for(;uu?(i=o,o=null):i=o.sibling;var c=y(n,o,s.value,r);if(null===c){null===o&&(o=i);break}f&&o&&null===c.alternate&&d(n,o),e=h(c,e,u),null===a?l=c:a.sibling=c,a=c,o=i}if(s.done)p(n,o);else if(null===o)for(;!s.done;u++,s=t.next())null!==(s=g(n,s.value,r))&&(e=h(s,e,u),null===a?l=s:a.sibling=s,a=s);else{for(o=m(n,o);!s.done;u++,s=t.next())null!==(s=v(o,n,u,s.value,r))&&(f&&null!==s.alternate&&o.delete(null===s.key?u:s.key),e=h(s,e,u),null===a?l=s:a.sibling=s,a=s);f&&o.forEach(function(e){return d(n,e)})}return E&&bt(n,u),l}function w(e,n,t,r){if("object"==typeof(t="object"==typeof t&&null!==t&&t.type===fo&&null===t.key?t.props.children:t)&&null!==t){switch(t.$$typeof){case so:e:{for(var l=t.key,a=n;null!==a;){if(a.key===l){if((l=t.type)===fo){if(7===a.tag){p(e,a.sibling),(n=o(a,t.props.children)).return=e,e=n;break e}}else if(a.elementType===l||"object"==typeof l&&null!==l&&l.$$typeof===wo&&nr(l)===a.type){p(e,a.sibling),(n=o(a,t.props)).ref=Jt(e,a,t),n.return=e,e=n;break e}p(e,a);break}d(e,a),a=a.sibling}e=t.type===fo?((n=Pa(t.props.children,e.mode,r,t.key)).return=e,n):((r=za(t.type,t.key,t.props,null,e.mode,r)).ref=Jt(e,n,t),r.return=e,r)}return u(e);case co:e:{for(a=t.key;null!==n;){if(n.key===a){if(4===n.tag&&n.stateNode.containerInfo===t.containerInfo&&n.stateNode.implementation===t.implementation){p(e,n.sibling),(n=o(n,t.children||[])).return=e,e=n;break e}p(e,n);break}d(e,n),n=n.sibling}(n=Ta(t,e.mode,r)).return=e,e=n}return u(e);case wo:return w(e,n,(a=t._init)(t._payload),r)}if(Co(t))return b(e,n,t,r);if(Q(t))return k(e,n,t,r);er(e,t)}return"string"==typeof t&&""!==t||"number"==typeof t?(t=""+t,(n=null!==n&&6===n.tag?(p(e,n.sibling),o(n,t)):(p(e,n),La(t,e.mode,r))).return=e,u(e=n)):p(e,n)}return w}function rr(e){if(e===ps)throw Error(S(174));return e}function lr(e,n){switch(f(gs,n),f(hs,e),f(ms,ps),e=n.nodeType){case 9:case 11:n=(n=n.documentElement)?n.namespaceURI:me(null,"");break;default:n=me(n=(e=8===e?n.parentNode:n).namespaceURI||null,e=e.tagName)}s(ms),f(ms,n)}function ar(e){s(ms),s(hs),s(gs)}function or(e){rr(gs.current);var n=rr(ms.current),t=me(n,e.type);n!==t&&(f(hs,e),f(ms,t))}function ur(e){hs.current===e&&(s(ms),s(hs))}function ir(e){for(var n=e;null!==n;){if(13===n.tag){var t=n.memoizedState;if(null!==t&&(null===(t=t.dehydrated)||"$?"===t.data||"$!"===t.data))return n}else if(19===n.tag&&void 0!==n.memoizedProps.revealOrder){if(0!=(128&n.flags))return n}else if(null!==n.child){n=(n.child.return=n).child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return null;n=n.return}n.sibling.return=n.return,n=n.sibling}return null}function sr(){for(var e=0;e<\\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=o.createElement(t,{is:r.is}):(e=o.createElement(t),"select"===t&&(o=e,r.multiple?o.multiple=!0:r.size&&(o.size=r.size))):e=o.createElementNS(e,t),e[Ti]=n,e[Mi]=r,Ms(e,n,!1,!1),n.stateNode=e;e:{switch(o=ve(t,r),t){case"dialog":c("cancel",e),c("close",e),a=r;break;case"iframe":case"object":case"embed":c("load",e),a=r;break;case"video":case"audio":for(a=0;aGs&&(n.flags|=128,Sl(i,!(r=!0)),n.lanes=4194304)}else{if(!r)if(null!==(e=ir(o))){if(n.flags|=128,r=!0,null!==(t=e.updateQueue)&&(n.updateQueue=t,n.flags|=4),Sl(i,!0),null===i.tail&&"hidden"===i.tailMode&&!o.alternate&&!E)return p(n),null}else 2*y()-i.renderingStartTime>Gs&&1073741824!==t&&(n.flags|=128,Sl(i,!(r=!0)),n.lanes=4194304);i.isBackwards?(o.sibling=n.child,n.child=o):(null!==(t=i.last)?t.sibling=o:n.child=o,i.last=o)}if(null!==i.tail)return n=i.tail,i.rendering=n,i.tail=n.sibling,i.renderingStartTime=y(),n.sibling=null,t=C.current,f(C,r?1&t|2:1&t),n}return p(n),null;case 22:case 23:return O=Qs.current,s(Qs),r=null!==n.memoizedState,null!==e&&null!==e.memoizedState!==r&&(n.flags|=8192),r&&0!=(1&n.mode)?0!=(1073741824&O)&&(p(n),6&n.subtreeFlags)&&(n.flags|=8192):p(n),null;case 24:case 25:return null}throw Error(S(156,n.tag))}function El(e,n,t){switch(St(n),n.tag){case 1:return h(n.type)&&(s(b),s(v)),65536&(e=n.flags)?(n.flags=-65537&e|128,n):null;case 3:return ar(),s(b),s(v),sr(),0!=(65536&(e=n.flags))&&0==(128&e)?(n.flags=-65537&e|128,n):null;case 5:return ur(n),null;case 13:if(s(C),null!==(e=n.memoizedState)&&null!==e.dehydrated){if(null===n.alternate)throw Error(S(340));_t()}return 65536&(e=n.flags)?(n.flags=-65537&e|128,n):null;case 19:return s(C),null;case 4:return ar(),null;case 10:return Ft(n.type._context),null;case 22:case 23:return O=Qs.current,s(Qs),null;default:return null}}function Cl(n,t){var e=n.ref;if(null!==e)if("function"==typeof e)try{e(null)}catch(e){w(n,t,e)}else e.current=null}function Nl(n,t,e){try{e()}catch(e){w(n,t,e)}}function zl(e,n){if(Ci=xu,On(e=Dn())){if("selectionStart"in e)var t={start:e.selectionStart,end:e.selectionEnd};else e:if((a=(t=(t=e.ownerDocument)&&t.defaultView||window).getSelection&&t.getSelection())&&0!==a.rangeCount){var t=a.anchorNode,r=a.anchorOffset,l=a.focusNode,a=a.focusOffset;try{t.nodeType,l.nodeType}catch(e){t=null;break e}var o,u=0,i=-1,s=-1,c=0,f=0,d=e,p=null;n:for(;;){for(;d!==t||0!==r&&3!==d.nodeType||(i=u+r),d!==l||0!==a&&3!==d.nodeType||(s=u+a),3===d.nodeType&&(u+=d.nodeValue.length),null!==(o=d.firstChild);)p=d,d=o;for(;;){if(d===e)break n;if(p===t&&++c===r&&(i=u),p===l&&++f===a&&(s=u),null!==(o=d.nextSibling))break;p=(d=p).parentNode}d=o}t=-1===i||-1===s?null:{start:i,end:s}}else t=null;t=t||{start:0,end:0}}else t=null;for(xu=!(Ni={focusedElem:e,selectionRange:t}),T=n;null!==T;)if(e=(n=T).child,0!=(1028&n.subtreeFlags)&&null!==e)e.return=n,T=e;else for(;null!==T;){n=T;try{var m,h,g,y,v=n.alternate;if(0!=(1024&n.flags))switch(n.tag){case 0:case 11:case 15:break;case 1:null!==v&&(m=v.memoizedProps,h=v.memoizedState,y=(g=n.stateNode).getSnapshotBeforeUpdate(n.elementType===n.type?m:Tt(n.type,m),h),g.__reactInternalSnapshotBeforeUpdate=y);break;case 3:var b=n.stateNode.containerInfo;1===b.nodeType?b.textContent="":9===b.nodeType&&b.documentElement&&b.removeChild(b.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(S(163))}}catch(e){w(n,n.return,e)}if(null!==(e=n.sibling)){e.return=n.return,T=e;break}T=n.return}return v=Us,Us=!1,v}function Pl(e,n,t){var r=n.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var l,a=r=r.next;do{}while((a.tag&e)===e&&(l=a.destroy,(a.destroy=void 0)!==l)&&Nl(n,t,l),(a=a.next)!==r)}}function _l(e,n){if(null!==(n=null!==(n=n.updateQueue)?n.lastEffect:null)){var t,r=n=n.next;do{}while((r.tag&e)===e&&(t=r.create,r.destroy=t()),(r=r.next)!==n)}}function Ll(e){var n,t=e.ref;null!==t&&(n=e.stateNode,e.tag,e=n,"function"==typeof t?t(e):t.current=e)}function Tl(e){var n=e.alternate;null!==n&&(e.alternate=null,Tl(n)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&null!==(n=e.stateNode)&&(delete n[Ti],delete n[Mi],delete n[Ri],delete n[Di],delete n[Oi]),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ml(e){return 5===e.tag||3===e.tag||4===e.tag}function Fl(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||Ml(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e=(e.child.return=e).child}if(!(2&e.flags))return e.stateNode}}function Rl(e,n,t){var r=e.tag;if(5===r||6===r)e=e.stateNode,n?(8===t.nodeType?t.parentNode:t).insertBefore(e,n):(8===t.nodeType?(n=t.parentNode).insertBefore(e,t):(n=t).appendChild(e),null==(t=t._reactRootContainer)&&null===n.onclick&&(n.onclick=et));else if(4!==r&&null!==(e=e.child))for(Rl(e,n,t),e=e.sibling;null!==e;)Rl(e,n,t),e=e.sibling}function Dl(e,n,t){var r=e.tag;if(5===r||6===r)e=e.stateNode,n?t.insertBefore(e,n):t.appendChild(e);else if(4!==r&&null!==(e=e.child))for(Dl(e,n,t),e=e.sibling;null!==e;)Dl(e,n,t),e=e.sibling}function Ol(e,n,t){for(t=t.child;null!==t;)Il(e,n,t),t=t.sibling}function Il(e,n,t){if(uu&&"function"==typeof uu.onCommitFiberUnmount)try{uu.onCommitFiberUnmount(ou,t)}catch(e){}switch(t.tag){case 5:L||Cl(t,n);case 6:var r=M,l=Vs;M=null,Ol(e,n,t),Vs=l,null!==(M=r)&&(Vs?(e=M,t=t.stateNode,(8===e.nodeType?e.parentNode:e).removeChild(t)):M.removeChild(t.stateNode));break;case 18:null!==M&&(Vs?(e=M,t=t.stateNode,8===e.nodeType?rt(e.parentNode,t):1===e.nodeType&&rt(e,t),en(e)):rt(M,t.stateNode));break;case 4:r=M,l=Vs,M=t.stateNode.containerInfo,Vs=!0,Ol(e,n,t),M=r,Vs=l;break;case 0:case 11:case 14:case 15:if(!L&&null!==(r=t.updateQueue)&&null!==(r=r.lastEffect)){l=r=r.next;do{var a=(o=l).destroy,o=o.tag}while(void 0===a||0==(2&o)&&0==(4&o)||Nl(t,n,a),(l=l.next)!==r)}Ol(e,n,t);break;case 1:if(!L&&(Cl(t,n),"function"==typeof(r=t.stateNode).componentWillUnmount))try{r.props=t.memoizedProps,r.state=t.memoizedState,r.componentWillUnmount()}catch(e){w(t,n,e)}Ol(e,n,t);break;case 21:Ol(e,n,t);break;case 22:1&t.mode?(L=(r=L)||null!==t.memoizedState,Ol(e,n,t),L=r):Ol(e,n,t);break;default:Ol(e,n,t)}}function Ul(t){var r,e=t.updateQueue;null!==e&&((t.updateQueue=null)===(r=t.stateNode)&&(r=t.stateNode=new Is),e.forEach(function(e){var n=wa.bind(null,t,e);r.has(e)||(r.add(e),e.then(n,n))}))}function Vl(e,n,t){if(null!==(t=n.deletions))for(var r=0;r