Þ¤pathÙ:/home/runner/work/LSINC1113/LSINC1113/Lectures/2_number.jl¨metadata€¬cell_resultsÞ¨Ù$8f6ba1c4-a971-4dc4-ac5d-2f30790aecdeЧrunning§runtimeÍ È¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$8f6ba1c4-a971-4dc4-ac5d-2f30790aecde¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ^

Fermat’s Little Theorem

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`0‹—°persist_js_state·has_pluto_hook_featuresÂÙ$708c442b-cbff-4e1a-b70d-e704453cfd3dЧrunning§runtimeÎæ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$708c442b-cbff-4e1a-b70d-e704453cfd3d¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ$

Équation de récurrence:

$$x_{k+1} = x_k + x_{k-1}$$

Reformulation sans $(k-1)$

$$\begin{align} x_{k+1} & = x_k + y_{k}\\ y_{k+1} & = x_k \end{align}$$

Forme matricielle:

$$\begin{bmatrix} x_{k+1}\\ y_{k+1} \end{bmatrix} = \begin{bmatrix} 1 & 1\\ 1 & 0 \end{bmatrix} \begin{bmatrix} x_{k}\\ y_{k} \end{bmatrix}$$

Matrix power:

$$\begin{bmatrix} x_n\\ y_n \end{bmatrix} = \begin{bmatrix} 1 & 1\\ 1 & 0 \end{bmatrix}^n \begin{bmatrix} x_0\\ y_0 \end{bmatrix}$$

n = 10

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áa¶í°persist_js_state·has_pluto_hook_featuresÂÙ$c3411941-d77f-46cb-8378-23998a1a4828Чrunning§runtimeÍ"1¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$c3411941-d77f-46cb-8378-23998a1a4828¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙR

Division par 3 et 9

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^‡ÕR°persist_js_state·has_pluto_hook_featuresÂÙ$ae89661a-2c0f-4752-adc2-023f09dc0e9fЧrunning§runtimeÎT&r¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ae89661a-2c0f-4752-adc2-023f09dc0e9f¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙK4×4 Matrix{Int64}: 1 16 1 16 2 15 2 15 4 13 4 13 8 9 8 9¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°áa Ÿ°persist_js_state·has_pluto_hook_featuresÂÙ$9f55cad1-b01a-45e3-93df-a4349e2dfbd3Чrunning§runtimeÍC!¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9f55cad1-b01a-45e3-93df-a4349e2dfbd3¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix¥Int64¨elementsš’’¡1ªtext/plain’’¡2ªtext/plain’’¡3ªtext/plain’’¡4ªtext/plain’’¡5ªtext/plain’’¡6ªtext/plain’’¡7ªtext/plain’’¡8ªtext/plain’ ’¡9ªtext/plain’ ’¢10ªtext/plain¤type¥Array¬prefix_short ¨objectid°840d8cff5653bfd7¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚ°áaŸõ°persist_js_state·has_pluto_hook_featuresÂÙ$7bad8c6c-45c7-402f-ad59-6857e9268901Чrunning§runtimeÎêôs¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$7bad8c6c-45c7-402f-ad59-6857e9268901¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚÅ
Comment prouver que l'égalité $ax + by = c$ implique que $\text{gcd}(a, b)$ divise $c$ ?

Soit $g = \text{gcd}(a, b)$. Par définition, il existe $\alpha, \beta$ tels que $a = \alpha g$ et $b = \beta g$. On a alors $c = ax + by = (\alpha x + \beta y) g$ ce qui implique que $c$ est un multiple de $g$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^8•-°persist_js_state·has_pluto_hook_featuresÂÙ$6cf004be-5205-429e-8131-ef607cebeaecЧrunning§runtimeÍ-±¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6cf004be-5205-429e-8131-ef607cebeaec¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙA2×2 Matrix{Float64}: 0.525731 -0.850651 -0.850651 -0.525731¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á_ôæ!°persist_js_state·has_pluto_hook_featuresÂÙ$027fe67c-d2f0-49f6-b894-959795551d27Чrunning§runtimeÎTlŠÒ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$027fe67c-d2f0-49f6-b894-959795551d27¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’³ 1.406084 seconds ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$027fe67c-d2f0-49f6-b894-959795551d27¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤body©267914296¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á_Ff°persist_js_state·has_pluto_hook_featuresÂÙ$08dcbbd3-a531-4f74-a724-1cae8fae1636Чrunning§runtimeÎLH¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$08dcbbd3-a531-4f74-a724-1cae8fae1636¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙc

Le nombre 2 est une racine primitive modulo 11

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áaÁ]°persist_js_state·has_pluto_hook_featuresÂÙ$4cff1d10-422f-4b12-b790-a589c972fbb7Чrunning§runtimeÍ)¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4cff1d10-422f-4b12-b790-a589c972fbb7¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚy

g = 2

p = 11

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áa Þ°persist_js_state·has_pluto_hook_featuresÂÙ$6c3595d2-4f68-44da-90e7-dc9c68479bcfЧrunning§runtimeη¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6c3595d2-4f68-44da-90e7-dc9c68479bcf¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ%cite (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°ábtOµ°persist_js_state·has_pluto_hook_featuresÂÙ$a4698418-ebf7-4992-a3ba-a15ff282bf87Чrunning§runtimeÎ ¿¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a4698418-ebf7-4992-a3ba-a15ff282bf87¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚP
Quelle est la complexité temporelle ?

Si $n$ est impair, au coup suivant, il est pair donc il n'est impair qu'au pire une fois sur deux. En $l$ multiplication, on divise $m$ au moins par $2^{l/2}$ donc on a une complexité logarithmique $\Theta(\log(m))$ en supposant que prod_func a une complexité $\Theta(1)$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^È'°persist_js_state·has_pluto_hook_featuresÂÙ$8670abc2-63e6-496a-b20c-812197acd9adЧrunning§runtimeÎ Oh¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$8670abc2-63e6-496a-b20c-812197acd9ad¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ/fast_mod_power (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á^Ðb²°persist_js_state·has_pluto_hook_featuresÂÙ$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2Чrunning§runtimeÎ6(¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚA
Quelle est la complexité spatiale et temporelle de discrete_log ?

$\mathcal{O}(p)$ temporelle et $\Omega(1)$ spatiale. Voir [HPS14; Proposition 2.19].

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°ábž5“°persist_js_state·has_pluto_hook_featuresÂÙ$7330af43-bec3-460c-94f6-768ac2975b00Чrunning§runtimeÎ »ì¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$7330af43-bec3-460c-94f6-768ac2975b00¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ4shanks_discrete_log (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`W6°persist_js_state·has_pluto_hook_featuresÂÙ$4c2d45e3-56a2-467f-b87f-7b98cb873a05Чrunning§runtimeΪ÷¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4c2d45e3-56a2-467f-b87f-7b98cb873a05¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix¥Int64¨elementsÜ’’¡2ªtext/plain’’¡3ªtext/plain’’¡4ªtext/plain’’¡2ªtext/plain’’¡7ªtext/plain’’¡8ªtext/plain’’¢10ªtext/plain’’¡6ªtext/plain’ ’¢15ªtext/plain’ ’¡2ªtext/plain’ ’¢19ªtext/plain’ ’¢39ªtext/plain’ ’¢22ªtext/plain’’¢12ªtext/plain’’¢50ªtext/plain’’¢14ªtext/plain’’¢35ªtext/plain’’¢41ªtext/plain’’¢64ªtext/plain’’¢37ªtext/plain’’¢11ªtext/plain’’¢32ªtext/plain’’¢67ªtext/plain’’¢11ªtext/plain¤type¥Array¬prefix_short ¨objectid°3062e43a0eb23dc5¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚ°á`Ë|J°persist_js_state·has_pluto_hook_featuresÂÙ$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fdЧrunning§runtimeÍ%¡¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fd¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¡3¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°áa1j°persist_js_state·has_pluto_hook_featuresÂÙ$ec14d629-b720-47cd-bc08-ff96f49271abЧrunning§runtime΀x¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ec14d629-b720-47cd-bc08-ff96f49271ab¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ-discrete_log (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`8ì°persist_js_state·has_pluto_hook_featuresÂÙ$594829e2-585b-4d48-bb6e-b35d9543cfbeЧrunning§runtimeÍ"m¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$594829e2-585b-4d48-bb6e-b35d9543cfbe¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ`

Fast powering for matrices

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^ã|-°persist_js_state·has_pluto_hook_featuresÂÙ$bbc907b1-63f8-435a-badc-11ed88bd6cf5Чrunning§runtimeÍ"¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$bbc907b1-63f8-435a-badc-11ed88bd6cf5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ<

Exemples

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^?÷°persist_js_state·has_pluto_hook_featuresÂÙ$227e415e-ab17-4f3a-b695-9573c9ee2b57Чrunning§runtimeÎÜj¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$227e415e-ab17-4f3a-b695-9573c9ee2b57¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚˆ
What is the relation between $A'$ and $B'$ ?

$$A' \equiv (g^b)^a \equiv g^{ab} \equiv (g^{a})^b \equiv B' \pmod{p}$$

Alice et Bob ont donc maintenant la même clef! Il est cependant difficile de trouver $A'$ depuis $A$ et $B$ sans connaitre les secrets $a$ ou $b$ si le Discrete Logarithm Problem est difficile.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`X†°persist_js_state·has_pluto_hook_featuresÂÙ$821de132-559b-4420-b866-e97134c5bd9aЧrunning§runtimeÎ2c¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$821de132-559b-4420-b866-e97134c5bd9a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ:chinese_remainder_theorem (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á^Ù¹™°persist_js_state·has_pluto_hook_featuresÂÙ$3026f9c5-81d3-443a-940a-f22fef9754afЧrunning§runtimeο<¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$3026f9c5-81d3-443a-940a-f22fef9754af¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ,giant_steps (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`HùU°persist_js_state·has_pluto_hook_featuresÂÙ$3f1af973-a02b-4e06-8e6e-eff414fcaf67Чrunning§runtimeÎ�¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$3f1af973-a02b-4e06-8e6e-eff414fcaf67¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ&pgcdx (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á^“¹å°persist_js_state·has_pluto_hook_featuresÂÙ$59817f59-429b-4f17-a46a-185571fd1e5aЧrunning§runtimeÍL¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$59817f59-429b-4f17-a46a-185571fd1e5a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙV

Fast modular powering

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^ÈÄÒ°persist_js_state·has_pluto_hook_featuresÂÙ$f9f03579-5bfc-452d-bff9-9e7adfe095d3Чrunning§runtimeÍ";¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$f9f03579-5bfc-452d-bff9-9e7adfe095d3¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¡7¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á^¿@°persist_js_state·has_pluto_hook_featuresÂÙ$e2a3842d-4e07-4703-ab47-a5140649dd6aЧrunning§runtimeÍg˜¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e2a3842d-4e07-4703-ab47-a5140649dd6a¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix¥Int64¨elementsš’’¡1ªtext/plain’’¡2ªtext/plain’’¡3ªtext/plain’’¡4ªtext/plain’’¡5ªtext/plain’’¡6ªtext/plain’’¡7ªtext/plain’’¡8ªtext/plain’ ’¡9ªtext/plain’ ’¢10ªtext/plain¤type¥Array¬prefix_short ¨objectid°1846b2acfdce0ae4¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚ°áa9 °persist_js_state·has_pluto_hook_featuresÂÙ$59254bfd-48f2-4585-9ba5-e4c809421072Чrunning§runtimeÍ{‚¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$59254bfd-48f2-4585-9ba5-e4c809421072¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¡8¤mimeªtext/plain¬rootassignee¨shanks_x²last_run_timestampËAÚ°áa0¡õ°persist_js_state·has_pluto_hook_featuresÂÙ$83852dd5-3546-45af-a845-b01dab0aa2a6Чrunning§runtimeÍ o¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$83852dd5-3546-45af-a845-b01dab0aa2a6¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙf

Inverse et division modulaire

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^ˆt?°persist_js_state·has_pluto_hook_featuresÂÙ$c2fab245-8a98-4b41-ade2-c5b16e9c39f9Чrunning§runtimeͯ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$c2fab245-8a98-4b41-ade2-c5b16e9c39f9¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ^

Chinese remainder theorem

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^Ñ帰persist_js_state·has_pluto_hook_featuresÂÙ$eeaec4f4-71bd-43df-b9c9-a00bc3b1864bЧrunning§runtimeÍ!i¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$eeaec4f4-71bd-43df-b9c9-a00bc3b1864b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒ¨elements“’’¡1ªtext/plain’’¨89932200ªtext/plain’’©-32561659ªtext/plain¤type¥Tuple¨objectid°54a1c5b46a9f8dc9¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚ°á^¤B)°persist_js_state·has_pluto_hook_featuresÂÙ$535f4bc1-e88c-47c7-990b-e3c8b5054accЧrunning§runtimeÎ�¶¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$535f4bc1-e88c-47c7-990b-e3c8b5054acc¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ+fib_closed (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`+„�°persist_js_state·has_pluto_hook_featuresÂÙ$7db2060b-d69e-42e7-ae81-fd37ee793876Чrunning§runtimeÎ]¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$7db2060b-d69e-42e7-ae81-fd37ee793876¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚZ

Corollaire

$$n \mid a \quad \text{et} \quad n \mid b \quad \Rightarrow \quad n \mid (ab)$$

À ne pas confondre avec

$$a \mid n \quad \text{et} \quad b \mid n \quad \Rightarrow \quad (ab/\text{gcd}(a,b)) \mid n$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3•°persist_js_state·has_pluto_hook_featuresÂÙ$2381babe-0777-45db-acff-cc647a8a68d3Чrunning§runtimeÎ ×v¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$2381babe-0777-45db-acff-cc647a8a68d3¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ"l251¤mime©text/html¬rootassignee¬power_slider²last_run_timestampËAÚ°á`©”ݰpersist_js_state·has_pluto_hook_featuresÂÙ$cbabee34-2ca2-4ad4-93ba-2ec3c941da5eЧrunning§runtimeΦ‚¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$cbabee34-2ca2-4ad4-93ba-2ec3c941da5e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ¬

Si tous les mois avaient 30 jours, est-ce qu'il y a des jours de la semaine qui ne seront jamais le premier du mois ?

Reformulation: pour tout nombre $0 \le j < 7$, existe-t-il $x$ et $y$ tels que $30x = j + 7y$. Notation modulo : $30x \equiv j \pmod{7}$.

Si tous les ans avaient 365 jours, est-ce qu'il y a des jours de la semaine qui ne seront jamais le 25 Décembre ? Est si tous les ans avaient 366 jours ? Et s'ils avaient 364 jours ?

Reformulation: pour tout nombre $0 \le j < 7$, existe-t-il $x$ et $y$ tels que $365x = j + 7y$. Notation modulo : $365x \equiv j \pmod{7}$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ$Žz°persist_js_state·has_pluto_hook_featuresÂÙ$819f15ef-31d0-44b6-837a-e3e67f2667b9Чrunning§runtimeÎ)¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$819f15ef-31d0-44b6-837a-e3e67f2667b9¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ:

Revenons aux exemples:

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3•¯°persist_js_state·has_pluto_hook_featuresÂÙ$087cbe82-b42a-4f80-a1af-97f3aa93aeebЧrunning§runtimeÎù)¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$087cbe82-b42a-4f80-a1af-97f3aa93aeeb¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ"©

power = 251

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`©Û8°persist_js_state·has_pluto_hook_featuresÂÙ$57816e2c-a675-43e7-b674-2877ffcf1415Чrunning§runtimeÎÒ>o¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$57816e2c-a675-43e7-b674-2877ffcf1415¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ½11¤mime©text/html¬rootassignee¨p_picker²last_run_timestampËAÚ°áa à&°persist_js_state·has_pluto_hook_featuresÂÙ$ba16d83d-21a5-4f0c-807b-674a167da4dcЧrunning§runtimeΕ<Ó¡¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ba16d83d-21a5-4f0c-807b-674a167da4dc¹depends_on_disabled_cells¦queued¤logs“ˆ¥group¥utils¤lineÿ£msg’ÙXLoading bibliography from `/home/runner/work/LSINC1113/LSINC1113/Lectures/biblio.bib`...ªtext/plain¥level¤Info¢id¹Main_workspace#3_a1ed908b§cell_idÙ$ba16d83d-21a5-4f0c-807b-674a167da4dc¦kwargs�¤fileÙ7/home/runner/work/LSINC1113/LSINC1113/Lectures/utils.jlˆ¥group¦bibtex¤lineÿ£msg’Ù=Entry west2022Introduction is missing the publisher field(s).ªtext/plain¥level¥Error¢id´BibInternal_c3aff3e5§cell_idÙ$ba16d83d-21a5-4f0c-807b-674a167da4dc¦kwargs�¤fileÙ

Fermat's little theorem [HPS14; Theorem 1.24]

$$\text{Si} \quad p \text{ est premier}\quad \text{et} \quad p \nmid g,\quad \text{alors} \quad g^{p - 1} \equiv 1 \pmod{p}.$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áb™m”°persist_js_state·has_pluto_hook_featuresÂÙ$40b8e474-16e0-4a61-bb28-11d90beefeeaЧrunning§runtimeÍ0y¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$40b8e474-16e0-4a61-bb28-11d90beefeea¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¡1¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á^¢»„°persist_js_state·has_pluto_hook_featuresÂÙ$592ae01b-2819-402d-9538-17018df5c34bЧrunning§runtimeͶ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$592ae01b-2819-402d-9538-17018df5c34b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙP

Fibonacci sequence

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^âê¼°persist_js_state·has_pluto_hook_featuresÂÙ$6e59ee60-ef73-45ca-86eb-4d8a44c73771Чrunning§runtimeÎ�ó¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6e59ee60-ef73-45ca-86eb-4d8a44c73771¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ²
Observation clé Que dit le théorème de Bézout par rapport à $\text{gcd}(a, d)$ et $r$.

Le reste $r$ est divisible par $\text{gcd}(a, d)$. Le nombre $\text{gcd}(a, d)$ divise donc les 3 nombres, $a$, $d$ et $r$ et donc $\text{gcd}(a, d) = \text{gcd}(a, d, r)$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^:Œ°persist_js_state·has_pluto_hook_featuresÂÙ$e1b5733f-a7a8-458f-a345-b358b9a03fcfЧrunning§runtimeÎVù¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e1b5733f-a7a8-458f-a345-b358b9a03fcf¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ·

On remarque que la matrice est de rang 1. Elle vaut

$$\begin{bmatrix} 1 & g^n & \cdots & g^{n^2-n}\\ g & g^{n+1} & \ddots & g^{n^2-n+1}\\ \vdots & \ddots & \ddots & \vdots\\ g^{n-1} & g^{2n-1} & \cdots & g^{n^2 - 1} \end{bmatrix} \equiv \begin{bmatrix} 1\\ g\\ g^2\\ \vdots\\ g^{n-1} \end{bmatrix} \begin{bmatrix} 1 & g^{n} & g^{2n} & \cdots & g^{n^2-n} \end{bmatrix} \pmod{p}$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4½w°persist_js_state·has_pluto_hook_featuresÂÙ$b57adc77-3783-4958-91a0-e90782338755Чrunning§runtimeÎ~û¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$b57adc77-3783-4958-91a0-e90782338755¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚä11¤mime©text/html¬rootassignee¨slider_a²last_run_timestampËAÚ°á`y–…°persist_js_state·has_pluto_hook_featuresÂÙ$e505716d-af01-455f-a55a-a9c225822ad5Чrunning§runtimeÎqa¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e505716d-af01-455f-a55a-a9c225822ad5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ€

Comment calculer $a^m$ pour un large $m$ ?

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3ôý°persist_js_state·has_pluto_hook_featuresÂÙ$0ee6972c-5069-4ba0-887f-be64c7d000d0Чrunning§runtimeÍ!ÿ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$0ee6972c-5069-4ba0-887f-be64c7d000d0¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙj

Arithmétique modulaire : somme

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^†Ÿ°persist_js_state·has_pluto_hook_featuresÂÙ$2cb5c6e0-b431-4d2e-b023-cd2131112ecaЧrunning§runtimeÍ!h¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$2cb5c6e0-b431-4d2e-b023-cd2131112eca¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙl

Algorithme d'Euclide étendu

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^‰fà°persist_js_state·has_pluto_hook_featuresÂÙ$93aa2719-f962-497b-9fda-30f54fd848ebЧrunning§runtimeÎ4B”¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$93aa2719-f962-497b-9fda-30f54fd848eb¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix¥Int64¨elements—’’¡0ªtext/plain’’¡4ªtext/plain’’¡1ªtext/plain’’¡5ªtext/plain’’¡2ªtext/plain’’¡6ªtext/plain’’¡3ªtext/plain¤type¥Array¬prefix_short ¨objectid°b4b120cb152f2ea9¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚ°á^½Ó=°persist_js_state·has_pluto_hook_featuresÂÙ$9722971a-16f1-4f28-ba31-c12b673b8a30Чrunning§runtimeÎ+ ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9722971a-16f1-4f28-ba31-c12b673b8a30¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ3

Et modulo 999 ?

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4 °persist_js_state·has_pluto_hook_featuresÂÙ$909b8a36-79bb-4c1a-9dd7-4acaffc0434eЧrunning§runtimeÍ!ødepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$909b8a36-79bb-4c1a-9dd7-4acaffc0434e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙV

Théorème de Bézout

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^Þ©°persist_js_state·has_pluto_hook_featuresÂÙ$a7985d16-500b-4024-aaa1-78e654b94be4Чrunning§runtimeÎÚD¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a7985d16-500b-4024-aaa1-78e654b94be4¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ
Comment trouver l'inverse modulaire ?

Si on avait les coefficients $x$ et $y$ tels que $xa + yn = 1$, l'inverse serait $x$. Dans l'algorithme d'Euclide, on ne garde que le reste et on oublie le quotient. Il faudrait combiner les quotients des différentes opérations pour trouver $x$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^ˆÁʰpersist_js_state·has_pluto_hook_featuresÂÙ$9752afbb-96e6-4f96-92cb-09654cf46155Чrunning§runtimeέx¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9752afbb-96e6-4f96-92cb-09654cf46155¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ[
Est-ce que l'inverse modulaire existe toujours ?

Par le théorème de Bézout, il existe si et seulement si $\text{gcd}(a, n) \mid 1$, c'est à dire que $\text{gcd}(a, n) = 1$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^ˆšö°persist_js_state·has_pluto_hook_featuresÂÙ$6ed7c73d-60da-4908-85cb-958745d81ebcЧrunning§runtimeÎj¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6ed7c73d-60da-4908-85cb-958745d81ebc¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙÜ

Par l'algo d'Euclide, $\text{gcd}(n, n - 1) = 1$ donc $\text{gcd}(1000, 999) = 1$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4/s°persist_js_state·has_pluto_hook_featuresÂÙ$eb311761-ace2-4632-9ebf-9c7c166659f7Чrunning§runtimeΪ¦¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$eb311761-ace2-4632-9ebf-9c7c166659f7¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ„

$$A' \equiv B^a \pmod{p} \qquad B' \equiv A^b \pmod{p}$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ5 š°persist_js_state·has_pluto_hook_featuresÂÙ$9e8a61d9-a700-4851-b1cd-49ce042c3530Чrunning§runtimeÎ ¦¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9e8a61d9-a700-4851-b1cd-49ce042c3530¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’Ù. 0.000015 seconds (5 allocations: 176 bytes) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$9e8a61d9-a700-4851-b1cd-49ce042c3530¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÙL3618502788666131106986593281521497120414687020801267626233049500247285301248¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`³²á°persist_js_state·has_pluto_hook_featuresÂÙ$256c8009-4d2b-42f8-adaa-6f238ef22c6dЧrunning§runtimeÎ||¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$256c8009-4d2b-42f8-adaa-6f238ef22c6d¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚâ5¤mime©text/html¬rootassignee¨slider_n²last_run_timestampËAÚ°á`z -°persist_js_state·has_pluto_hook_featuresÂÙ$c8f85081-3659-4796-8550-2e708b09c8d7Чrunning§runtimeÎ׸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$c8f85081-3659-4796-8550-2e708b09c8d7¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ"©

power = 251

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`©¹ú°persist_js_state·has_pluto_hook_featuresÂÙ$6332b2f2-ed2f-448a-b1df-247b110e335bЧrunning§runtimeÎ)5¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6332b2f2-ed2f-448a-b1df-247b110e335b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ7
Que faire si que $m$ est impair, c'est à dire $m = 2k + 1$...

Si $b = a^{2k}$, calcule le produit $b \times a$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^À0œ°persist_js_state·has_pluto_hook_featuresÂÙ$35b7b8b7-bff6-4f64-91b9-b65035162365Чrunning§runtimeÎ }¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$35b7b8b7-bff6-4f64-91b9-b65035162365¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙE

Voir [HPS14; Section 2.3]

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°ábžž°persist_js_state·has_pluto_hook_featuresÂÙ$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0Чrunning§runtimeΟ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ%pgcd (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á^Eäi°persist_js_state·has_pluto_hook_featuresÂÙ$77093b36-c232-4477-be49-845f1a631829Чrunning§runtimeÎ Ô¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$77093b36-c232-4477-be49-845f1a631829¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’³ 0.000001 seconds ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$77093b36-c232-4477-be49-845f1a631829¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤body£248¤mimeªtext/plain¬rootassignee®@time pow_1000²last_run_timestampËAÚ°á`¹R°persist_js_state·has_pluto_hook_featuresÂÙ$bd0c0258-7040-42e7-a20e-532b55af3a62Чrunning§runtimeÍe¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$bd0c0258-7040-42e7-a20e-532b55af3a62¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ€

Algorithme d'Euclide : implémentation

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^;˜5°persist_js_state·has_pluto_hook_featuresÂÙ$cd481f6c-66f4-4ebf-9769-c3edc24f403bЧrunning§runtimeÍ!‘¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$cd481f6c-66f4-4ebf-9769-c3edc24f403b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙz

Algorithme d'Euclide : élaboration

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^9/˜°persist_js_state·has_pluto_hook_featuresÂÙ$58da5ba4-c858-4684-a9f4-5a39fdc4fb03Чrunning§runtimeÎ �¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$58da5ba4-c858-4684-a9f4-5a39fdc4fb03¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ+fast_power (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á^Çúœ°persist_js_state·has_pluto_hook_featuresÂÙ$16b677e4-c467-462a-b770-b7a31160e129Чrunning§runtimeÍ>Ô¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$16b677e4-c467-462a-b770-b7a31160e129¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix¥Int64¨elementsÜ’’¡3ªtext/plain’’¡5ªtext/plain’’¡7ªtext/plain’’¢11ªtext/plain’’¢13ªtext/plain’’¢17ªtext/plain’’¢19ªtext/plain’’¢23ªtext/plain’ ’¢29ªtext/plain’ ’¢31ªtext/plain’ ’¢37ªtext/plain’ ’¢41ªtext/plain’ ’¢43ªtext/plain’’¢47ªtext/plain’’¢53ªtext/plain’’¢59ªtext/plain’’¢61ªtext/plain’’¢67ªtext/plain’’¢71ªtext/plain’’¢73ªtext/plain’’¢79ªtext/plain’’¢83ªtext/plain’’¢89ªtext/plain’’¢97ªtext/plain¤type¥Array¬prefix_short ¨objectid°ab7b0438725a5c2a¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeªprime_list²last_run_timestampËAÚ°á^â,A°persist_js_state·has_pluto_hook_featuresÂÙ$1b1d5c9b-5fc7-480e-9649-e9c44a49c38dЧrunning§runtimeÎŒª¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1b1d5c9b-5fc7-480e-9649-e9c44a49c38d¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ$qa (generic function with 2 methods)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á]ú†º°persist_js_state·has_pluto_hook_featuresÂÙ$1ca71c26-f98c-4126-a1c5-98786fde7e9bЧrunning§runtimeάB¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1ca71c26-f98c-4126-a1c5-98786fde7e9b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ¶

Trouver $b$ tel que $x_k$ est solution:

$$x_k = b^k \quad \to \quad b^{k+1} = b^k + b^{k-1} \quad \to \quad b^2 - b - 1 = 0 \quad \to \quad b = \frac{1 \pm \sqrt{5}}{2}$$

On a donc une famille de solutions:

$$x_k = a_1 \left(\frac{1 - \sqrt5}{2}\right)^k + a_2 \left(\frac{1 + \sqrt5}{2}\right)^k$$

Il reste à trouver $a_1$ et $a_2$ tels que $x_0 = 0$ et $x_1 = 1$. Ça correspond à calculer E.vectors \ [1, 0], etc...

$$\begin{align} x_0 & = 0 & a_1 + a_2 & = 0\\ x_1 & = 1 & a_1 \frac{1 - \sqrt5}{2} + a_2 \frac{1 + \sqrt5}{2} & = 1 \end{align}$$

Donc $a_1 = -1/\sqrt5$ et $a_2 = 1/\sqrt5$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4R‹°persist_js_state·has_pluto_hook_featuresÂÙ$191f8429-cbbb-44aa-8beb-271a94293e4bЧrunning§runtimeÎ\5·¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$191f8429-cbbb-44aa-8beb-271a94293e4b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ$986325341584402112586461440731025613¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`Ôq�°persist_js_state·has_pluto_hook_featuresÂÙ$59ac02af-7b54-44d4-b5f4-a0f60d4458a1Чrunning§runtimeÎo7g¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$59ac02af-7b54-44d4-b5f4-a0f60d4458a1¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix¥Int64¨elementsš’’¡2ªtext/plain’’¡4ªtext/plain’’¡8ªtext/plain’’¡5ªtext/plain’’¢10ªtext/plain’’¡9ªtext/plain’’¡7ªtext/plain’’¡3ªtext/plain’ ’¡6ªtext/plain’ ’¡1ªtext/plain¤type¥Array¬prefix_short ¨objectid°83fc227b5653792b¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeªall_powers²last_run_timestampËAÚ°áa#°persist_js_state·has_pluto_hook_featuresÂÙ$7f9bd301-355b-43f5-b168-22fac9e52511Чrunning§runtimeÎر¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$7f9bd301-355b-43f5-b168-22fac9e52511¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix¥Int64¨elements”’’¡2ªtext/plain’’¡3ªtext/plain’’¡5ªtext/plain’’¡7ªtext/plain¤type¥Array¬prefix_short ¨objectid°3392b0ff1d988767¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚ°á`YC°persist_js_state·has_pluto_hook_featuresÂÙ$d1b260fb-7500-47fb-bb48-21b5857ab55aЧrunning§runtimeÎä<¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d1b260fb-7500-47fb-bb48-21b5857ab55a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙå

Lemme: Si $a \equiv r \pmod{b}$ alors $\text{gcd}(a, b) = \text{gcd}(b, r)$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ$Èü°persist_js_state·has_pluto_hook_featuresÂÙ$3cd40d9e-fcea-427d-9877-cea65e7ea413Чrunning§runtimeÎ?=3¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$3cd40d9e-fcea-427d-9877-cea65e7ea413¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’Ù5 0.003560 seconds (40.01 k allocations: 17.619 MiB) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$3cd40d9e-fcea-427d-9877-cea65e7ea413¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÚT2531162323732361242240155003520607291766356485802485278951929841991312781760541315230153423463758831637443488219211037689033673531462742885329724071555187618026931630449193158922771331642302030331971098689235780843478258502779200293635651897483309686042860996364443514558772156043691404155819572984971754278513112487985892718229593329483578531419148805380281624260900362993556916638613939977074685016188258584312329139526393558096840812970422952418558991855772306882442574855589237165219912238201311184749075137322987656049866305366913734924425822681338966507463855180236283582409861199212323835947891143765414913345008456022009455704210891637791911265475167769704477334859109822590053774932978465651023851447920601310106288957894301592502061560528131203072778677491443420921822590709910448617329156135355464620891788459566081572824889514296350670950824208245170667601726417091127999999941149913010424532046881958285409468463211897582215075436515584016297874572183907949257286261608612401379639484713101138120404671732190451327881433201025184027541696124114463488665359385870910331476156665889459832092710304159637019707297988417848767011085425271875588008671422491434005115288334343837778792282383576736341414410248994081564830202363820504190074504566612515965134665683289356188727549463732830075811851574961558669278847363279870595320099844676879457196432535973357128305390290471349480258751812890314779723508104229525161740643984423978659638233074463100366500571977234508464710078102581304823235436518145074482824812996511614161933313389889630935320139507075992100561077534028207257574257706278201308302642634678112591091843082665721697117838726431766741158743554298864560993255547608496686850185804659790217122426535133253371422250684486113457341827911625517128815447325958547912113242367201990672230681308819195941016156001961954700241576553750737681552256845421159386858399433450045903975167084252876848848085910156941603293424067793097271128806817514906531652407763118308162377033463203514657531210413149191213595455280387631030665594589183601575340027172997222489081631144728873621805528648768511368948639522975539046995395707688938978847084621586473529546678958226255042389998718141303055036060772003887773038422366913820397748550793178167220193346017430024134496141145991896227741842515718997898627269918236920453493946658273870473264523119133765447653295022886429174942653014656521909469613184983671431465934965489425515981067546087342348350724207583544436107294087637975025147846254526938442435644928231027868701394819091132912397475713787593612758364812687556725146456646878912169274219209708166678668152184941578590201953144030519381922273252666652671717526318606676754556170379350956342095455612780202199922615392785572481747913435560866995432578680971243966868110016581395696310922519803685837460795358384618017215468122880442252343684547233668502313239328352671318130604247460452134121833305284398726438573787798499612760939462427922917659263046333084007208056631996856315539698234022953452211505675629153637867252695056925345220084020071611220575700841268302638995272842160994219632684575364180160991884885091858259996299627148614456696661412745040519981575543804847463997422326563897043803732970397488471644906183310144691243649149542394691524972023935190633672827306116525712882959108434211652465621144702015336657459532134026915214509960877430595844287585350290234547564574848753110281101545931547225811763441710217452979668178025286460158324658852904105792472468108996135476637212057508192176910900422826969523438985332067597093454021924077101784215936539638808624420121459718286059401823614213214326004270471752802725625810953787713898846144256909835116371235019527013180204030167601567064268573820697948868982630904164685161783088076506964317303709708574052747204405282785965604677674192569851918643651835755242670293612851920696732320545562286110332140065912751551110134916256237884844001366366654055079721985816714803952429301558096968202261698837096090377863017797020488044826628817462866854321356787305635653577619877987998113667928954840972022833505708587561902023411398915823487627297968947621416912816367516125096563705174220460639857683971213093125¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á_Z¦°persist_js_state·has_pluto_hook_featuresÂÙ$67093a35-8e1b-4cd3-b11b-c7ff601f802eЧrunning§runtimeÎmk¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$67093a35-8e1b-4cd3-b11b-c7ff601f802e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ �

primes_upper = 100

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^Û¹å°persist_js_state·has_pluto_hook_featuresÂÙ$ac5e1516-1574-4893-a965-f799947076cbЧrunning§runtimeÎÿB¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ac5e1516-1574-4893-a965-f799947076cb¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’ÙO 0.284572 seconds (701.20 k allocations: 37.581 MiB, 99.93% compilation time) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$ac5e1516-1574-4893-a965-f799947076cb¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÙU2.531162323732361578998428490601662084769270923897910687031954402219719762339543e4179¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`"j¡°persist_js_state·has_pluto_hook_featuresÂÙ$a826d9d1-47db-4645-be6e-3ae0ed8d4e18Чrunning§runtimeÎ ¢¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a826d9d1-47db-4645-be6e-3ae0ed8d4e18¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ.

Est-ce que 2345 est divisible par 3 ou 9?

$$\begin{align} 2 \cdot 10^3 + 3 \cdot 10^2 + 4 \cdot 10 + 5 & \equiv \,\, ? \pmod{9}\\ 2 \cdot 1^3 + 3 \cdot 1^2 + 4 \cdot 1 + 5 & \equiv \,\, ? \pmod{9}\\ 2 + 3 + 4 + 5 & \equiv 14 \pmod{9}\\ \end{align}$$

Est-ce que 2345 est divisible par 11?

$$\begin{align} 2 \cdot (10)^3 + 3 \cdot 10^2 + 4 \cdot 10 + 5 & \equiv \,\, ? \pmod{11}\\ 2 \cdot (-1)^3 + 3 \cdot (-1)^2 + 4 \cdot (-1) + 5 & \equiv \,\, ? \pmod{11}\\ -2 + 3 - 4 + 5 & \equiv 2 \pmod{11}\\ \end{align}$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3&�°persist_js_state·has_pluto_hook_featuresÂÙ$fe2af566-4a8b-4052-9915-85266ee5ce98Чrunning§runtimeÎÏ�¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$fe2af566-4a8b-4052-9915-85266ee5ce98¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’Úgcd(90284599, 249357461) = gcd(249357461, 90284599) = gcd(90284599, 68788263) = gcd(68788263, 21496336) = gcd(21496336, 4299255) = gcd(4299255, 61) = gcd(61, 36) = gcd(36, 25) = gcd(25, 11) = gcd(11, 3) = gcd(3, 2) = gcd(2, 1) = gcd(1, 0) = 1 ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$fe2af566-4a8b-4052-9915-85266ee5ce98¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤body¡1¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á^†–°persist_js_state·has_pluto_hook_featuresÂÙ$ee43c389-55f4-4cf9-a8db-ce37d1b89db4Чrunning§runtimeÍ!¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ee43c389-55f4-4cf9-a8db-ce37d1b89db4¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ‚

Shanks's Babystep–Giantstep Algorithm

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`:(A°persist_js_state·has_pluto_hook_featuresÂÙ$e9633e3f-376d-413d-bc19-d015f6ce76e5Чrunning§runtimeÍ7ݸdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e9633e3f-376d-413d-bc19-d015f6ce76e5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙL3618502788666131106986593281521497120414687020801267626233049500247285301248¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`Ö[¸°persist_js_state·has_pluto_hook_featuresÂÙ$37585789-bd43-4ce5-b550-ad712b70d226Чrunning§runtimeÎi¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$37585789-bd43-4ce5-b550-ad712b70d226¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚÄ

Définition Le résultat de la division Euclidienne de $a$ par un diviseur $d$ est un quotient $q$ et un reste $0 \le r < d$ tels que $a = qd + r$. En notation modulaire $a \equiv r \pmod{d}$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ$³Ý°persist_js_state·has_pluto_hook_featuresÂÙ$61462af5-69bd-42be-8918-7992c79ee00dЧrunning§runtimeΪM¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$61462af5-69bd-42be-8918-7992c79ee00d¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚC
Comment savoir si prime_list contient assez de nombres pour avoir la bonne réponse ?

On a la bonne réponse modulo prod(prime_list) donc si prod(prime_list) > 2^power, on a la bonne réponse.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^âSÚ°persist_js_state·has_pluto_hook_featuresÂÙ$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4Чrunning§runtimeÎ�]¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ
Comment trouver mod(2^power, 999000) en utilisant pow_1000 et pow_999 ?

On peut utiliser une astuce similaire à l'interpolation Lagrangienne. On veut trouver $x$ et $y$ tels que

$$\texttt{pow\_1000}x + \texttt{pow\_999}y \equiv 2^\texttt{power} \pmod{999000}$$

On veut que $x \equiv 0 \pmod{999}$ et $x \equiv 1 \pmod{1000}$. On utilise donc $x = 999x'$ avec $x' \equiv (999)^{-1} \pmod{1000}$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^ÑRÁ°persist_js_state·has_pluto_hook_featuresÂÙ$4cb070de-e8bf-4a1d-9625-043c19466c46Чrunning§runtimeÎ à¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4cb070de-e8bf-4a1d-9625-043c19466c46¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’Ù2 0.000117 seconds (826 allocations: 100.844 KiB) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$4cb070de-e8bf-4a1d-9625-043c19466c46¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÚT2531162323732361242240155003520607291766356485802485278951929841991312781760541315230153423463758831637443488219211037689033673531462742885329724071555187618026931630449193158922771331642302030331971098689235780843478258502779200293635651897483309686042860996364443514558772156043691404155819572984971754278513112487985892718229593329483578531419148805380281624260900362993556916638613939977074685016188258584312329139526393558096840812970422952418558991855772306882442574855589237165219912238201311184749075137322987656049866305366913734924425822681338966507463855180236283582409861199212323835947891143765414913345008456022009455704210891637791911265475167769704477334859109822590053774932978465651023851447920601310106288957894301592502061560528131203072778677491443420921822590709910448617329156135355464620891788459566081572824889514296350670950824208245170667601726417091127999999941149913010424532046881958285409468463211897582215075436515584016297874572183907949257286261608612401379639484713101138120404671732190451327881433201025184027541696124114463488665359385870910331476156665889459832092710304159637019707297988417848767011085425271875588008671422491434005115288334343837778792282383576736341414410248994081564830202363820504190074504566612515965134665683289356188727549463732830075811851574961558669278847363279870595320099844676879457196432535973357128305390290471349480258751812890314779723508104229525161740643984423978659638233074463100366500571977234508464710078102581304823235436518145074482824812996511614161933313389889630935320139507075992100561077534028207257574257706278201308302642634678112591091843082665721697117838726431766741158743554298864560993255547608496686850185804659790217122426535133253371422250684486113457341827911625517128815447325958547912113242367201990672230681308819195941016156001961954700241576553750737681552256845421159386858399433450045903975167084252876848848085910156941603293424067793097271128806817514906531652407763118308162377033463203514657531210413149191213595455280387631030665594589183601575340027172997222489081631144728873621805528648768511368948639522975539046995395707688938978847084621586473529546678958226255042389998718141303055036060772003887773038422366913820397748550793178167220193346017430024134496141145991896227741842515718997898627269918236920453493946658273870473264523119133765447653295022886429174942653014656521909469613184983671431465934965489425515981067546087342348350724207583544436107294087637975025147846254526938442435644928231027868701394819091132912397475713787593612758364812687556725146456646878912169274219209708166678668152184941578590201953144030519381922273252666652671717526318606676754556170379350956342095455612780202199922615392785572481747913435560866995432578680971243966868110016581395696310922519803685837460795358384618017215468122880442252343684547233668502313239328352671318130604247460452134121833305284398726438573787798499612760939462427922917659263046333084007208056631996856315539698234022953452211505675629153637867252695056925345220084020071611220575700841268302638995272842160994219632684575364180160991884885091858259996299627148614456696661412745040519981575543804847463997422326563897043803732970397488471644906183310144691243649149542394691524972023935190633672827306116525712882959108434211652465621144702015336657459532134026915214509960877430595844287585350290234547564574848753110281101545931547225811763441710217452979668178025286460158324658852904105792472468108996135476637212057508192176910900422826969523438985332067597093454021924077101784215936539638808624420121459718286059401823614213214326004270471752802725625810953787713898846144256909835116371235019527013180204030167601567064268573820697948868982630904164685161783088076506964317303709708574052747204405282785965604677674192569851918643651835755242670293612851920696732320545562286110332140065912751551110134916256237884844001366366654055079721985816714803952429301558096968202261698837096090377863017797020488044826628817462866854321356787305635653577619877987998113667928954840972022833505708587561902023411398915823487627297968947621416912816367516125096563705174220460639857683971213093125¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`#×¥°persist_js_state·has_pluto_hook_featuresÂÙ$192f608c-0563-4179-903f-49fad2db4c74Чrunning§runtimeÎ ü¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$192f608c-0563-4179-903f-49fad2db4c74¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’Ù2 0.000165 seconds (826 allocations: 100.812 KiB) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$192f608c-0563-4179-903f-49fad2db4c74¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÚT2531162323732361242240155003520607291766356485802485278951929841991312781760541315230153423463758831637443488219211037689033673531462742885329724071555187618026931630449193158922771331642302030331971098689235780843478258502779200293635651897483309686042860996364443514558772156043691404155819572984971754278513112487985892718229593329483578531419148805380281624260900362993556916638613939977074685016188258584312329139526393558096840812970422952418558991855772306882442574855589237165219912238201311184749075137322987656049866305366913734924425822681338966507463855180236283582409861199212323835947891143765414913345008456022009455704210891637791911265475167769704477334859109822590053774932978465651023851447920601310106288957894301592502061560528131203072778677491443420921822590709910448617329156135355464620891788459566081572824889514296350670950824208245170667601726417091127999999941149913010424532046881958285409468463211897582215075436515584016297874572183907949257286261608612401379639484713101138120404671732190451327881433201025184027541696124114463488665359385870910331476156665889459832092710304159637019707297988417848767011085425271875588008671422491434005115288334343837778792282383576736341414410248994081564830202363820504190074504566612515965134665683289356188727549463732830075811851574961558669278847363279870595320099844676879457196432535973357128305390290471349480258751812890314779723508104229525161740643984423978659638233074463100366500571977234508464710078102581304823235436518145074482824812996511614161933313389889630935320139507075992100561077534028207257574257706278201308302642634678112591091843082665721697117838726431766741158743554298864560993255547608496686850185804659790217122426535133253371422250684486113457341827911625517128815447325958547912113242367201990672230681308819195941016156001961954700241576553750737681552256845421159386858399433450045903975167084252876848848085910156941603293424067793097271128806817514906531652407763118308162377033463203514657531210413149191213595455280387631030665594589183601575340027172997222489081631144728873621805528648768511368948639522975539046995395707688938978847084621586473529546678958226255042389998718141303055036060772003887773038422366913820397748550793178167220193346017430024134496141145991896227741842515718997898627269918236920453493946658273870473264523119133765447653295022886429174942653014656521909469613184983671431465934965489425515981067546087342348350724207583544436107294087637975025147846254526938442435644928231027868701394819091132912397475713787593612758364812687556725146456646878912169274219209708166678668152184941578590201953144030519381922273252666652671717526318606676754556170379350956342095455612780202199922615392785572481747913435560866995432578680971243966868110016581395696310922519803685837460795358384618017215468122880442252343684547233668502313239328352671318130604247460452134121833305284398726438573787798499612760939462427922917659263046333084007208056631996856315539698234022953452211505675629153637867252695056925345220084020071611220575700841268302638995272842160994219632684575364180160991884885091858259996299627148614456696661412745040519981575543804847463997422326563897043803732970397488471644906183310144691243649149542394691524972023935190633672827306116525712882959108434211652465621144702015336657459532134026915214509960877430595844287585350290234547564574848753110281101545931547225811763441710217452979668178025286460158324658852904105792472468108996135476637212057508192176910900422826969523438985332067597093454021924077101784215936539638808624420121459718286059401823614213214326004270471752802725625810953787713898846144256909835116371235019527013180204030167601567064268573820697948868982630904164685161783088076506964317303709708574052747204405282785965604677674192569851918643651835755242670293612851920696732320545562286110332140065912751551110134916256237884844001366366654055079721985816714803952429301558096968202261698837096090377863017797020488044826628817462866854321356787305635653577619877987998113667928954840972022833505708587561902023411398915823487627297968947621416912816367516125096563705174220460639857683971213093125¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`/âm°persist_js_state·has_pluto_hook_featuresÂÙ$a293bb0e-078d-4335-a446-3096a79c03bcЧrunning§runtimeÍ’¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a293bb0e-078d-4335-a446-3096a79c03bc¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙH

Diffie-Hellman

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`WÝ©°persist_js_state·has_pluto_hook_featuresÂÙ$a1081bb2-2186-4b19-b667-0c246155f360Чrunning§runtimeÎ ü«¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a1081bb2-2186-4b19-b667-0c246155f360¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’Ù2 0.000133 seconds (826 allocations: 100.922 KiB) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$a1081bb2-2186-4b19-b667-0c246155f360¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÚT2531162323732361242240155003520607291766356485802485278951929841991312781760541315230153423463758831637443488219211037689033673531462742885329724071555187618026931630449193158922771331642302030331971098689235780843478258502779200293635651897483309686042860996364443514558772156043691404155819572984971754278513112487985892718229593329483578531419148805380281624260900362993556916638613939977074685016188258584312329139526393558096840812970422952418558991855772306882442574855589237165219912238201311184749075137322987656049866305366913734924425822681338966507463855180236283582409861199212323835947891143765414913345008456022009455704210891637791911265475167769704477334859109822590053774932978465651023851447920601310106288957894301592502061560528131203072778677491443420921822590709910448617329156135355464620891788459566081572824889514296350670950824208245170667601726417091127999999941149913010424532046881958285409468463211897582215075436515584016297874572183907949257286261608612401379639484713101138120404671732190451327881433201025184027541696124114463488665359385870910331476156665889459832092710304159637019707297988417848767011085425271875588008671422491434005115288334343837778792282383576736341414410248994081564830202363820504190074504566612515965134665683289356188727549463732830075811851574961558669278847363279870595320099844676879457196432535973357128305390290471349480258751812890314779723508104229525161740643984423978659638233074463100366500571977234508464710078102581304823235436518145074482824812996511614161933313389889630935320139507075992100561077534028207257574257706278201308302642634678112591091843082665721697117838726431766741158743554298864560993255547608496686850185804659790217122426535133253371422250684486113457341827911625517128815447325958547912113242367201990672230681308819195941016156001961954700241576553750737681552256845421159386858399433450045903975167084252876848848085910156941603293424067793097271128806817514906531652407763118308162377033463203514657531210413149191213595455280387631030665594589183601575340027172997222489081631144728873621805528648768511368948639522975539046995395707688938978847084621586473529546678958226255042389998718141303055036060772003887773038422366913820397748550793178167220193346017430024134496141145991896227741842515718997898627269918236920453493946658273870473264523119133765447653295022886429174942653014656521909469613184983671431465934965489425515981067546087342348350724207583544436107294087637975025147846254526938442435644928231027868701394819091132912397475713787593612758364812687556725146456646878912169274219209708166678668152184941578590201953144030519381922273252666652671717526318606676754556170379350956342095455612780202199922615392785572481747913435560866995432578680971243966868110016581395696310922519803685837460795358384618017215468122880442252343684547233668502313239328352671318130604247460452134121833305284398726438573787798499612760939462427922917659263046333084007208056631996856315539698234022953452211505675629153637867252695056925345220084020071611220575700841268302638995272842160994219632684575364180160991884885091858259996299627148614456696661412745040519981575543804847463997422326563897043803732970397488471644906183310144691243649149542394691524972023935190633672827306116525712882959108434211652465621144702015336657459532134026915214509960877430595844287585350290234547564574848753110281101545931547225811763441710217452979668178025286460158324658852904105792472468108996135476637212057508192176910900422826969523438985332067597093454021924077101784215936539638808624420121459718286059401823614213214326004270471752802725625810953787713898846144256909835116371235019527013180204030167601567064268573820697948868982630904164685161783088076506964317303709708574052747204405282785965604677674192569851918643651835755242670293612851920696732320545562286110332140065912751551110134916256237884844001366366654055079721985816714803952429301558096968202261698837096090377863017797020488044826628817462866854321356787305635653577619877987998113667928954840972022833505708587561902023411398915823487627297968947621416912816367516125096563705174220460639857683971213093125¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á_~•J°persist_js_state·has_pluto_hook_featuresÂÙ$d8a28762-8aab-49e9-b9ac-38901d34abffЧrunning§runtimeÍ"�¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d8a28762-8aab-49e9-b9ac-38901d34abff¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙF

Fast powering

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^¿åæ°persist_js_state·has_pluto_hook_featuresÂÙ$15367f3b-c7e4-4004-a018-5422a7f22024Чrunning§runtimeÎ_ã¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$15367f3b-c7e4-4004-a018-5422a7f22024¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ¬

On peut mettre le vecteur de taille $n^2$ sous forme de matrice de taille $n \times n$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4©ë°persist_js_state·has_pluto_hook_featuresÂÙ$9207b107-e1b0-4328-a004-f4b8152b423fЧrunning§runtimeÎ{™¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9207b107-e1b0-4328-a004-f4b8152b423f¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ7
Observation clé Si $a > b$, trouver un mono-variant.

On a $(a, b) > (b, r)$. En effet, $a > b$ par supposition et $b > r$ par définition de l'algorithme d'Euclide. Notons que même si la supposition $a > b$ n'est pas vraie, elle le devient pour $\text{gcd}(b, r)$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^:Üϰpersist_js_state·has_pluto_hook_featuresÂÙ$aee611f2-bc86-4e85-bbcb-add78c6a9175Чrunning§runtimeÍ2ï¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$aee611f2-bc86-4e85-bbcb-add78c6a9175¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyƒ¨elements“’’¡1ªtext/plain’’¨89932200ªtext/plain’’©-32561659ªtext/plain¤type¥Tuple¨objectid°54a1c5b46a9f8dc9¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚ°á^¢U7°persist_js_state·has_pluto_hook_featuresÂÙ$b319619e-8f8d-4650-8fb4-76e5ba953470Чrunning§runtimeÎMù¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$b319619e-8f8d-4650-8fb4-76e5ba953470¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚÍ

$$xb + yr = g \quad \text{et} \quad r = a - qb \quad \Rightarrow \quad (x - yq)b + ya = g$$

Solution homogène $x = b$, $y = -a$ → $ba - ab = 0$. Donc si $(x, y)$ est solution, $(x + b, y - a)$ aussi.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3Zî°persist_js_state·has_pluto_hook_featuresÂÙ$642d545f-b1b9-49da-8a03-ad63e3214f59Чrunning§runtimeÎM�¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$642d545f-b1b9-49da-8a03-ad63e3214f59¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙÛ

$$a \equiv \alpha \pmod{n} \quad \text{et} \quad b \equiv \beta \pmod{n} \quad \Rightarrow \quad a b \equiv \alpha \beta \pmod{n}$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ2ú+°persist_js_state·has_pluto_hook_featuresÂÙ$a7d06375-e4dd-47b1-8aba-11dc4d62954bЧrunning§runtimeθdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a7d06375-e4dd-47b1-8aba-11dc4d62954b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚh
Supposons que $m$ est pair, c'est à dire $m = 2k$...

On a $a^{2k} = (a^k)^2$. Si $b = a^k$, on calcule le produit $b \times b$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^À °persist_js_state·has_pluto_hook_featuresÂÙ$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfЧrunning§runtimeÎ †·¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$65f4990f-1952-4682-8fa8-9e3dd4bf1ebf¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’³ 0.000001 seconds ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$65f4990f-1952-4682-8fa8-9e3dd4bf1ebf¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤body£500¤mimeªtext/plain¬rootassignee­@time pow_999²last_run_timestampËAÚ°á`º‚ù°persist_js_state·has_pluto_hook_featuresÂÙ$0e3fb524-bea1-4ef0-9589-36230a84e949Чrunning§runtimeÎr1¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$0e3fb524-bea1-4ef0-9589-36230a84e949¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚy

g = 2

p = 11

¤mime©text/html¬rootassignee©gp_picker²last_run_timestampËAÚ°áa "y°persist_js_state·has_pluto_hook_featuresÂÙ$78df9410-5ea4-4d9f-bbe5-862f76a100fcЧrunning§runtimeÎK¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$78df9410-5ea4-4d9f-bbe5-862f76a100fc¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ¯

$30x \equiv j \pmod{7} \quad \Rightarrow \quad x \equiv (30)^{-1} j\pmod{7}$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3¨¬°persist_js_state·has_pluto_hook_featuresÂÙ$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986Чrunning§runtimeÍ3�¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¦252248¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`¿bܰpersist_js_state·has_pluto_hook_featuresÂÙ$8b16a522-9be4-4286-b64d-3d1bbdef7142Чrunning§runtimeΓ‘¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$8b16a522-9be4-4286-b64d-3d1bbdef7142¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ°

Étant donné un nombre premier $p$ et une racine primitive $g$ modulo $p$ et un entier $a$ tel que $p \nmid a$, le Discrete logarithme problem consiste à retrouver $x$ tel que $g^x \equiv a \pmod{p}$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4€Ø°persist_js_state·has_pluto_hook_featuresÂÙ$c376513c-6553-4cd6-8384-ae6ff9d472d7Чrunning§runtimeβ½¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$c376513c-6553-4cd6-8384-ae6ff9d472d7¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙz

$$A \equiv g^a \pmod{p} \qquad B \equiv g^b \pmod{p}$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4ù/°persist_js_state·has_pluto_hook_featuresÂÙ$3da58487-192f-458a-9d47-7a4ce98b6da3Чrunning§runtimeÍC¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$3da58487-192f-458a-9d47-7a4ce98b6da3¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ6

Utils

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`X”°persist_js_state·has_pluto_hook_featuresÂÙ$64eb4b52-4946-467c-867a-a6fc437b15f6Чrunning§runtimeÍ#g¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$64eb4b52-4946-467c-867a-a6fc437b15f6¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙb

Meet in the middle approach

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`9�Ö°persist_js_state·has_pluto_hook_featuresÂÙ$31388128-33a3-4443-835e-74b91bf48268Чrunning§runtimeÍ&u¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$31388128-33a3-4443-835e-74b91bf48268¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¡4¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`~Ÿw°persist_js_state·has_pluto_hook_featuresÂÙ$4714b7d7-32ee-42a1-bfa5-93eafda739d3Чrunning§runtimeÍ Q¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4714b7d7-32ee-42a1-bfa5-93eafda739d3¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙt

Diagonalization to speed up powering

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á_:ë°persist_js_state·has_pluto_hook_featuresÂÙ$d882afdd-eb85-467c-bf18-525c0c5da5e7Чrunning§runtimeÎ ¸è¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d882afdd-eb85-467c-bf18-525c0c5da5e7¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’Ù/ 0.000046 seconds (39 allocations: 2.609 KiB) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$d882afdd-eb85-467c-bf18-525c0c5da5e7¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÙU2.531162323732361578998428490601662084769270923897910687031954402219719762339543e4179¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`.„M°persist_js_state·has_pluto_hook_featuresÂÙ$a7d9703a-5121-4b43-8cd4-2acf9a0d91efЧrunning§runtimeÎðÀ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a7d9703a-5121-4b43-8cd4-2acf9a0d91ef¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ#

La méthode meet in the middle est une méthode générique permettant de passer d'une complexité de $\mathcal{O}(N)$ à $\mathcal{O}(\sqrt{N})$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4–�°persist_js_state·has_pluto_hook_featuresÂÙ$38744170-9af6-44b5-a0be-46a83da3253eЧrunning§runtimeÎá´¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$38744170-9af6-44b5-a0be-46a83da3253e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ(fib_pow (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á_a¹°persist_js_state·has_pluto_hook_featuresÂÙ$f86a5efc-d31e-4e88-b81f-ebdbbeba11ecЧrunning§runtimeΉ4¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$f86a5efc-d31e-4e88-b81f-ebdbbeba11ec¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚª

On doit donc trouver la ligne $i$ et la ligne et $j$ tels que

$$\begin{align} g^{i-1}g^{(j-1)n} & \equiv a & \pmod{p}\\ g^{i-1} & \equiv a(g^{-n})^{j-1} & \pmod{p} \end{align}$$

Ils ne reste plus qu'à chercher une collision entre les listes de restes modulo $p$ pour $g^{i-1}$ et $a(g^{-n})^{j-1}$. L'identification des collision peut se faire en $\mathcal{O}(\sqrt{n}\log(n))$ avec une recherche dichotomique our en $\mathcal{O}(\sqrt{n})$ amorti avec un dictionaire.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4Ó³°persist_js_state·has_pluto_hook_featuresÂÙ$8315b53f-abca-483d-bbf6-7e9193e751c9Чrunning§runtimeÎÏW¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$8315b53f-abca-483d-bbf6-7e9193e751c9¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ*draw_fib (generic function with 2 methods)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`à¬*°persist_js_state·has_pluto_hook_featuresÂÙ$08b18315-c28e-44ed-beb2-5b17421b0224Чrunning§runtimeÎ’n¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$08b18315-c28e-44ed-beb2-5b17421b0224¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ•

Définition Le Greatest Common Divisor (GCD) de deux nombres $a \in \mathbb{Z}$ et $b \in \mathbb{Z}$, noté $\text{gcd}(a, b)$ est le plus grand nombre $g \in \mathbb{Z}$ qui divise $a$ (noté $g \mid a$) et $b$ (noté $g \mid b$). C'est à dire qu'il existe $x \in \mathbb{Z}$ tel que $a = gx$ et $y \in \mathbb{Z}$ tel que $b = gy$. En notation modulaire, $a \equiv 0 \pmod{g}$ et $b \equiv 0 \pmod{g}$.

Théorème de Bézout Il existe $x, y \in \mathbb{Z}$ tels que $ax + by = c$ si et seulement si $\text{gcd}(a, b)$ divise $c$. En notation modulaire $ax \equiv c \pmod{b}$ et $by \equiv c \pmod{a}$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ$¡Ü°persist_js_state·has_pluto_hook_featuresÂÙ$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253Чrunning§runtimeÍ8`¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¡3¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°áa·�°persist_js_state·has_pluto_hook_featuresÂÙ$e52d25b3-65bf-4617-ae8d-fae0d0c8d041Чrunning§runtimeÎ18¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e52d25b3-65bf-4617-ae8d-fae0d0c8d041¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ±

$366x \equiv j \pmod{7} \quad \Rightarrow \quad x \equiv (366)^{-1} j\pmod{7}$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3Î�°persist_js_state·has_pluto_hook_featuresÂÙ$462fa407-d973-4e9e-8512-b7cd3bb98b7bЧrunning§runtimeΠdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$462fa407-d973-4e9e-8512-b7cd3bb98b7b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ(fib_seq (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á_Neþ°persist_js_state·has_pluto_hook_featuresÂÙ$ca8905ef-97a3-424c-bb2e-559f7151585bЧrunning§runtimeΟ:¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ca8905ef-97a3-424c-bb2e-559f7151585b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ3

Ensemble de solutions: $(x + kb, y - ka)$ pour un $k \in \mathbb{Z}$ arbitraire. Prenons $k$ tel que $0 \le x + kb < b$ avec mod.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3‚Q°persist_js_state·has_pluto_hook_featuresÂÙ$09f44611-ba21-4982-ba1b-0691124642fcЧrunning§runtimeÍ!}¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$09f44611-ba21-4982-ba1b-0691124642fc¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙn

Arithmétique modulaire : produit

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^‡8a°persist_js_state·has_pluto_hook_featuresÂÙ$18031ccb-657f-409a-9080-9a0ada3ae8b5Чrunning§runtimeÎ Ò¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$18031ccb-657f-409a-9080-9a0ada3ae8b5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚä13¤mime©text/html¬rootassignee¨slider_b²last_run_timestampËAÚ°á`yÐ̰persist_js_state·has_pluto_hook_featuresÂÙ$d81bbd74-42df-4bb2-a045-9c2642cc19e5Чrunning§runtimeÍ™¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d81bbd74-42df-4bb2-a045-9c2642cc19e5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ;
a$\alpha$b$\beta$n
1111335
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`¨é-°persist_js_state·has_pluto_hook_featuresÂÙ$4be6cea4-13a2-4bcb-b849-14eef57ab604Чrunning§runtimeΨ�¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4be6cea4-13a2-4bcb-b849-14eef57ab604¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙc

Le nombre 2 est une racine primitive modulo 11

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áaL^°persist_js_state·has_pluto_hook_featuresÂÙ$1072a756-5026-4de9-93a8-f942d54c474aЧrunning§runtimeÎ|¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1072a756-5026-4de9-93a8-f942d54c474a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙE

Voir [HPS14; Section 2.7]

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°ábž�R°persist_js_state·has_pluto_hook_featuresÂÙ$6107d03d-1e45-4eb9-b8e2-51e4a72485e6Чrunning§runtimeÍÞ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6107d03d-1e45-4eb9-b8e2-51e4a72485e6¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ\

Recursive implementation

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^ÀË2°persist_js_state·has_pluto_hook_featuresÂÙ$87fdefa1-3bbd-4b69-ad3a-72baca6e55eeЧrunning§runtimeÍ6œ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$87fdefa1-3bbd-4b69-ad3a-72baca6e55ee¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¡4¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`@ÿ°persist_js_state·has_pluto_hook_featuresÂÙ$48eba223-6cce-4aa2-9977-4883ba7903fcЧrunning§runtimeÎàô¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$48eba223-6cce-4aa2-9977-4883ba7903fc¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ¡
Observation finale Si $a$ et $b$ sont positifs et qu'on effectue la substitution $(a, b) \to (b, r)$ récursivement, le mono-variant impose qu'on ne puisse itérer qu'un nombre fini de fois, que va-t-il se passer ?

La paire $(a, b)$ va diminuer strictement (c'est à dire d'au moins 1) à chaque itération. Pourtant, ce sont des nombres entier positifs donc ils ne peuvent diminuer strictement qu'un nombre fini de fois. C'est une contradiction, comme cela se fait-il ? À un moment $b$ vaudra 0, on ne pourra alors plus faire de division Euclidienne. On utilisera alors le fait que $\text{gcd}(a, 0) = a$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^:ÿ°°persist_js_state·has_pluto_hook_featuresÂÙ$72ec8410-05d9-475a-93d4-47153cc0ce31Чrunning§runtimeθdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$72ec8410-05d9-475a-93d4-47153cc0ce31¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ(fib_rec (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á^êi¥°persist_js_state·has_pluto_hook_featuresÂÙ$1a4da418-147f-46f4-9b95-7955183aa5cfЧrunning§runtimeÎ >¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1a4da418-147f-46f4-9b95-7955183aa5cf¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ8€

gcd_a = 90284599

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^r—³°persist_js_state·has_pluto_hook_featuresÂÙ$7da0705e-c925-4f8d-9ca4-8d8a0f859feaЧrunning§runtimeΡu¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$7da0705e-c925-4f8d-9ca4-8d8a0f859fea¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ±

$365x \equiv j \pmod{7} \quad \Rightarrow \quad x \equiv (365)^{-1} j\pmod{7}$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3»�°persist_js_state·has_pluto_hook_featuresÂÙ$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66bЧrunning§runtimeÎbg·¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66b¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’Ù/ 0.000045 seconds (22 allocations: 1.586 KiB) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66b¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÙU2.531162323732361242240155003520607291766356485802485278951929841991312781989138e4179¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`-$ÿ°persist_js_state·has_pluto_hook_featuresÂÙ$82ba8fe1-435e-422b-abb7-cb50a7a85e1eЧrunning§runtimeÍ1ÿ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$82ba8fe1-435e-422b-abb7-cb50a7a85e1e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙN

Dicrete logarithm

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`1nƒ°persist_js_state·has_pluto_hook_featuresÂÙ$f39cccac-5b24-46e4-8749-1b0a944542efЧrunning§runtime΀y¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$f39cccac-5b24-46e4-8749-1b0a944542ef¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ8‚

gcd_b = 249357461

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^rß“°persist_js_state·has_pluto_hook_featuresÂÙ$c5e906c8-0f73-4955-baa7-337195329e04Чrunning§runtimeÎÇI¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$c5e906c8-0f73-4955-baa7-337195329e04¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ›

Étant donné un nombre premier $p$ et une racine primitive $g$ modulo $p$, Alice (resp. Bob) génère un nombre secret $a$ (resp. $b$). Ils communique ensuite publiquement $A$ et $B$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4çó°persist_js_state·has_pluto_hook_featuresÂÙ$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6Чrunning§runtimeÎxå¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚM
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3Dаpersist_js_state·has_pluto_hook_featuresÂÙ$bc9a718f-4b97-4e15-acf8-d180abc5b6d5Чrunning§runtimeΣ¼¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$bc9a718f-4b97-4e15-acf8-d180abc5b6d5¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚì
Est-ce une complexité linéaire ou exponentielle en fonction de la taille de l'input

La taille est proportionnelle à $\log_2(p)$ donc on être linéaire en $p$ c'est être proportionnel à $2^{\log_2(p)}$ et donc la complexité est exponentielle en la taille de l'input ! [HPS14; Section 2.6]

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°ábžc °persist_js_state·has_pluto_hook_featuresÂÙ$41cf9efd-65e5-4abb-94d3-e824780e659cЧrunning§runtimeÎbøÿü¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$41cf9efd-65e5-4abb-94d3-e824780e659c¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ~

[HPS14] J. Hoffstein, J. Pipher and J. H. Silverman. An Introduction to Mathematical Cryptography. Undergraduate Texts in Mathematics (Springer, New York, NY, 2014). Accessed on Nov 18, 2024.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°ác.§°persist_js_state·has_pluto_hook_featuresÂÙ$1e27eedc-5308-4608-863f-fb81d60acdf0Чrunning§runtimeÎ~7¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1e27eedc-5308-4608-863f-fb81d60acdf0¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ¿
Quelle est la complexité?

$\mathcal{O}(\sqrt{p}\log(p))$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`WI�°persist_js_state·has_pluto_hook_featuresÂÙ$a59a20e2-a7c7-48a9-ad8d-8094e03a749dЧrunning§runtimeÍ_ˆ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a59a20e2-a7c7-48a9-ad8d-8094e03a749d¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix¥Int64¨elements—’’¡0ªtext/plain’’¡1ªtext/plain’’¡2ªtext/plain’’¡3ªtext/plain’’¡4ªtext/plain’’¡5ªtext/plain’’¡6ªtext/plain¤type¥Array¬prefix_short ¨objectid°724655f7ac3740a4¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚ°á^¾ZÞ°persist_js_state·has_pluto_hook_featuresÂÙ$3c198d79-c46a-4781-8bd1-b6b68f06c31fЧrunning§runtimeÎ_`,¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$3c198d79-c46a-4781-8bd1-b6b68f06c31f¹depends_on_disabled_cells¦queued¤logs‘ˆ¥group¦stdout¤lineÿ£msg’ÙN 0.005667 seconds (2.61 k allocations: 124.359 KiB, 99.37% compilation time) ªtext/plain¥level®LogLevel(-555)¢id´PlutoRunner_40f9f5d1§cell_idÙ$3c198d79-c46a-4781-8bd1-b6b68f06c31f¦kwargs�¤fileÙP/home/runner/.julia/packages/Pluto/sRdkC/src/runner/PlutoRunner/src/io/stdout.jl¦output†¤bodyÙL3618502788666131106986593281521497120414687020801267626233049500247285301248¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`µŠ+°persist_js_state·has_pluto_hook_featuresÂÙ$03e49669-cdee-4241-862d-33ee91214455Чrunning§runtimeÎTO¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$03e49669-cdee-4241-862d-33ee91214455¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙª

The complexity is difficult to evaluate but can be shown to be $O(\log(\min(a, b)))$.

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ$ÜÛ°persist_js_state·has_pluto_hook_featuresÂÙ$6f10de7b-ce05-4f82-82e7-4110be44e8ccЧrunning§runtimeÍQJ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6f10de7b-ce05-4f82-82e7-4110be44e8cc¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¦252248¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`» �°persist_js_state·has_pluto_hook_featuresÂÙ$059b0ada-2442-48e4-82dd-489cb97e5dccЧrunning§runtimeÍǸdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$059b0ada-2442-48e4-82dd-489cb97e5dcc¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚy

g = 2

p = 11

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áa%°persist_js_state·has_pluto_hook_featuresÂÙ$4853f4ef-fbb8-48c3-9523-13ab4969d097Чrunning§runtimeÎ Q{¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4853f4ef-fbb8-48c3-9523-13ab4969d097¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ+baby_steps (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`BY°persist_js_state·has_pluto_hook_featuresÂÙ$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1Чrunning§runtimeÍVº¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix¥Int64¨elements—’’¡0ªtext/plain’’¡4ªtext/plain’’¡1ªtext/plain’’¡5ªtext/plain’’¡2ªtext/plain’’¡6ªtext/plain’’¡3ªtext/plain¤type¥Array¬prefix_short ¨objectid°2fcb83ae2769fd42¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚ°á^¾Þ"°persist_js_state·has_pluto_hook_featuresÂÙ$0c8ab02e-80b0-44d6-a4a8-c813aac38209Чrunning§runtimeÎ `½¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$0c8ab02e-80b0-44d6-a4a8-c813aac38209¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚÖ10¤mime©text/html¬rootassigneeªfib_picker²last_run_timestampËAÚ°á`àé6°persist_js_state·has_pluto_hook_featuresÂÙ$3df688c8-1c52-462d-88be-daa153333c60Чrunning§runtimeÎxO¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$3df688c8-1c52-462d-88be-daa153333c60¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙå
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áb™'ž°persist_js_state·has_pluto_hook_featuresÂÙ$2c34c17e-12de-43ea-870c-818c97647836Чrunning§runtimeÍ o¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$2c34c17e-12de-43ea-870c-818c97647836¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙz

Inversion modulaire par Euclide étendu

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^¤Ú­°persist_js_state·has_pluto_hook_featuresÂÙ$f6e22fc3-382e-4548-bc59-8f944e06d237Чrunning§runtimeν ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$f6e22fc3-382e-4548-bc59-8f944e06d237¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ32×2 Matrix{Float64}: 1.0 1.0 1.0 -1.11022e-16¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`VÁ°persist_js_state·has_pluto_hook_featuresÂÙ$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82Чrunning§runtime͸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ;
a$\alpha$b$\beta$n
1111335
¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`©YÚ°persist_js_state·has_pluto_hook_featuresÂÙ$ce07d5c5-90a3-4c12-bada-30e4da1b99fdЧrunning§runtimeÍ<5¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$ce07d5c5-90a3-4c12-bada-30e4da1b99fd¹depends_on_disabled_cells¦queued¤logs�¦output†¤body…¦prefix¥Int64¨elementsÜ’’¡1ªtext/plain’’¡2ªtext/plain’’¡4ªtext/plain’’¡8ªtext/plain’’¢16ªtext/plain’’¢15ªtext/plain’’¢13ªtext/plain’’¡9ªtext/plain’ ’¡1ªtext/plain’ ’¡2ªtext/plain’ ’¡4ªtext/plain’ ’¡8ªtext/plain’ ’¢16ªtext/plain’’¢15ªtext/plain’’¢13ªtext/plain’’¡9ªtext/plain¤type¥Array¬prefix_short ¨objectid°b2193a9b14979af5¤mimeÙ!application/vnd.pluto.tree+object¬rootassigneeÀ²last_run_timestampËAÚ°áa)°persist_js_state·has_pluto_hook_featuresÂÙ$b5f3620d-0942-41bb-80b0-d2ddcfe65090Чrunning§runtimeÎe3g¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$b5f3620d-0942-41bb-80b0-d2ddcfe65090¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙÐEigen{Float64, Float64, Matrix{Float64}, Vector{Float64}} values: 2-element Vector{Float64}: -0.6180339887498948 1.618033988749895 vectors: 2×2 Matrix{Float64}: 0.525731 -0.850651 -0.850651 -0.525731¤mimeªtext/plain¬rootassignee¡E²last_run_timestampËAÚ°á_Ò¡ì°persist_js_state·has_pluto_hook_featuresÂÙ$4a98507b-653e-4354-a825-7605f8fcb31bЧrunning§runtimeÎ áó¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4a98507b-653e-4354-a825-7605f8fcb31b¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙK4×4 Matrix{Int64}: 1 16 1 16 2 15 2 15 4 13 4 13 8 9 8 9¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°áa*—°persist_js_state·has_pluto_hook_featuresÂÙ$736307ec-a2a4-11ef-0f85-ad1a0093e06aЧrunning§runtimeÎ9¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$736307ec-a2a4-11ef-0f85-ad1a0093e06a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙZ

La théorie des nombres

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ$kì°persist_js_state·has_pluto_hook_featuresÂÙ$a7afc0cb-a980-4f4f-b782-9791d932ee52Чrunning§runtimeÎu͸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a7afc0cb-a980-4f4f-b782-9791d932ee52¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙF

Voir [HPS14; Section 2.8].

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áb™ND°persist_js_state·has_pluto_hook_featuresÂÙ$d830fffd-3781-40ca-85cb-c242f99667ceЧrunning§runtimeÎh)¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d830fffd-3781-40ca-85cb-c242f99667ce¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ)fib_diag (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`©P°persist_js_state·has_pluto_hook_featuresÂÙ$19ef447f-9fdf-49e1-8d1a-7860b4d4e9baЧrunning§runtimeÎH¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$19ef447f-9fdf-49e1-8d1a-7860b4d4e9ba¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙR2×2 Diagonal{BigFloat, Vector{BigFloat}}: -0.618034 â‹… â‹… 1.61803¤mimeªtext/plain¬rootassignee¡D²last_run_timestampËAÚ°á_°persist_js_state·has_pluto_hook_featuresÂÙ$21df1900-3954-4506-b759-aeeee664d1dfЧrunning§runtimeÎìÚ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$21df1900-3954-4506-b759-aeeee664d1df¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ'modinv (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á^«¦3°persist_js_state·has_pluto_hook_featuresÂÙ$06679a09-47d7-4024-8232-4954c08747a0Чrunning§runtimeÎ!õXN¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$06679a09-47d7-4024-8232-4954c08747a0¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á]œì°persist_js_state·has_pluto_hook_featuresÂÙ$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2Чrunning§runtimeÍ <¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙT

Closed form solution

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á`$só°persist_js_state·has_pluto_hook_featuresÂÙ$8a5a251f-5373-445a-97b1-4d652c6b7ba8Чrunning§runtimeÎø©¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$8a5a251f-5373-445a-97b1-4d652c6b7ba8¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ%refs (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°áb¥µÝ°persist_js_state·has_pluto_hook_featuresÂÙ$9efb7a71-9a03-4716-8d34-aae233e9b898Чrunning§runtimeÍ'¡¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$9efb7a71-9a03-4716-8d34-aae233e9b898¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¡8¤mimeªtext/plain¬rootassignee¡x²last_run_timestampËAÚ°áaS°persist_js_state·has_pluto_hook_featuresÂÙ$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82Чrunning§runtimeÎÂ߸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ*collision (generic function with 1 method)¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`Pä°persist_js_state·has_pluto_hook_featuresÂÙ$f4f49568-dcf2-4c76-ba66-065d2fda7a4aЧrunning§runtimeα»¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$f4f49568-dcf2-4c76-ba66-065d2fda7a4a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙç

$$a \equiv \alpha \pmod{n} \quad \text{et} \quad b \equiv \beta \pmod{n} \quad \Rightarrow \quad a + b \equiv \alpha + \beta \pmod{n}$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ2Ý{°persist_js_state·has_pluto_hook_featuresÂÙ$a1628317-7937-4316-85bf-2da860effce3Чrunning§runtimeÍ'—¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a1628317-7937-4316-85bf-2da860effce3¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¡3¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`¹°persist_js_state·has_pluto_hook_featuresÂÙ$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3Чrunning§runtimeÍ3¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3¹depends_on_disabled_cells¦queued¤logs�¦output†¤body¡3¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`€W°persist_js_state·has_pluto_hook_featuresÂÙ$a41722b8-8c21-4d3c-a38b-4d248a79e80aЧrunning§runtimeÎ;ç¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$a41722b8-8c21-4d3c-a38b-4d248a79e80a¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ<

Pas une solution unique:

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3mì°persist_js_state·has_pluto_hook_featuresÂÙ$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21eЧrunning§runtimeÎ,r¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21e¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ1

Last 3 digit:

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4¯°persist_js_state·has_pluto_hook_featuresÂÙ$bc58ba24-90f0-4913-8f66-10bb6cb54076Чrunning§runtimeγœ¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$bc58ba24-90f0-4913-8f66-10bb6cb54076¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚœ

Définition $g$ est une racine primitive modulo $p$ si $g^k$ prend toutes les valeurs $1, 2, ..., p - 1$.

$$\text{Si } \quad p \nmid b,\quad \text{ alors } \quad b^{p - 1} \equiv 1 \pmod{p}$$

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ4j°persist_js_state·has_pluto_hook_featuresÂÙ$bafc9870-3823-4d1d-b0b7-94c69ee764d5Чrunning§runtimeÎ ‰`Ó¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$bafc9870-3823-4d1d-b0b7-94c69ee764d5¹depends_on_disabled_cells¦queued¤logs�¦output†¤body ¤mimeªtext/plain¬rootassigneeÀ²last_run_timestampËAÚ°á`f;аpersist_js_state·has_pluto_hook_featuresÂÙ$d6b89fda-308f-43da-8028-1a812b4516cfЧrunning§runtimeÎ<θdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$d6b89fda-308f-43da-8028-1a812b4516cf¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ†
Observation clé Que dit le théorème de Bézout par rapport à $\text{gcd}(d, r)$ et $a$.

Le nombre $a$ est divisible par $\text{gcd}(d, r)$. Le nombre $\text{gcd}(d, r)$ divise donc les 3 nombres, $a$, $d$ et $r$ et donc $\text{gcd}(d, r) = \text{gcd}(a, d, r)$. En combinant ça avec l'observation précédente, on a $\text{gcd}(a, d) = \text{gcd}(d, r)$. On peut généraliser cela en le lemme suivant:

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°á^:¸N°persist_js_state·has_pluto_hook_featuresÂÙ$4e35d650-b9a6-4668-90f0-f27a50af29adЧrunning§runtimeÎȸdepends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$4e35d650-b9a6-4668-90f0-f27a50af29ad¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÚ;
a$\alpha$b$\beta$n
1111335
¤mime©text/html¬rootassigneeªabn_picker²last_run_timestampËAÚ°á`¦²î°persist_js_state·has_pluto_hook_featuresÂÙ$bbb2793a-faa4-43bd-b2e8-e8d3ac93310fЧrunning§runtimeÎ@>¸depends_on_skipped_cellsµpublished_object_keys�§errored§cell_idÙ$bbb2793a-faa4-43bd-b2e8-e8d3ac93310f¹depends_on_disabled_cells¦queued¤logs�¦output†¤bodyÙ…

S'il y avait 364 jours par ans, les fêtes seraient toujours le même jour de la semaine!

¤mime©text/html¬rootassigneeÀ²last_run_timestampËAÚ°áZ3áʰpersist_js_state·has_pluto_hook_features±published_objects€¥bonds€´cell_execution_orderܨÙ$06679a09-47d7-4024-8232-4954c08747a0Ù$1b1d5c9b-5fc7-480e-9649-e9c44a49c38dÙ$736307ec-a2a4-11ef-0f85-ad1a0093e06aÙ$bbc907b1-63f8-435a-badc-11ed88bd6cf5Ù$cbabee34-2ca2-4ad4-93ba-2ec3c941da5eÙ$909b8a36-79bb-4c1a-9dd7-4acaffc0434eÙ$08b18315-c28e-44ed-beb2-5b17421b0224Ù$7bad8c6c-45c7-402f-ad59-6857e9268901Ù$cd481f6c-66f4-4ebf-9769-c3edc24f403bÙ$37585789-bd43-4ce5-b550-ad712b70d226Ù$6e59ee60-ef73-45ca-86eb-4d8a44c73771Ù$d6b89fda-308f-43da-8028-1a812b4516cfÙ$d1b260fb-7500-47fb-bb48-21b5857ab55aÙ$9207b107-e1b0-4328-a004-f4b8152b423fÙ$48eba223-6cce-4aa2-9977-4883ba7903fcÙ$bd0c0258-7040-42e7-a20e-532b55af3a62Ù$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0Ù$1a4da418-147f-46f4-9b95-7955183aa5cfÙ$f39cccac-5b24-46e4-8749-1b0a944542efÙ$fe2af566-4a8b-4052-9915-85266ee5ce98Ù$03e49669-cdee-4241-862d-33ee91214455Ù$0ee6972c-5069-4ba0-887f-be64c7d000d0Ù$f4f49568-dcf2-4c76-ba66-065d2fda7a4aÙ$09f44611-ba21-4982-ba1b-0691124642fcÙ$642d545f-b1b9-49da-8a03-ad63e3214f59Ù$7db2060b-d69e-42e7-ae81-fd37ee793876Ù$c3411941-d77f-46cb-8378-23998a1a4828Ù$a826d9d1-47db-4645-be6e-3ae0ed8d4e18Ù$83852dd5-3546-45af-a845-b01dab0aa2a6Ù$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6Ù$9752afbb-96e6-4f96-92cb-09654cf46155Ù$a7985d16-500b-4024-aaa1-78e654b94be4Ù$2cb5c6e0-b431-4d2e-b023-cd2131112ecaÙ$b319619e-8f8d-4650-8fb4-76e5ba953470Ù$3f1af973-a02b-4e06-8e6e-eff414fcaf67Ù$aee611f2-bc86-4e85-bbcb-add78c6a9175Ù$40b8e474-16e0-4a61-bb28-11d90beefeeaÙ$a41722b8-8c21-4d3c-a38b-4d248a79e80aÙ$eeaec4f4-71bd-43df-b9c9-a00bc3b1864bÙ$2c34c17e-12de-43ea-870c-818c97647836Ù$ca8905ef-97a3-424c-bb2e-559f7151585bÙ$21df1900-3954-4506-b759-aeeee664d1dfÙ$819f15ef-31d0-44b6-837a-e3e67f2667b9Ù$78df9410-5ea4-4d9f-bbe5-862f76a100fcÙ$93aa2719-f962-497b-9fda-30f54fd848ebÙ$7da0705e-c925-4f8d-9ca4-8d8a0f859feaÙ$a59a20e2-a7c7-48a9-ad8d-8094e03a749dÙ$e52d25b3-65bf-4617-ae8d-fae0d0c8d041Ù$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1Ù$bbb2793a-faa4-43bd-b2e8-e8d3ac93310fÙ$f9f03579-5bfc-452d-bff9-9e7adfe095d3Ù$d8a28762-8aab-49e9-b9ac-38901d34abffÙ$e505716d-af01-455f-a55a-a9c225822ad5Ù$a7d06375-e4dd-47b1-8aba-11dc4d62954bÙ$6332b2f2-ed2f-448a-b1df-247b110e335bÙ$6107d03d-1e45-4eb9-b8e2-51e4a72485e6Ù$58da5ba4-c858-4684-a9f4-5a39fdc4fb03Ù$a4698418-ebf7-4992-a3ba-a15ff282bf87Ù$59817f59-429b-4f17-a46a-185571fd1e5aÙ$8670abc2-63e6-496a-b20c-812197acd9adÙ$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21eÙ$9722971a-16f1-4f28-ba31-c12b673b8a30Ù$6ed7c73d-60da-4908-85cb-958745d81ebcÙ$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4Ù$c2fab245-8a98-4b41-ade2-c5b16e9c39f9Ù$821de132-559b-4420-b866-e97134c5bd9aÙ$67093a35-8e1b-4cd3-b11b-c7ff601f802eÙ$16b677e4-c467-462a-b770-b7a31160e129Ù$61462af5-69bd-42be-8918-7992c79ee00dÙ$592ae01b-2819-402d-9538-17018df5c34bÙ$594829e2-585b-4d48-bb6e-b35d9543cfbeÙ$72ec8410-05d9-475a-93d4-47153cc0ce31Ù$027fe67c-d2f0-49f6-b894-959795551d27Ù$462fa407-d973-4e9e-8512-b7cd3bb98b7bÙ$3cd40d9e-fcea-427d-9877-cea65e7ea413Ù$38744170-9af6-44b5-a0be-46a83da3253eÙ$a1081bb2-2186-4b19-b667-0c246155f360Ù$4714b7d7-32ee-42a1-bfa5-93eafda739d3Ù$b5f3620d-0942-41bb-80b0-d2ddcfe65090Ù$19ef447f-9fdf-49e1-8d1a-7860b4d4e9baÙ$6cf004be-5205-429e-8131-ef607cebeaecÙ$f6e22fc3-382e-4548-bc59-8f944e06d237Ù$d830fffd-3781-40ca-85cb-c242f99667ceÙ$ac5e1516-1574-4893-a965-f799947076cbÙ$4cb070de-e8bf-4a1d-9625-043c19466c46Ù$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2Ù$1ca71c26-f98c-4126-a1c5-98786fde7e9bÙ$535f4bc1-e88c-47c7-990b-e3c8b5054accÙ$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66bÙ$d882afdd-eb85-467c-bf18-525c0c5da5e7Ù$192f608c-0563-4179-903f-49fad2db4c74Ù$8f6ba1c4-a971-4dc4-ac5d-2f30790aecdeÙ$bc58ba24-90f0-4913-8f66-10bb6cb54076Ù$82ba8fe1-435e-422b-abb7-cb50a7a85e1eÙ$8b16a522-9be4-4286-b64d-3d1bbdef7142Ù$ec14d629-b720-47cd-bc08-ff96f49271abÙ$64eb4b52-4946-467c-867a-a6fc437b15f6Ù$a7d9703a-5121-4b43-8cd4-2acf9a0d91efÙ$15367f3b-c7e4-4004-a018-5422a7f22024Ù$e1b5733f-a7a8-458f-a345-b358b9a03fcfÙ$f86a5efc-d31e-4e88-b81f-ebdbbeba11ecÙ$ee43c389-55f4-4cf9-a8db-ce37d1b89db4Ù$4853f4ef-fbb8-48c3-9523-13ab4969d097Ù$3026f9c5-81d3-443a-940a-f22fef9754afÙ$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82Ù$7330af43-bec3-460c-94f6-768ac2975b00Ù$1e27eedc-5308-4608-863f-fb81d60acdf0Ù$a293bb0e-078d-4335-a446-3096a79c03bcÙ$c5e906c8-0f73-4955-baa7-337195329e04Ù$c376513c-6553-4cd6-8384-ae6ff9d472d7Ù$eb311761-ace2-4632-9ebf-9c7c166659f7Ù$227e415e-ab17-4f3a-b695-9573c9ee2b57Ù$3da58487-192f-458a-9d47-7a4ce98b6da3Ù$7f9bd301-355b-43f5-b168-22fac9e52511Ù$bafc9870-3823-4d1d-b0b7-94c69ee764d5Ù$b57adc77-3783-4958-91a0-e90782338755Ù$18031ccb-657f-409a-9080-9a0ada3ae8b5Ù$256c8009-4d2b-42f8-adaa-6f238ef22c6dÙ$31388128-33a3-4443-835e-74b91bf48268Ù$87fdefa1-3bbd-4b69-ad3a-72baca6e55eeÙ$a1628317-7937-4316-85bf-2da860effce3Ù$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3Ù$4e35d650-b9a6-4668-90f0-f27a50af29adÙ$d81bbd74-42df-4bb2-a045-9c2642cc19e5Ù$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82Ù$2381babe-0777-45db-acff-cc647a8a68d3Ù$c8f85081-3659-4796-8550-2e708b09c8d7Ù$087cbe82-b42a-4f80-a1af-97f3aa93aeebÙ$9e8a61d9-a700-4851-b1cd-49ce042c3530Ù$3c198d79-c46a-4781-8bd1-b6b68f06c31fÙ$77093b36-c232-4477-be49-845f1a631829Ù$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfÙ$6f10de7b-ce05-4f82-82e7-4110be44e8ccÙ$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986Ù$9cef898e-192c-418a-bec6-511f8b6da179Ù$4c2d45e3-56a2-467f-b87f-7b98cb873a05Ù$191f8429-cbbb-44aa-8beb-271a94293e4bÙ$e9633e3f-376d-413d-bc19-d015f6ce76e5Ù$8315b53f-abca-483d-bbf6-7e9193e751c9Ù$0c8ab02e-80b0-44d6-a4a8-c813aac38209Ù$708c442b-cbff-4e1a-b70d-e704453cfd3dÙ$57816e2c-a675-43e7-b674-2877ffcf1415Ù$0e3fb524-bea1-4ef0-9589-36230a84e949Ù$4cff1d10-422f-4b12-b790-a589c972fbb7Ù$59ac02af-7b54-44d4-b5f4-a0f60d4458a1Ù$9f55cad1-b01a-45e3-93df-a4349e2dfbd3Ù$e2a3842d-4e07-4703-ab47-a5140649dd6aÙ$08dcbbd3-a531-4f74-a724-1cae8fae1636Ù$059b0ada-2442-48e4-82dd-489cb97e5dccÙ$4be6cea4-13a2-4bcb-b849-14eef57ab604Ù$9efb7a71-9a03-4716-8d34-aae233e9b898Ù$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253Ù$ce07d5c5-90a3-4c12-bada-30e4da1b99fdÙ$ae89661a-2c0f-4752-adc2-023f09dc0e9fÙ$4a98507b-653e-4354-a825-7605f8fcb31bÙ$59254bfd-48f2-4585-9ba5-e4c809421072Ù$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fdÙ$ba16d83d-21a5-4f0c-807b-674a167da4dcÙ$6c3595d2-4f68-44da-90e7-dc9c68479bcfÙ$3df688c8-1c52-462d-88be-daa153333c60Ù$a7afc0cb-a980-4f4f-b782-9791d932ee52Ù$ed023033-1044-4d48-aab1-39e9300043f7Ù$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2Ù$bc9a718f-4b97-4e15-acf8-d180abc5b6d5Ù$1072a756-5026-4de9-93a8-f942d54c474aÙ$35b7b8b7-bff6-4f64-91b9-b65035162365Ù$8a5a251f-5373-445a-97b1-4d652c6b7ba8Ù$41cf9efd-65e5-4abb-94d3-e824780e659c®process_status¥ready­julia_version§v1.13.1ªcell_orderܨÙ$736307ec-a2a4-11ef-0f85-ad1a0093e06aÙ$3df688c8-1c52-462d-88be-daa153333c60Ù$41cf9efd-65e5-4abb-94d3-e824780e659cÙ$bbc907b1-63f8-435a-badc-11ed88bd6cf5Ù$cbabee34-2ca2-4ad4-93ba-2ec3c941da5eÙ$909b8a36-79bb-4c1a-9dd7-4acaffc0434eÙ$08b18315-c28e-44ed-beb2-5b17421b0224Ù$7bad8c6c-45c7-402f-ad59-6857e9268901Ù$cd481f6c-66f4-4ebf-9769-c3edc24f403bÙ$37585789-bd43-4ce5-b550-ad712b70d226Ù$6e59ee60-ef73-45ca-86eb-4d8a44c73771Ù$d6b89fda-308f-43da-8028-1a812b4516cfÙ$d1b260fb-7500-47fb-bb48-21b5857ab55aÙ$9207b107-e1b0-4328-a004-f4b8152b423fÙ$48eba223-6cce-4aa2-9977-4883ba7903fcÙ$bd0c0258-7040-42e7-a20e-532b55af3a62Ù$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0Ù$1a4da418-147f-46f4-9b95-7955183aa5cfÙ$f39cccac-5b24-46e4-8749-1b0a944542efÙ$fe2af566-4a8b-4052-9915-85266ee5ce98Ù$03e49669-cdee-4241-862d-33ee91214455Ù$0ee6972c-5069-4ba0-887f-be64c7d000d0Ù$f4f49568-dcf2-4c76-ba66-065d2fda7a4aÙ$d81bbd74-42df-4bb2-a045-9c2642cc19e5Ù$31388128-33a3-4443-835e-74b91bf48268Ù$87fdefa1-3bbd-4b69-ad3a-72baca6e55eeÙ$09f44611-ba21-4982-ba1b-0691124642fcÙ$642d545f-b1b9-49da-8a03-ad63e3214f59Ù$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82Ù$a1628317-7937-4316-85bf-2da860effce3Ù$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3Ù$7db2060b-d69e-42e7-ae81-fd37ee793876Ù$c3411941-d77f-46cb-8378-23998a1a4828Ù$a826d9d1-47db-4645-be6e-3ae0ed8d4e18Ù$83852dd5-3546-45af-a845-b01dab0aa2a6Ù$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6Ù$9752afbb-96e6-4f96-92cb-09654cf46155Ù$a7985d16-500b-4024-aaa1-78e654b94be4Ù$2cb5c6e0-b431-4d2e-b023-cd2131112ecaÙ$b319619e-8f8d-4650-8fb4-76e5ba953470Ù$3f1af973-a02b-4e06-8e6e-eff414fcaf67Ù$aee611f2-bc86-4e85-bbcb-add78c6a9175Ù$40b8e474-16e0-4a61-bb28-11d90beefeeaÙ$a41722b8-8c21-4d3c-a38b-4d248a79e80aÙ$eeaec4f4-71bd-43df-b9c9-a00bc3b1864bÙ$2c34c17e-12de-43ea-870c-818c97647836Ù$ca8905ef-97a3-424c-bb2e-559f7151585bÙ$21df1900-3954-4506-b759-aeeee664d1dfÙ$819f15ef-31d0-44b6-837a-e3e67f2667b9Ù$78df9410-5ea4-4d9f-bbe5-862f76a100fcÙ$93aa2719-f962-497b-9fda-30f54fd848ebÙ$7da0705e-c925-4f8d-9ca4-8d8a0f859feaÙ$a59a20e2-a7c7-48a9-ad8d-8094e03a749dÙ$e52d25b3-65bf-4617-ae8d-fae0d0c8d041Ù$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1Ù$bbb2793a-faa4-43bd-b2e8-e8d3ac93310fÙ$f9f03579-5bfc-452d-bff9-9e7adfe095d3Ù$d8a28762-8aab-49e9-b9ac-38901d34abffÙ$e505716d-af01-455f-a55a-a9c225822ad5Ù$c8f85081-3659-4796-8550-2e708b09c8d7Ù$a7d06375-e4dd-47b1-8aba-11dc4d62954bÙ$6332b2f2-ed2f-448a-b1df-247b110e335bÙ$6107d03d-1e45-4eb9-b8e2-51e4a72485e6Ù$58da5ba4-c858-4684-a9f4-5a39fdc4fb03Ù$087cbe82-b42a-4f80-a1af-97f3aa93aeebÙ$9e8a61d9-a700-4851-b1cd-49ce042c3530Ù$3c198d79-c46a-4781-8bd1-b6b68f06c31fÙ$a4698418-ebf7-4992-a3ba-a15ff282bf87Ù$59817f59-429b-4f17-a46a-185571fd1e5aÙ$8670abc2-63e6-496a-b20c-812197acd9adÙ$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21eÙ$77093b36-c232-4477-be49-845f1a631829Ù$9722971a-16f1-4f28-ba31-c12b673b8a30Ù$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfÙ$6ed7c73d-60da-4908-85cb-958745d81ebcÙ$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4Ù$9cef898e-192c-418a-bec6-511f8b6da179Ù$6f10de7b-ce05-4f82-82e7-4110be44e8ccÙ$c2fab245-8a98-4b41-ade2-c5b16e9c39f9Ù$a7afc0cb-a980-4f4f-b782-9791d932ee52Ù$821de132-559b-4420-b866-e97134c5bd9aÙ$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986Ù$67093a35-8e1b-4cd3-b11b-c7ff601f802eÙ$16b677e4-c467-462a-b770-b7a31160e129Ù$4c2d45e3-56a2-467f-b87f-7b98cb873a05Ù$191f8429-cbbb-44aa-8beb-271a94293e4bÙ$e9633e3f-376d-413d-bc19-d015f6ce76e5Ù$61462af5-69bd-42be-8918-7992c79ee00dÙ$592ae01b-2819-402d-9538-17018df5c34bÙ$708c442b-cbff-4e1a-b70d-e704453cfd3dÙ$594829e2-585b-4d48-bb6e-b35d9543cfbeÙ$72ec8410-05d9-475a-93d4-47153cc0ce31Ù$027fe67c-d2f0-49f6-b894-959795551d27Ù$462fa407-d973-4e9e-8512-b7cd3bb98b7bÙ$3cd40d9e-fcea-427d-9877-cea65e7ea413Ù$38744170-9af6-44b5-a0be-46a83da3253eÙ$a1081bb2-2186-4b19-b667-0c246155f360Ù$4714b7d7-32ee-42a1-bfa5-93eafda739d3Ù$b5f3620d-0942-41bb-80b0-d2ddcfe65090Ù$19ef447f-9fdf-49e1-8d1a-7860b4d4e9baÙ$6cf004be-5205-429e-8131-ef607cebeaecÙ$f6e22fc3-382e-4548-bc59-8f944e06d237Ù$d830fffd-3781-40ca-85cb-c242f99667ceÙ$ac5e1516-1574-4893-a965-f799947076cbÙ$4cb070de-e8bf-4a1d-9625-043c19466c46Ù$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2Ù$1ca71c26-f98c-4126-a1c5-98786fde7e9bÙ$535f4bc1-e88c-47c7-990b-e3c8b5054accÙ$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66bÙ$d882afdd-eb85-467c-bf18-525c0c5da5e7Ù$192f608c-0563-4179-903f-49fad2db4c74Ù$8f6ba1c4-a971-4dc4-ac5d-2f30790aecdeÙ$ed023033-1044-4d48-aab1-39e9300043f7Ù$bc58ba24-90f0-4913-8f66-10bb6cb54076Ù$4cff1d10-422f-4b12-b790-a589c972fbb7Ù$59ac02af-7b54-44d4-b5f4-a0f60d4458a1Ù$9f55cad1-b01a-45e3-93df-a4349e2dfbd3Ù$e2a3842d-4e07-4703-ab47-a5140649dd6aÙ$08dcbbd3-a531-4f74-a724-1cae8fae1636Ù$82ba8fe1-435e-422b-abb7-cb50a7a85e1eÙ$8b16a522-9be4-4286-b64d-3d1bbdef7142Ù$ec14d629-b720-47cd-bc08-ff96f49271abÙ$059b0ada-2442-48e4-82dd-489cb97e5dccÙ$4be6cea4-13a2-4bcb-b849-14eef57ab604Ù$9efb7a71-9a03-4716-8d34-aae233e9b898Ù$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253Ù$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2Ù$bc9a718f-4b97-4e15-acf8-d180abc5b6d5Ù$64eb4b52-4946-467c-867a-a6fc437b15f6Ù$a7d9703a-5121-4b43-8cd4-2acf9a0d91efÙ$ce07d5c5-90a3-4c12-bada-30e4da1b99fdÙ$15367f3b-c7e4-4004-a018-5422a7f22024Ù$ae89661a-2c0f-4752-adc2-023f09dc0e9fÙ$e1b5733f-a7a8-458f-a345-b358b9a03fcfÙ$4a98507b-653e-4354-a825-7605f8fcb31bÙ$f86a5efc-d31e-4e88-b81f-ebdbbeba11ecÙ$ee43c389-55f4-4cf9-a8db-ce37d1b89db4Ù$1072a756-5026-4de9-93a8-f942d54c474aÙ$3026f9c5-81d3-443a-940a-f22fef9754afÙ$4853f4ef-fbb8-48c3-9523-13ab4969d097Ù$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82Ù$7330af43-bec3-460c-94f6-768ac2975b00Ù$59254bfd-48f2-4585-9ba5-e4c809421072Ù$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fdÙ$1e27eedc-5308-4608-863f-fb81d60acdf0Ù$a293bb0e-078d-4335-a446-3096a79c03bcÙ$c5e906c8-0f73-4955-baa7-337195329e04Ù$c376513c-6553-4cd6-8384-ae6ff9d472d7Ù$eb311761-ace2-4632-9ebf-9c7c166659f7Ù$227e415e-ab17-4f3a-b695-9573c9ee2b57Ù$35b7b8b7-bff6-4f64-91b9-b65035162365Ù$3da58487-192f-458a-9d47-7a4ce98b6da3Ù$7f9bd301-355b-43f5-b168-22fac9e52511Ù$06679a09-47d7-4024-8232-4954c08747a0Ù$bafc9870-3823-4d1d-b0b7-94c69ee764d5Ù$b57adc77-3783-4958-91a0-e90782338755Ù$18031ccb-657f-409a-9080-9a0ada3ae8b5Ù$256c8009-4d2b-42f8-adaa-6f238ef22c6dÙ$4e35d650-b9a6-4668-90f0-f27a50af29adÙ$0e3fb524-bea1-4ef0-9589-36230a84e949Ù$2381babe-0777-45db-acff-cc647a8a68d3Ù$8315b53f-abca-483d-bbf6-7e9193e751c9Ù$0c8ab02e-80b0-44d6-a4a8-c813aac38209Ù$57816e2c-a675-43e7-b674-2877ffcf1415Ù$1b1d5c9b-5fc7-480e-9649-e9c44a49c38dÙ$ba16d83d-21a5-4f0c-807b-674a167da4dcÙ$6c3595d2-4f68-44da-90e7-dc9c68479bcfÙ$8a5a251f-5373-445a-97b1-4d652c6b7ba8«cell_inputsÞ¨Ù$8f6ba1c4-a971-4dc4-ac5d-2f30790aecde„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$8f6ba1c4-a971-4dc4-ac5d-2f30790aecde«code_foldedäcodeÙ'frametitle("Fermat’s Little Theorem")Ù$708c442b-cbff-4e1a-b70d-e704453cfd3d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$708c442b-cbff-4e1a-b70d-e704453cfd3d«code_foldedäcodeÚ6HAlign( md""" Équation de récurrence: ```math x_{k+1} = x_k + x_{k-1} ``` Reformulation sans ``(k-1)`` ```math \begin{align} x_{k+1} & = x_k + y_{k}\\ y_{k+1} & = x_k \end{align} ``` Forme matricielle: ```math \begin{bmatrix} x_{k+1}\\ y_{k+1} \end{bmatrix} = \begin{bmatrix} 1 & 1\\ 1 & 0 \end{bmatrix} \begin{bmatrix} x_{k}\\ y_{k} \end{bmatrix} ``` Matrix power: ```math \begin{bmatrix} x_n\\ y_n \end{bmatrix} = \begin{bmatrix} 1 & 1\\ 1 & 0 \end{bmatrix}^n \begin{bmatrix} x_0\\ y_0 \end{bmatrix} ``` """, md""" `n` = $(fib_picker)\ $(draw_fib(fib_n)) """, )Ù$c3411941-d77f-46cb-8378-23998a1a4828„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$c3411941-d77f-46cb-8378-23998a1a4828«code_foldedäcodeÙ!frametitle("Division par 3 et 9")Ù$ae89661a-2c0f-4752-adc2-023f09dc0e9f„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ae89661a-2c0f-4752-adc2-023f09dc0e9f«code_folded¤codeÙ+reshape(fast_mod_power.(g, 0:15, 17), 4, 4)Ù$9f55cad1-b01a-45e3-93df-a4349e2dfbd3„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9f55cad1-b01a-45e3-93df-a4349e2dfbd3«code_folded¤code°sort(all_powers)Ù$7bad8c6c-45c7-402f-ad59-6857e9268901„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$7bad8c6c-45c7-402f-ad59-6857e9268901«code_foldedäcodeÚVqa(md"Comment prouver que l'égalité ``ax + by = c`` implique que ``\text{gcd}(a, b)`` divise ``c`` ?", md""" Soit ``g = \text{gcd}(a, b)``. Par définition, il existe ``\alpha, \beta`` tels que ``a = \alpha g`` et ``b = \beta g``. On a alors ``c = ax + by = (\alpha x + \beta y) g`` ce qui implique que ``c`` est un multiple de ``g``. """,)Ù$6cf004be-5205-429e-8131-ef607cebeaec„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6cf004be-5205-429e-8131-ef607cebeaec«code_folded¤code©E.vectorsÙ$027fe67c-d2f0-49f6-b894-959795551d27„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$027fe67c-d2f0-49f6-b894-959795551d27«code_folded¤code±@time fib_rec(42)Ù$08dcbbd3-a531-4f74-a724-1cae8fae1636„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$08dcbbd3-a531-4f74-a724-1cae8fae1636«code_foldedäcodeÙ³if length(unique(sort(all_powers))) == p - 1 md"Le nombre $g **est** une racine primitive modulo $p" else md"Le nombre $g **n'est pas** une racine primitive modulo $p" endÙ$4cff1d10-422f-4b12-b790-a589c972fbb7„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4cff1d10-422f-4b12-b790-a589c972fbb7«code_foldedäcode©gp_pickerÙ$6c3595d2-4f68-44da-90e7-dc9c68479bcf„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6c3595d2-4f68-44da-90e7-dc9c68479bcf«code_folded¤codeÙ(cite(args...) = bibcite(biblio, args...)Ù$a4698418-ebf7-4992-a3ba-a15ff282bf87„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a4698418-ebf7-4992-a3ba-a15ff282bf87«code_foldedäcodeÚUqa(md"Quelle est la complexité temporelle ?", md"Si ``n`` est impair, au coup suivant, il est pair donc il n'est impair qu'au pire une fois sur deux. En ``l`` multiplication, on divise ``m`` au moins par ``2^{l/2}`` donc on a une complexité logarithmique ``\Theta(\log(m))`` en supposant que `prod_func` a une complexité ``\Theta(1)``.")Ù$8670abc2-63e6-496a-b20c-812197acd9ad„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$8670abc2-63e6-496a-b20c-812197acd9ad«code_foldedäcodeÙKfast_mod_power(a, power, n) = fast_power((a, b) -> mod(a * b, n), a, power)Ù$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2«code_foldedäcodeÙÏqa(md"Quelle est la complexité spatiale et temporelle de `discrete_log` ?", md""" ``\mathcal{O}(p)`` temporelle et ``\Omega(1)`` spatiale. Voir $(cite("hoffstein2014Introduction", "Proposition 2.19")). """)Ù$7330af43-bec3-460c-94f6-768ac2975b00„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$7330af43-bec3-460c-94f6-768ac2975b00«code_folded¤codeÙ¢function shanks_discrete_log(a, g, p) n = isqrt(p) + 1 i, j = collision(baby_steps(g, n, p), mod.(a .* giant_steps(g, n, p), p)) return i - 1 + (j - 1) * n endÙ$4c2d45e3-56a2-467f-b87f-7b98cb873a05„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4c2d45e3-56a2-467f-b87f-7b98cb873a05«code_folded¤codeÙ%fast_mod_power.(2, power, prime_list)Ù$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fd„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fd«code_folded¤code¾fast_mod_power(g, shanks_x, p)Ù$ec14d629-b720-47cd-bc08-ff96f49271ab„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ec14d629-b720-47cd-bc08-ff96f49271ab«code_folded¤codeÙ‰function discrete_log(a, g, p) a = mod(a, p) gx = one(a) for x = 0:(p-2) if a == gx return x end gx = mod(gx * g, p) end endÙ$594829e2-585b-4d48-bb6e-b35d9543cfbe„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$594829e2-585b-4d48-bb6e-b35d9543cfbe«code_foldedäcodeÙ(frametitle("Fast powering for matrices")Ù$bbc907b1-63f8-435a-badc-11ed88bd6cf5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$bbc907b1-63f8-435a-badc-11ed88bd6cf5«code_foldedäcode¶frametitle("Exemples")Ù$227e415e-ab17-4f3a-b695-9573c9ee2b57„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$227e415e-ab17-4f3a-b695-9573c9ee2b57«code_foldedäcodeÚ`qa(md"What is the relation between ``A'`` and ``B'`` ?", md""" ```math A' \equiv (g^b)^a \equiv g^{ab} \equiv (g^{a})^b \equiv B' \pmod{p} ``` Alice et Bob ont donc maintenant la même clef! Il est cependant difficile de trouver ``A'`` depuis ``A`` et ``B`` sans connaitre les secrets ``a`` ou ``b`` si le Discrete Logarithm Problem est difficile. """)Ù$821de132-559b-4420-b866-e97134c5bd9a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$821de132-559b-4420-b866-e97134c5bd9a«code_foldedäcodeÚ`function chinese_remainder_theorem(r, n) for i in eachindex(n) for j in eachindex(n) if i != j && gcd(n[i], n[j]) != 1 error("`$(n[i])` and `$(n[j])` are not coprime") end end end prod_n = prod(n) return mod(sum(eachindex(n)) do i m = div(prod_n, n[i]) return mod(r[i] * mod(m * modinv(m, n[i]), prod_n), prod_n) end, prod_n) endÙ$3026f9c5-81d3-443a-940a-f22fef9754af„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$3026f9c5-81d3-443a-940a-f22fef9754af«code_folded¤codeÙhfunction giant_steps(g, n, p) gn = fast_mod_power(g, n, p) return baby_steps.(modinv(gn, p), n, p) endÙ$3f1af973-a02b-4e06-8e6e-eff414fcaf67„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$3f1af973-a02b-4e06-8e6e-eff414fcaf67«code_folded¤codeÙ”function pgcdx(a, b) if b == 0 return a, one(a), zero(a) else q, r = divrem(a, b) g, x, y = pgcdx(b, r) return g, y, x - y * q end endÙ$59817f59-429b-4f17-a46a-185571fd1e5a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$59817f59-429b-4f17-a46a-185571fd1e5a«code_foldedäcodeÙ#frametitle("Fast modular powering")Ù$f9f03579-5bfc-452d-bff9-9e7adfe095d3„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$f9f03579-5bfc-452d-bff9-9e7adfe095d3«code_folded¤code«gcd(364, 7)Ù$e2a3842d-4e07-4703-ab47-a5140649dd6a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e2a3842d-4e07-4703-ab47-a5140649dd6a«code_folded¤code¸unique(sort(all_powers))Ù$59254bfd-48f2-4585-9ba5-e4c809421072„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$59254bfd-48f2-4585-9ba5-e4c809421072«code_folded¤codeÙ'shanks_x = shanks_discrete_log(3, g, p)Ù$83852dd5-3546-45af-a845-b01dab0aa2a6„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$83852dd5-3546-45af-a845-b01dab0aa2a6«code_foldedäcodeÙ+frametitle("Inverse et division modulaire")Ù$c2fab245-8a98-4b41-ade2-c5b16e9c39f9„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$c2fab245-8a98-4b41-ade2-c5b16e9c39f9«code_foldedäcodeÙ'frametitle("Chinese remainder theorem")Ù$eeaec4f4-71bd-43df-b9c9-a00bc3b1864b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$eeaec4f4-71bd-43df-b9c9-a00bc3b1864b«code_folded¤code²gcdx(gcd_a, gcd_b)Ù$535f4bc1-e88c-47c7-990b-e3c8b5054acc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$535f4bc1-e88c-47c7-990b-e3c8b5054acc«code_folded¤codeÙOfib_closed(n) = (((1 + √big(5)) / 2)^n - ((1 - √big(5)) / 2)^n) / √big(5)Ù$7db2060b-d69e-42e7-ae81-fd37ee793876„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$7db2060b-d69e-42e7-ae81-fd37ee793876«code_foldedäcodeÙímd""" Corollaire ```math n \mid a \quad \text{et} \quad n \mid b \quad \Rightarrow \quad n \mid (ab) ``` À ne pas confondre avec ```math a \mid n \quad \text{et} \quad b \mid n \quad \Rightarrow \quad (ab/\text{gcd}(a,b)) \mid n ``` """Ù$2381babe-0777-45db-acff-cc647a8a68d3„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$2381babe-0777-45db-acff-cc647a8a68d3«code_folded¤codeÙLpower_slider = @bind power Slider(1:10000, default = 256, show_value = true)Ù$cbabee34-2ca2-4ad4-93ba-2ec3c941da5e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$cbabee34-2ca2-4ad4-93ba-2ec3c941da5e«code_foldedäcodeÚdmd""" Si tous les mois avaient 30 jours, est-ce qu'il y a des jours de la semaine qui ne seront jamais le premier du mois ? Reformulation: pour tout nombre ``0 \le j < 7``, existe-t-il ``x`` et ``y`` tels que ``30x = j + 7y``. Notation modulo : ``30x \equiv j \pmod{7}``. Si tous les ans avaient 365 jours, est-ce qu'il y a des jours de la semaine qui ne seront jamais le 25 Décembre ? Est si tous les ans avaient 366 jours ? Et s'ils avaient 364 jours ? Reformulation: pour tout nombre ``0 \le j < 7``, existe-t-il ``x`` et ``y`` tels que ``365x = j + 7y``. Notation modulo : ``365x \equiv j \pmod{7}``. """Ù$819f15ef-31d0-44b6-837a-e3e67f2667b9„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$819f15ef-31d0-44b6-837a-e3e67f2667b9«code_foldedäcodeºmd"Revenons aux exemples:"Ù$087cbe82-b42a-4f80-a1af-97f3aa93aeeb„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$087cbe82-b42a-4f80-a1af-97f3aa93aeeb«code_foldedäcode»md"`power` = $power_slider"Ù$57816e2c-a675-43e7-b674-2877ffcf1415„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$57816e2c-a675-43e7-b674-2877ffcf1415«code_folded¤codeÙFp_picker = @bind p Slider(primes(20), default = 11, show_value = true)Ù$ba16d83d-21a5-4f0c-807b-674a167da4dc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ba16d83d-21a5-4f0c-807b-674a167da4dc«code_folded¤code·biblio = load_biblio!()Ù$9cef898e-192c-418a-bec6-511f8b6da179„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9cef898e-192c-418a-bec6-511f8b6da179«code_folded¤codeÙ fast_mod_power(2, power, 999000)Ù$ed023033-1044-4d48-aab1-39e9300043f7„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ed023033-1044-4d48-aab1-39e9300043f7«code_foldedäcodeÙâmd""" **Fermat's little theorem** $(cite("hoffstein2014Introduction", "Theorem 1.24")) ```math \text{Si} \quad p \text{ est premier}\quad \text{et} \quad p \nmid g,\quad \text{alors} \quad g^{p - 1} \equiv 1 \pmod{p}. ``` """Ù$40b8e474-16e0-4a61-bb28-11d90beefeea„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$40b8e474-16e0-4a61-bb28-11d90beefeea«code_folded¤code½gcd_x * gcd_a + gcd_y * gcd_bÙ$592ae01b-2819-402d-9538-17018df5c34b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$592ae01b-2819-402d-9538-17018df5c34b«code_foldedäcodeÙ frametitle("Fibonacci sequence")Ù$6e59ee60-ef73-45ca-86eb-4d8a44c73771„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6e59ee60-ef73-45ca-86eb-4d8a44c73771«code_foldedäcodeÚ5qa(md"**Observation clé** Que dit le théorème de Bézout par rapport à ``\text{gcd}(a, d)`` et ``r``.", md""" Le reste ``r`` est **divisible** par ``\text{gcd}(a, d)``. Le nombre ``\text{gcd}(a, d)`` divise donc les 3 nombres, ``a``, ``d`` et ``r`` et donc ``\text{gcd}(a, d) = \text{gcd}(a, d, r)``. """)Ù$e1b5733f-a7a8-458f-a345-b358b9a03fcf„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e1b5733f-a7a8-458f-a345-b358b9a03fcf«code_foldedäcodeÚ md""" On remarque que la matrice est de rang 1. Elle vaut ```math \begin{bmatrix} 1 & g^n & \cdots & g^{n^2-n}\\ g & g^{n+1} & \ddots & g^{n^2-n+1}\\ \vdots & \ddots & \ddots & \vdots\\ g^{n-1} & g^{2n-1} & \cdots & g^{n^2 - 1} \end{bmatrix} \equiv \begin{bmatrix} 1\\ g\\ g^2\\ \vdots\\ g^{n-1} \end{bmatrix} \begin{bmatrix} 1 & g^{n} & g^{2n} & \cdots & g^{n^2-n} \end{bmatrix} \pmod{p} ``` """Ù$b57adc77-3783-4958-91a0-e90782338755„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$b57adc77-3783-4958-91a0-e90782338755«code_folded¤codeÙ?slider_a = @bind a Slider(1:100, default=11, show_value = true)Ù$e505716d-af01-455f-a55a-a9c225822ad5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e505716d-af01-455f-a55a-a9c225822ad5«code_foldedäcodeÙ8md""" Comment calculer ``a^m`` pour un large ``m`` ? """Ù$0ee6972c-5069-4ba0-887f-be64c7d000d0„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$0ee6972c-5069-4ba0-887f-be64c7d000d0«code_foldedäcodeÙ-frametitle("Arithmétique modulaire : somme")Ù$2cb5c6e0-b431-4d2e-b023-cd2131112eca„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$2cb5c6e0-b431-4d2e-b023-cd2131112eca«code_foldedäcodeÙ*frametitle("Algorithme d'Euclide étendu")Ù$93aa2719-f962-497b-9fda-30f54fd848eb„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$93aa2719-f962-497b-9fda-30f54fd848eb«code_folded¤codeÙ(collect(mod.(modinv(30, 7) .* (0:6), 7))Ù$9722971a-16f1-4f28-ba31-c12b673b8a30„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9722971a-16f1-4f28-ba31-c12b673b8a30«code_foldedäcode³md"Et modulo 999 ?"Ù$909b8a36-79bb-4c1a-9dd7-4acaffc0434e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$909b8a36-79bb-4c1a-9dd7-4acaffc0434e«code_foldedäcodeÙ#frametitle("Théorème de Bézout")Ù$a7985d16-500b-4024-aaa1-78e654b94be4„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a7985d16-500b-4024-aaa1-78e654b94be4«code_foldedäcodeÚBqa(md"Comment trouver l'inverse modulaire ?", md""" Si on avait les coefficients ``x`` et ``y`` tels que ``xa + yn = 1``, l'inverse serait ``x``. Dans l'algorithme d'Euclide, on ne garde que le **reste** et on oublie le **quotient**. Il faudrait combiner les quotients des différentes opérations pour trouver ``x``. """)Ù$9752afbb-96e6-4f96-92cb-09654cf46155„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9752afbb-96e6-4f96-92cb-09654cf46155«code_foldedäcodeÙÇqa(md"Est-ce que l'inverse modulaire existe toujours ?", md""" Par le théorème de Bézout, il existe si et seulement si ``\text{gcd}(a, n) \mid 1``, c'est à dire que ``\text{gcd}(a, n) = 1``. """)Ù$6ed7c73d-60da-4908-85cb-958745d81ebc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6ed7c73d-60da-4908-85cb-958745d81ebc«code_foldedäcodeÙZmd"Par l'algo d'Euclide, ``\text{gcd}(n, n - 1) = 1`` donc ``\text{gcd}(1000, 999) = 1``."Ù$eb311761-ace2-4632-9ebf-9c7c166659f7„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$eb311761-ace2-4632-9ebf-9c7c166659f7«code_foldedäcodeÙJmd""" ```math A' \equiv B^a \pmod{p} \qquad B' \equiv A^b \pmod{p} ``` """Ù$9e8a61d9-a700-4851-b1cd-49ce042c3530„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9e8a61d9-a700-4851-b1cd-49ce042c3530«code_folded¤code²@time big(2)^powerÙ$256c8009-4d2b-42f8-adaa-6f238ef22c6d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$256c8009-4d2b-42f8-adaa-6f238ef22c6d«code_folded¤codeÙ>slider_n = @bind n Slider(1:100, default=5, show_value = true)Ù$c8f85081-3659-4796-8550-2e708b09c8d7„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$c8f85081-3659-4796-8550-2e708b09c8d7«code_foldedäcode»md"`power` = $power_slider"Ù$6332b2f2-ed2f-448a-b1df-247b110e335b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6332b2f2-ed2f-448a-b1df-247b110e335b«code_foldedäcodeÙ‹qa(md"Que faire si que ``m`` est impair, c'est à dire ``m = 2k + 1``...", md""" Si ``b = a^{2k}``, calcule le produit ``b \times a``. """)Ù$35b7b8b7-bff6-4f64-91b9-b65035162365„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$35b7b8b7-bff6-4f64-91b9-b65035162365«code_foldedäcodeÙ@md"""Voir $(cite("hoffstein2014Introduction", "Section 2.3"))"""Ù$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0«code_folded¤codeÙfunction pgcd(a, b) println("gcd($a, $b) = ") if b == 0 println(a) return a else return pgcd(b, mod(a, b)) end endÙ$77093b36-c232-4477-be49-845f1a631829„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$77093b36-c232-4477-be49-845f1a631829«code_folded¤codeÙ/@time pow_1000 = fast_mod_power(2, power, 1000)Ù$bd0c0258-7040-42e7-a20e-532b55af3a62„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$bd0c0258-7040-42e7-a20e-532b55af3a62«code_foldedäcodeÙ4frametitle("Algorithme d'Euclide : implémentation")Ù$cd481f6c-66f4-4ebf-9769-c3edc24f403b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$cd481f6c-66f4-4ebf-9769-c3edc24f403b«code_foldedäcodeÙ1frametitle("Algorithme d'Euclide : élaboration")Ù$58da5ba4-c858-4684-a9f4-5a39fdc4fb03„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$58da5ba4-c858-4684-a9f4-5a39fdc4fb03«code_folded¤codeÙýfunction fast_power(prod_func::Function, a, power) if power == 0 return one(a) elseif mod(power, 2) == 1 return prod_func(fast_power(prod_func, a, power - 1), a) else b = fast_power(prod_func, a, div(power, 2)) return prod_func(b, b) end endÙ$16b677e4-c467-462a-b770-b7a31160e129„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$16b677e4-c467-462a-b770-b7a31160e129«code_folded¤codeÙ$prime_list = primes(3, primes_upper)Ù$1b1d5c9b-5fc7-480e-9649-e9c44a49c38d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1b1d5c9b-5fc7-480e-9649-e9c44a49c38d«code_folded¤code³include("utils.jl")Ù$1ca71c26-f98c-4126-a1c5-98786fde7e9b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1ca71c26-f98c-4126-a1c5-98786fde7e9b«code_foldedäcodeÚ�md""" Trouver ``b`` tel que ``x_k`` est solution: ```math x_k = b^k \quad \to \quad b^{k+1} = b^k + b^{k-1} \quad \to \quad b^2 - b - 1 = 0 \quad \to \quad b = \frac{1 \pm \sqrt{5}}{2} ``` On a donc une famille de solutions: ```math x_k = a_1 \left(\frac{1 - \sqrt5}{2}\right)^k + a_2 \left(\frac{1 + \sqrt5}{2}\right)^k ``` Il reste à trouver ``a_1`` et ``a_2`` tels que ``x_0 = 0`` et ``x_1 = 1``. Ça correspond à calculer `E.vectors \ [1, 0]`, etc... ```math \begin{align} x_0 & = 0 & a_1 + a_2 & = 0\\ x_1 & = 1 & a_1 \frac{1 - \sqrt5}{2} + a_2 \frac{1 + \sqrt5}{2} & = 1 \end{align} ``` Donc ``a_1 = -1/\sqrt5`` et ``a_2 = 1/\sqrt5``. """Ù$191f8429-cbbb-44aa-8beb-271a94293e4b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$191f8429-cbbb-44aa-8beb-271a94293e4b«code_folded¤codeÙXchinese_remainder_theorem(big.(fast_mod_power.(2, power, prime_list)), big.(prime_list))Ù$59ac02af-7b54-44d4-b5f4-a0f60d4458a1„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$59ac02af-7b54-44d4-b5f4-a0f60d4458a1«code_folded¤codeÙ+all_powers = fast_mod_power.(g, 1:(p-1), p)Ù$7f9bd301-355b-43f5-b168-22fac9e52511„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$7f9bd301-355b-43f5-b168-22fac9e52511«code_folded¤code±Primes.primes(10)Ù$d1b260fb-7500-47fb-bb48-21b5857ab55a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d1b260fb-7500-47fb-bb48-21b5857ab55a«code_foldedäcodeÙ^md""" **Lemme**: Si ``a \equiv r \pmod{b}`` alors ``\text{gcd}(a, b) = \text{gcd}(b, r)``. """Ù$3cd40d9e-fcea-427d-9877-cea65e7ea413„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$3cd40d9e-fcea-427d-9877-cea65e7ea413«code_folded¤code´@time fib_seq(20000)Ù$67093a35-8e1b-4cd3-b11b-c7ff601f802e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$67093a35-8e1b-4cd3-b11b-c7ff601f802e«code_foldedäcodeÙ[md"`primes_upper` = $(@bind primes_upper Slider(50:300, default = 100, show_value = true))"Ù$ac5e1516-1574-4893-a965-f799947076cb„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ac5e1516-1574-4893-a965-f799947076cb«code_folded¤codeµ@time fib_diag(20000)Ù$a826d9d1-47db-4645-be6e-3ae0ed8d4e18„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a826d9d1-47db-4645-be6e-3ae0ed8d4e18«code_foldedäcodeÚmd""" Est-ce que 2345 est divisible par 3 ou 9? ```math \begin{align} 2 \cdot 10^3 + 3 \cdot 10^2 + 4 \cdot 10 + 5 & \equiv \,\, ? \pmod{9}\\ 2 \cdot 1^3 + 3 \cdot 1^2 + 4 \cdot 1 + 5 & \equiv \,\, ? \pmod{9}\\ 2 + 3 + 4 + 5 & \equiv 14 \pmod{9}\\ \end{align} ``` Est-ce que 2345 est divisible par 11? ```math \begin{align} 2 \cdot (10)^3 + 3 \cdot 10^2 + 4 \cdot 10 + 5 & \equiv \,\, ? \pmod{11}\\ 2 \cdot (-1)^3 + 3 \cdot (-1)^2 + 4 \cdot (-1) + 5 & \equiv \,\, ? \pmod{11}\\ -2 + 3 - 4 + 5 & \equiv 2 \pmod{11}\\ \end{align} ``` """Ù$fe2af566-4a8b-4052-9915-85266ee5ce98„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$fe2af566-4a8b-4052-9915-85266ee5ce98«code_folded¤code²pgcd(gcd_a, gcd_b)Ù$ee43c389-55f4-4cf9-a8db-ce37d1b89db4„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ee43c389-55f4-4cf9-a8db-ce37d1b89db4«code_foldedäcodeÙ5frametitle("Shanks's Babystep–Giantstep Algorithm")Ù$e9633e3f-376d-413d-bc19-d015f6ce76e5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e9633e3f-376d-413d-bc19-d015f6ce76e5«code_folded¤code¬big(2)^powerÙ$37585789-bd43-4ce5-b550-ad712b70d226„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$37585789-bd43-4ce5-b550-ad712b70d226«code_foldedäcodeÙÞmd""" > **Définition** Le résultat de la *division Euclidienne* de ``a`` par un diviseur ``d`` est un quotient ``q`` et un reste ``0 \le r < d`` tels que ``a = qd + r``. En notation modulaire ``a \equiv r \pmod{d}``. """Ù$61462af5-69bd-42be-8918-7992c79ee00d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$61462af5-69bd-42be-8918-7992c79ee00d«code_foldedäcodeÙÓqa(md"Comment savoir si `prime_list` contient assez de nombres pour avoir la bonne réponse ?", md"On a la bonne réponse modulo `prod(prime_list)` donc si `prod(prime_list) > 2^power`, on a la bonne réponse.")Ù$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4«code_foldedäcodeÚ´qa(md"Comment trouver `mod(2^power, 999000)` en utilisant `pow_1000` et `pow_999` ?", md" On peut utiliser une astuce similaire à l'interpolation Lagrangienne. On veut trouver ``x`` et ``y`` tels que ```math \texttt{pow\_1000}x + \texttt{pow\_999}y \equiv 2^\texttt{power} \pmod{999000} ``` On veut que ``x \equiv 0 \pmod{999}`` et ``x \equiv 1 \pmod{1000}``. On utilise donc ``x = 999x'`` avec ``x' \equiv (999)^{-1} \pmod{1000}``. ")Ù$4cb070de-e8bf-4a1d-9625-043c19466c46„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4cb070de-e8bf-4a1d-9625-043c19466c46«code_folded¤code´@time fib_pow(20000)Ù$192f608c-0563-4179-903f-49fad2db4c74„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$192f608c-0563-4179-903f-49fad2db4c74«code_folded¤code´@time fib_pow(20000)Ù$a293bb0e-078d-4335-a446-3096a79c03bc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a293bb0e-078d-4335-a446-3096a79c03bc«code_foldedäcode¼frametitle("Diffie-Hellman")Ù$a1081bb2-2186-4b19-b667-0c246155f360„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a1081bb2-2186-4b19-b667-0c246155f360«code_folded¤code´@time fib_pow(20000)Ù$d8a28762-8aab-49e9-b9ac-38901d34abff„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d8a28762-8aab-49e9-b9ac-38901d34abff«code_foldedäcode»frametitle("Fast powering")Ù$15367f3b-c7e4-4004-a018-5422a7f22024„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$15367f3b-c7e4-4004-a018-5422a7f22024«code_foldedäcodeÙ^md"On peut mettre le vecteur de taille ``n^2`` sous forme de matrice de taille ``n \times n``"Ù$9207b107-e1b0-4328-a004-f4b8152b423f„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9207b107-e1b0-4328-a004-f4b8152b423f«code_foldedäcodeÚ-qa(md"**Observation clé** Si ``a > b``, trouver un mono-variant.", md""" On a ``(a, b) > (b, r)``. En effet, ``a > b`` par supposition et ``b > r`` par définition de l'algorithme d'Euclide. Notons que même si la supposition ``a > b`` n'est pas vraie, elle le devient pour ``\text{gcd}(b, r)``. """)Ù$aee611f2-bc86-4e85-bbcb-add78c6a9175„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$aee611f2-bc86-4e85-bbcb-add78c6a9175«code_folded¤codeÙ)gcd_g, gcd_x, gcd_y = pgcdx(gcd_a, gcd_b)Ù$b319619e-8f8d-4650-8fb4-76e5ba953470„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$b319619e-8f8d-4650-8fb4-76e5ba953470«code_foldedäcodeÙèmd""" ```math xb + yr = g \quad \text{et} \quad r = a - qb \quad \Rightarrow \quad (x - yq)b + ya = g ``` Solution *homogène* ``x = b``, ``y = -a`` → ``ba - ab = 0``. Donc si ``(x, y)`` est solution, ``(x + b, y - a)`` aussi. """Ù$642d545f-b1b9-49da-8a03-ad63e3214f59„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$642d545f-b1b9-49da-8a03-ad63e3214f59«code_foldedäcodeÙ•md""" ```math a \equiv \alpha \pmod{n} \quad \text{et} \quad b \equiv \beta \pmod{n} \quad \Rightarrow \quad a b \equiv \alpha \beta \pmod{n} ``` """Ù$a7d06375-e4dd-47b1-8aba-11dc4d62954b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a7d06375-e4dd-47b1-8aba-11dc4d62954b«code_foldedäcodeÙ�qa(md"Supposons que ``m`` est pair, c'est à dire ``m = 2k``...", md""" On a ``a^{2k} = (a^k)^2``. Si ``b = a^k``, on calcule le produit ``b \times b``. """)Ù$65f4990f-1952-4682-8fa8-9e3dd4bf1ebf„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$65f4990f-1952-4682-8fa8-9e3dd4bf1ebf«code_folded¤codeÙ-@time pow_999 = fast_mod_power(2, power, 999)Ù$0e3fb524-bea1-4ef0-9589-36230a84e949„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$0e3fb524-bea1-4ef0-9589-36230a84e949«code_folded¤codeÙrgp_picker = HAlign( md"`g` = $(@bind g Slider(2:(p-1), default = 2, show_value = true))", md"`p` = $p_picker", )Ù$78df9410-5ea4-4d9f-bbe5-862f76a100fc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$78df9410-5ea4-4d9f-bbe5-862f76a100fc«code_foldedäcodeÙRmd"``30x \equiv j \pmod{7} \quad \Rightarrow \quad x \equiv (30)^{-1} j\pmod{7}``"Ù$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986«code_folded¤codeÙ;chinese_remainder_theorem([pow_1000, pow_999], [1000, 999])Ù$8b16a522-9be4-4286-b64d-3d1bbdef7142„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$8b16a522-9be4-4286-b64d-3d1bbdef7142«code_foldedäcodeÙämd""" Étant donné un nombre premier ``p`` et une racine primitive ``g`` modulo ``p`` et un entier ``a`` tel que ``p \nmid a``, le *Discrete logarithme problem* consiste à retrouver ``x`` tel que ``g^x \equiv a \pmod{p}``. """Ù$c376513c-6553-4cd6-8384-ae6ff9d472d7„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$c376513c-6553-4cd6-8384-ae6ff9d472d7«code_foldedäcodeÙHmd""" ```math A \equiv g^a \pmod{p} \qquad B \equiv g^b \pmod{p} ``` """Ù$3da58487-192f-458a-9d47-7a4ce98b6da3„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$3da58487-192f-458a-9d47-7a4ce98b6da3«code_foldedäcode°section("Utils")Ù$64eb4b52-4946-467c-867a-a6fc437b15f6„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$64eb4b52-4946-467c-867a-a6fc437b15f6«code_foldedäcodeÙ)frametitle("Meet in the middle approach")Ù$31388128-33a3-4443-835e-74b91bf48268„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$31388128-33a3-4443-835e-74b91bf48268«code_folded¤code­mod(a + b, n)Ù$4714b7d7-32ee-42a1-bfa5-93eafda739d3„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4714b7d7-32ee-42a1-bfa5-93eafda739d3«code_foldedäcodeÙ2frametitle("Diagonalization to speed up powering")Ù$d882afdd-eb85-467c-bf18-525c0c5da5e7„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d882afdd-eb85-467c-bf18-525c0c5da5e7«code_folded¤codeµ@time fib_diag(20000)Ù$a7d9703a-5121-4b43-8cd4-2acf9a0d91ef„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a7d9703a-5121-4b43-8cd4-2acf9a0d91ef«code_foldedäcodeÙ¢md""" La méthode *meet in the middle* est une méthode générique permettant de passer d'une complexité de ``\mathcal{O}(N)`` à ``\mathcal{O}(\sqrt{N})``. """Ù$38744170-9af6-44b5-a0be-46a83da3253e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$38744170-9af6-44b5-a0be-46a83da3253e«code_folded¤codeÙRfunction fib_pow(n) A = BigInt[1 1 1 0] x = A^(n-1) * [1, 0] return x[1] endÙ$f86a5efc-d31e-4e88-b81f-ebdbbeba11ec„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$f86a5efc-d31e-4e88-b81f-ebdbbeba11ec«code_foldedäcodeÚõmd""" On doit donc trouver la ligne ``i`` et la ligne et ``j`` tels que ```math \begin{align} g^{i-1}g^{(j-1)n} & \equiv a & \pmod{p}\\ g^{i-1} & \equiv a(g^{-n})^{j-1} & \pmod{p} \end{align} ``` Ils ne reste plus qu'à chercher une collision entre les listes de restes modulo ``p`` pour ``g^{i-1}`` et ``a(g^{-n})^{j-1}``. L'identification des collision peut se faire en ``\mathcal{O}(\sqrt{n}\log(n))`` avec une recherche dichotomique our en ``\mathcal{O}(\sqrt{n})`` amorti avec un dictionaire. """Ù$8315b53f-abca-483d-bbf6-7e9193e751c9„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$8315b53f-abca-483d-bbf6-7e9193e751c9«code_folded¤codeÚ‡function draw_fib(n, size = 400) f = [0, 1, 1] for i in 3:(n+1) push!(f, f[end] + f[end - 1]) end scale = div(size, 2maximum(f[end-1])) #Luxor.scale(scale) colors = distinguishable_colors(n) if iseven(n) Δx = f[end] Δy = f[end - 1] else Δx = f[end - 1] Δy = f[end] end left_most = sum(f[i] for i in 1:(n+1) if mod(i, 4) == 1; init = 0) up_most = sum(f[i] for i in 1:(n+1) if mod(i, 4) == 0; init = 0) shift = Point(left_most - Δx / 2, up_most - Δy / 2) pos(x, y) = scale * (Point(x, y) + shift) @draw begin x = 0 y = 0 j = 1 for i in 2:(n+1) left = x if isodd(i) if iseven(div(i - 1, 2)) left -= f[i] else left += f[i - 1] end end up = y if iseven(i) if iseven(div(i, 2)) up -= f[i] else up += f[i-1] end end sethue(colors[i - 1]) setopacity(0.6) rect(pos(left, up), scale * f[i], scale * f[i], action=:fill) setopacity(1) sethue("black") fontsize(div(scale * f[i], 2)) text(string(f[i]), pos(left + f[i] / 2, up + f[i] / 2), halign = :center, valign = :middle) x = min(x, left) y = min(y, up) end end Δx * scale Δy * scale endÙ$08b18315-c28e-44ed-beb2-5b17421b0224„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$08b18315-c28e-44ed-beb2-5b17421b0224«code_foldedäcodeÚžmd""" > **Définition** Le *Greatest Common Divisor (GCD)* de deux nombres ``a \in \mathbb{Z}`` et ``b \in \mathbb{Z}``, noté ``\text{gcd}(a, b)`` est le plus grand nombre ``g \in \mathbb{Z}`` qui divise ``a`` (noté ``g \mid a``) et ``b`` (noté ``g \mid b``). C'est à dire qu'il existe ``x \in \mathbb{Z}`` tel que ``a = gx`` et ``y \in \mathbb{Z}`` tel que ``b = gy``. En notation modulaire, ``a \equiv 0 \pmod{g}`` et ``b \equiv 0 \pmod{g}``. > **Théorème de Bézout** Il existe ``x, y \in \mathbb{Z}`` tels que ``ax + by = c`` si et seulement si ``\text{gcd}(a, b)`` divise ``c``. En notation modulaire ``ax \equiv c \pmod{b}`` et ``by \equiv c \pmod{a}``. """Ù$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253«code_folded¤codeÙ-if !isnothing(x) fast_mod_power(g, x, p) endÙ$e52d25b3-65bf-4617-ae8d-fae0d0c8d041„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e52d25b3-65bf-4617-ae8d-fae0d0c8d041«code_foldedäcodeÙTmd"``366x \equiv j \pmod{7} \quad \Rightarrow \quad x \equiv (366)^{-1} j\pmod{7}``"Ù$462fa407-d973-4e9e-8512-b7cd3bb98b7b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$462fa407-d973-4e9e-8512-b7cd3bb98b7b«code_folded¤codeÙzfunction fib_seq(n) f = zeros(BigInt, n + 1) f[2] = 1 for k in 2:n f[k + 1] = f[k] + f[k - 1] end return f[end] endÙ$ca8905ef-97a3-424c-bb2e-559f7151585b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ca8905ef-97a3-424c-bb2e-559f7151585b«code_foldedäcodeÙ•md""" Ensemble de solutions: ``(x + kb, y - ka)`` pour un ``k \in \mathbb{Z}`` arbitraire. Prenons ``k`` tel que ``0 \le x + kb < b`` avec `mod`. """Ù$09f44611-ba21-4982-ba1b-0691124642fc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$09f44611-ba21-4982-ba1b-0691124642fc«code_foldedäcodeÙ/frametitle("Arithmétique modulaire : produit")Ù$18031ccb-657f-409a-9080-9a0ada3ae8b5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$18031ccb-657f-409a-9080-9a0ada3ae8b5«code_folded¤codeÙ?slider_b = @bind b Slider(1:100, default=13, show_value = true)Ù$d81bbd74-42df-4bb2-a045-9c2642cc19e5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d81bbd74-42df-4bb2-a045-9c2642cc19e5«code_folded¤codeªabn_pickerÙ$4be6cea4-13a2-4bcb-b849-14eef57ab604„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4be6cea4-13a2-4bcb-b849-14eef57ab604«code_foldedäcodeÙ³if length(unique(sort(all_powers))) == p - 1 md"Le nombre $g **est** une racine primitive modulo $p" else md"Le nombre $g **n'est pas** une racine primitive modulo $p" endÙ$1072a756-5026-4de9-93a8-f942d54c474a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1072a756-5026-4de9-93a8-f942d54c474a«code_foldedäcodeÙ@md"""Voir $(cite("hoffstein2014Introduction", "Section 2.7"))"""Ù$6107d03d-1e45-4eb9-b8e2-51e4a72485e6„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6107d03d-1e45-4eb9-b8e2-51e4a72485e6«code_foldedäcodeÙ&frametitle("Recursive implementation")Ù$87fdefa1-3bbd-4b69-ad3a-72baca6e55ee„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$87fdefa1-3bbd-4b69-ad3a-72baca6e55ee«code_folded¤code½mod(mod(a, n) + mod(b, n), n)Ù$48eba223-6cce-4aa2-9977-4883ba7903fc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$48eba223-6cce-4aa2-9977-4883ba7903fc«code_foldedäcodeÚ‚qa(md"**Observation finale** Si ``a`` et ``b`` sont positifs et qu'on effectue la substitution ``(a, b) \to (b, r)`` récursivement, le mono-variant impose qu'on ne puisse itérer qu'un nombre fini de fois, que va-t-il se passer ?", md""" La paire ``(a, b)`` va diminuer strictement (c'est à dire d'au moins 1) à chaque itération. Pourtant, ce sont des nombres entier positifs donc ils ne peuvent diminuer strictement qu'un nombre fini de fois. C'est une contradiction, comme cela se fait-il ? À un moment ``b`` vaudra 0, on ne pourra alors plus faire de division Euclidienne. On utilisera alors le fait que ``\text{gcd}(a, 0) = a``. """)Ù$72ec8410-05d9-475a-93d4-47153cc0ce31„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$72ec8410-05d9-475a-93d4-47153cc0ce31«code_folded¤codeÙJfib_rec(n) = (n == 0 ? 0 : (n == 1 ? 1 : fib_rec(n - 1) + fib_rec(n - 2)))Ù$1a4da418-147f-46f4-9b95-7955183aa5cf„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1a4da418-147f-46f4-9b95-7955183aa5cf«code_foldedäcodeÙZmd"`gcd_a` = $(@bind gcd_a Slider(1:typemax(Int32), default=90284599, show_value = true))"Ù$7da0705e-c925-4f8d-9ca4-8d8a0f859fea„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$7da0705e-c925-4f8d-9ca4-8d8a0f859fea«code_foldedäcodeÙTmd"``365x \equiv j \pmod{7} \quad \Rightarrow \quad x \equiv (365)^{-1} j\pmod{7}``"Ù$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66b«code_folded¤code·@time fib_closed(20000)Ù$82ba8fe1-435e-422b-abb7-cb50a7a85e1e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$82ba8fe1-435e-422b-abb7-cb50a7a85e1e«code_foldedäcode¿frametitle("Dicrete logarithm")Ù$f39cccac-5b24-46e4-8749-1b0a944542ef„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$f39cccac-5b24-46e4-8749-1b0a944542ef«code_foldedäcodeÙ[md"`gcd_b` = $(@bind gcd_b Slider(1:typemax(Int32), default=249357461, show_value = true))"Ù$c5e906c8-0f73-4955-baa7-337195329e04„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$c5e906c8-0f73-4955-baa7-337195329e04«code_foldedäcodeÙÐmd""" Étant donné un nombre premier ``p`` et une racine primitive ``g`` modulo ``p``, Alice (resp. Bob) génère un nombre secret ``a`` (resp. ``b``). Ils communique ensuite publiquement ``A`` et ``B``. """Ù$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6«code_foldedäcodeÚmd""" * **Inverse modulaire** : étant donné ``a, n``, trouver ``x`` (noté ``a^{-1}``) tel que ``xa \equiv 1 \pmod{n}`` * **Division modulaire** : étant donné ``a, b, n``, trouver ``x`` tel que ``xa \equiv b \pmod{n}`` → ``x \equiv a^{-1}b \pmod{n}``. """Ù$bc9a718f-4b97-4e15-acf8-d180abc5b6d5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$bc9a718f-4b97-4e15-acf8-d180abc5b6d5«code_foldedäcodeÚ^qa(md"Est-ce une complexité linéaire ou exponentielle en fonction de la taille de l'input", md""" La taille est proportionnelle à ``\log_2(p)`` donc on être linéaire en ``p`` c'est être proportionnel à ``2^{\log_2(p)}`` et donc la complexité est exponentielle en la taille de l'input ! $(cite("hoffstein2014Introduction", "Section 2.6")) """)Ù$41cf9efd-65e5-4abb-94d3-e824780e659c„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$41cf9efd-65e5-4abb-94d3-e824780e659c«code_foldedäcodeÙ#refs(["hoffstein2014Introduction"])Ù$1e27eedc-5308-4608-863f-fb81d60acdf0„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1e27eedc-5308-4608-863f-fb81d60acdf0«code_foldedäcodeÙHqa(md"Quelle est la complexité?", md"``\mathcal{O}(\sqrt{p}\log(p))``")Ù$a59a20e2-a7c7-48a9-ad8d-8094e03a749d„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a59a20e2-a7c7-48a9-ad8d-8094e03a749d«code_folded¤codeÙ)collect(mod.(modinv(365, 7) .* (0:6), 7))Ù$3c198d79-c46a-4781-8bd1-b6b68f06c31f„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$3c198d79-c46a-4781-8bd1-b6b68f06c31f«code_folded¤codeÙ"@time fast_power(*, big(2), power)Ù$03e49669-cdee-4241-862d-33ee91214455„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$03e49669-cdee-4241-862d-33ee91214455«code_foldedäcodeÙ[md"The complexity is difficult to evaluate but can be shown to be ``O(\log(\min(a, b)))``."Ù$6f10de7b-ce05-4f82-82e7-4110be44e8cc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6f10de7b-ce05-4f82-82e7-4110be44e8cc«code_folded¤codeÙTmod(pow_1000 * 999 * modinv(999, 1000) + pow_999 * 1000 * modinv(1000, 999), 999000)Ù$059b0ada-2442-48e4-82dd-489cb97e5dcc„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$059b0ada-2442-48e4-82dd-489cb97e5dcc«code_foldedäcode©gp_pickerÙ$4853f4ef-fbb8-48c3-9523-13ab4969d097„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4853f4ef-fbb8-48c3-9523-13ab4969d097«code_folded¤codeÙzfunction baby_steps(g, n, p) steps = [one(g)] for i in 1:n push!(steps, mod(steps[end] * g, p)) end return steps endÙ$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1«code_folded¤codeÙ)collect(mod.(modinv(366, 7) .* (0:6), 7))Ù$0c8ab02e-80b0-44d6-a4a8-c813aac38209„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$0c8ab02e-80b0-44d6-a4a8-c813aac38209«code_folded¤codeÙFfib_picker = @bind fib_n Slider(1:12, default = 10, show_value = true)Ù$3df688c8-1c52-462d-88be-daa153333c60„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$3df688c8-1c52-462d-88be-daa153333c60«code_foldedäcodeÙ×md""" * Théorie des nombres: $(cite("hoffstein2014Introduction", "1.2, 1.3, 1.4, 1.5, 2.2, 2.3")) * Discrete Logarithme Problem et Diffie-Hellman: $(cite("hoffstein2014Introduction", "2.2, 2.3, 2.6, 2.7, 2.8")) """Ù$2c34c17e-12de-43ea-870c-818c97647836„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$2c34c17e-12de-43ea-870c-818c97647836«code_foldedäcodeÙ5frametitle("Inversion modulaire par Euclide étendu")Ù$f6e22fc3-382e-4548-bc59-8f944e06d237„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$f6e22fc3-382e-4548-bc59-8f944e06d237«code_folded¤codeÙ/E.vectors * Diagonal(E.values) * inv(E.vectors)Ù$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82«code_foldedäcodeªabn_pickerÙ$ce07d5c5-90a3-4c12-bada-30e4da1b99fd„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$ce07d5c5-90a3-4c12-bada-30e4da1b99fd«code_folded¤code¼fast_mod_power.(g, 0:15, 17)Ù$b5f3620d-0942-41bb-80b0-d2ddcfe65090„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$b5f3620d-0942-41bb-80b0-d2ddcfe65090«code_folded¤codeµE = eigen([1 1; 1 0])Ù$4a98507b-653e-4354-a825-7605f8fcb31b„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4a98507b-653e-4354-a825-7605f8fcb31b«code_folded¤codeÙFmod.(fast_mod_power.(g, 0:3, 17) * fast_mod_power.(g^4, 0:3, 17)', 17)Ù$736307ec-a2a4-11ef-0f85-ad1a0093e06a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$736307ec-a2a4-11ef-0f85-ad1a0093e06a«code_foldedäcode½md"# La théorie des nombres"Ù$a7afc0cb-a980-4f4f-b782-9791d932ee52„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a7afc0cb-a980-4f4f-b782-9791d932ee52«code_foldedäcodeÙCmd""" Voir $(cite("hoffstein2014Introduction", "Section 2.8")). """Ù$d830fffd-3781-40ca-85cb-c242f99667ce„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d830fffd-3781-40ca-85cb-c242f99667ce«code_folded¤codeÙWfunction fib_diag(n) x = E.vectors * D^(n - 1) * (E.vectors \ [1, 0]) return x[1] endÙ$19ef447f-9fdf-49e1-8d1a-7860b4d4e9ba„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$19ef447f-9fdf-49e1-8d1a-7860b4d4e9ba«code_folded¤codeÙ8D = Diagonal([(1 - √big(5)) / 2, (1 + √big(5)) / 2])Ù$21df1900-3954-4506-b759-aeeee664d1df„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$21df1900-3954-4506-b759-aeeee664d1df«code_folded¤codeÙAfunction modinv(a, n) g, x, y = gcdx(a, n) return mod(x, n) endÙ$06679a09-47d7-4024-8232-4954c08747a0„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$06679a09-47d7-4024-8232-4954c08747a0«code_folded¤codeÙ?using PlutoUI, Primes, DataFrames, Luxor, Colors, LinearAlgebraÙ$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2«code_foldedäcodeÙ"frametitle("Closed form solution")Ù$8a5a251f-5373-445a-97b1-4d652c6b7ba8„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$8a5a251f-5373-445a-97b1-4d652c6b7ba8«code_folded¤codeÙ"refs(keys) = bibrefs(biblio, keys)Ù$9efb7a71-9a03-4716-8d34-aae233e9b898„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$9efb7a71-9a03-4716-8d34-aae233e9b898«code_folded¤code¹x = discrete_log(3, g, p)Ù$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82«code_folded¤codeÙ“function collision(a, b) d = Dict(a[i] => i for i in eachindex(a)) for j in eachindex(b) if haskey(d, b[j]) return d[b[j]], j end end endÙ$f4f49568-dcf2-4c76-ba66-065d2fda7a4a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$f4f49568-dcf2-4c76-ba66-065d2fda7a4a«code_foldedäcodeÙ™md""" ```math a \equiv \alpha \pmod{n} \quad \text{et} \quad b \equiv \beta \pmod{n} \quad \Rightarrow \quad a + b \equiv \alpha + \beta \pmod{n} ``` """Ù$a1628317-7937-4316-85bf-2da860effce3„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a1628317-7937-4316-85bf-2da860effce3«code_folded¤code­mod(a * b, n)Ù$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3«code_folded¤code½mod(mod(a, n) * mod(b, n), n)Ù$a41722b8-8c21-4d3c-a38b-4d248a79e80a„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$a41722b8-8c21-4d3c-a38b-4d248a79e80a«code_foldedäcode¼md"Pas une solution unique:"Ù$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21e„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21e«code_foldedäcode±md"Last 3 digit:"Ù$bc58ba24-90f0-4913-8f66-10bb6cb54076„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$bc58ba24-90f0-4913-8f66-10bb6cb54076«code_foldedäcodeÙàmd""" **Définition** ``g`` est une *racine primitive* modulo ``p`` si ``g^k`` prend toutes les valeurs ``1, 2, ..., p - 1``. ```math \text{Si } \quad p \nmid b,\quad \text{ alors } \quad b^{p - 1} \equiv 1 \pmod{p} ``` """Ù$bafc9870-3823-4d1d-b0b7-94c69ee764d5„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$bafc9870-3823-4d1d-b0b7-94c69ee764d5«code_folded¤codeºimport DocumenterCitationsÙ$d6b89fda-308f-43da-8028-1a812b4516cf„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$d6b89fda-308f-43da-8028-1a812b4516cf«code_foldedäcodeÚÆqa(md"**Observation clé** Que dit le théorème de Bézout par rapport à ``\text{gcd}(d, r)`` et ``a``.", md""" Le nombre ``a`` est **divisible** par ``\text{gcd}(d, r)``. Le nombre ``\text{gcd}(d, r)`` divise donc les 3 nombres, ``a``, ``d`` et ``r`` et donc ``\text{gcd}(d, r) = \text{gcd}(a, d, r)``. En combinant ça avec l'observation précédente, on a ``\text{gcd}(a, d) = \text{gcd}(d, r)``. On peut généraliser cela en le lemme suivant: """)Ù$4e35d650-b9a6-4668-90f0-f27a50af29ad„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$4e35d650-b9a6-4668-90f0-f27a50af29ad«code_foldedäcodeÙ¤abn_picker = md""" | `a` | ``\alpha`` | `b` | ``\beta`` | `n` | |------|-----|-----|---|---| | $slider_a | $(mod(a, n)) | $slider_b | $(mod(b, n)) | $slider_n | """Ù$bbb2793a-faa4-43bd-b2e8-e8d3ac93310f„¨metadataƒ¨disabled©show_logsîskip_as_script§cell_idÙ$bbb2793a-faa4-43bd-b2e8-e8d3ac93310f«code_foldedäcodeÙ]md"S'il y avait 364 jours par ans, les fêtes seraient toujours le même jour de la semaine!"´last_hot_reload_time˱cell_dependenciesÞ¨Ù$8f6ba1c4-a971-4dc4-ac5d-2f30790aecde„´precedence_heuristic §cell_idÙ$8f6ba1c4-a971-4dc4-ac5d-2f30790aecde´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$708c442b-cbff-4e1a-b70d-e704453cfd3d„´precedence_heuristic §cell_idÙ$708c442b-cbff-4e1a-b70d-e704453cfd3d´downstream_cells_map€²upstream_cells_map†¦HAlign�¨draw_fib‘Ù$8315b53f-abca-483d-bbf6-7e9193e751c9§@md_str�¨getindex�¥fib_n‘Ù$0c8ab02e-80b0-44d6-a4a8-c813aac38209ªfib_picker‘Ù$0c8ab02e-80b0-44d6-a4a8-c813aac38209Ù$c3411941-d77f-46cb-8378-23998a1a4828„´precedence_heuristic §cell_idÙ$c3411941-d77f-46cb-8378-23998a1a4828´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$ae89661a-2c0f-4752-adc2-023f09dc0e9f„´precedence_heuristic §cell_idÙ$ae89661a-2c0f-4752-adc2-023f09dc0e9f´downstream_cells_map€²upstream_cells_map„§reshape�¡:�¡g‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$9f55cad1-b01a-45e3-93df-a4349e2dfbd3„´precedence_heuristic §cell_idÙ$9f55cad1-b01a-45e3-93df-a4349e2dfbd3´downstream_cells_map€²upstream_cells_map‚¤sort�ªall_powers‘Ù$59ac02af-7b54-44d4-b5f4-a0f60d4458a1Ù$7bad8c6c-45c7-402f-ad59-6857e9268901„´precedence_heuristic §cell_idÙ$7bad8c6c-45c7-402f-ad59-6857e9268901´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$6cf004be-5205-429e-8131-ef607cebeaec„´precedence_heuristic §cell_idÙ$6cf004be-5205-429e-8131-ef607cebeaec´downstream_cells_map€²upstream_cells_map�¡E‘Ù$b5f3620d-0942-41bb-80b0-d2ddcfe65090Ù$027fe67c-d2f0-49f6-b894-959795551d27„´precedence_heuristic §cell_idÙ$027fe67c-d2f0-49f6-b894-959795551d27´downstream_cells_map€²upstream_cells_mapÞ¬Base.GC_Diff�§fib_rec‘Ù$72ec8410-05d9-475a-93d4-47153cc0ce31¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�«Base.string�¿Base.cumulative_compile_time_ns�³Base.gc_alloc_count�¦Base.-�¤Base�¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�¾Base.cumulative_compile_timing�Ù$08dcbbd3-a531-4f74-a724-1cae8fae1636„´precedence_heuristic §cell_idÙ$08dcbbd3-a531-4f74-a724-1cae8fae1636´downstream_cells_map€²upstream_cells_mapŠ¢==�¤sort�¡p‘Ù$57816e2c-a675-43e7-b674-2877ffcf1415¦length�¡g‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949¨getindex�§@md_str�¡-�¦unique�ªall_powers‘Ù$59ac02af-7b54-44d4-b5f4-a0f60d4458a1Ù$4cff1d10-422f-4b12-b790-a589c972fbb7„´precedence_heuristic §cell_idÙ$4cff1d10-422f-4b12-b790-a589c972fbb7´downstream_cells_map€²upstream_cells_map�©gp_picker‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949Ù$6c3595d2-4f68-44da-90e7-dc9c68479bcf„´precedence_heuristic §cell_idÙ$6c3595d2-4f68-44da-90e7-dc9c68479bcf´downstream_cells_map�¤cite—Ù$3df688c8-1c52-462d-88be-daa153333c60Ù$a7afc0cb-a980-4f4f-b782-9791d932ee52Ù$ed023033-1044-4d48-aab1-39e9300043f7Ù$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2Ù$bc9a718f-4b97-4e15-acf8-d180abc5b6d5Ù$1072a756-5026-4de9-93a8-f942d54c474aÙ$35b7b8b7-bff6-4f64-91b9-b65035162365²upstream_cells_map‚§bibcite�¦biblio‘Ù$ba16d83d-21a5-4f0c-807b-674a167da4dcÙ$a4698418-ebf7-4992-a3ba-a15ff282bf87„´precedence_heuristic §cell_idÙ$a4698418-ebf7-4992-a3ba-a15ff282bf87´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$8670abc2-63e6-496a-b20c-812197acd9ad„´precedence_heuristic §cell_idÙ$8670abc2-63e6-496a-b20c-812197acd9ad´downstream_cells_map�®fast_mod_powerœÙ$77093b36-c232-4477-be49-845f1a631829Ù$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfÙ$9cef898e-192c-418a-bec6-511f8b6da179Ù$4c2d45e3-56a2-467f-b87f-7b98cb873a05Ù$191f8429-cbbb-44aa-8beb-271a94293e4bÙ$59ac02af-7b54-44d4-b5f4-a0f60d4458a1Ù$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253Ù$ce07d5c5-90a3-4c12-bada-30e4da1b99fdÙ$ae89661a-2c0f-4752-adc2-023f09dc0e9fÙ$4a98507b-653e-4354-a825-7605f8fcb31bÙ$3026f9c5-81d3-443a-940a-f22fef9754afÙ$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fd²upstream_cells_mapƒªfast_power‘Ù$58da5ba4-c858-4684-a9f4-5a39fdc4fb03£mod�¡*�Ù$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2„´precedence_heuristic §cell_idÙ$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2´downstream_cells_map€²upstream_cells_map„¢qa�§@md_str�¨getindex�¤cite‘Ù$6c3595d2-4f68-44da-90e7-dc9c68479bcfÙ$7330af43-bec3-460c-94f6-768ac2975b00„´precedence_heuristic §cell_idÙ$7330af43-bec3-460c-94f6-768ac2975b00´downstream_cells_map�³shanks_discrete_log‘Ù$59254bfd-48f2-4585-9ba5-e4c809421072²upstream_cells_mapˆ«giant_steps‘Ù$3026f9c5-81d3-443a-940a-f22fef9754af¥isqrt�©collision‘Ù$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82£mod�¡+�¡-�ªbaby_steps‘Ù$4853f4ef-fbb8-48c3-9523-13ab4969d097¡*�Ù$4c2d45e3-56a2-467f-b87f-7b98cb873a05„´precedence_heuristic §cell_idÙ$4c2d45e3-56a2-467f-b87f-7b98cb873a05´downstream_cells_map€²upstream_cells_mapƒªprime_list‘Ù$16b677e4-c467-462a-b770-b7a31160e129¥power‘Ù$2381babe-0777-45db-acff-cc647a8a68d3®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fd„´precedence_heuristic §cell_idÙ$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fd´downstream_cells_map€²upstream_cells_map„¨shanks_x‘Ù$59254bfd-48f2-4585-9ba5-e4c809421072¡p‘Ù$57816e2c-a675-43e7-b674-2877ffcf1415¡g‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$ec14d629-b720-47cd-bc08-ff96f49271ab„´precedence_heuristic §cell_idÙ$ec14d629-b720-47cd-bc08-ff96f49271ab´downstream_cells_map�¬discrete_log‘Ù$9efb7a71-9a03-4716-8d34-aae233e9b898²upstream_cells_map†¢==�£one�¡:�£mod�¡-�¡*�Ù$594829e2-585b-4d48-bb6e-b35d9543cfbe„´precedence_heuristic §cell_idÙ$594829e2-585b-4d48-bb6e-b35d9543cfbe´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$bbc907b1-63f8-435a-badc-11ed88bd6cf5„´precedence_heuristic §cell_idÙ$bbc907b1-63f8-435a-badc-11ed88bd6cf5´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$227e415e-ab17-4f3a-b695-9573c9ee2b57„´precedence_heuristic §cell_idÙ$227e415e-ab17-4f3a-b695-9573c9ee2b57´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$821de132-559b-4420-b866-e97134c5bd9a„´precedence_heuristic §cell_idÙ$821de132-559b-4420-b866-e97134c5bd9a´downstream_cells_map�¹chinese_remainder_theorem’Ù$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986Ù$191f8429-cbbb-44aa-8beb-271a94293e4b²upstream_cells_map‹¥error�£gcd�©eachindex�¢==�¦modinv‘Ù$21df1900-3954-4506-b759-aeeee664d1df¤prod�£mod�¢!=�£sum�¡*�£div�Ù$3026f9c5-81d3-443a-940a-f22fef9754af„´precedence_heuristic §cell_idÙ$3026f9c5-81d3-443a-940a-f22fef9754af´downstream_cells_map�«giant_steps‘Ù$7330af43-bec3-460c-94f6-768ac2975b00²upstream_cells_mapƒ¦modinv‘Ù$21df1900-3954-4506-b759-aeeee664d1dfªbaby_steps‘Ù$4853f4ef-fbb8-48c3-9523-13ab4969d097®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$3f1af973-a02b-4e06-8e6e-eff414fcaf67„´precedence_heuristic §cell_idÙ$3f1af973-a02b-4e06-8e6e-eff414fcaf67´downstream_cells_map�¥pgcdx‘Ù$aee611f2-bc86-4e85-bbcb-add78c6a9175²upstream_cells_map†¢==�£one�¦divrem�¡-�¤zero�¡*�Ù$59817f59-429b-4f17-a46a-185571fd1e5a„´precedence_heuristic §cell_idÙ$59817f59-429b-4f17-a46a-185571fd1e5a´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$f9f03579-5bfc-452d-bff9-9e7adfe095d3„´precedence_heuristic §cell_idÙ$f9f03579-5bfc-452d-bff9-9e7adfe095d3´downstream_cells_map€²upstream_cells_map�£gcd�Ù$e2a3842d-4e07-4703-ab47-a5140649dd6a„´precedence_heuristic §cell_idÙ$e2a3842d-4e07-4703-ab47-a5140649dd6a´downstream_cells_map€²upstream_cells_mapƒ¤sort�¦unique�ªall_powers‘Ù$59ac02af-7b54-44d4-b5f4-a0f60d4458a1Ù$59254bfd-48f2-4585-9ba5-e4c809421072„´precedence_heuristic §cell_idÙ$59254bfd-48f2-4585-9ba5-e4c809421072´downstream_cells_map�¨shanks_x‘Ù$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fd²upstream_cells_mapƒ³shanks_discrete_log‘Ù$7330af43-bec3-460c-94f6-768ac2975b00¡p‘Ù$57816e2c-a675-43e7-b674-2877ffcf1415¡g‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949Ù$83852dd5-3546-45af-a845-b01dab0aa2a6„´precedence_heuristic §cell_idÙ$83852dd5-3546-45af-a845-b01dab0aa2a6´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$c2fab245-8a98-4b41-ade2-c5b16e9c39f9„´precedence_heuristic §cell_idÙ$c2fab245-8a98-4b41-ade2-c5b16e9c39f9´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$eeaec4f4-71bd-43df-b9c9-a00bc3b1864b„´precedence_heuristic §cell_idÙ$eeaec4f4-71bd-43df-b9c9-a00bc3b1864b´downstream_cells_map€²upstream_cells_mapƒ¥gcd_b‘Ù$f39cccac-5b24-46e4-8749-1b0a944542ef¤gcdx�¥gcd_a‘Ù$1a4da418-147f-46f4-9b95-7955183aa5cfÙ$535f4bc1-e88c-47c7-990b-e3c8b5054acc„´precedence_heuristic §cell_idÙ$535f4bc1-e88c-47c7-990b-e3c8b5054acc´downstream_cells_map�ªfib_closed‘Ù$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66b²upstream_cells_map‡¡/�¡^�¡+�¡-�¤sqrt�£big�£âˆš�Ù$7db2060b-d69e-42e7-ae81-fd37ee793876„´precedence_heuristic §cell_idÙ$7db2060b-d69e-42e7-ae81-fd37ee793876´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$2381babe-0777-45db-acff-cc647a8a68d3„´precedence_heuristic §cell_idÙ$2381babe-0777-45db-acff-cc647a8a68d3´downstream_cells_map‚¥power˜Ù$9e8a61d9-a700-4851-b1cd-49ce042c3530Ù$3c198d79-c46a-4781-8bd1-b6b68f06c31fÙ$77093b36-c232-4477-be49-845f1a631829Ù$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfÙ$9cef898e-192c-418a-bec6-511f8b6da179Ù$4c2d45e3-56a2-467f-b87f-7b98cb873a05Ù$191f8429-cbbb-44aa-8beb-271a94293e4bÙ$e9633e3f-376d-413d-bc19-d015f6ce76e5¬power_slider’Ù$c8f85081-3659-4796-8550-2e708b09c8d7Ù$087cbe82-b42a-4f80-a1af-97f3aa93aeeb²upstream_cells_map‰¤Base�¡:�¥@bind�¨Base.get�«PlutoRunner�¦Slider�¯Core.applicable�¤Core�·PlutoRunner.create_bond�Ù$cbabee34-2ca2-4ad4-93ba-2ec3c941da5e„´precedence_heuristic §cell_idÙ$cbabee34-2ca2-4ad4-93ba-2ec3c941da5e´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$819f15ef-31d0-44b6-837a-e3e67f2667b9„´precedence_heuristic §cell_idÙ$819f15ef-31d0-44b6-837a-e3e67f2667b9´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$087cbe82-b42a-4f80-a1af-97f3aa93aeeb„´precedence_heuristic §cell_idÙ$087cbe82-b42a-4f80-a1af-97f3aa93aeeb´downstream_cells_map€²upstream_cells_mapƒ§@md_str�¨getindex�¬power_slider‘Ù$2381babe-0777-45db-acff-cc647a8a68d3Ù$57816e2c-a675-43e7-b674-2877ffcf1415„´precedence_heuristic §cell_idÙ$57816e2c-a675-43e7-b674-2877ffcf1415´downstream_cells_map‚¡p˜Ù$59ac02af-7b54-44d4-b5f4-a0f60d4458a1Ù$08dcbbd3-a531-4f74-a724-1cae8fae1636Ù$4be6cea4-13a2-4bcb-b849-14eef57ab604Ù$9efb7a71-9a03-4716-8d34-aae233e9b898Ù$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253Ù$59254bfd-48f2-4585-9ba5-e4c809421072Ù$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fdÙ$0e3fb524-bea1-4ef0-9589-36230a84e949¨p_picker‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949²upstream_cells_map‰¦primes�¤Base�¥@bind�¨Base.get�«PlutoRunner�¦Slider�¯Core.applicable�¤Core�·PlutoRunner.create_bond�Ù$ba16d83d-21a5-4f0c-807b-674a167da4dc„´precedence_heuristic §cell_idÙ$ba16d83d-21a5-4f0c-807b-674a167da4dc´downstream_cells_map�¦biblio’Ù$6c3595d2-4f68-44da-90e7-dc9c68479bcfÙ$8a5a251f-5373-445a-97b1-4d652c6b7ba8²upstream_cells_map�¬load_biblio!�Ù$9cef898e-192c-418a-bec6-511f8b6da179„´precedence_heuristic §cell_idÙ$9cef898e-192c-418a-bec6-511f8b6da179´downstream_cells_map€²upstream_cells_map‚¥power‘Ù$2381babe-0777-45db-acff-cc647a8a68d3®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$ed023033-1044-4d48-aab1-39e9300043f7„´precedence_heuristic §cell_idÙ$ed023033-1044-4d48-aab1-39e9300043f7´downstream_cells_map€²upstream_cells_mapƒ§@md_str�¨getindex�¤cite‘Ù$6c3595d2-4f68-44da-90e7-dc9c68479bcfÙ$40b8e474-16e0-4a61-bb28-11d90beefeea„´precedence_heuristic §cell_idÙ$40b8e474-16e0-4a61-bb28-11d90beefeea´downstream_cells_map€²upstream_cells_map†¥gcd_b‘Ù$f39cccac-5b24-46e4-8749-1b0a944542ef¡+�¥gcd_x‘Ù$aee611f2-bc86-4e85-bbcb-add78c6a9175¥gcd_y‘Ù$aee611f2-bc86-4e85-bbcb-add78c6a9175¡*�¥gcd_a‘Ù$1a4da418-147f-46f4-9b95-7955183aa5cfÙ$592ae01b-2819-402d-9538-17018df5c34b„´precedence_heuristic §cell_idÙ$592ae01b-2819-402d-9538-17018df5c34b´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$6e59ee60-ef73-45ca-86eb-4d8a44c73771„´precedence_heuristic §cell_idÙ$6e59ee60-ef73-45ca-86eb-4d8a44c73771´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$e1b5733f-a7a8-458f-a345-b358b9a03fcf„´precedence_heuristic §cell_idÙ$e1b5733f-a7a8-458f-a345-b358b9a03fcf´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$b57adc77-3783-4958-91a0-e90782338755„´precedence_heuristic §cell_idÙ$b57adc77-3783-4958-91a0-e90782338755´downstream_cells_map‚¡a•Ù$31388128-33a3-4443-835e-74b91bf48268Ù$87fdefa1-3bbd-4b69-ad3a-72baca6e55eeÙ$a1628317-7937-4316-85bf-2da860effce3Ù$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3Ù$4e35d650-b9a6-4668-90f0-f27a50af29ad¨slider_a‘Ù$4e35d650-b9a6-4668-90f0-f27a50af29ad²upstream_cells_map‰¤Base�¡:�¥@bind�¨Base.get�«PlutoRunner�¦Slider�¯Core.applicable�¤Core�·PlutoRunner.create_bond�Ù$e505716d-af01-455f-a55a-a9c225822ad5„´precedence_heuristic §cell_idÙ$e505716d-af01-455f-a55a-a9c225822ad5´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$0ee6972c-5069-4ba0-887f-be64c7d000d0„´precedence_heuristic §cell_idÙ$0ee6972c-5069-4ba0-887f-be64c7d000d0´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$2cb5c6e0-b431-4d2e-b023-cd2131112eca„´precedence_heuristic §cell_idÙ$2cb5c6e0-b431-4d2e-b023-cd2131112eca´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$93aa2719-f962-497b-9fda-30f54fd848eb„´precedence_heuristic §cell_idÙ$93aa2719-f962-497b-9fda-30f54fd848eb´downstream_cells_map€²upstream_cells_map…¦modinv‘Ù$21df1900-3954-4506-b759-aeeee664d1df§collect�¡:�£mod�¡*�Ù$9722971a-16f1-4f28-ba31-c12b673b8a30„´precedence_heuristic §cell_idÙ$9722971a-16f1-4f28-ba31-c12b673b8a30´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$909b8a36-79bb-4c1a-9dd7-4acaffc0434e„´precedence_heuristic §cell_idÙ$909b8a36-79bb-4c1a-9dd7-4acaffc0434e´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$a7985d16-500b-4024-aaa1-78e654b94be4„´precedence_heuristic §cell_idÙ$a7985d16-500b-4024-aaa1-78e654b94be4´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$9752afbb-96e6-4f96-92cb-09654cf46155„´precedence_heuristic §cell_idÙ$9752afbb-96e6-4f96-92cb-09654cf46155´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$6ed7c73d-60da-4908-85cb-958745d81ebc„´precedence_heuristic §cell_idÙ$6ed7c73d-60da-4908-85cb-958745d81ebc´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$eb311761-ace2-4632-9ebf-9c7c166659f7„´precedence_heuristic §cell_idÙ$eb311761-ace2-4632-9ebf-9c7c166659f7´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$9e8a61d9-a700-4851-b1cd-49ce042c3530„´precedence_heuristic §cell_idÙ$9e8a61d9-a700-4851-b1cd-49ce042c3530´downstream_cells_map€²upstream_cells_mapÞ¬Base.GC_Diff�¡^�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�³Base.gc_alloc_count�«Base.string�¥power‘Ù$2381babe-0777-45db-acff-cc647a8a68d3¦Base.-�¿Base.cumulative_compile_time_ns�¤Base�¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�£big�¾Base.cumulative_compile_timing�Ù$256c8009-4d2b-42f8-adaa-6f238ef22c6d„´precedence_heuristic §cell_idÙ$256c8009-4d2b-42f8-adaa-6f238ef22c6d´downstream_cells_map‚¡n•Ù$31388128-33a3-4443-835e-74b91bf48268Ù$87fdefa1-3bbd-4b69-ad3a-72baca6e55eeÙ$a1628317-7937-4316-85bf-2da860effce3Ù$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3Ù$4e35d650-b9a6-4668-90f0-f27a50af29ad¨slider_n‘Ù$4e35d650-b9a6-4668-90f0-f27a50af29ad²upstream_cells_map‰¤Base�¡:�¥@bind�¨Base.get�«PlutoRunner�¦Slider�¯Core.applicable�¤Core�·PlutoRunner.create_bond�Ù$c8f85081-3659-4796-8550-2e708b09c8d7„´precedence_heuristic §cell_idÙ$c8f85081-3659-4796-8550-2e708b09c8d7´downstream_cells_map€²upstream_cells_mapƒ§@md_str�¨getindex�¬power_slider‘Ù$2381babe-0777-45db-acff-cc647a8a68d3Ù$6332b2f2-ed2f-448a-b1df-247b110e335b„´precedence_heuristic §cell_idÙ$6332b2f2-ed2f-448a-b1df-247b110e335b´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$35b7b8b7-bff6-4f64-91b9-b65035162365„´precedence_heuristic §cell_idÙ$35b7b8b7-bff6-4f64-91b9-b65035162365´downstream_cells_map€²upstream_cells_mapƒ§@md_str�¨getindex�¤cite‘Ù$6c3595d2-4f68-44da-90e7-dc9c68479bcfÙ$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0„´precedence_heuristic §cell_idÙ$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0´downstream_cells_map�¤pgcd‘Ù$fe2af566-4a8b-4052-9915-85266ee5ce98²upstream_cells_mapƒ¢==�§println�£mod�Ù$77093b36-c232-4477-be49-845f1a631829„´precedence_heuristic §cell_idÙ$77093b36-c232-4477-be49-845f1a631829´downstream_cells_map�¨pow_1000’Ù$6f10de7b-ce05-4f82-82e7-4110be44e8ccÙ$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986²upstream_cells_mapÞ¾Base.cumulative_compile_timing�¬Base.GC_Diff�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�³Base.gc_alloc_count�«Base.string�¥power‘Ù$2381babe-0777-45db-acff-cc647a8a68d3¦Base.-�¿Base.cumulative_compile_time_ns�¤Base�¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$bd0c0258-7040-42e7-a20e-532b55af3a62„´precedence_heuristic §cell_idÙ$bd0c0258-7040-42e7-a20e-532b55af3a62´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$cd481f6c-66f4-4ebf-9769-c3edc24f403b„´precedence_heuristic §cell_idÙ$cd481f6c-66f4-4ebf-9769-c3edc24f403b´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$58da5ba4-c858-4684-a9f4-5a39fdc4fb03„´precedence_heuristic §cell_idÙ$58da5ba4-c858-4684-a9f4-5a39fdc4fb03´downstream_cells_map�ªfast_power’Ù$3c198d79-c46a-4781-8bd1-b6b68f06c31fÙ$8670abc2-63e6-496a-b20c-812197acd9ad²upstream_cells_map†¢==�£one�£mod�¡-�¨Function�£div�Ù$16b677e4-c467-462a-b770-b7a31160e129„´precedence_heuristic §cell_idÙ$16b677e4-c467-462a-b770-b7a31160e129´downstream_cells_map�ªprime_list’Ù$4c2d45e3-56a2-467f-b87f-7b98cb873a05Ù$191f8429-cbbb-44aa-8beb-271a94293e4b²upstream_cells_map‚¦primes�¬primes_upper‘Ù$67093a35-8e1b-4cd3-b11b-c7ff601f802eÙ$1b1d5c9b-5fc7-480e-9649-e9c44a49c38d„´precedence_heuristic§cell_idÙ$1b1d5c9b-5fc7-480e-9649-e9c44a49c38d´downstream_cells_map€²upstream_cells_map�§include�Ù$1ca71c26-f98c-4126-a1c5-98786fde7e9b„´precedence_heuristic §cell_idÙ$1ca71c26-f98c-4126-a1c5-98786fde7e9b´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$191f8429-cbbb-44aa-8beb-271a94293e4b„´precedence_heuristic §cell_idÙ$191f8429-cbbb-44aa-8beb-271a94293e4b´downstream_cells_map€²upstream_cells_map…ªprime_list‘Ù$16b677e4-c467-462a-b770-b7a31160e129¹chinese_remainder_theorem‘Ù$821de132-559b-4420-b866-e97134c5bd9a¥power‘Ù$2381babe-0777-45db-acff-cc647a8a68d3£big�®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$59ac02af-7b54-44d4-b5f4-a0f60d4458a1„´precedence_heuristic §cell_idÙ$59ac02af-7b54-44d4-b5f4-a0f60d4458a1´downstream_cells_map�ªall_powers”Ù$9f55cad1-b01a-45e3-93df-a4349e2dfbd3Ù$e2a3842d-4e07-4703-ab47-a5140649dd6aÙ$08dcbbd3-a531-4f74-a724-1cae8fae1636Ù$4be6cea4-13a2-4bcb-b849-14eef57ab604²upstream_cells_map…¡p‘Ù$57816e2c-a675-43e7-b674-2877ffcf1415¡:�¡g‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949¡-�®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$7f9bd301-355b-43f5-b168-22fac9e52511„´precedence_heuristic §cell_idÙ$7f9bd301-355b-43f5-b168-22fac9e52511´downstream_cells_map€²upstream_cells_map‚­Primes.primes�¦Primes‘Ù$06679a09-47d7-4024-8232-4954c08747a0Ù$d1b260fb-7500-47fb-bb48-21b5857ab55a„´precedence_heuristic §cell_idÙ$d1b260fb-7500-47fb-bb48-21b5857ab55a´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$3cd40d9e-fcea-427d-9877-cea65e7ea413„´precedence_heuristic §cell_idÙ$3cd40d9e-fcea-427d-9877-cea65e7ea413´downstream_cells_map€²upstream_cells_mapÞ¬Base.GC_Diff�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�«Base.string�¿Base.cumulative_compile_time_ns�³Base.gc_alloc_count�¦Base.-�§fib_seq‘Ù$462fa407-d973-4e9e-8512-b7cd3bb98b7b¤Base�¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�¾Base.cumulative_compile_timing�Ù$67093a35-8e1b-4cd3-b11b-c7ff601f802e„´precedence_heuristic §cell_idÙ$67093a35-8e1b-4cd3-b11b-c7ff601f802e´downstream_cells_map�¬primes_upper‘Ù$16b677e4-c467-462a-b770-b7a31160e129²upstream_cells_map‹¡:�«PlutoRunner�¯Core.applicable�¤Core�¤Base�¨Base.get�§@md_str�¨getindex�¦Slider�¥@bind�·PlutoRunner.create_bond�Ù$ac5e1516-1574-4893-a965-f799947076cb„´precedence_heuristic §cell_idÙ$ac5e1516-1574-4893-a965-f799947076cb´downstream_cells_map€²upstream_cells_mapÞ¬Base.GC_Diff�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�«Base.string�¿Base.cumulative_compile_time_ns�³Base.gc_alloc_count�¦Base.-�¤Base�¨fib_diag‘Ù$d830fffd-3781-40ca-85cb-c242f99667ce¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�¾Base.cumulative_compile_timing�Ù$a826d9d1-47db-4645-be6e-3ae0ed8d4e18„´precedence_heuristic §cell_idÙ$a826d9d1-47db-4645-be6e-3ae0ed8d4e18´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$fe2af566-4a8b-4052-9915-85266ee5ce98„´precedence_heuristic §cell_idÙ$fe2af566-4a8b-4052-9915-85266ee5ce98´downstream_cells_map€²upstream_cells_mapƒ¥gcd_a‘Ù$1a4da418-147f-46f4-9b95-7955183aa5cf¥gcd_b‘Ù$f39cccac-5b24-46e4-8749-1b0a944542ef¤pgcd‘Ù$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0Ù$ee43c389-55f4-4cf9-a8db-ce37d1b89db4„´precedence_heuristic §cell_idÙ$ee43c389-55f4-4cf9-a8db-ce37d1b89db4´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$e9633e3f-376d-413d-bc19-d015f6ce76e5„´precedence_heuristic §cell_idÙ$e9633e3f-376d-413d-bc19-d015f6ce76e5´downstream_cells_map€²upstream_cells_mapƒ¡^�¥power‘Ù$2381babe-0777-45db-acff-cc647a8a68d3£big�Ù$37585789-bd43-4ce5-b550-ad712b70d226„´precedence_heuristic §cell_idÙ$37585789-bd43-4ce5-b550-ad712b70d226´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$61462af5-69bd-42be-8918-7992c79ee00d„´precedence_heuristic §cell_idÙ$61462af5-69bd-42be-8918-7992c79ee00d´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4„´precedence_heuristic §cell_idÙ$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$4cb070de-e8bf-4a1d-9625-043c19466c46„´precedence_heuristic §cell_idÙ$4cb070de-e8bf-4a1d-9625-043c19466c46´downstream_cells_map€²upstream_cells_mapÞ§fib_pow‘Ù$38744170-9af6-44b5-a0be-46a83da3253e¬Base.GC_Diff�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�«Base.string�¿Base.cumulative_compile_time_ns�³Base.gc_alloc_count�¦Base.-�¤Base�¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�¾Base.cumulative_compile_timing�Ù$192f608c-0563-4179-903f-49fad2db4c74„´precedence_heuristic §cell_idÙ$192f608c-0563-4179-903f-49fad2db4c74´downstream_cells_map€²upstream_cells_mapÞ§fib_pow‘Ù$38744170-9af6-44b5-a0be-46a83da3253e¬Base.GC_Diff�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�«Base.string�¿Base.cumulative_compile_time_ns�³Base.gc_alloc_count�¦Base.-�¤Base�¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�¾Base.cumulative_compile_timing�Ù$a293bb0e-078d-4335-a446-3096a79c03bc„´precedence_heuristic §cell_idÙ$a293bb0e-078d-4335-a446-3096a79c03bc´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$a1081bb2-2186-4b19-b667-0c246155f360„´precedence_heuristic §cell_idÙ$a1081bb2-2186-4b19-b667-0c246155f360´downstream_cells_map€²upstream_cells_mapÞ§fib_pow‘Ù$38744170-9af6-44b5-a0be-46a83da3253e¬Base.GC_Diff�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�«Base.string�¿Base.cumulative_compile_time_ns�³Base.gc_alloc_count�¦Base.-�¤Base�¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�¾Base.cumulative_compile_timing�Ù$d8a28762-8aab-49e9-b9ac-38901d34abff„´precedence_heuristic §cell_idÙ$d8a28762-8aab-49e9-b9ac-38901d34abff´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$15367f3b-c7e4-4004-a018-5422a7f22024„´precedence_heuristic §cell_idÙ$15367f3b-c7e4-4004-a018-5422a7f22024´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$9207b107-e1b0-4328-a004-f4b8152b423f„´precedence_heuristic §cell_idÙ$9207b107-e1b0-4328-a004-f4b8152b423f´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$aee611f2-bc86-4e85-bbcb-add78c6a9175„´precedence_heuristic §cell_idÙ$aee611f2-bc86-4e85-bbcb-add78c6a9175´downstream_cells_mapƒ¥gcd_x‘Ù$40b8e474-16e0-4a61-bb28-11d90beefeea¥gcd_g�¥gcd_y‘Ù$40b8e474-16e0-4a61-bb28-11d90beefeea²upstream_cells_mapƒ¥pgcdx‘Ù$3f1af973-a02b-4e06-8e6e-eff414fcaf67¥gcd_b‘Ù$f39cccac-5b24-46e4-8749-1b0a944542ef¥gcd_a‘Ù$1a4da418-147f-46f4-9b95-7955183aa5cfÙ$b319619e-8f8d-4650-8fb4-76e5ba953470„´precedence_heuristic §cell_idÙ$b319619e-8f8d-4650-8fb4-76e5ba953470´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$642d545f-b1b9-49da-8a03-ad63e3214f59„´precedence_heuristic §cell_idÙ$642d545f-b1b9-49da-8a03-ad63e3214f59´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$a7d06375-e4dd-47b1-8aba-11dc4d62954b„´precedence_heuristic §cell_idÙ$a7d06375-e4dd-47b1-8aba-11dc4d62954b´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$65f4990f-1952-4682-8fa8-9e3dd4bf1ebf„´precedence_heuristic §cell_idÙ$65f4990f-1952-4682-8fa8-9e3dd4bf1ebf´downstream_cells_map�§pow_999’Ù$6f10de7b-ce05-4f82-82e7-4110be44e8ccÙ$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986²upstream_cells_mapÞ¾Base.cumulative_compile_timing�¬Base.GC_Diff�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�³Base.gc_alloc_count�«Base.string�¥power‘Ù$2381babe-0777-45db-acff-cc647a8a68d3¦Base.-�¿Base.cumulative_compile_time_ns�¤Base�¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$0e3fb524-bea1-4ef0-9589-36230a84e949„´precedence_heuristic §cell_idÙ$0e3fb524-bea1-4ef0-9589-36230a84e949´downstream_cells_map‚¡gšÙ$59ac02af-7b54-44d4-b5f4-a0f60d4458a1Ù$08dcbbd3-a531-4f74-a724-1cae8fae1636Ù$4be6cea4-13a2-4bcb-b849-14eef57ab604Ù$9efb7a71-9a03-4716-8d34-aae233e9b898Ù$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253Ù$ce07d5c5-90a3-4c12-bada-30e4da1b99fdÙ$ae89661a-2c0f-4752-adc2-023f09dc0e9fÙ$4a98507b-653e-4354-a825-7605f8fcb31bÙ$59254bfd-48f2-4585-9ba5-e4c809421072Ù$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fd©gp_picker’Ù$4cff1d10-422f-4b12-b790-a589c972fbb7Ù$059b0ada-2442-48e4-82dd-489cb97e5dcc²upstream_cells_map�¡p‘Ù$57816e2c-a675-43e7-b674-2877ffcf1415¡:�«PlutoRunner�¡-�¯Core.applicable�¤Core�¦HAlign�¤Base�¨p_picker‘Ù$57816e2c-a675-43e7-b674-2877ffcf1415¨Base.get�¨getindex�§@md_str�¦Slider�¥@bind�·PlutoRunner.create_bond�Ù$78df9410-5ea4-4d9f-bbe5-862f76a100fc„´precedence_heuristic §cell_idÙ$78df9410-5ea4-4d9f-bbe5-862f76a100fc´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986„´precedence_heuristic §cell_idÙ$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986´downstream_cells_map€²upstream_cells_mapƒ§pow_999‘Ù$65f4990f-1952-4682-8fa8-9e3dd4bf1ebf¨pow_1000‘Ù$77093b36-c232-4477-be49-845f1a631829¹chinese_remainder_theorem‘Ù$821de132-559b-4420-b866-e97134c5bd9aÙ$8b16a522-9be4-4286-b64d-3d1bbdef7142„´precedence_heuristic §cell_idÙ$8b16a522-9be4-4286-b64d-3d1bbdef7142´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$c376513c-6553-4cd6-8384-ae6ff9d472d7„´precedence_heuristic §cell_idÙ$c376513c-6553-4cd6-8384-ae6ff9d472d7´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$3da58487-192f-458a-9d47-7a4ce98b6da3„´precedence_heuristic §cell_idÙ$3da58487-192f-458a-9d47-7a4ce98b6da3´downstream_cells_map€²upstream_cells_map�§section�Ù$64eb4b52-4946-467c-867a-a6fc437b15f6„´precedence_heuristic §cell_idÙ$64eb4b52-4946-467c-867a-a6fc437b15f6´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$31388128-33a3-4443-835e-74b91bf48268„´precedence_heuristic §cell_idÙ$31388128-33a3-4443-835e-74b91bf48268´downstream_cells_map€²upstream_cells_map…¡a‘Ù$b57adc77-3783-4958-91a0-e90782338755¡n‘Ù$256c8009-4d2b-42f8-adaa-6f238ef22c6d£mod�¡+�¡b‘Ù$18031ccb-657f-409a-9080-9a0ada3ae8b5Ù$4714b7d7-32ee-42a1-bfa5-93eafda739d3„´precedence_heuristic §cell_idÙ$4714b7d7-32ee-42a1-bfa5-93eafda739d3´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$d882afdd-eb85-467c-bf18-525c0c5da5e7„´precedence_heuristic §cell_idÙ$d882afdd-eb85-467c-bf18-525c0c5da5e7´downstream_cells_map€²upstream_cells_mapÞ¬Base.GC_Diff�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�«Base.string�¿Base.cumulative_compile_time_ns�³Base.gc_alloc_count�¦Base.-�¤Base�¨fib_diag‘Ù$d830fffd-3781-40ca-85cb-c242f99667ce¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�¾Base.cumulative_compile_timing�Ù$a7d9703a-5121-4b43-8cd4-2acf9a0d91ef„´precedence_heuristic §cell_idÙ$a7d9703a-5121-4b43-8cd4-2acf9a0d91ef´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$38744170-9af6-44b5-a0be-46a83da3253e„´precedence_heuristic §cell_idÙ$38744170-9af6-44b5-a0be-46a83da3253e´downstream_cells_map�§fib_pow“Ù$a1081bb2-2186-4b19-b667-0c246155f360Ù$4cb070de-e8bf-4a1d-9625-043c19466c46Ù$192f608c-0563-4179-903f-49fad2db4c74²upstream_cells_map„¡^�¡-�¦BigInt�¡*�Ù$f86a5efc-d31e-4e88-b81f-ebdbbeba11ec„´precedence_heuristic §cell_idÙ$f86a5efc-d31e-4e88-b81f-ebdbbeba11ec´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$8315b53f-abca-483d-bbf6-7e9193e751c9„´precedence_heuristic §cell_idÙ$8315b53f-abca-483d-bbf6-7e9193e751c9´downstream_cells_map�¨draw_fib‘Ù$708c442b-cbff-4e1a-b70d-e704453cfd3d²upstream_cells_mapÞ¨fontsize�¡/�¦isless�¥isodd�¦sethue�°Luxor.background�ªsetopacity�£min�¬Luxor.origin�¡-�¥@draw�¤rect�£mod�¡+�£sum�¤text�¬Luxor.sethue�­Luxor.preview�­Luxor.Drawing�¥push!�¡:�¥Point�¬Luxor.finish�¦iseven�¢==�¦string�¶distinguishable_colors�§maximum�¡*�¥Luxor‘Ù$06679a09-47d7-4024-8232-4954c08747a0£div�Ù$08b18315-c28e-44ed-beb2-5b17421b0224„´precedence_heuristic §cell_idÙ$08b18315-c28e-44ed-beb2-5b17421b0224´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253„´precedence_heuristic §cell_idÙ$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253´downstream_cells_map€²upstream_cells_map†¡x‘Ù$9efb7a71-9a03-4716-8d34-aae233e9b898¡p‘Ù$57816e2c-a675-43e7-b674-2877ffcf1415©isnothing�¡g‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949¡!�®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$e52d25b3-65bf-4617-ae8d-fae0d0c8d041„´precedence_heuristic §cell_idÙ$e52d25b3-65bf-4617-ae8d-fae0d0c8d041´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$462fa407-d973-4e9e-8512-b7cd3bb98b7b„´precedence_heuristic §cell_idÙ$462fa407-d973-4e9e-8512-b7cd3bb98b7b´downstream_cells_map�§fib_seq‘Ù$3cd40d9e-fcea-427d-9877-cea65e7ea413²upstream_cells_map…¥zeros�¡:�¡+�¡-�¦BigInt�Ù$ca8905ef-97a3-424c-bb2e-559f7151585b„´precedence_heuristic §cell_idÙ$ca8905ef-97a3-424c-bb2e-559f7151585b´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$09f44611-ba21-4982-ba1b-0691124642fc„´precedence_heuristic §cell_idÙ$09f44611-ba21-4982-ba1b-0691124642fc´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$18031ccb-657f-409a-9080-9a0ada3ae8b5„´precedence_heuristic §cell_idÙ$18031ccb-657f-409a-9080-9a0ada3ae8b5´downstream_cells_map‚¡b•Ù$31388128-33a3-4443-835e-74b91bf48268Ù$87fdefa1-3bbd-4b69-ad3a-72baca6e55eeÙ$a1628317-7937-4316-85bf-2da860effce3Ù$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3Ù$4e35d650-b9a6-4668-90f0-f27a50af29ad¨slider_b‘Ù$4e35d650-b9a6-4668-90f0-f27a50af29ad²upstream_cells_map‰¤Base�¡:�¥@bind�¨Base.get�«PlutoRunner�¦Slider�¯Core.applicable�¤Core�·PlutoRunner.create_bond�Ù$d81bbd74-42df-4bb2-a045-9c2642cc19e5„´precedence_heuristic §cell_idÙ$d81bbd74-42df-4bb2-a045-9c2642cc19e5´downstream_cells_map€²upstream_cells_map�ªabn_picker‘Ù$4e35d650-b9a6-4668-90f0-f27a50af29adÙ$4be6cea4-13a2-4bcb-b849-14eef57ab604„´precedence_heuristic §cell_idÙ$4be6cea4-13a2-4bcb-b849-14eef57ab604´downstream_cells_map€²upstream_cells_mapŠ¢==�¤sort�¡p‘Ù$57816e2c-a675-43e7-b674-2877ffcf1415¦length�¡g‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949¨getindex�§@md_str�¡-�¦unique�ªall_powers‘Ù$59ac02af-7b54-44d4-b5f4-a0f60d4458a1Ù$1072a756-5026-4de9-93a8-f942d54c474a„´precedence_heuristic §cell_idÙ$1072a756-5026-4de9-93a8-f942d54c474a´downstream_cells_map€²upstream_cells_mapƒ§@md_str�¨getindex�¤cite‘Ù$6c3595d2-4f68-44da-90e7-dc9c68479bcfÙ$6107d03d-1e45-4eb9-b8e2-51e4a72485e6„´precedence_heuristic §cell_idÙ$6107d03d-1e45-4eb9-b8e2-51e4a72485e6´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$87fdefa1-3bbd-4b69-ad3a-72baca6e55ee„´precedence_heuristic §cell_idÙ$87fdefa1-3bbd-4b69-ad3a-72baca6e55ee´downstream_cells_map€²upstream_cells_map…¡a‘Ù$b57adc77-3783-4958-91a0-e90782338755¡n‘Ù$256c8009-4d2b-42f8-adaa-6f238ef22c6d£mod�¡+�¡b‘Ù$18031ccb-657f-409a-9080-9a0ada3ae8b5Ù$48eba223-6cce-4aa2-9977-4883ba7903fc„´precedence_heuristic §cell_idÙ$48eba223-6cce-4aa2-9977-4883ba7903fc´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$72ec8410-05d9-475a-93d4-47153cc0ce31„´precedence_heuristic §cell_idÙ$72ec8410-05d9-475a-93d4-47153cc0ce31´downstream_cells_map�§fib_rec‘Ù$027fe67c-d2f0-49f6-b894-959795551d27²upstream_cells_mapƒ¢==�¡+�¡-�Ù$1a4da418-147f-46f4-9b95-7955183aa5cf„´precedence_heuristic §cell_idÙ$1a4da418-147f-46f4-9b95-7955183aa5cf´downstream_cells_map�¥gcd_a”Ù$fe2af566-4a8b-4052-9915-85266ee5ce98Ù$aee611f2-bc86-4e85-bbcb-add78c6a9175Ù$40b8e474-16e0-4a61-bb28-11d90beefeeaÙ$eeaec4f4-71bd-43df-b9c9-a00bc3b1864b²upstream_cells_map�¡:�¥Int32�«PlutoRunner�¯Core.applicable�¤Core�¤Base�¨Base.get�§@md_str�¨getindex�¦Slider�¥@bind�§typemax�·PlutoRunner.create_bond�Ù$7da0705e-c925-4f8d-9ca4-8d8a0f859fea„´precedence_heuristic §cell_idÙ$7da0705e-c925-4f8d-9ca4-8d8a0f859fea´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66b„´precedence_heuristic §cell_idÙ$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66b´downstream_cells_map€²upstream_cells_mapÞ¬Base.GC_Diff�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�ªfib_closed‘Ù$535f4bc1-e88c-47c7-990b-e3c8b5054acc«Base.string�¿Base.cumulative_compile_time_ns�¦Base.-�³Base.gc_alloc_count�¤Base�¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�¾Base.cumulative_compile_timing�Ù$82ba8fe1-435e-422b-abb7-cb50a7a85e1e„´precedence_heuristic §cell_idÙ$82ba8fe1-435e-422b-abb7-cb50a7a85e1e´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$f39cccac-5b24-46e4-8749-1b0a944542ef„´precedence_heuristic §cell_idÙ$f39cccac-5b24-46e4-8749-1b0a944542ef´downstream_cells_map�¥gcd_b”Ù$fe2af566-4a8b-4052-9915-85266ee5ce98Ù$aee611f2-bc86-4e85-bbcb-add78c6a9175Ù$40b8e474-16e0-4a61-bb28-11d90beefeeaÙ$eeaec4f4-71bd-43df-b9c9-a00bc3b1864b²upstream_cells_map�¡:�¥Int32�«PlutoRunner�¯Core.applicable�¤Core�¤Base�¨Base.get�§@md_str�¨getindex�¦Slider�¥@bind�§typemax�·PlutoRunner.create_bond�Ù$c5e906c8-0f73-4955-baa7-337195329e04„´precedence_heuristic §cell_idÙ$c5e906c8-0f73-4955-baa7-337195329e04´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6„´precedence_heuristic §cell_idÙ$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$bc9a718f-4b97-4e15-acf8-d180abc5b6d5„´precedence_heuristic §cell_idÙ$bc9a718f-4b97-4e15-acf8-d180abc5b6d5´downstream_cells_map€²upstream_cells_map„¢qa�§@md_str�¨getindex�¤cite‘Ù$6c3595d2-4f68-44da-90e7-dc9c68479bcfÙ$41cf9efd-65e5-4abb-94d3-e824780e659c„´precedence_heuristic §cell_idÙ$41cf9efd-65e5-4abb-94d3-e824780e659c´downstream_cells_map€²upstream_cells_map�¤refs‘Ù$8a5a251f-5373-445a-97b1-4d652c6b7ba8Ù$1e27eedc-5308-4608-863f-fb81d60acdf0„´precedence_heuristic §cell_idÙ$1e27eedc-5308-4608-863f-fb81d60acdf0´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$a59a20e2-a7c7-48a9-ad8d-8094e03a749d„´precedence_heuristic §cell_idÙ$a59a20e2-a7c7-48a9-ad8d-8094e03a749d´downstream_cells_map€²upstream_cells_map…¦modinv‘Ù$21df1900-3954-4506-b759-aeeee664d1df§collect�¡:�£mod�¡*�Ù$3c198d79-c46a-4781-8bd1-b6b68f06c31f„´precedence_heuristic §cell_idÙ$3c198d79-c46a-4781-8bd1-b6b68f06c31f´downstream_cells_map€²upstream_cells_mapÞ¬Base.GC_Diff�¥@time�¯Base.time_print�«Base.gc_num�»Base.Threads.lock_profiling�¿Base.cumulative_compile_time_ns�«Base.string�¥power‘Ù$2381babe-0777-45db-acff-cc647a8a68d3¦Base.-�³Base.gc_alloc_count�ªfast_power‘Ù$58da5ba4-c858-4684-a9f4-5a39fdc4fb03¤Base�¬Base.time_ns�¦Base./�¦Base.*�¨Base.===�£big�¡*�¾Base.cumulative_compile_timing�Ù$03e49669-cdee-4241-862d-33ee91214455„´precedence_heuristic §cell_idÙ$03e49669-cdee-4241-862d-33ee91214455´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$6f10de7b-ce05-4f82-82e7-4110be44e8cc„´precedence_heuristic §cell_idÙ$6f10de7b-ce05-4f82-82e7-4110be44e8cc´downstream_cells_map€²upstream_cells_map†¦modinv‘Ù$21df1900-3954-4506-b759-aeeee664d1df§pow_999‘Ù$65f4990f-1952-4682-8fa8-9e3dd4bf1ebf¨pow_1000‘Ù$77093b36-c232-4477-be49-845f1a631829£mod�¡+�¡*�Ù$059b0ada-2442-48e4-82dd-489cb97e5dcc„´precedence_heuristic §cell_idÙ$059b0ada-2442-48e4-82dd-489cb97e5dcc´downstream_cells_map€²upstream_cells_map�©gp_picker‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949Ù$4853f4ef-fbb8-48c3-9523-13ab4969d097„´precedence_heuristic §cell_idÙ$4853f4ef-fbb8-48c3-9523-13ab4969d097´downstream_cells_map�ªbaby_steps’Ù$3026f9c5-81d3-443a-940a-f22fef9754afÙ$7330af43-bec3-460c-94f6-768ac2975b00²upstream_cells_map…£one�¥push!�¡:�£mod�¡*�Ù$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1„´precedence_heuristic §cell_idÙ$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1´downstream_cells_map€²upstream_cells_map…¦modinv‘Ù$21df1900-3954-4506-b759-aeeee664d1df§collect�¡:�£mod�¡*�Ù$0c8ab02e-80b0-44d6-a4a8-c813aac38209„´precedence_heuristic §cell_idÙ$0c8ab02e-80b0-44d6-a4a8-c813aac38209´downstream_cells_map‚¥fib_n‘Ù$708c442b-cbff-4e1a-b70d-e704453cfd3dªfib_picker‘Ù$708c442b-cbff-4e1a-b70d-e704453cfd3d²upstream_cells_map‰¤Base�¡:�¥@bind�¨Base.get�«PlutoRunner�¦Slider�¯Core.applicable�¤Core�·PlutoRunner.create_bond�Ù$3df688c8-1c52-462d-88be-daa153333c60„´precedence_heuristic §cell_idÙ$3df688c8-1c52-462d-88be-daa153333c60´downstream_cells_map€²upstream_cells_mapƒ§@md_str�¨getindex�¤cite‘Ù$6c3595d2-4f68-44da-90e7-dc9c68479bcfÙ$2c34c17e-12de-43ea-870c-818c97647836„´precedence_heuristic §cell_idÙ$2c34c17e-12de-43ea-870c-818c97647836´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$f6e22fc3-382e-4548-bc59-8f944e06d237„´precedence_heuristic §cell_idÙ$f6e22fc3-382e-4548-bc59-8f944e06d237´downstream_cells_map€²upstream_cells_map„¨Diagonal�£inv�¡*�¡E‘Ù$b5f3620d-0942-41bb-80b0-d2ddcfe65090Ù$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82„´precedence_heuristic §cell_idÙ$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82´downstream_cells_map€²upstream_cells_map�ªabn_picker‘Ù$4e35d650-b9a6-4668-90f0-f27a50af29adÙ$ce07d5c5-90a3-4c12-bada-30e4da1b99fd„´precedence_heuristic §cell_idÙ$ce07d5c5-90a3-4c12-bada-30e4da1b99fd´downstream_cells_map€²upstream_cells_mapƒ¡:�¡g‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$b5f3620d-0942-41bb-80b0-d2ddcfe65090„´precedence_heuristic §cell_idÙ$b5f3620d-0942-41bb-80b0-d2ddcfe65090´downstream_cells_map�¡E“Ù$6cf004be-5205-429e-8131-ef607cebeaecÙ$f6e22fc3-382e-4548-bc59-8f944e06d237Ù$d830fffd-3781-40ca-85cb-c242f99667ce²upstream_cells_map�¥eigen�Ù$4a98507b-653e-4354-a825-7605f8fcb31b„´precedence_heuristic §cell_idÙ$4a98507b-653e-4354-a825-7605f8fcb31b´downstream_cells_map€²upstream_cells_mapˆ¤conj�¡^�¡:�¡g‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949£mod�§adjoint�¡*�®fast_mod_power‘Ù$8670abc2-63e6-496a-b20c-812197acd9adÙ$736307ec-a2a4-11ef-0f85-ad1a0093e06a„´precedence_heuristic §cell_idÙ$736307ec-a2a4-11ef-0f85-ad1a0093e06a´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$a7afc0cb-a980-4f4f-b782-9791d932ee52„´precedence_heuristic §cell_idÙ$a7afc0cb-a980-4f4f-b782-9791d932ee52´downstream_cells_map€²upstream_cells_mapƒ§@md_str�¨getindex�¤cite‘Ù$6c3595d2-4f68-44da-90e7-dc9c68479bcfÙ$d830fffd-3781-40ca-85cb-c242f99667ce„´precedence_heuristic §cell_idÙ$d830fffd-3781-40ca-85cb-c242f99667ce´downstream_cells_map�¨fib_diag’Ù$ac5e1516-1574-4893-a965-f799947076cbÙ$d882afdd-eb85-467c-bf18-525c0c5da5e7²upstream_cells_map†¡^�¡D‘Ù$19ef447f-9fdf-49e1-8d1a-7860b4d4e9ba¡\�¡-�¡*�¡E‘Ù$b5f3620d-0942-41bb-80b0-d2ddcfe65090Ù$19ef447f-9fdf-49e1-8d1a-7860b4d4e9ba„´precedence_heuristic §cell_idÙ$19ef447f-9fdf-49e1-8d1a-7860b4d4e9ba´downstream_cells_map�¡D‘Ù$d830fffd-3781-40ca-85cb-c242f99667ce²upstream_cells_map‡¨Diagonal�¡/�¡+�¡-�¤sqrt�£big�£âˆš�Ù$21df1900-3954-4506-b759-aeeee664d1df„´precedence_heuristic §cell_idÙ$21df1900-3954-4506-b759-aeeee664d1df´downstream_cells_map�¦modinv–Ù$93aa2719-f962-497b-9fda-30f54fd848ebÙ$a59a20e2-a7c7-48a9-ad8d-8094e03a749dÙ$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1Ù$6f10de7b-ce05-4f82-82e7-4110be44e8ccÙ$821de132-559b-4420-b866-e97134c5bd9aÙ$3026f9c5-81d3-443a-940a-f22fef9754af²upstream_cells_map‚£mod�¤gcdx�Ù$06679a09-47d7-4024-8232-4954c08747a0„´precedence_heuristic§cell_idÙ$06679a09-47d7-4024-8232-4954c08747a0´downstream_cells_map†­LinearAlgebra�§PlutoUI�¦Primes‘Ù$7f9bd301-355b-43f5-b168-22fac9e52511¦Colors�¥Luxor‘Ù$8315b53f-abca-483d-bbf6-7e9193e751c9ªDataFrames�²upstream_cells_map€Ù$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2„´precedence_heuristic §cell_idÙ$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2´downstream_cells_map€²upstream_cells_map�ªframetitle�Ù$8a5a251f-5373-445a-97b1-4d652c6b7ba8„´precedence_heuristic §cell_idÙ$8a5a251f-5373-445a-97b1-4d652c6b7ba8´downstream_cells_map�¤refs‘Ù$41cf9efd-65e5-4abb-94d3-e824780e659c²upstream_cells_map‚§bibrefs�¦biblio‘Ù$ba16d83d-21a5-4f0c-807b-674a167da4dcÙ$9efb7a71-9a03-4716-8d34-aae233e9b898„´precedence_heuristic §cell_idÙ$9efb7a71-9a03-4716-8d34-aae233e9b898´downstream_cells_map�¡x‘Ù$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253²upstream_cells_mapƒ¡p‘Ù$57816e2c-a675-43e7-b674-2877ffcf1415¡g‘Ù$0e3fb524-bea1-4ef0-9589-36230a84e949¬discrete_log‘Ù$ec14d629-b720-47cd-bc08-ff96f49271abÙ$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82„´precedence_heuristic §cell_idÙ$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82´downstream_cells_map�©collision‘Ù$7330af43-bec3-460c-94f6-768ac2975b00²upstream_cells_map„¦haskey�©eachindex�¤Dict�¢=>�Ù$f4f49568-dcf2-4c76-ba66-065d2fda7a4a„´precedence_heuristic §cell_idÙ$f4f49568-dcf2-4c76-ba66-065d2fda7a4a´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$a1628317-7937-4316-85bf-2da860effce3„´precedence_heuristic §cell_idÙ$a1628317-7937-4316-85bf-2da860effce3´downstream_cells_map€²upstream_cells_map…¡a‘Ù$b57adc77-3783-4958-91a0-e90782338755¡n‘Ù$256c8009-4d2b-42f8-adaa-6f238ef22c6d£mod�¡b‘Ù$18031ccb-657f-409a-9080-9a0ada3ae8b5¡*�Ù$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3„´precedence_heuristic §cell_idÙ$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3´downstream_cells_map€²upstream_cells_map…¡a‘Ù$b57adc77-3783-4958-91a0-e90782338755¡n‘Ù$256c8009-4d2b-42f8-adaa-6f238ef22c6d£mod�¡b‘Ù$18031ccb-657f-409a-9080-9a0ada3ae8b5¡*�Ù$a41722b8-8c21-4d3c-a38b-4d248a79e80a„´precedence_heuristic §cell_idÙ$a41722b8-8c21-4d3c-a38b-4d248a79e80a´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21e„´precedence_heuristic §cell_idÙ$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21e´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$bc58ba24-90f0-4913-8f66-10bb6cb54076„´precedence_heuristic §cell_idÙ$bc58ba24-90f0-4913-8f66-10bb6cb54076´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�Ù$bafc9870-3823-4d1d-b0b7-94c69ee764d5„´precedence_heuristic §cell_idÙ$bafc9870-3823-4d1d-b0b7-94c69ee764d5´downstream_cells_map�³DocumenterCitations�²upstream_cells_map€Ù$d6b89fda-308f-43da-8028-1a812b4516cf„´precedence_heuristic §cell_idÙ$d6b89fda-308f-43da-8028-1a812b4516cf´downstream_cells_map€²upstream_cells_mapƒ¢qa�§@md_str�¨getindex�Ù$4e35d650-b9a6-4668-90f0-f27a50af29ad„´precedence_heuristic §cell_idÙ$4e35d650-b9a6-4668-90f0-f27a50af29ad´downstream_cells_map�ªabn_picker’Ù$d81bbd74-42df-4bb2-a045-9c2642cc19e5Ù$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82²upstream_cells_map‰¡a‘Ù$b57adc77-3783-4958-91a0-e90782338755¡n‘Ù$256c8009-4d2b-42f8-adaa-6f238ef22c6d£mod�¨getindex�¨slider_a‘Ù$b57adc77-3783-4958-91a0-e90782338755¨slider_n‘Ù$256c8009-4d2b-42f8-adaa-6f238ef22c6d§@md_str�¡b‘Ù$18031ccb-657f-409a-9080-9a0ada3ae8b5¨slider_b‘Ù$18031ccb-657f-409a-9080-9a0ada3ae8b5Ù$bbb2793a-faa4-43bd-b2e8-e8d3ac93310f„´precedence_heuristic §cell_idÙ$bbb2793a-faa4-43bd-b2e8-e8d3ac93310f´downstream_cells_map€²upstream_cells_map‚§@md_str�¨getindex�©shortpath«2_number.jl®last_save_timeËAÚ°áZ½Œ«notebook_idÙ$3b72b0fe-c0ad-11f1-8140-ebc9738c526d¥nbpkgŠ­busy_packages�Ù,waiting_for_permission_but_probably_disabled§enabledðterminal_outputsˆ­LinearAlgebraÚ5 Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Fixing stdlib dependencies and trying again... â”” @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Manifest.toml` Instantiating... === Precompiling... ===³DocumenterCitationsÚ5 Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Fixing stdlib dependencies and trying again... â”” @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Manifest.toml` Instantiating... === Precompiling... ===§PlutoUIÚ5 Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Fixing stdlib dependencies and trying again... â”” @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Manifest.toml` Instantiating... === Precompiling... ===ªnbpkg_syncÚ5 Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Fixing stdlib dependencies and trying again... â”” @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Manifest.toml` Instantiating... === Precompiling... ===¦PrimesÚ5 Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Fixing stdlib dependencies and trying again... â”” @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Manifest.toml` Instantiating... === Precompiling... ===¦ColorsÚ5 Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Fixing stdlib dependencies and trying again... â”” @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Manifest.toml` Instantiating... === Precompiling... ===¥LuxorÚ5 Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Fixing stdlib dependencies and trying again... â”” @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Manifest.toml` Instantiating... === Precompiling... ===ªDataFramesÚ5 Waiting for other notebooks to finish Pkg operations... === Resolving... === ┌ Warning: Pkg operation failed. Fixing stdlib dependencies and trying again... â”” @ GracefulPkg ~/.julia/packages/GracefulPkg/GQ6My/src/apply strategies.jl:96 Resolving... ===  Project No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_lobiqzmayg/Manifest.toml` Instantiating... === Precompiling... ===¶waiting_for_permission·restart_recommended_msgÀ´restart_required_msgÀ²installed_versions‰­LinearAlgebra¦stdlib³DocumenterCitations¥1.3.5Ù!__internal_julia_manifest_version¦1.13.1¸__internal_julia_version¦1.13.1§PlutoUI¦0.7.60¦Primes¥0.5.6¦Colors§0.12.11ªDataFrames¥1.7.0¥Luxor¥4.1.0¯install_time_nsÎ(}Äìinstantiatedípluto_version¦v1.0.4«in_temp_dirÂ