path:/home/runner/work/LSINC1113/LSINC1113/Lectures/2_number.jlcell_results$a7985d16-500b-4024-aaa1-78e654b94be4running§runtimeGdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a7985d16-500b-4024-aaa1-78e654b94be4depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBH has_pluto_hook_features¤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$.

persist_js_state$eb311761-ace2-4632-9ebf-9c7c166659f7running§runtimeŸdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$eb311761-ace2-4632-9ebf-9c7c166659f7depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Uj'has_pluto_hook_features¤bodyل

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

persist_js_state$d8a28762-8aab-49e9-b9ac-38901d34abffrunning§runtime!depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$d8a28762-8aab-49e9-b9ac-38901d34abffdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکC2has_pluto_hook_features¤bodyF

Fast powering

persist_js_state$a826d9d1-47db-4645-be6e-3ae0ed8d4e18running§runtimeE]depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a826d9d1-47db-4645-be6e-3ae0ed8d4e18depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?S:dhas_pluto_hook_features¤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}$$

persist_js_state$8f6ba1c4-a971-4dc4-ac5d-2f30790aecderunning§runtime!׸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$8f6ba1c4-a971-4dc4-ac5d-2f30790aecdedepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکDohas_pluto_hook_features¤body^

Fermat’s Little Theorem

persist_js_state$6c3595d2-4f68-44da-90e7-dc9c68479bcfrunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$6c3595d2-4f68-44da-90e7-dc9c68479bcfdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکG_has_pluto_hook_features¤body%cite (generic function with 1 method)persist_js_state$a293bb0e-078d-4335-a446-3096a79c03bcrunning§runtime!kdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a293bb0e-078d-4335-a446-3096a79c03bcdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکD(has_pluto_hook_features¤bodyH

Diffie-Hellman

persist_js_state$38744170-9af6-44b5-a0be-46a83da3253erunning§runtimeظdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$38744170-9af6-44b5-a0be-46a83da3253edepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکCТ˷has_pluto_hook_features¤body(fib_pow (generic function with 1 method)persist_js_state$87fdefa1-3bbd-4b69-ad3a-72baca6e55eerunning§runtime;fdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$87fdefa1-3bbd-4b69-ad3a-72baca6e55eedepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکEʷhas_pluto_hook_features¤body4persist_js_state$77093b36-c232-4477-be49-845f1a631829running§runtime depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$77093b36-c232-4477-be49-845f1a631829depends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg 0.000001 seconds text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$77093b36-c232-4477-be49-845f1a631829kwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassignee@time pow_1000last_run_timestampAکE^{lhas_pluto_hook_features¤body248persist_js_state$462fa407-d973-4e9e-8512-b7cd3bb98b7brunning§runtimeS$depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$462fa407-d973-4e9e-8512-b7cd3bb98b7bdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکC2has_pluto_hook_features¤body(fib_seq (generic function with 1 method)persist_js_state$ca8905ef-97a3-424c-bb2e-559f7151585brunning§runtime depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ca8905ef-97a3-424c-bb2e-559f7151585bdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Shas_pluto_hook_features¤body3

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.

persist_js_state$59817f59-429b-4f17-a46a-185571fd1e5arunning§runtime#depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$59817f59-429b-4f17-a46a-185571fd1e5adepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکC&has_pluto_hook_features¤bodyV

Fast modular powering

persist_js_state$ee43c389-55f4-4cf9-a8db-ce37d1b89db4running§runtime,depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ee43c389-55f4-4cf9-a8db-ce37d1b89db4depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکD!has_pluto_hook_features¤bodyق

Shanks's Babystep–Giantstep Algorithm

persist_js_state$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66brunning§runtime{depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66bdepends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg/ 0.000037 seconds (22 allocations: 1.586 KiB) text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66bkwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکDhas_pluto_hook_features¤bodyU2.531162323732361242240155003520607291766356485802485278951929841991312781989138e4179persist_js_state$cd481f6c-66f4-4ebf-9769-c3edc24f403brunning§runtime% depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$cd481f6c-66f4-4ebf-9769-c3edc24f403bdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBu_has_pluto_hook_features¤bodyz

Algorithme d'Euclide : élaboration

persist_js_state$9752afbb-96e6-4f96-92cb-09654cf46155running§runtime׸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$9752afbb-96e6-4f96-92cb-09654cf46155depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکB.has_pluto_hook_features¤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$.

persist_js_state$bafc9870-3823-4d1d-b0b7-94c69ee764d5running§runtime ldepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$bafc9870-3823-4d1d-b0b7-94c69ee764d5depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکDhas_pluto_hook_features¤bodypersist_js_state$7bad8c6c-45c7-402f-ad59-6857e9268901running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$7bad8c6c-45c7-402f-ad59-6857e9268901depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBt↷has_pluto_hook_features¤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$.

persist_js_state$0c8ab02e-80b0-44d6-a4a8-c813aac38209running§runtime NVdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$0c8ab02e-80b0-44d6-a4a8-c813aac38209depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneefib_pickerlast_run_timestampAکE has_pluto_hook_features¤body10persist_js_state$059b0ada-2442-48e4-82dd-489cb97e5dccrunning§runtimepdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$059b0ada-2442-48e4-82dd-489cb97e5dccdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکEhas_pluto_hook_features¤bodyy

g = 2

p = 11

persist_js_state$b319619e-8f8d-4650-8fb4-76e5ba953470running§runtimeGdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$b319619e-8f8d-4650-8fb4-76e5ba953470depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?SvKhas_pluto_hook_features¤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.

persist_js_state$7db2060b-d69e-42e7-ae81-fd37ee793876running§runtimeC͸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$7db2060b-d69e-42e7-ae81-fd37ee793876depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?S!has_pluto_hook_features¤bodyZ

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$$

persist_js_state$594829e2-585b-4d48-bb6e-b35d9543cfberunning§runtime"Adepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$594829e2-585b-4d48-bb6e-b35d9543cfbedepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکCGhas_pluto_hook_features¤body`

Fast powering for matrices

persist_js_state$6107d03d-1e45-4eb9-b8e2-51e4a72485e6running§runtime!depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$6107d03d-1e45-4eb9-b8e2-51e4a72485e6depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکChas_pluto_hook_features¤body\

Recursive implementation

persist_js_state$e1b5733f-a7a8-458f-a345-b358b9a03fcfrunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$e1b5733f-a7a8-458f-a345-b358b9a03fcfdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Uhas_pluto_hook_features¤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}$$

persist_js_state$b5f3620d-0942-41bb-80b0-d2ddcfe65090running§runtime@depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$b5f3620d-0942-41bb-80b0-d2ddcfe65090depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneeElast_run_timestampAکDK0/has_pluto_hook_features¤bodyEigen{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.525731persist_js_state$18031ccb-657f-409a-9080-9a0ada3ae8b5running§runtime 'jdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$18031ccb-657f-409a-9080-9a0ada3ae8b5depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneeslider_blast_run_timestampAکEƷhas_pluto_hook_features¤body13persist_js_state$1e27eedc-5308-4608-863f-fb81d60acdf0running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$1e27eedc-5308-4608-863f-fb81d60acdf0depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکDkhas_pluto_hook_features¤bodyٿ
Quelle est la complexité?

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

persist_js_state$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکEM"`has_pluto_hook_features¤body;
a$\alpha$b$\beta$n
1111335
persist_js_state$c8f85081-3659-4796-8550-2e708b09c8d7running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$c8f85081-3659-4796-8550-2e708b09c8d7depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکEMڷhas_pluto_hook_features¤body"

power = 251

persist_js_state$bc9a718f-4b97-4e15-acf8-d180abc5b6d5running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$bc9a718f-4b97-4e15-acf8-d180abc5b6d5depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکGطhas_pluto_hook_features¤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]

persist_js_state$ce07d5c5-90a3-4c12-bada-30e4da1b99fdrunning§runtimeF˸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ce07d5c5-90a3-4c12-bada-30e4da1b99fddepends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAکE{-has_pluto_hook_features¤bodyprefixInt64objectid92c10dcc22dac2eetypeArrayprefix_shortelements1text/plain2text/plain4text/plain8text/plain16text/plain15text/plain13text/plain9text/plain 1text/plain 2text/plain 4text/plain 8text/plain 16text/plain15text/plain13text/plain9text/plainpersist_js_state$59254bfd-48f2-4585-9ba5-e4c809421072running§runtimevʸdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$59254bfd-48f2-4585-9ba5-e4c809421072depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneeshanks_xlast_run_timestampAکEwhas_pluto_hook_features¤body8persist_js_state$93aa2719-f962-497b-9fda-30f54fd848ebrunning§runtime9depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$93aa2719-f962-497b-9fda-30f54fd848ebdepends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAکC{has_pluto_hook_features¤bodyprefixInt64objectid3bcf7ee67c6523f4typeArrayprefix_shortelements0text/plain4text/plain1text/plain5text/plain2text/plain6text/plain3text/plainpersist_js_state$9f55cad1-b01a-45e3-93df-a4349e2dfbd3running§runtimeYfdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$9f55cad1-b01a-45e3-93df-a4349e2dfbd3depends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAکEkhas_pluto_hook_features¤bodyprefixInt64objectid6780b2674a446051typeArrayprefix_shortelements1text/plain2text/plain3text/plain4text/plain5text/plain6text/plain7text/plain8text/plain 9text/plain 10text/plainpersist_js_state$a41722b8-8c21-4d3c-a38b-4d248a79e80arunning§runtimex?depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a41722b8-8c21-4d3c-a38b-4d248a79e80adepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?S]has_pluto_hook_features¤body<

Pas une solution unique:

persist_js_state$9cef898e-192c-418a-bec6-511f8b6da179running§runtime&idepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$9cef898e-192c-418a-bec6-511f8b6da179depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکEfhas_pluto_hook_features¤body252248persist_js_state$ed023033-1044-4d48-aab1-39e9300043f7running§runtime,depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ed023033-1044-4d48-aab1-39e9300043f7depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکG7~has_pluto_hook_features¤body<

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}.$$

persist_js_state$2cb5c6e0-b431-4d2e-b023-cd2131112ecarunning§runtime!Zdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$2cb5c6e0-b431-4d2e-b023-cd2131112ecadepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBhas_pluto_hook_features¤bodyl

Algorithme d'Euclide étendu

persist_js_state$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fdrunning§runtime(udepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fddepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکEPhas_pluto_hook_features¤body3persist_js_state$a7d9703a-5121-4b43-8cd4-2acf9a0d91efrunning§runtimekdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a7d9703a-5121-4b43-8cd4-2acf9a0d91efdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?T?has_pluto_hook_features¤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})$.

persist_js_state$57816e2c-a675-43e7-b674-2877ffcf1415running§runtime"ĸdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$57816e2c-a675-43e7-b674-2877ffcf1415depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneep_pickerlast_run_timestampAکEêihas_pluto_hook_features¤body11persist_js_state$f4f49568-dcf2-4c76-ba66-065d2fda7a4arunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$f4f49568-dcf2-4c76-ba66-065d2fda7a4adepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?RQhas_pluto_hook_features¤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}$$

persist_js_state$4a98507b-653e-4354-a825-7605f8fcb31brunning§runtime ⾸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$4a98507b-653e-4354-a825-7605f8fcb31bdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکEhas_pluto_hook_features¤bodyK4×4 Matrix{Int64}: 1 16 1 16 2 15 2 15 4 13 4 13 8 9 8 9persist_js_state$a59a20e2-a7c7-48a9-ad8d-8094e03a749drunning§runtimeaSdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a59a20e2-a7c7-48a9-ad8d-8094e03a749ddepends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAکC1@has_pluto_hook_features¤bodyprefixInt64objectid875d01a715f17eb8typeArrayprefix_shortelements0text/plain1text/plain2text/plain3text/plain4text/plain5text/plain6text/plainpersist_js_state$4e35d650-b9a6-4668-90f0-f27a50af29adrunning§runtimeGdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$4e35d650-b9a6-4668-90f0-f27a50af29addepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneeabn_pickerlast_run_timestampAکEH{ķhas_pluto_hook_features¤body;
a$\alpha$b$\beta$n
1111335
persist_js_state$4cff1d10-422f-4b12-b790-a589c972fbb7running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$4cff1d10-422f-4b12-b790-a589c972fbb7depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکE.has_pluto_hook_features¤bodyy

g = 2

p = 11

persist_js_state$909b8a36-79bb-4c1a-9dd7-4acaffc0434erunning§runtime-depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$909b8a36-79bb-4c1a-9dd7-4acaffc0434edepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBVhas_pluto_hook_features¤bodyV

Théorème de Bézout

persist_js_state$642d545f-b1b9-49da-8a03-ad63e3214f59running§runtimeddepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$642d545f-b1b9-49da-8a03-ad63e3214f59depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Shas_pluto_hook_features¤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}$$

persist_js_state$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2running§runtime&depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکDwͷhas_pluto_hook_features¤bodyT

Closed form solution

persist_js_state$a7afc0cb-a980-4f4f-b782-9791d932ee52running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a7afc0cb-a980-4f4f-b782-9791d932ee52depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکG{has_pluto_hook_features¤bodyF

Voir [HPS14; Section 2.8].

persist_js_state$d81bbd74-42df-4bb2-a045-9c2642cc19e5running§runtime(Udepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$d81bbd74-42df-4bb2-a045-9c2642cc19e5depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکELhas_pluto_hook_features¤body;
a$\alpha$b$\beta$n
1111335
persist_js_state$087cbe82-b42a-4f80-a1af-97f3aa93aeebrunning§runtimeKdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$087cbe82-b42a-4f80-a1af-97f3aa93aeebdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکEMhas_pluto_hook_features¤body"

power = 251

persist_js_state$8b16a522-9be4-4286-b64d-3d1bbdef7142running§runtime竸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$8b16a522-9be4-4286-b64d-3d1bbdef7142depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Thas_pluto_hook_features¤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}$.

persist_js_state$bbc907b1-63f8-435a-badc-11ed88bd6cf5running§runtime%Ddepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$bbc907b1-63f8-435a-badc-11ed88bd6cf5depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBU9has_pluto_hook_features¤body<

Exemples

persist_js_state$c2fab245-8a98-4b41-ade2-c5b16e9c39f9running§runtime'#depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$c2fab245-8a98-4b41-ade2-c5b16e9c39f9depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکC1}has_pluto_hook_features¤body^

Chinese remainder theorem

persist_js_state$35b7b8b7-bff6-4f64-91b9-b65035162365running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$35b7b8b7-bff6-4f64-91b9-b65035162365depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکGhas_pluto_hook_features¤bodyE

Voir [HPS14; Section 2.3]

persist_js_state$3cd40d9e-fcea-427d-9877-cea65e7ea413running§runtimefdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$3cd40d9e-fcea-427d-9877-cea65e7ea413depends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg5 0.006044 seconds (40.01 k allocations: 17.618 MiB) text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$3cd40d9e-fcea-427d-9877-cea65e7ea413kwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکC۷has_pluto_hook_features¤bodyT2531162323732361242240155003520607291766356485802485278951929841991312781760541315230153423463758831637443488219211037689033673531462742885329724071555187618026931630449193158922771331642302030331971098689235780843478258502779200293635651897483309686042860996364443514558772156043691404155819572984971754278513112487985892718229593329483578531419148805380281624260900362993556916638613939977074685016188258584312329139526393558096840812970422952418558991855772306882442574855589237165219912238201311184749075137322987656049866305366913734924425822681338966507463855180236283582409861199212323835947891143765414913345008456022009455704210891637791911265475167769704477334859109822590053774932978465651023851447920601310106288957894301592502061560528131203072778677491443420921822590709910448617329156135355464620891788459566081572824889514296350670950824208245170667601726417091127999999941149913010424532046881958285409468463211897582215075436515584016297874572183907949257286261608612401379639484713101138120404671732190451327881433201025184027541696124114463488665359385870910331476156665889459832092710304159637019707297988417848767011085425271875588008671422491434005115288334343837778792282383576736341414410248994081564830202363820504190074504566612515965134665683289356188727549463732830075811851574961558669278847363279870595320099844676879457196432535973357128305390290471349480258751812890314779723508104229525161740643984423978659638233074463100366500571977234508464710078102581304823235436518145074482824812996511614161933313389889630935320139507075992100561077534028207257574257706278201308302642634678112591091843082665721697117838726431766741158743554298864560993255547608496686850185804659790217122426535133253371422250684486113457341827911625517128815447325958547912113242367201990672230681308819195941016156001961954700241576553750737681552256845421159386858399433450045903975167084252876848848085910156941603293424067793097271128806817514906531652407763118308162377033463203514657531210413149191213595455280387631030665594589183601575340027172997222489081631144728873621805528648768511368948639522975539046995395707688938978847084621586473529546678958226255042389998718141303055036060772003887773038422366913820397748550793178167220193346017430024134496141145991896227741842515718997898627269918236920453493946658273870473264523119133765447653295022886429174942653014656521909469613184983671431465934965489425515981067546087342348350724207583544436107294087637975025147846254526938442435644928231027868701394819091132912397475713787593612758364812687556725146456646878912169274219209708166678668152184941578590201953144030519381922273252666652671717526318606676754556170379350956342095455612780202199922615392785572481747913435560866995432578680971243966868110016581395696310922519803685837460795358384618017215468122880442252343684547233668502313239328352671318130604247460452134121833305284398726438573787798499612760939462427922917659263046333084007208056631996856315539698234022953452211505675629153637867252695056925345220084020071611220575700841268302638995272842160994219632684575364180160991884885091858259996299627148614456696661412745040519981575543804847463997422326563897043803732970397488471644906183310144691243649149542394691524972023935190633672827306116525712882959108434211652465621144702015336657459532134026915214509960877430595844287585350290234547564574848753110281101545931547225811763441710217452979668178025286460158324658852904105792472468108996135476637212057508192176910900422826969523438985332067597093454021924077101784215936539638808624420121459718286059401823614213214326004270471752802725625810953787713898846144256909835116371235019527013180204030167601567064268573820697948868982630904164685161783088076506964317303709708574052747204405282785965604677674192569851918643651835755242670293612851920696732320545562286110332140065912751551110134916256237884844001366366654055079721985816714803952429301558096968202261698837096090377863017797020488044826628817462866854321356787305635653577619877987998113667928954840972022833505708587561902023411398915823487627297968947621416912816367516125096563705174220460639857683971213093125persist_js_state$4cb070de-e8bf-4a1d-9625-043c19466c46running§runtime `depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$4cb070de-e8bf-4a1d-9625-043c19466c46depends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg2 0.000146 seconds (826 allocations: 100.859 KiB) text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$4cb070de-e8bf-4a1d-9625-043c19466c46kwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکD$has_pluto_hook_features¤bodyT2531162323732361242240155003520607291766356485802485278951929841991312781760541315230153423463758831637443488219211037689033673531462742885329724071555187618026931630449193158922771331642302030331971098689235780843478258502779200293635651897483309686042860996364443514558772156043691404155819572984971754278513112487985892718229593329483578531419148805380281624260900362993556916638613939977074685016188258584312329139526393558096840812970422952418558991855772306882442574855589237165219912238201311184749075137322987656049866305366913734924425822681338966507463855180236283582409861199212323835947891143765414913345008456022009455704210891637791911265475167769704477334859109822590053774932978465651023851447920601310106288957894301592502061560528131203072778677491443420921822590709910448617329156135355464620891788459566081572824889514296350670950824208245170667601726417091127999999941149913010424532046881958285409468463211897582215075436515584016297874572183907949257286261608612401379639484713101138120404671732190451327881433201025184027541696124114463488665359385870910331476156665889459832092710304159637019707297988417848767011085425271875588008671422491434005115288334343837778792282383576736341414410248994081564830202363820504190074504566612515965134665683289356188727549463732830075811851574961558669278847363279870595320099844676879457196432535973357128305390290471349480258751812890314779723508104229525161740643984423978659638233074463100366500571977234508464710078102581304823235436518145074482824812996511614161933313389889630935320139507075992100561077534028207257574257706278201308302642634678112591091843082665721697117838726431766741158743554298864560993255547608496686850185804659790217122426535133253371422250684486113457341827911625517128815447325958547912113242367201990672230681308819195941016156001961954700241576553750737681552256845421159386858399433450045903975167084252876848848085910156941603293424067793097271128806817514906531652407763118308162377033463203514657531210413149191213595455280387631030665594589183601575340027172997222489081631144728873621805528648768511368948639522975539046995395707688938978847084621586473529546678958226255042389998718141303055036060772003887773038422366913820397748550793178167220193346017430024134496141145991896227741842515718997898627269918236920453493946658273870473264523119133765447653295022886429174942653014656521909469613184983671431465934965489425515981067546087342348350724207583544436107294087637975025147846254526938442435644928231027868701394819091132912397475713787593612758364812687556725146456646878912169274219209708166678668152184941578590201953144030519381922273252666652671717526318606676754556170379350956342095455612780202199922615392785572481747913435560866995432578680971243966868110016581395696310922519803685837460795358384618017215468122880442252343684547233668502313239328352671318130604247460452134121833305284398726438573787798499612760939462427922917659263046333084007208056631996856315539698234022953452211505675629153637867252695056925345220084020071611220575700841268302638995272842160994219632684575364180160991884885091858259996299627148614456696661412745040519981575543804847463997422326563897043803732970397488471644906183310144691243649149542394691524972023935190633672827306116525712882959108434211652465621144702015336657459532134026915214509960877430595844287585350290234547564574848753110281101545931547225811763441710217452979668178025286460158324658852904105792472468108996135476637212057508192176910900422826969523438985332067597093454021924077101784215936539638808624420121459718286059401823614213214326004270471752802725625810953787713898846144256909835116371235019527013180204030167601567064268573820697948868982630904164685161783088076506964317303709708574052747204405282785965604677674192569851918643651835755242670293612851920696732320545562286110332140065912751551110134916256237884844001366366654055079721985816714803952429301558096968202261698837096090377863017797020488044826628817462866854321356787305635653577619877987998113667928954840972022833505708587561902023411398915823487627297968947621416912816367516125096563705174220460639857683971213093125persist_js_state$1a4da418-147f-46f4-9b95-7955183aa5cfrunning§runtime k0depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$1a4da418-147f-46f4-9b95-7955183aa5cfdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBhas_pluto_hook_features¤body8

gcd_a = 90284599

persist_js_state$192f608c-0563-4179-903f-49fad2db4c74running§runtime xdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$192f608c-0563-4179-903f-49fad2db4c74depends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg2 0.000140 seconds (826 allocations: 100.938 KiB) text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$192f608c-0563-4179-903f-49fad2db4c74kwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکDhas_pluto_hook_features¤bodyT2531162323732361242240155003520607291766356485802485278951929841991312781760541315230153423463758831637443488219211037689033673531462742885329724071555187618026931630449193158922771331642302030331971098689235780843478258502779200293635651897483309686042860996364443514558772156043691404155819572984971754278513112487985892718229593329483578531419148805380281624260900362993556916638613939977074685016188258584312329139526393558096840812970422952418558991855772306882442574855589237165219912238201311184749075137322987656049866305366913734924425822681338966507463855180236283582409861199212323835947891143765414913345008456022009455704210891637791911265475167769704477334859109822590053774932978465651023851447920601310106288957894301592502061560528131203072778677491443420921822590709910448617329156135355464620891788459566081572824889514296350670950824208245170667601726417091127999999941149913010424532046881958285409468463211897582215075436515584016297874572183907949257286261608612401379639484713101138120404671732190451327881433201025184027541696124114463488665359385870910331476156665889459832092710304159637019707297988417848767011085425271875588008671422491434005115288334343837778792282383576736341414410248994081564830202363820504190074504566612515965134665683289356188727549463732830075811851574961558669278847363279870595320099844676879457196432535973357128305390290471349480258751812890314779723508104229525161740643984423978659638233074463100366500571977234508464710078102581304823235436518145074482824812996511614161933313389889630935320139507075992100561077534028207257574257706278201308302642634678112591091843082665721697117838726431766741158743554298864560993255547608496686850185804659790217122426535133253371422250684486113457341827911625517128815447325958547912113242367201990672230681308819195941016156001961954700241576553750737681552256845421159386858399433450045903975167084252876848848085910156941603293424067793097271128806817514906531652407763118308162377033463203514657531210413149191213595455280387631030665594589183601575340027172997222489081631144728873621805528648768511368948639522975539046995395707688938978847084621586473529546678958226255042389998718141303055036060772003887773038422366913820397748550793178167220193346017430024134496141145991896227741842515718997898627269918236920453493946658273870473264523119133765447653295022886429174942653014656521909469613184983671431465934965489425515981067546087342348350724207583544436107294087637975025147846254526938442435644928231027868701394819091132912397475713787593612758364812687556725146456646878912169274219209708166678668152184941578590201953144030519381922273252666652671717526318606676754556170379350956342095455612780202199922615392785572481747913435560866995432578680971243966868110016581395696310922519803685837460795358384618017215468122880442252343684547233668502313239328352671318130604247460452134121833305284398726438573787798499612760939462427922917659263046333084007208056631996856315539698234022953452211505675629153637867252695056925345220084020071611220575700841268302638995272842160994219632684575364180160991884885091858259996299627148614456696661412745040519981575543804847463997422326563897043803732970397488471644906183310144691243649149542394691524972023935190633672827306116525712882959108434211652465621144702015336657459532134026915214509960877430595844287585350290234547564574848753110281101545931547225811763441710217452979668178025286460158324658852904105792472468108996135476637212057508192176910900422826969523438985332067597093454021924077101784215936539638808624420121459718286059401823614213214326004270471752802725625810953787713898846144256909835116371235019527013180204030167601567064268573820697948868982630904164685161783088076506964317303709708574052747204405282785965604677674192569851918643651835755242670293612851920696732320545562286110332140065912751551110134916256237884844001366366654055079721985816714803952429301558096968202261698837096090377863017797020488044826628817462866854321356787305635653577619877987998113667928954840972022833505708587561902023411398915823487627297968947621416912816367516125096563705174220460639857683971213093125persist_js_state$027fe67c-d2f0-49f6-b894-959795551d27running§runtimeWa!{depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$027fe67c-d2f0-49f6-b894-959795551d27depends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg 1.453452 seconds text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$027fe67c-d2f0-49f6-b894-959795551d27kwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکCohas_pluto_hook_features¤body267914296persist_js_state$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2running§runtimeNdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکG&has_pluto_hook_features¤bodyA
Quelle est la complexité spatiale et temporelle de discrete_log ?

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

persist_js_state$cbabee34-2ca2-4ad4-93ba-2ec3c941da5erunning§runtimeadepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$cbabee34-2ca2-4ad4-93ba-2ec3c941da5edepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Phas_pluto_hook_features¤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}$.

persist_js_state$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6running§runtimeTdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?S]has_pluto_hook_features¤bodyM
persist_js_state$535f4bc1-e88c-47c7-990b-e3c8b5054accrunning§runtimefdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$535f4bc1-e88c-47c7-990b-e3c8b5054accdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکDȰhas_pluto_hook_features¤body+fib_closed (generic function with 1 method)persist_js_state$bd0c0258-7040-42e7-a20e-532b55af3a62running§runtime!)depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$bd0c0258-7040-42e7-a20e-532b55af3a62depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBxqhas_pluto_hook_features¤bodyـ

Algorithme d'Euclide : implémentation

persist_js_state$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfrunning§runtime Ldepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfdepends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg 0.000001 seconds text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfkwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassignee@time pow_999last_run_timestampAکE_has_pluto_hook_features¤body500persist_js_state$d1b260fb-7500-47fb-bb48-21b5857ab55arunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$d1b260fb-7500-47fb-bb48-21b5857ab55adepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Rʧhas_pluto_hook_features¤body

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

persist_js_state$31388128-33a3-4443-835e-74b91bf48268running§runtime).depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$31388128-33a3-4443-835e-74b91bf48268depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکEShas_pluto_hook_features¤body4persist_js_state$9207b107-e1b0-4328-a004-f4b8152b423frunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$9207b107-e1b0-4328-a004-f4b8152b423fdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBwͷhas_pluto_hook_features¤body7
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)$.

persist_js_state$06679a09-47d7-4024-8232-4954c08747a0running§runtime"depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$06679a09-47d7-4024-8232-4954c08747a0depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکAUhas_pluto_hook_features¤bodypersist_js_state$4714b7d7-32ee-42a1-bfa5-93eafda739d3running§runtime"depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$4714b7d7-32ee-42a1-bfa5-93eafda739d3depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکCThas_pluto_hook_features¤bodyt

Diagonalization to speed up powering

persist_js_state$3da58487-192f-458a-9d47-7a4ce98b6da3running§runtime#depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$3da58487-192f-458a-9d47-7a4ce98b6da3depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکDhas_pluto_hook_features¤body6

Utils

persist_js_state$6cf004be-5205-429e-8131-ef607cebeaecrunning§runtime(depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$6cf004be-5205-429e-8131-ef607cebeaecdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکDwhas_pluto_hook_features¤bodyA2×2 Matrix{Float64}: 0.525731 -0.850651 -0.850651 -0.525731persist_js_state$0e3fb524-bea1-4ef0-9589-36230a84e949running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$0e3fb524-bea1-4ef0-9589-36230a84e949depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneegp_pickerlast_run_timestampAکE has_pluto_hook_features¤bodyy

g = 2

p = 11

persist_js_state$aee611f2-bc86-4e85-bbcb-add78c6a9175running§runtime]߸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$aee611f2-bc86-4e85-bbcb-add78c6a9175depends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAکBۭhas_pluto_hook_features¤bodyobjectid54a1c5b46a9f8dc9typeTupleelements1text/plain89932200text/plain-32561659text/plainpersist_js_state$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0running§runtime2depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکB"has_pluto_hook_features¤body%pgcd (generic function with 1 method)persist_js_state$9722971a-16f1-4f28-ba31-c12b673b8a30running§runtime~/depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$9722971a-16f1-4f28-ba31-c12b673b8a30depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?T`has_pluto_hook_features¤body3

Et modulo 999 ?

persist_js_state$8a5a251f-5373-445a-97b1-4d652c6b7ba8running§runtime<depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$8a5a251f-5373-445a-97b1-4d652c6b7ba8depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکG/has_pluto_hook_features¤body%refs (generic function with 1 method)persist_js_state$592ae01b-2819-402d-9538-17018df5c34brunning§runtime$depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$592ae01b-2819-402d-9538-17018df5c34bdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکCFhas_pluto_hook_features¤bodyP

Fibonacci sequence

persist_js_state$191f8429-cbbb-44aa-8beb-271a94293e4brunning§runtime5depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$191f8429-cbbb-44aa-8beb-271a94293e4bdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکE~Phas_pluto_hook_features¤body$986325341584402112586461440731025613persist_js_state$1072a756-5026-4de9-93a8-f942d54c474arunning§runtimeKdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$1072a756-5026-4de9-93a8-f942d54c474adepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکGhas_pluto_hook_features¤bodyE

Voir [HPS14; Section 2.7]

persist_js_state$59ac02af-7b54-44d4-b5f4-a0f60d4458a1running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$59ac02af-7b54-44d4-b5f4-a0f60d4458a1depends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneeall_powerslast_run_timestampAکEhas_pluto_hook_features¤bodyprefixInt64objectidff14545779809987typeArrayprefix_shortelements2text/plain4text/plain8text/plain5text/plain10text/plain9text/plain7text/plain3text/plain 6text/plain 1text/plainpersist_js_state$09f44611-ba21-4982-ba1b-0691124642fcrunning§runtime(kdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$09f44611-ba21-4982-ba1b-0691124642fcdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBqhas_pluto_hook_features¤bodyn

Arithmétique modulaire : produit

persist_js_state$eeaec4f4-71bd-43df-b9c9-a00bc3b1864brunning§runtime$depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$eeaec4f4-71bd-43df-b9c9-a00bc3b1864bdepends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAکBEhas_pluto_hook_features¤bodyobjectid54a1c5b46a9f8dc9typeTupleelements1text/plain89932200text/plain-32561659text/plainpersist_js_state$f6e22fc3-382e-4548-bc59-8f944e06d237running§runtime depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$f6e22fc3-382e-4548-bc59-8f944e06d237depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکDhas_pluto_hook_features¤body32×2 Matrix{Float64}: 1.0 1.0 1.0 -1.11022e-16persist_js_state$19ef447f-9fdf-49e1-8d1a-7860b4d4e9barunning§runtime9adepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$19ef447f-9fdf-49e1-8d1a-7860b4d4e9badepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneeDlast_run_timestampAکDndhas_pluto_hook_features¤bodyR2×2 Diagonal{BigFloat, Vector{BigFloat}}: -0.618034 ⋅ ⋅ 1.61803persist_js_state$82ba8fe1-435e-422b-abb7-cb50a7a85e1erunning§runtime!۸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$82ba8fe1-435e-422b-abb7-cb50a7a85e1edepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکD%ݷhas_pluto_hook_features¤bodyN

Dicrete logarithm

persist_js_state$41cf9efd-65e5-4abb-94d3-e824780e659crunning§runtimeuP6depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$41cf9efd-65e5-4abb-94d3-e824780e659cdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکH<(has_pluto_hook_features¤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.

persist_js_state$58da5ba4-c858-4684-a9f4-5a39fdc4fb03running§runtime i6depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$58da5ba4-c858-4684-a9f4-5a39fdc4fb03depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکC%has_pluto_hook_features¤body+fast_power (generic function with 1 method)persist_js_state$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986running§runtime6depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکEe÷has_pluto_hook_features¤body252248persist_js_state$256c8009-4d2b-42f8-adaa-6f238ef22c6drunning§runtime depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$256c8009-4d2b-42f8-adaa-6f238ef22c6ddepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneeslider_nlast_run_timestampAکEٷhas_pluto_hook_features¤body5persist_js_state$c5e906c8-0f73-4955-baa7-337195329e04running§runtime6depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$c5e906c8-0f73-4955-baa7-337195329e04depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?UBٷhas_pluto_hook_features¤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$.

persist_js_state$f39cccac-5b24-46e4-8749-1b0a944542efrunning§runtime"1depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$f39cccac-5b24-46e4-8749-1b0a944542efdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکB&has_pluto_hook_features¤body8

gcd_b = 249357461

persist_js_state$9efb7a71-9a03-4716-8d34-aae233e9b898running§runtime('depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$9efb7a71-9a03-4716-8d34-aae233e9b898depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneexlast_run_timestampAکEthas_pluto_hook_features¤body8persist_js_state$a1628317-7937-4316-85bf-2da860effce3running§runtime)depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a1628317-7937-4316-85bf-2da860effce3depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکE&has_pluto_hook_features¤body3persist_js_state$7330af43-bec3-460c-94f6-768ac2975b00running§runtime Ѹdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$7330af43-bec3-460c-94f6-768ac2975b00depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکD;2has_pluto_hook_features¤body4shanks_discrete_log (generic function with 1 method)persist_js_state$f9f03579-5bfc-452d-bff9-9e7adfe095d3running§runtime"$depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$f9f03579-5bfc-452d-bff9-9e7adfe095d3depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکCGhas_pluto_hook_features¤body7persist_js_state$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3running§runtime6depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکEbRhas_pluto_hook_features¤body3persist_js_state$819f15ef-31d0-44b6-837a-e3e67f2667b9running§runtimeydepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$819f15ef-31d0-44b6-837a-e3e67f2667b9depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?S˷has_pluto_hook_features¤body:

Revenons aux exemples:

persist_js_state$3c198d79-c46a-4781-8bd1-b6b68f06c31frunning§runtimea~%depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$3c198d79-c46a-4781-8bd1-b6b68f06c31fdepends_on_disabled_cells¦queued¤logsgroupstdoutlinemsgN 0.005701 seconds (2.62 k allocations: 126.141 KiB, 99.49% compilation time) text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$3c198d79-c46a-4781-8bd1-b6b68f06c31fkwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکEZhas_pluto_hook_features¤bodyL3618502788666131106986593281521497120414687020801267626233049500247285301248persist_js_state$ac5e1516-1574-4893-a965-f799947076cbrunning§runtimeݸdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ac5e1516-1574-4893-a965-f799947076cbdepends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg_ 0.397354 seconds (704.91 k allocations: 38.056 MiB, 17.56% gc time, 99.95% compilation time) text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$ac5e1516-1574-4893-a965-f799947076cbkwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکDhas_pluto_hook_features¤bodyU2.531162323732361578998428490601662084769270923897910687031954402219719762339543e4179persist_js_state$4be6cea4-13a2-4bcb-b849-14eef57ab604running§runtimeԧdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$4be6cea4-13a2-4bcb-b849-14eef57ab604depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکE-has_pluto_hook_features¤bodyc

Le nombre 2 est une racine primitive modulo 11

persist_js_state$a4698418-ebf7-4992-a3ba-a15ff282bf87running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a4698418-ebf7-4992-a3ba-a15ff282bf87depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکC%has_pluto_hook_features¤bodyP
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)$.

persist_js_state$a1081bb2-2186-4b19-b667-0c246155f360running§runtime depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a1081bb2-2186-4b19-b667-0c246155f360depends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg2 0.000166 seconds (826 allocations: 100.922 KiB) text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$a1081bb2-2186-4b19-b667-0c246155f360kwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکC,#has_pluto_hook_features¤bodyT2531162323732361242240155003520607291766356485802485278951929841991312781760541315230153423463758831637443488219211037689033673531462742885329724071555187618026931630449193158922771331642302030331971098689235780843478258502779200293635651897483309686042860996364443514558772156043691404155819572984971754278513112487985892718229593329483578531419148805380281624260900362993556916638613939977074685016188258584312329139526393558096840812970422952418558991855772306882442574855589237165219912238201311184749075137322987656049866305366913734924425822681338966507463855180236283582409861199212323835947891143765414913345008456022009455704210891637791911265475167769704477334859109822590053774932978465651023851447920601310106288957894301592502061560528131203072778677491443420921822590709910448617329156135355464620891788459566081572824889514296350670950824208245170667601726417091127999999941149913010424532046881958285409468463211897582215075436515584016297874572183907949257286261608612401379639484713101138120404671732190451327881433201025184027541696124114463488665359385870910331476156665889459832092710304159637019707297988417848767011085425271875588008671422491434005115288334343837778792282383576736341414410248994081564830202363820504190074504566612515965134665683289356188727549463732830075811851574961558669278847363279870595320099844676879457196432535973357128305390290471349480258751812890314779723508104229525161740643984423978659638233074463100366500571977234508464710078102581304823235436518145074482824812996511614161933313389889630935320139507075992100561077534028207257574257706278201308302642634678112591091843082665721697117838726431766741158743554298864560993255547608496686850185804659790217122426535133253371422250684486113457341827911625517128815447325958547912113242367201990672230681308819195941016156001961954700241576553750737681552256845421159386858399433450045903975167084252876848848085910156941603293424067793097271128806817514906531652407763118308162377033463203514657531210413149191213595455280387631030665594589183601575340027172997222489081631144728873621805528648768511368948639522975539046995395707688938978847084621586473529546678958226255042389998718141303055036060772003887773038422366913820397748550793178167220193346017430024134496141145991896227741842515718997898627269918236920453493946658273870473264523119133765447653295022886429174942653014656521909469613184983671431465934965489425515981067546087342348350724207583544436107294087637975025147846254526938442435644928231027868701394819091132912397475713787593612758364812687556725146456646878912169274219209708166678668152184941578590201953144030519381922273252666652671717526318606676754556170379350956342095455612780202199922615392785572481747913435560866995432578680971243966868110016581395696310922519803685837460795358384618017215468122880442252343684547233668502313239328352671318130604247460452134121833305284398726438573787798499612760939462427922917659263046333084007208056631996856315539698234022953452211505675629153637867252695056925345220084020071611220575700841268302638995272842160994219632684575364180160991884885091858259996299627148614456696661412745040519981575543804847463997422326563897043803732970397488471644906183310144691243649149542394691524972023935190633672827306116525712882959108434211652465621144702015336657459532134026915214509960877430595844287585350290234547564574848753110281101545931547225811763441710217452979668178025286460158324658852904105792472468108996135476637212057508192176910900422826969523438985332067597093454021924077101784215936539638808624420121459718286059401823614213214326004270471752802725625810953787713898846144256909835116371235019527013180204030167601567064268573820697948868982630904164685161783088076506964317303709708574052747204405282785965604677674192569851918643651835755242670293612851920696732320545562286110332140065912751551110134916256237884844001366366654055079721985816714803952429301558096968202261698837096090377863017797020488044826628817462866854321356787305635653577619877987998113667928954840972022833505708587561902023411398915823487627297968947621416912816367516125096563705174220460639857683971213093125persist_js_state$6332b2f2-ed2f-448a-b1df-247b110e335brunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$6332b2f2-ed2f-448a-b1df-247b110e335bdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکCTChas_pluto_hook_features¤body7
Que faire si que $m$ est impair, c'est à dire $m = 2k + 1$...

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

persist_js_state$2381babe-0777-45db-acff-cc647a8a68d3running§runtime Mdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$2381babe-0777-45db-acff-cc647a8a68d3depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneepower_sliderlast_run_timestampAکEMf4has_pluto_hook_features¤body"l251persist_js_state$72ec8410-05d9-475a-93d4-47153cc0ce31running§runtime^depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$72ec8410-05d9-475a-93d4-47153cc0ce31depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکCPhas_pluto_hook_features¤body(fib_rec (generic function with 1 method)persist_js_state$48eba223-6cce-4aa2-9977-4883ba7903fcrunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$48eba223-6cce-4aa2-9977-4883ba7903fcdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBw4has_pluto_hook_features¤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$.

persist_js_state$1ca71c26-f98c-4126-a1c5-98786fde7e9brunning§runtime depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$1ca71c26-f98c-4126-a1c5-98786fde7e9bdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Tٷhas_pluto_hook_features¤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$.

persist_js_state$3026f9c5-81d3-443a-940a-f22fef9754afrunning§runtimeKdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$3026f9c5-81d3-443a-940a-f22fef9754afdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکD˼has_pluto_hook_features¤body,giant_steps (generic function with 1 method)persist_js_state$821de132-559b-4420-b866-e97134c5bd9arunning§runtime!ߏdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$821de132-559b-4420-b866-e97134c5bd9adepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکC;has_pluto_hook_features¤body:chinese_remainder_theorem (generic function with 1 method)persist_js_state$0ee6972c-5069-4ba0-887f-be64c7d000d0running§runtime'"depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$0ee6972c-5069-4ba0-887f-be64c7d000d0depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBӠZhas_pluto_hook_features¤bodyj

Arithmétique modulaire : somme

persist_js_state$4853f4ef-fbb8-48c3-9523-13ab4969d097running§runtime ָdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$4853f4ef-fbb8-48c3-9523-13ab4969d097depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکDЎhas_pluto_hook_features¤body+baby_steps (generic function with 1 method)persist_js_state$b57adc77-3783-4958-91a0-e90782338755running§runtimevdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$b57adc77-3783-4958-91a0-e90782338755depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneeslider_alast_run_timestampAکEHVhas_pluto_hook_features¤body11persist_js_state$c376513c-6553-4cd6-8384-ae6ff9d472d7running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$c376513c-6553-4cd6-8384-ae6ff9d472d7depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?UVhas_pluto_hook_features¤bodyz

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

persist_js_state$37585789-bd43-4ce5-b550-ad712b70d226running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$37585789-bd43-4ce5-b550-ad712b70d226depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Rhas_pluto_hook_features¤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}$.

persist_js_state$78df9410-5ea4-4d9f-bbe5-862f76a100fcrunning§runtime3depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$78df9410-5ea4-4d9f-bbe5-862f76a100fcdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Shas_pluto_hook_features¤bodyٯ

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

persist_js_state$9e8a61d9-a700-4851-b1cd-49ce042c3530running§runtimehdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$9e8a61d9-a700-4851-b1cd-49ce042c3530depends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg. 0.000012 seconds (5 allocations: 176 bytes) text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$9e8a61d9-a700-4851-b1cd-49ce042c3530kwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکEXhas_pluto_hook_features¤bodyL3618502788666131106986593281521497120414687020801267626233049500247285301248persist_js_state$e505716d-af01-455f-a55a-a9c225822ad5running§runtimeAdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$e505716d-af01-455f-a55a-a9c225822ad5depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?T3@has_pluto_hook_features¤bodyـ

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

persist_js_state$61462af5-69bd-42be-8918-7992c79ee00drunning§runtime$depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$61462af5-69bd-42be-8918-7992c79ee00ddepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکCF5has_pluto_hook_features¤bodyC
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.

persist_js_state$15367f3b-c7e4-4004-a018-5422a7f22024running§runtimeʸdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$15367f3b-c7e4-4004-a018-5422a7f22024depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Thas_pluto_hook_features¤body٬

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

persist_js_state$ba16d83d-21a5-4f0c-807b-674a167da4dcrunning§runtimeΪ˦depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ba16d83d-21a5-4f0c-807b-674a167da4dcdepends_on_disabled_cells¦queued¤logsgrouputilslinemsgXLoading bibliography from `/home/runner/work/LSINC1113/LSINC1113/Lectures/biblio.bib`...text/plainlevelInfoidMain_workspace#3_a1ed908bcell_id$ba16d83d-21a5-4f0c-807b-674a167da4dckwargsfile7/home/runner/work/LSINC1113/LSINC1113/Lectures/utils.jlgroupbibtexlinemsg=Entry west2022Introduction is missing the publisher field(s).text/plainlevelErroridBibInternal_c3aff3e5cell_id$ba16d83d-21a5-4f0c-807b-674a167da4dckwargsfile

Meet in the middle approach

persist_js_state$bbb2793a-faa4-43bd-b2e8-e8d3ac93310frunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$bbb2793a-faa4-43bd-b2e8-e8d3ac93310fdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Thas_pluto_hook_features¤bodyم

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

persist_js_state$ec14d629-b720-47cd-bc08-ff96f49271abrunning§runtime 謸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ec14d629-b720-47cd-bc08-ff96f49271abdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکDƨhas_pluto_hook_features¤body-discrete_log (generic function with 1 method)persist_js_state$bc58ba24-90f0-4913-8f66-10bb6cb54076running§runtime*depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$bc58ba24-90f0-4913-8f66-10bb6cb54076depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Tphas_pluto_hook_features¤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}$$

persist_js_state$f86a5efc-d31e-4e88-b81f-ebdbbeba11ecrunning§runtimeθdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$f86a5efc-d31e-4e88-b81f-ebdbbeba11ecdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?U+has_pluto_hook_features¤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.

persist_js_state$83852dd5-3546-45af-a845-b01dab0aa2a6running§runtime%Xdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$83852dd5-3546-45af-a845-b01dab0aa2a6depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBhas_pluto_hook_features¤bodyf

Inverse et division modulaire

persist_js_state$8315b53f-abca-483d-bbf6-7e9193e751c9running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$8315b53f-abca-483d-bbf6-7e9193e751c9depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکEt2has_pluto_hook_features¤body*draw_fib (generic function with 2 methods)persist_js_state$4c2d45e3-56a2-467f-b87f-7b98cb873a05running§runtimetdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$4c2d45e3-56a2-467f-b87f-7b98cb873a05depends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAکEshas_pluto_hook_features¤bodyprefixInt64objectid771ffe29e6f08f7typeArrayprefix_shortelements2text/plain3text/plain4text/plain2text/plain7text/plain8text/plain10text/plain6text/plain 15text/plain 2text/plain 19text/plain 39text/plain 22text/plain12text/plain50text/plain14text/plain35text/plain41text/plain64text/plain37text/plain11text/plain32text/plain67text/plain11text/plainpersist_js_state$3df688c8-1c52-462d-88be-daa153333c60running§runtime% u=depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$3df688c8-1c52-462d-88be-daa153333c60depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکGhas_pluto_hook_features¤body
persist_js_state$e9633e3f-376d-413d-bc19-d015f6ce76e5running§runtime;depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$e9633e3f-376d-413d-bc19-d015f6ce76e5depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکE~has_pluto_hook_features¤bodyL3618502788666131106986593281521497120414687020801267626233049500247285301248persist_js_state$ae89661a-2c0f-4752-adc2-023f09dc0e9frunning§runtimefodepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ae89661a-2c0f-4752-adc2-023f09dc0e9fdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکEٗhas_pluto_hook_features¤bodyK4×4 Matrix{Int64}: 1 16 1 16 2 15 2 15 4 13 4 13 8 9 8 9persist_js_state$1b1d5c9b-5fc7-480e-9649-e9c44a49c38drunning§runtime9X/depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$1b1d5c9b-5fc7-480e-9649-e9c44a49c38ddepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکBkhas_pluto_hook_features¤body$qa (generic function with 2 methods)persist_js_state$6f10de7b-ce05-4f82-82e7-4110be44e8ccrunning§runtimeEQdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$6f10de7b-ce05-4f82-82e7-4110be44e8ccdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکE``has_pluto_hook_features¤body252248persist_js_state$d6b89fda-308f-43da-8028-1a812b4516cfrunning§runtimeCdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$d6b89fda-308f-43da-8028-1a812b4516cfdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBwjHhas_pluto_hook_features¤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:

persist_js_state$e2a3842d-4e07-4703-ab47-a5140649dd6arunning§runtime6depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$e2a3842d-4e07-4703-ab47-a5140649dd6adepends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAکEhas_pluto_hook_features¤bodyprefixInt64objectid7c823493749ea7d1typeArrayprefix_shortelements1text/plain2text/plain3text/plain4text/plain5text/plain6text/plain7text/plain8text/plain 9text/plain 10text/plainpersist_js_state$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4running§runtime-depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکC0Jhas_pluto_hook_features¤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}$.

persist_js_state$d882afdd-eb85-467c-bf18-525c0c5da5e7running§runtimeHdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$d882afdd-eb85-467c-bf18-525c0c5da5e7depends_on_disabled_cells¦queued¤logsgroupstdoutlinemsg/ 0.000043 seconds (39 allocations: 2.609 KiB) text/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$d882afdd-eb85-467c-bf18-525c0c5da5e7kwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکD1has_pluto_hook_features¤bodyU2.531162323732361578998428490601662084769270923897910687031954402219719762339543e4179persist_js_state$03e49669-cdee-4241-862d-33ee91214455running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$03e49669-cdee-4241-862d-33ee91214455depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Rhas_pluto_hook_features¤body٪

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

persist_js_state$e52d25b3-65bf-4617-ae8d-fae0d0c8d041running§runtime*depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$e52d25b3-65bf-4617-ae8d-fae0d0c8d041depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?T%has_pluto_hook_features¤bodyٱ

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

persist_js_state$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1running§runtime`cdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1depends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAکC_has_pluto_hook_features¤bodyprefixInt64objectidd54ee329a64b7e94typeArrayprefix_shortelements0text/plain4text/plain1text/plain5text/plain2text/plain6text/plain3text/plainpersist_js_state$7da0705e-c925-4f8d-9ca4-8d8a0f859fearunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$7da0705e-c925-4f8d-9ca4-8d8a0f859feadepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Sɷhas_pluto_hook_features¤bodyٱ

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

persist_js_state$c3411941-d77f-46cb-8378-23998a1a4828running§runtime$]depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$c3411941-d77f-46cb-8378-23998a1a4828depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکB2jhas_pluto_hook_features¤bodyR

Division par 3 et 9

persist_js_state$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253running§runtime<޸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکEhas_pluto_hook_features¤body3persist_js_state$736307ec-a2a4-11ef-0f85-ad1a0093e06arunning§runtimelIdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$736307ec-a2a4-11ef-0f85-ad1a0093e06adepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Phas_pluto_hook_features¤bodyZ

La théorie des nombres

persist_js_state$40b8e474-16e0-4a61-bb28-11d90beefeearunning§runtime:depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$40b8e474-16e0-4a61-bb28-11d90beefeeadepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکB[yhas_pluto_hook_features¤body1persist_js_state$6e59ee60-ef73-45ca-86eb-4d8a44c73771running§runtimemPdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$6e59ee60-ef73-45ca-86eb-4d8a44c73771depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکBw8Ghas_pluto_hook_features¤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)$.

persist_js_state$08dcbbd3-a531-4f74-a724-1cae8fae1636running§runtime\m˸depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$08dcbbd3-a531-4f74-a724-1cae8fae1636depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکEɅhas_pluto_hook_features¤bodyc

Le nombre 2 est une racine primitive modulo 11

persist_js_state$16b677e4-c467-462a-b770-b7a31160e129running§runtime;Sdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$16b677e4-c467-462a-b770-b7a31160e129depends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneeprime_listlast_run_timestampAکCFphas_pluto_hook_features¤bodyprefixInt64objectid12dbf85fb9c52fa9typeArrayprefix_shortelements3text/plain5text/plain7text/plain11text/plain13text/plain17text/plain19text/plain23text/plain 29text/plain 31text/plain 37text/plain 41text/plain 43text/plain47text/plain53text/plain59text/plain61text/plain67text/plain71text/plain73text/plain79text/plain83text/plain89text/plain97text/plainpersist_js_state$2c34c17e-12de-43ea-870c-818c97647836running§runtime!-depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$2c34c17e-12de-43ea-870c-818c97647836depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکB has_pluto_hook_features¤bodyz

Inversion modulaire par Euclide étendu

persist_js_state$21df1900-3954-4506-b759-aeeee664d1dfrunning§runtime Gdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$21df1900-3954-4506-b759-aeeee664d1dfdepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکChas_pluto_hook_features¤body'modinv (generic function with 1 method)persist_js_state$d830fffd-3781-40ca-85cb-c242f99667cerunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$d830fffd-3781-40ca-85cb-c242f99667cedepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکDhas_pluto_hook_features¤body)fib_diag (generic function with 1 method)persist_js_state$08b18315-c28e-44ed-beb2-5b17421b0224running§runtime`depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$08b18315-c28e-44ed-beb2-5b17421b0224depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?R[has_pluto_hook_features¤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}$.

persist_js_state$8670abc2-63e6-496a-b20c-812197acd9adrunning§runtime qdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$8670abc2-63e6-496a-b20c-812197acd9addepends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکC/has_pluto_hook_features¤body/fast_mod_power (generic function with 1 method)persist_js_state$227e415e-ab17-4f3a-b695-9573c9ee2b57running§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$227e415e-ab17-4f3a-b695-9573c9ee2b57depends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکDUhas_pluto_hook_features¤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.

persist_js_state$67093a35-8e1b-4cd3-b11b-c7ff601f802erunning§runtimedepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$67093a35-8e1b-4cd3-b11b-c7ff601f802edepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکC>?has_pluto_hook_features¤body

primes_upper = 100

persist_js_state$7f9bd301-355b-43f5-b168-22fac9e52511running§runtime*Zdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$7f9bd301-355b-43f5-b168-22fac9e52511depends_on_disabled_cells¦queued¤logsoutputmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAکDchas_pluto_hook_features¤bodyprefixInt64objectid9955d5551477a6b6typeArrayprefix_shortelements2text/plain3text/plain5text/plain7text/plainpersist_js_state$3f1af973-a02b-4e06-8e6e-eff414fcaf67running§runtime˳depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$3f1af973-a02b-4e06-8e6e-eff414fcaf67depends_on_disabled_cells¦queued¤logsoutputmimetext/plainrootassigneelast_run_timestampAکBߞhas_pluto_hook_features¤body&pgcdx (generic function with 1 method)persist_js_state$fe2af566-4a8b-4052-9915-85266ee5ce98running§runtimez{depends_on_skipped_cellsµpublished_object_keyserrored§cell_id$fe2af566-4a8b-4052-9915-85266ee5ce98depends_on_disabled_cells¦queued¤logsgroupstdoutlinemsggcd(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/plainlevelLogLevel(-555)idPlutoRunner_40f9f5d1cell_id$fe2af566-4a8b-4052-9915-85266ee5ce98kwargsfileP/home/runner/.julia/packages/Pluto/F6SNP/src/runner/PlutoRunner/src/io/stdout.jloutputmimetext/plainrootassigneelast_run_timestampAکB has_pluto_hook_features¤body1persist_js_state$6ed7c73d-60da-4908-85cb-958745d81ebcrunning§runtimeܸdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$6ed7c73d-60da-4908-85cb-958745d81ebcdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?Tvhas_pluto_hook_features¤body

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

persist_js_state$708c442b-cbff-4e1a-b70d-e704453cfd3drunning§runtimeDdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$708c442b-cbff-4e1a-b70d-e704453cfd3ddepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکE(has_pluto_hook_features¤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

persist_js_state$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21erunning§runtimezdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21edepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAک?TJ^has_pluto_hook_features¤body1

Last 3 digit:

persist_js_state$a7d06375-e4dd-47b1-8aba-11dc4d62954brunning§runtimeRdepends_on_skipped_cellsµpublished_object_keyserrored§cell_id$a7d06375-e4dd-47b1-8aba-11dc4d62954bdepends_on_disabled_cells¦queued¤logsoutputmimetext/htmlrootassigneelast_run_timestampAکC,has_pluto_hook_features¤bodyh
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$.

persist_js_state±published_objectsjulia_versionv1.13.0cell_dependencies$a7985d16-500b-4024-aaa1-78e654b94be4precedence_heuristic cell_id$a7985d16-500b-4024-aaa1-78e654b94be4downstream_cells_mapupstream_cells_mapqa@md_strgetindex$eb311761-ace2-4632-9ebf-9c7c166659f7precedence_heuristic cell_id$eb311761-ace2-4632-9ebf-9c7c166659f7downstream_cells_mapupstream_cells_map@md_strgetindex$d8a28762-8aab-49e9-b9ac-38901d34abffprecedence_heuristic cell_id$d8a28762-8aab-49e9-b9ac-38901d34abffdownstream_cells_mapupstream_cells_mapframetitle$a826d9d1-47db-4645-be6e-3ae0ed8d4e18precedence_heuristic cell_id$a826d9d1-47db-4645-be6e-3ae0ed8d4e18downstream_cells_mapupstream_cells_map@md_strgetindex$8f6ba1c4-a971-4dc4-ac5d-2f30790aecdeprecedence_heuristic cell_id$8f6ba1c4-a971-4dc4-ac5d-2f30790aecdedownstream_cells_mapupstream_cells_mapframetitle$6c3595d2-4f68-44da-90e7-dc9c68479bcfprecedence_heuristic cell_id$6c3595d2-4f68-44da-90e7-dc9c68479bcfdownstream_cells_mapcite$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-b65035162365upstream_cells_mapbibcitebiblio$ba16d83d-21a5-4f0c-807b-674a167da4dc$a293bb0e-078d-4335-a446-3096a79c03bcprecedence_heuristic cell_id$a293bb0e-078d-4335-a446-3096a79c03bcdownstream_cells_mapupstream_cells_mapframetitle$38744170-9af6-44b5-a0be-46a83da3253eprecedence_heuristic cell_id$38744170-9af6-44b5-a0be-46a83da3253edownstream_cells_mapfib_pow$a1081bb2-2186-4b19-b667-0c246155f360$4cb070de-e8bf-4a1d-9625-043c19466c46$192f608c-0563-4179-903f-49fad2db4c74upstream_cells_map^-BigInt*$87fdefa1-3bbd-4b69-ad3a-72baca6e55eeprecedence_heuristic cell_id$87fdefa1-3bbd-4b69-ad3a-72baca6e55eedownstream_cells_mapupstream_cells_mapa$b57adc77-3783-4958-91a0-e90782338755n$256c8009-4d2b-42f8-adaa-6f238ef22c6dmod+b$18031ccb-657f-409a-9080-9a0ada3ae8b5$77093b36-c232-4477-be49-845f1a631829precedence_heuristic cell_id$77093b36-c232-4477-be49-845f1a631829downstream_cells_mappow_1000$6f10de7b-ce05-4f82-82e7-4110be44e8cc$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986upstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.gc_alloc_countBase.stringBase./fast_mod_power$8670abc2-63e6-496a-b20c-812197acd9adBase.GC_Diff@timepower$2381babe-0777-45db-acff-cc647a8a68d3Base.cumulative_compile_time_nsBase.-BaseBase.time_nsBase.===Base.*Base.cumulative_compile_timing$462fa407-d973-4e9e-8512-b7cd3bb98b7bprecedence_heuristic cell_id$462fa407-d973-4e9e-8512-b7cd3bb98b7bdownstream_cells_mapfib_seq$3cd40d9e-fcea-427d-9877-cea65e7ea413upstream_cells_mapzeros:+-endBigInt$ca8905ef-97a3-424c-bb2e-559f7151585bprecedence_heuristic cell_id$ca8905ef-97a3-424c-bb2e-559f7151585bdownstream_cells_mapupstream_cells_map@md_strgetindex$59817f59-429b-4f17-a46a-185571fd1e5aprecedence_heuristic cell_id$59817f59-429b-4f17-a46a-185571fd1e5adownstream_cells_mapupstream_cells_mapframetitle$ee43c389-55f4-4cf9-a8db-ce37d1b89db4precedence_heuristic cell_id$ee43c389-55f4-4cf9-a8db-ce37d1b89db4downstream_cells_mapupstream_cells_mapframetitle$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66bprecedence_heuristic cell_id$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66bdownstream_cells_mapupstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.stringBase.gc_alloc_countBase./Base.GC_Diff@timefib_closed$535f4bc1-e88c-47c7-990b-e3c8b5054accBase.cumulative_compile_time_nsBase.-BaseBase.time_nsBase.===Base.*Base.cumulative_compile_timing$cd481f6c-66f4-4ebf-9769-c3edc24f403bprecedence_heuristic cell_id$cd481f6c-66f4-4ebf-9769-c3edc24f403bdownstream_cells_mapupstream_cells_mapframetitle$9752afbb-96e6-4f96-92cb-09654cf46155precedence_heuristic cell_id$9752afbb-96e6-4f96-92cb-09654cf46155downstream_cells_mapupstream_cells_mapqa@md_strgetindex$bafc9870-3823-4d1d-b0b7-94c69ee764d5precedence_heuristic cell_id$bafc9870-3823-4d1d-b0b7-94c69ee764d5downstream_cells_mapDocumenterCitationsupstream_cells_map$7bad8c6c-45c7-402f-ad59-6857e9268901precedence_heuristic cell_id$7bad8c6c-45c7-402f-ad59-6857e9268901downstream_cells_mapupstream_cells_mapqa@md_strgetindex$0c8ab02e-80b0-44d6-a4a8-c813aac38209precedence_heuristic cell_id$0c8ab02e-80b0-44d6-a4a8-c813aac38209downstream_cells_mapfib_n$708c442b-cbff-4e1a-b70d-e704453cfd3dfib_picker$708c442b-cbff-4e1a-b70d-e704453cfd3dupstream_cells_mapBase:@bindBase.getPlutoRunnerSliderCore.applicableCorePlutoRunner.create_bond$059b0ada-2442-48e4-82dd-489cb97e5dccprecedence_heuristic cell_id$059b0ada-2442-48e4-82dd-489cb97e5dccdownstream_cells_mapupstream_cells_mapgp_picker$0e3fb524-bea1-4ef0-9589-36230a84e949$b319619e-8f8d-4650-8fb4-76e5ba953470precedence_heuristic cell_id$b319619e-8f8d-4650-8fb4-76e5ba953470downstream_cells_mapupstream_cells_map@md_strgetindex$7db2060b-d69e-42e7-ae81-fd37ee793876precedence_heuristic cell_id$7db2060b-d69e-42e7-ae81-fd37ee793876downstream_cells_mapupstream_cells_map@md_strgetindex$594829e2-585b-4d48-bb6e-b35d9543cfbeprecedence_heuristic cell_id$594829e2-585b-4d48-bb6e-b35d9543cfbedownstream_cells_mapupstream_cells_mapframetitle$6107d03d-1e45-4eb9-b8e2-51e4a72485e6precedence_heuristic cell_id$6107d03d-1e45-4eb9-b8e2-51e4a72485e6downstream_cells_mapupstream_cells_mapframetitle$e1b5733f-a7a8-458f-a345-b358b9a03fcfprecedence_heuristic cell_id$e1b5733f-a7a8-458f-a345-b358b9a03fcfdownstream_cells_mapupstream_cells_map@md_strgetindex$b5f3620d-0942-41bb-80b0-d2ddcfe65090precedence_heuristic cell_id$b5f3620d-0942-41bb-80b0-d2ddcfe65090downstream_cells_mapE$6cf004be-5205-429e-8131-ef607cebeaec$f6e22fc3-382e-4548-bc59-8f944e06d237$d830fffd-3781-40ca-85cb-c242f99667ceupstream_cells_mapeigen$18031ccb-657f-409a-9080-9a0ada3ae8b5precedence_heuristic cell_id$18031ccb-657f-409a-9080-9a0ada3ae8b5downstream_cells_mapb$31388128-33a3-4443-835e-74b91bf48268$87fdefa1-3bbd-4b69-ad3a-72baca6e55ee$a1628317-7937-4316-85bf-2da860effce3$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3$4e35d650-b9a6-4668-90f0-f27a50af29adslider_b$4e35d650-b9a6-4668-90f0-f27a50af29adupstream_cells_mapBase:@bindBase.getPlutoRunnerSliderCore.applicableCorePlutoRunner.create_bond$1e27eedc-5308-4608-863f-fb81d60acdf0precedence_heuristic cell_id$1e27eedc-5308-4608-863f-fb81d60acdf0downstream_cells_mapupstream_cells_mapqa@md_strgetindex$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82precedence_heuristic cell_id$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82downstream_cells_mapupstream_cells_mapabn_picker$4e35d650-b9a6-4668-90f0-f27a50af29ad$c8f85081-3659-4796-8550-2e708b09c8d7precedence_heuristic cell_id$c8f85081-3659-4796-8550-2e708b09c8d7downstream_cells_mapupstream_cells_map@md_strgetindexpower_slider$2381babe-0777-45db-acff-cc647a8a68d3$bc9a718f-4b97-4e15-acf8-d180abc5b6d5precedence_heuristic cell_id$bc9a718f-4b97-4e15-acf8-d180abc5b6d5downstream_cells_mapupstream_cells_mapqa@md_strgetindexcite$6c3595d2-4f68-44da-90e7-dc9c68479bcf$ce07d5c5-90a3-4c12-bada-30e4da1b99fdprecedence_heuristic cell_id$ce07d5c5-90a3-4c12-bada-30e4da1b99fddownstream_cells_mapupstream_cells_map:g$0e3fb524-bea1-4ef0-9589-36230a84e949fast_mod_power$8670abc2-63e6-496a-b20c-812197acd9ad$59254bfd-48f2-4585-9ba5-e4c809421072precedence_heuristic cell_id$59254bfd-48f2-4585-9ba5-e4c809421072downstream_cells_mapshanks_x$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fdupstream_cells_mapshanks_discrete_log$7330af43-bec3-460c-94f6-768ac2975b00p$57816e2c-a675-43e7-b674-2877ffcf1415g$0e3fb524-bea1-4ef0-9589-36230a84e949$93aa2719-f962-497b-9fda-30f54fd848ebprecedence_heuristic cell_id$93aa2719-f962-497b-9fda-30f54fd848ebdownstream_cells_mapupstream_cells_mapmodinv$21df1900-3954-4506-b759-aeeee664d1dfcollect:mod*$9f55cad1-b01a-45e3-93df-a4349e2dfbd3precedence_heuristic cell_id$9f55cad1-b01a-45e3-93df-a4349e2dfbd3downstream_cells_mapupstream_cells_mapsortall_powers$59ac02af-7b54-44d4-b5f4-a0f60d4458a1$a41722b8-8c21-4d3c-a38b-4d248a79e80aprecedence_heuristic cell_id$a41722b8-8c21-4d3c-a38b-4d248a79e80adownstream_cells_mapupstream_cells_map@md_strgetindex$9cef898e-192c-418a-bec6-511f8b6da179precedence_heuristic cell_id$9cef898e-192c-418a-bec6-511f8b6da179downstream_cells_mapupstream_cells_mappower$2381babe-0777-45db-acff-cc647a8a68d3fast_mod_power$8670abc2-63e6-496a-b20c-812197acd9ad$ed023033-1044-4d48-aab1-39e9300043f7precedence_heuristic cell_id$ed023033-1044-4d48-aab1-39e9300043f7downstream_cells_mapupstream_cells_map@md_strgetindexcite$6c3595d2-4f68-44da-90e7-dc9c68479bcf$2cb5c6e0-b431-4d2e-b023-cd2131112ecaprecedence_heuristic cell_id$2cb5c6e0-b431-4d2e-b023-cd2131112ecadownstream_cells_mapupstream_cells_mapframetitle$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fdprecedence_heuristic cell_id$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fddownstream_cells_mapupstream_cells_mapshanks_x$59254bfd-48f2-4585-9ba5-e4c809421072p$57816e2c-a675-43e7-b674-2877ffcf1415g$0e3fb524-bea1-4ef0-9589-36230a84e949fast_mod_power$8670abc2-63e6-496a-b20c-812197acd9ad$a7d9703a-5121-4b43-8cd4-2acf9a0d91efprecedence_heuristic cell_id$a7d9703a-5121-4b43-8cd4-2acf9a0d91efdownstream_cells_mapupstream_cells_map@md_strgetindex$57816e2c-a675-43e7-b674-2877ffcf1415precedence_heuristic cell_id$57816e2c-a675-43e7-b674-2877ffcf1415downstream_cells_mapp$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-36230a84e949p_picker$0e3fb524-bea1-4ef0-9589-36230a84e949upstream_cells_mapprimesBase@bindBase.getPlutoRunnerSliderCore.applicableCorePlutoRunner.create_bond$f4f49568-dcf2-4c76-ba66-065d2fda7a4aprecedence_heuristic cell_id$f4f49568-dcf2-4c76-ba66-065d2fda7a4adownstream_cells_mapupstream_cells_map@md_strgetindex$4a98507b-653e-4354-a825-7605f8fcb31bprecedence_heuristic cell_id$4a98507b-653e-4354-a825-7605f8fcb31bdownstream_cells_mapupstream_cells_mapconj^:g$0e3fb524-bea1-4ef0-9589-36230a84e949modadjoint*fast_mod_power$8670abc2-63e6-496a-b20c-812197acd9ad$a59a20e2-a7c7-48a9-ad8d-8094e03a749dprecedence_heuristic cell_id$a59a20e2-a7c7-48a9-ad8d-8094e03a749ddownstream_cells_mapupstream_cells_mapmodinv$21df1900-3954-4506-b759-aeeee664d1dfcollect:mod*$4e35d650-b9a6-4668-90f0-f27a50af29adprecedence_heuristic cell_id$4e35d650-b9a6-4668-90f0-f27a50af29addownstream_cells_mapabn_picker$d81bbd74-42df-4bb2-a045-9c2642cc19e5$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82upstream_cells_mapa$b57adc77-3783-4958-91a0-e90782338755n$256c8009-4d2b-42f8-adaa-6f238ef22c6dmodgetindexslider_a$b57adc77-3783-4958-91a0-e90782338755slider_n$256c8009-4d2b-42f8-adaa-6f238ef22c6d@md_strb$18031ccb-657f-409a-9080-9a0ada3ae8b5slider_b$18031ccb-657f-409a-9080-9a0ada3ae8b5$4cff1d10-422f-4b12-b790-a589c972fbb7precedence_heuristic cell_id$4cff1d10-422f-4b12-b790-a589c972fbb7downstream_cells_mapupstream_cells_mapgp_picker$0e3fb524-bea1-4ef0-9589-36230a84e949$909b8a36-79bb-4c1a-9dd7-4acaffc0434eprecedence_heuristic cell_id$909b8a36-79bb-4c1a-9dd7-4acaffc0434edownstream_cells_mapupstream_cells_mapframetitle$642d545f-b1b9-49da-8a03-ad63e3214f59precedence_heuristic cell_id$642d545f-b1b9-49da-8a03-ad63e3214f59downstream_cells_mapupstream_cells_map@md_strgetindex$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2precedence_heuristic cell_id$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2downstream_cells_mapupstream_cells_mapframetitle$a7afc0cb-a980-4f4f-b782-9791d932ee52precedence_heuristic cell_id$a7afc0cb-a980-4f4f-b782-9791d932ee52downstream_cells_mapupstream_cells_map@md_strgetindexcite$6c3595d2-4f68-44da-90e7-dc9c68479bcf$d81bbd74-42df-4bb2-a045-9c2642cc19e5precedence_heuristic cell_id$d81bbd74-42df-4bb2-a045-9c2642cc19e5downstream_cells_mapupstream_cells_mapabn_picker$4e35d650-b9a6-4668-90f0-f27a50af29ad$087cbe82-b42a-4f80-a1af-97f3aa93aeebprecedence_heuristic cell_id$087cbe82-b42a-4f80-a1af-97f3aa93aeebdownstream_cells_mapupstream_cells_map@md_strgetindexpower_slider$2381babe-0777-45db-acff-cc647a8a68d3$8b16a522-9be4-4286-b64d-3d1bbdef7142precedence_heuristic cell_id$8b16a522-9be4-4286-b64d-3d1bbdef7142downstream_cells_mapupstream_cells_map@md_strgetindex$bbc907b1-63f8-435a-badc-11ed88bd6cf5precedence_heuristic cell_id$bbc907b1-63f8-435a-badc-11ed88bd6cf5downstream_cells_mapupstream_cells_mapframetitle$c2fab245-8a98-4b41-ade2-c5b16e9c39f9precedence_heuristic cell_id$c2fab245-8a98-4b41-ade2-c5b16e9c39f9downstream_cells_mapupstream_cells_mapframetitle$35b7b8b7-bff6-4f64-91b9-b65035162365precedence_heuristic cell_id$35b7b8b7-bff6-4f64-91b9-b65035162365downstream_cells_mapupstream_cells_map@md_strgetindexcite$6c3595d2-4f68-44da-90e7-dc9c68479bcf$3cd40d9e-fcea-427d-9877-cea65e7ea413precedence_heuristic cell_id$3cd40d9e-fcea-427d-9877-cea65e7ea413downstream_cells_mapupstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.stringBase.gc_alloc_countfib_seq$462fa407-d973-4e9e-8512-b7cd3bb98b7bBase./Base.GC_Diff@timeBase.cumulative_compile_time_nsBase.-BaseBase.time_nsBase.===Base.*Base.cumulative_compile_timing$4cb070de-e8bf-4a1d-9625-043c19466c46precedence_heuristic cell_id$4cb070de-e8bf-4a1d-9625-043c19466c46downstream_cells_mapupstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.stringBase.gc_alloc_countBase./fib_pow$38744170-9af6-44b5-a0be-46a83da3253eBase.GC_Diff@timeBase.cumulative_compile_time_nsBase.-BaseBase.time_nsBase.===Base.*Base.cumulative_compile_timing$1a4da418-147f-46f4-9b95-7955183aa5cfprecedence_heuristic cell_id$1a4da418-147f-46f4-9b95-7955183aa5cfdownstream_cells_mapgcd_a$fe2af566-4a8b-4052-9915-85266ee5ce98$aee611f2-bc86-4e85-bbcb-add78c6a9175$40b8e474-16e0-4a61-bb28-11d90beefeea$eeaec4f4-71bd-43df-b9c9-a00bc3b1864bupstream_cells_mapInt32PlutoRunnerCore.applicableCoreBase.getgetindex@bindtypemaxPlutoRunner.create_bond:Base@md_strSlider$192f608c-0563-4179-903f-49fad2db4c74precedence_heuristic cell_id$192f608c-0563-4179-903f-49fad2db4c74downstream_cells_mapupstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.stringBase.gc_alloc_countBase./fib_pow$38744170-9af6-44b5-a0be-46a83da3253eBase.GC_Diff@timeBase.cumulative_compile_time_nsBase.-BaseBase.time_nsBase.===Base.*Base.cumulative_compile_timing$027fe67c-d2f0-49f6-b894-959795551d27precedence_heuristic cell_id$027fe67c-d2f0-49f6-b894-959795551d27downstream_cells_mapupstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.stringBase.gc_alloc_countBase./Base.GC_Difffib_rec$72ec8410-05d9-475a-93d4-47153cc0ce31@timeBase.cumulative_compile_time_nsBase.-BaseBase.time_nsBase.===Base.*Base.cumulative_compile_timing$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2precedence_heuristic cell_id$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2downstream_cells_mapupstream_cells_mapqa@md_strgetindexcite$6c3595d2-4f68-44da-90e7-dc9c68479bcf$cbabee34-2ca2-4ad4-93ba-2ec3c941da5eprecedence_heuristic cell_id$cbabee34-2ca2-4ad4-93ba-2ec3c941da5edownstream_cells_mapupstream_cells_map@md_strgetindex$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6precedence_heuristic cell_id$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6downstream_cells_mapupstream_cells_map@md_strgetindex$535f4bc1-e88c-47c7-990b-e3c8b5054accprecedence_heuristic cell_id$535f4bc1-e88c-47c7-990b-e3c8b5054accdownstream_cells_mapfib_closed$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66bupstream_cells_map/^+-sqrtbig√$bd0c0258-7040-42e7-a20e-532b55af3a62precedence_heuristic cell_id$bd0c0258-7040-42e7-a20e-532b55af3a62downstream_cells_mapupstream_cells_mapframetitle$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfprecedence_heuristic cell_id$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfdownstream_cells_mappow_999$6f10de7b-ce05-4f82-82e7-4110be44e8cc$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986upstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.gc_alloc_countBase.stringBase./fast_mod_power$8670abc2-63e6-496a-b20c-812197acd9adBase.GC_Diff@timepower$2381babe-0777-45db-acff-cc647a8a68d3Base.cumulative_compile_time_nsBase.-BaseBase.time_nsBase.===Base.*Base.cumulative_compile_timing$d1b260fb-7500-47fb-bb48-21b5857ab55aprecedence_heuristic cell_id$d1b260fb-7500-47fb-bb48-21b5857ab55adownstream_cells_mapupstream_cells_map@md_strgetindex$31388128-33a3-4443-835e-74b91bf48268precedence_heuristic cell_id$31388128-33a3-4443-835e-74b91bf48268downstream_cells_mapupstream_cells_mapa$b57adc77-3783-4958-91a0-e90782338755n$256c8009-4d2b-42f8-adaa-6f238ef22c6dmod+b$18031ccb-657f-409a-9080-9a0ada3ae8b5$9207b107-e1b0-4328-a004-f4b8152b423fprecedence_heuristic cell_id$9207b107-e1b0-4328-a004-f4b8152b423fdownstream_cells_mapupstream_cells_mapqa@md_strgetindex$06679a09-47d7-4024-8232-4954c08747a0precedence_heuristiccell_id$06679a09-47d7-4024-8232-4954c08747a0downstream_cells_mapLinearAlgebraPlutoUIPrimes$7f9bd301-355b-43f5-b168-22fac9e52511ColorsLuxor$8315b53f-abca-483d-bbf6-7e9193e751c9DataFramesupstream_cells_map$4714b7d7-32ee-42a1-bfa5-93eafda739d3precedence_heuristic cell_id$4714b7d7-32ee-42a1-bfa5-93eafda739d3downstream_cells_mapupstream_cells_mapframetitle$3da58487-192f-458a-9d47-7a4ce98b6da3precedence_heuristic cell_id$3da58487-192f-458a-9d47-7a4ce98b6da3downstream_cells_mapupstream_cells_mapsection$6cf004be-5205-429e-8131-ef607cebeaecprecedence_heuristic cell_id$6cf004be-5205-429e-8131-ef607cebeaecdownstream_cells_mapupstream_cells_mapE$b5f3620d-0942-41bb-80b0-d2ddcfe65090$0e3fb524-bea1-4ef0-9589-36230a84e949precedence_heuristic cell_id$0e3fb524-bea1-4ef0-9589-36230a84e949downstream_cells_mapg$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-82e2f1bd95fdgp_picker$4cff1d10-422f-4b12-b790-a589c972fbb7$059b0ada-2442-48e4-82dd-489cb97e5dccupstream_cells_mapPlutoRunner-Core.applicableCoreHAlignBase.getgetindex@bindPlutoRunner.create_bondp$57816e2c-a675-43e7-b674-2877ffcf1415:Basep_picker$57816e2c-a675-43e7-b674-2877ffcf1415@md_strSlider$aee611f2-bc86-4e85-bbcb-add78c6a9175precedence_heuristic cell_id$aee611f2-bc86-4e85-bbcb-add78c6a9175downstream_cells_mapgcd_x$40b8e474-16e0-4a61-bb28-11d90beefeeagcd_ggcd_y$40b8e474-16e0-4a61-bb28-11d90beefeeaupstream_cells_mappgcdx$3f1af973-a02b-4e06-8e6e-eff414fcaf67gcd_b$f39cccac-5b24-46e4-8749-1b0a944542efgcd_a$1a4da418-147f-46f4-9b95-7955183aa5cf$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0precedence_heuristic cell_id$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0downstream_cells_mappgcd$fe2af566-4a8b-4052-9915-85266ee5ce98upstream_cells_map==printlnmod$9722971a-16f1-4f28-ba31-c12b673b8a30precedence_heuristic cell_id$9722971a-16f1-4f28-ba31-c12b673b8a30downstream_cells_mapupstream_cells_map@md_strgetindex$8a5a251f-5373-445a-97b1-4d652c6b7ba8precedence_heuristic cell_id$8a5a251f-5373-445a-97b1-4d652c6b7ba8downstream_cells_maprefs$41cf9efd-65e5-4abb-94d3-e824780e659cupstream_cells_mapbibrefsbiblio$ba16d83d-21a5-4f0c-807b-674a167da4dc$592ae01b-2819-402d-9538-17018df5c34bprecedence_heuristic cell_id$592ae01b-2819-402d-9538-17018df5c34bdownstream_cells_mapupstream_cells_mapframetitle$191f8429-cbbb-44aa-8beb-271a94293e4bprecedence_heuristic cell_id$191f8429-cbbb-44aa-8beb-271a94293e4bdownstream_cells_mapupstream_cells_mapfast_mod_power$8670abc2-63e6-496a-b20c-812197acd9adchinese_remainder_theorem$821de132-559b-4420-b866-e97134c5bd9apower$2381babe-0777-45db-acff-cc647a8a68d3bigprime_list$16b677e4-c467-462a-b770-b7a31160e129$1072a756-5026-4de9-93a8-f942d54c474aprecedence_heuristic cell_id$1072a756-5026-4de9-93a8-f942d54c474adownstream_cells_mapupstream_cells_map@md_strgetindexcite$6c3595d2-4f68-44da-90e7-dc9c68479bcf$59ac02af-7b54-44d4-b5f4-a0f60d4458a1precedence_heuristic cell_id$59ac02af-7b54-44d4-b5f4-a0f60d4458a1downstream_cells_mapall_powers$9f55cad1-b01a-45e3-93df-a4349e2dfbd3$e2a3842d-4e07-4703-ab47-a5140649dd6a$08dcbbd3-a531-4f74-a724-1cae8fae1636$4be6cea4-13a2-4bcb-b849-14eef57ab604upstream_cells_mapp$57816e2c-a675-43e7-b674-2877ffcf1415:g$0e3fb524-bea1-4ef0-9589-36230a84e949-fast_mod_power$8670abc2-63e6-496a-b20c-812197acd9ad$09f44611-ba21-4982-ba1b-0691124642fcprecedence_heuristic cell_id$09f44611-ba21-4982-ba1b-0691124642fcdownstream_cells_mapupstream_cells_mapframetitle$eeaec4f4-71bd-43df-b9c9-a00bc3b1864bprecedence_heuristic cell_id$eeaec4f4-71bd-43df-b9c9-a00bc3b1864bdownstream_cells_mapupstream_cells_mapgcd_b$f39cccac-5b24-46e4-8749-1b0a944542efgcdxgcd_a$1a4da418-147f-46f4-9b95-7955183aa5cf$f6e22fc3-382e-4548-bc59-8f944e06d237precedence_heuristic cell_id$f6e22fc3-382e-4548-bc59-8f944e06d237downstream_cells_mapupstream_cells_mapDiagonalinv*E$b5f3620d-0942-41bb-80b0-d2ddcfe65090$19ef447f-9fdf-49e1-8d1a-7860b4d4e9baprecedence_heuristic cell_id$19ef447f-9fdf-49e1-8d1a-7860b4d4e9badownstream_cells_mapD$d830fffd-3781-40ca-85cb-c242f99667ceupstream_cells_mapDiagonal/+-sqrtbig√$82ba8fe1-435e-422b-abb7-cb50a7a85e1eprecedence_heuristic cell_id$82ba8fe1-435e-422b-abb7-cb50a7a85e1edownstream_cells_mapupstream_cells_mapframetitle$41cf9efd-65e5-4abb-94d3-e824780e659cprecedence_heuristic cell_id$41cf9efd-65e5-4abb-94d3-e824780e659cdownstream_cells_mapupstream_cells_maprefs$8a5a251f-5373-445a-97b1-4d652c6b7ba8$58da5ba4-c858-4684-a9f4-5a39fdc4fb03precedence_heuristic cell_id$58da5ba4-c858-4684-a9f4-5a39fdc4fb03downstream_cells_mapfast_power$3c198d79-c46a-4781-8bd1-b6b68f06c31f$8670abc2-63e6-496a-b20c-812197acd9adupstream_cells_map==onemod-Functiondiv$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986precedence_heuristic cell_id$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986downstream_cells_mapupstream_cells_mappow_999$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfpow_1000$77093b36-c232-4477-be49-845f1a631829chinese_remainder_theorem$821de132-559b-4420-b866-e97134c5bd9a$256c8009-4d2b-42f8-adaa-6f238ef22c6dprecedence_heuristic cell_id$256c8009-4d2b-42f8-adaa-6f238ef22c6ddownstream_cells_mapn$31388128-33a3-4443-835e-74b91bf48268$87fdefa1-3bbd-4b69-ad3a-72baca6e55ee$a1628317-7937-4316-85bf-2da860effce3$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3$4e35d650-b9a6-4668-90f0-f27a50af29adslider_n$4e35d650-b9a6-4668-90f0-f27a50af29adupstream_cells_mapBase:@bindBase.getPlutoRunnerSliderCore.applicableCorePlutoRunner.create_bond$c5e906c8-0f73-4955-baa7-337195329e04precedence_heuristic cell_id$c5e906c8-0f73-4955-baa7-337195329e04downstream_cells_mapupstream_cells_map@md_strgetindex$f39cccac-5b24-46e4-8749-1b0a944542efprecedence_heuristic cell_id$f39cccac-5b24-46e4-8749-1b0a944542efdownstream_cells_mapgcd_b$fe2af566-4a8b-4052-9915-85266ee5ce98$aee611f2-bc86-4e85-bbcb-add78c6a9175$40b8e474-16e0-4a61-bb28-11d90beefeea$eeaec4f4-71bd-43df-b9c9-a00bc3b1864bupstream_cells_mapInt32PlutoRunnerCore.applicableCoreBase.getgetindex@bindtypemaxPlutoRunner.create_bond:Base@md_strSlider$9efb7a71-9a03-4716-8d34-aae233e9b898precedence_heuristic cell_id$9efb7a71-9a03-4716-8d34-aae233e9b898downstream_cells_mapx$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253upstream_cells_mapp$57816e2c-a675-43e7-b674-2877ffcf1415g$0e3fb524-bea1-4ef0-9589-36230a84e949discrete_log$ec14d629-b720-47cd-bc08-ff96f49271ab$a1628317-7937-4316-85bf-2da860effce3precedence_heuristic cell_id$a1628317-7937-4316-85bf-2da860effce3downstream_cells_mapupstream_cells_mapa$b57adc77-3783-4958-91a0-e90782338755n$256c8009-4d2b-42f8-adaa-6f238ef22c6dmodb$18031ccb-657f-409a-9080-9a0ada3ae8b5*$7330af43-bec3-460c-94f6-768ac2975b00precedence_heuristic cell_id$7330af43-bec3-460c-94f6-768ac2975b00downstream_cells_mapshanks_discrete_log$59254bfd-48f2-4585-9ba5-e4c809421072upstream_cells_mapgiant_steps$3026f9c5-81d3-443a-940a-f22fef9754afisqrtcollision$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82mod+-baby_steps$4853f4ef-fbb8-48c3-9523-13ab4969d097*$f9f03579-5bfc-452d-bff9-9e7adfe095d3precedence_heuristic cell_id$f9f03579-5bfc-452d-bff9-9e7adfe095d3downstream_cells_mapupstream_cells_mapgcd$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3precedence_heuristic cell_id$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3downstream_cells_mapupstream_cells_mapa$b57adc77-3783-4958-91a0-e90782338755n$256c8009-4d2b-42f8-adaa-6f238ef22c6dmodb$18031ccb-657f-409a-9080-9a0ada3ae8b5*$819f15ef-31d0-44b6-837a-e3e67f2667b9precedence_heuristic cell_id$819f15ef-31d0-44b6-837a-e3e67f2667b9downstream_cells_mapupstream_cells_map@md_strgetindex$3c198d79-c46a-4781-8bd1-b6b68f06c31fprecedence_heuristic cell_id$3c198d79-c46a-4781-8bd1-b6b68f06c31fdownstream_cells_mapupstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.stringBase.gc_alloc_countBase./Base.GC_Diff@timeBase.cumulative_compile_time_nspower$2381babe-0777-45db-acff-cc647a8a68d3Base.-fast_power$58da5ba4-c858-4684-a9f4-5a39fdc4fb03BaseBase.time_nsBase.===Base.*big*Base.cumulative_compile_timing$ac5e1516-1574-4893-a965-f799947076cbprecedence_heuristic cell_id$ac5e1516-1574-4893-a965-f799947076cbdownstream_cells_mapupstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.stringBase.gc_alloc_countBase./Base.GC_Diff@timeBase.cumulative_compile_time_nsBase.-Basefib_diag$d830fffd-3781-40ca-85cb-c242f99667ceBase.time_nsBase.===Base.*Base.cumulative_compile_timing$4be6cea4-13a2-4bcb-b849-14eef57ab604precedence_heuristic cell_id$4be6cea4-13a2-4bcb-b849-14eef57ab604downstream_cells_mapupstream_cells_map==sortp$57816e2c-a675-43e7-b674-2877ffcf1415lengthg$0e3fb524-bea1-4ef0-9589-36230a84e949getindex@md_str-uniqueall_powers$59ac02af-7b54-44d4-b5f4-a0f60d4458a1$a4698418-ebf7-4992-a3ba-a15ff282bf87precedence_heuristic cell_id$a4698418-ebf7-4992-a3ba-a15ff282bf87downstream_cells_mapupstream_cells_mapqa@md_strgetindex$a1081bb2-2186-4b19-b667-0c246155f360precedence_heuristic cell_id$a1081bb2-2186-4b19-b667-0c246155f360downstream_cells_mapupstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.stringBase.gc_alloc_countBase./fib_pow$38744170-9af6-44b5-a0be-46a83da3253eBase.GC_Diff@timeBase.cumulative_compile_time_nsBase.-BaseBase.time_nsBase.===Base.*Base.cumulative_compile_timing$6332b2f2-ed2f-448a-b1df-247b110e335bprecedence_heuristic cell_id$6332b2f2-ed2f-448a-b1df-247b110e335bdownstream_cells_mapupstream_cells_mapqa@md_strgetindex$2381babe-0777-45db-acff-cc647a8a68d3precedence_heuristic cell_id$2381babe-0777-45db-acff-cc647a8a68d3downstream_cells_mappower$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-d015f6ce76e5power_slider$c8f85081-3659-4796-8550-2e708b09c8d7$087cbe82-b42a-4f80-a1af-97f3aa93aeebupstream_cells_mapBase:@bindBase.getPlutoRunnerSliderCore.applicableCorePlutoRunner.create_bond$72ec8410-05d9-475a-93d4-47153cc0ce31precedence_heuristic cell_id$72ec8410-05d9-475a-93d4-47153cc0ce31downstream_cells_mapfib_rec$027fe67c-d2f0-49f6-b894-959795551d27upstream_cells_map==+-$48eba223-6cce-4aa2-9977-4883ba7903fcprecedence_heuristic cell_id$48eba223-6cce-4aa2-9977-4883ba7903fcdownstream_cells_mapupstream_cells_mapqa@md_strgetindex$1ca71c26-f98c-4126-a1c5-98786fde7e9bprecedence_heuristic cell_id$1ca71c26-f98c-4126-a1c5-98786fde7e9bdownstream_cells_mapupstream_cells_map@md_strgetindex$3026f9c5-81d3-443a-940a-f22fef9754afprecedence_heuristic cell_id$3026f9c5-81d3-443a-940a-f22fef9754afdownstream_cells_mapgiant_steps$7330af43-bec3-460c-94f6-768ac2975b00upstream_cells_mapmodinv$21df1900-3954-4506-b759-aeeee664d1dfbaby_steps$4853f4ef-fbb8-48c3-9523-13ab4969d097fast_mod_power$8670abc2-63e6-496a-b20c-812197acd9ad$821de132-559b-4420-b866-e97134c5bd9aprecedence_heuristic cell_id$821de132-559b-4420-b866-e97134c5bd9adownstream_cells_mapchinese_remainder_theorem$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986$191f8429-cbbb-44aa-8beb-271a94293e4bupstream_cells_mapeachindexprodmod!=sumerrorgcd==modinv$21df1900-3954-4506-b759-aeeee664d1df*div$0ee6972c-5069-4ba0-887f-be64c7d000d0precedence_heuristic cell_id$0ee6972c-5069-4ba0-887f-be64c7d000d0downstream_cells_mapupstream_cells_mapframetitle$4853f4ef-fbb8-48c3-9523-13ab4969d097precedence_heuristic cell_id$4853f4ef-fbb8-48c3-9523-13ab4969d097downstream_cells_mapbaby_steps$3026f9c5-81d3-443a-940a-f22fef9754af$7330af43-bec3-460c-94f6-768ac2975b00upstream_cells_maponepush!:modend*$b57adc77-3783-4958-91a0-e90782338755precedence_heuristic cell_id$b57adc77-3783-4958-91a0-e90782338755downstream_cells_mapa$31388128-33a3-4443-835e-74b91bf48268$87fdefa1-3bbd-4b69-ad3a-72baca6e55ee$a1628317-7937-4316-85bf-2da860effce3$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3$4e35d650-b9a6-4668-90f0-f27a50af29adslider_a$4e35d650-b9a6-4668-90f0-f27a50af29adupstream_cells_mapBase:@bindBase.getPlutoRunnerSliderCore.applicableCorePlutoRunner.create_bond$c376513c-6553-4cd6-8384-ae6ff9d472d7precedence_heuristic cell_id$c376513c-6553-4cd6-8384-ae6ff9d472d7downstream_cells_mapupstream_cells_map@md_strgetindex$37585789-bd43-4ce5-b550-ad712b70d226precedence_heuristic cell_id$37585789-bd43-4ce5-b550-ad712b70d226downstream_cells_mapupstream_cells_map@md_strgetindex$78df9410-5ea4-4d9f-bbe5-862f76a100fcprecedence_heuristic cell_id$78df9410-5ea4-4d9f-bbe5-862f76a100fcdownstream_cells_mapupstream_cells_map@md_strgetindex$9e8a61d9-a700-4851-b1cd-49ce042c3530precedence_heuristic cell_id$9e8a61d9-a700-4851-b1cd-49ce042c3530downstream_cells_mapupstream_cells_map^Base.time_printBase.gc_numBase.Threads.lock_profilingBase.gc_alloc_countBase.stringBase./Base.GC_Diff@timepower$2381babe-0777-45db-acff-cc647a8a68d3Base.cumulative_compile_time_nsBase.-BaseBase.time_nsBase.===Base.*bigBase.cumulative_compile_timing$e505716d-af01-455f-a55a-a9c225822ad5precedence_heuristic cell_id$e505716d-af01-455f-a55a-a9c225822ad5downstream_cells_mapupstream_cells_map@md_strgetindex$61462af5-69bd-42be-8918-7992c79ee00dprecedence_heuristic cell_id$61462af5-69bd-42be-8918-7992c79ee00ddownstream_cells_mapupstream_cells_mapqa@md_strgetindex$15367f3b-c7e4-4004-a018-5422a7f22024precedence_heuristic cell_id$15367f3b-c7e4-4004-a018-5422a7f22024downstream_cells_mapupstream_cells_map@md_strgetindex$ba16d83d-21a5-4f0c-807b-674a167da4dcprecedence_heuristic cell_id$ba16d83d-21a5-4f0c-807b-674a167da4dcdownstream_cells_mapbiblio$6c3595d2-4f68-44da-90e7-dc9c68479bcf$8a5a251f-5373-445a-97b1-4d652c6b7ba8upstream_cells_mapload_biblio!$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82precedence_heuristic cell_id$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82downstream_cells_mapcollision$7330af43-bec3-460c-94f6-768ac2975b00upstream_cells_mapeachindex=>haskeyDict$64eb4b52-4946-467c-867a-a6fc437b15f6precedence_heuristic cell_id$64eb4b52-4946-467c-867a-a6fc437b15f6downstream_cells_mapupstream_cells_mapframetitle$bbb2793a-faa4-43bd-b2e8-e8d3ac93310fprecedence_heuristic cell_id$bbb2793a-faa4-43bd-b2e8-e8d3ac93310fdownstream_cells_mapupstream_cells_map@md_strgetindex$ec14d629-b720-47cd-bc08-ff96f49271abprecedence_heuristic cell_id$ec14d629-b720-47cd-bc08-ff96f49271abdownstream_cells_mapdiscrete_log$9efb7a71-9a03-4716-8d34-aae233e9b898upstream_cells_map==one:mod-*$bc58ba24-90f0-4913-8f66-10bb6cb54076precedence_heuristic cell_id$bc58ba24-90f0-4913-8f66-10bb6cb54076downstream_cells_mapupstream_cells_map@md_strgetindex$f86a5efc-d31e-4e88-b81f-ebdbbeba11ecprecedence_heuristic cell_id$f86a5efc-d31e-4e88-b81f-ebdbbeba11ecdownstream_cells_mapupstream_cells_map@md_strgetindex$83852dd5-3546-45af-a845-b01dab0aa2a6precedence_heuristic cell_id$83852dd5-3546-45af-a845-b01dab0aa2a6downstream_cells_mapupstream_cells_mapframetitle$8315b53f-abca-483d-bbf6-7e9193e751c9precedence_heuristic cell_id$8315b53f-abca-483d-bbf6-7e9193e751c9downstream_cells_mapdraw_fib$708c442b-cbff-4e1a-b70d-e704453cfd3dupstream_cells_map Luxor$06679a09-47d7-4024-8232-4954c08747a0/islessdivsethueLuxor.backgroundsetopacityminLuxor.origin-@drawrectmod+endsumtextLuxor.sethueLuxor.previewLuxor.Drawingpush!:PointLuxor.finishiseven==stringdistinguishable_colorsmaximumisoddfontsize*$4c2d45e3-56a2-467f-b87f-7b98cb873a05precedence_heuristic cell_id$4c2d45e3-56a2-467f-b87f-7b98cb873a05downstream_cells_mapupstream_cells_mapfast_mod_power$8670abc2-63e6-496a-b20c-812197acd9adpower$2381babe-0777-45db-acff-cc647a8a68d3prime_list$16b677e4-c467-462a-b770-b7a31160e129$3df688c8-1c52-462d-88be-daa153333c60precedence_heuristic cell_id$3df688c8-1c52-462d-88be-daa153333c60downstream_cells_mapupstream_cells_map@md_strgetindexcite$6c3595d2-4f68-44da-90e7-dc9c68479bcf$e9633e3f-376d-413d-bc19-d015f6ce76e5precedence_heuristic cell_id$e9633e3f-376d-413d-bc19-d015f6ce76e5downstream_cells_mapupstream_cells_map^power$2381babe-0777-45db-acff-cc647a8a68d3big$ae89661a-2c0f-4752-adc2-023f09dc0e9fprecedence_heuristic cell_id$ae89661a-2c0f-4752-adc2-023f09dc0e9fdownstream_cells_mapupstream_cells_mapreshape:g$0e3fb524-bea1-4ef0-9589-36230a84e949fast_mod_power$8670abc2-63e6-496a-b20c-812197acd9ad$1b1d5c9b-5fc7-480e-9649-e9c44a49c38dprecedence_heuristiccell_id$1b1d5c9b-5fc7-480e-9649-e9c44a49c38ddownstream_cells_mapupstream_cells_mapinclude$6f10de7b-ce05-4f82-82e7-4110be44e8ccprecedence_heuristic cell_id$6f10de7b-ce05-4f82-82e7-4110be44e8ccdownstream_cells_mapupstream_cells_mapmodinv$21df1900-3954-4506-b759-aeeee664d1dfpow_999$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfpow_1000$77093b36-c232-4477-be49-845f1a631829mod+*$d6b89fda-308f-43da-8028-1a812b4516cfprecedence_heuristic cell_id$d6b89fda-308f-43da-8028-1a812b4516cfdownstream_cells_mapupstream_cells_mapqa@md_strgetindex$e2a3842d-4e07-4703-ab47-a5140649dd6aprecedence_heuristic cell_id$e2a3842d-4e07-4703-ab47-a5140649dd6adownstream_cells_mapupstream_cells_mapsortuniqueall_powers$59ac02af-7b54-44d4-b5f4-a0f60d4458a1$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4precedence_heuristic cell_id$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4downstream_cells_mapupstream_cells_mapqa@md_strgetindex$d882afdd-eb85-467c-bf18-525c0c5da5e7precedence_heuristic cell_id$d882afdd-eb85-467c-bf18-525c0c5da5e7downstream_cells_mapupstream_cells_mapBase.time_printBase.gc_numBase.Threads.lock_profilingBase.stringBase.gc_alloc_countBase./Base.GC_Diff@timeBase.cumulative_compile_time_nsBase.-Basefib_diag$d830fffd-3781-40ca-85cb-c242f99667ceBase.time_nsBase.===Base.*Base.cumulative_compile_timing$03e49669-cdee-4241-862d-33ee91214455precedence_heuristic cell_id$03e49669-cdee-4241-862d-33ee91214455downstream_cells_mapupstream_cells_map@md_strgetindex$e52d25b3-65bf-4617-ae8d-fae0d0c8d041precedence_heuristic cell_id$e52d25b3-65bf-4617-ae8d-fae0d0c8d041downstream_cells_mapupstream_cells_map@md_strgetindex$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1precedence_heuristic cell_id$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1downstream_cells_mapupstream_cells_mapmodinv$21df1900-3954-4506-b759-aeeee664d1dfcollect:mod*$7da0705e-c925-4f8d-9ca4-8d8a0f859feaprecedence_heuristic cell_id$7da0705e-c925-4f8d-9ca4-8d8a0f859feadownstream_cells_mapupstream_cells_map@md_strgetindex$c3411941-d77f-46cb-8378-23998a1a4828precedence_heuristic cell_id$c3411941-d77f-46cb-8378-23998a1a4828downstream_cells_mapupstream_cells_mapframetitle$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253precedence_heuristic cell_id$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253downstream_cells_mapupstream_cells_mapfast_mod_power$8670abc2-63e6-496a-b20c-812197acd9adp$57816e2c-a675-43e7-b674-2877ffcf1415isnothingg$0e3fb524-bea1-4ef0-9589-36230a84e949!x$9efb7a71-9a03-4716-8d34-aae233e9b898$736307ec-a2a4-11ef-0f85-ad1a0093e06aprecedence_heuristic cell_id$736307ec-a2a4-11ef-0f85-ad1a0093e06adownstream_cells_mapupstream_cells_map@md_strgetindex$40b8e474-16e0-4a61-bb28-11d90beefeeaprecedence_heuristic cell_id$40b8e474-16e0-4a61-bb28-11d90beefeeadownstream_cells_mapupstream_cells_mapgcd_b$f39cccac-5b24-46e4-8749-1b0a944542ef+gcd_x$aee611f2-bc86-4e85-bbcb-add78c6a9175gcd_y$aee611f2-bc86-4e85-bbcb-add78c6a9175*gcd_a$1a4da418-147f-46f4-9b95-7955183aa5cf$6e59ee60-ef73-45ca-86eb-4d8a44c73771precedence_heuristic cell_id$6e59ee60-ef73-45ca-86eb-4d8a44c73771downstream_cells_mapupstream_cells_mapqa@md_strgetindex$08dcbbd3-a531-4f74-a724-1cae8fae1636precedence_heuristic cell_id$08dcbbd3-a531-4f74-a724-1cae8fae1636downstream_cells_mapupstream_cells_map==sortp$57816e2c-a675-43e7-b674-2877ffcf1415lengthg$0e3fb524-bea1-4ef0-9589-36230a84e949getindex@md_str-uniqueall_powers$59ac02af-7b54-44d4-b5f4-a0f60d4458a1$16b677e4-c467-462a-b770-b7a31160e129precedence_heuristic cell_id$16b677e4-c467-462a-b770-b7a31160e129downstream_cells_mapprime_list$4c2d45e3-56a2-467f-b87f-7b98cb873a05$191f8429-cbbb-44aa-8beb-271a94293e4bupstream_cells_mapprimesprimes_upper$67093a35-8e1b-4cd3-b11b-c7ff601f802e$2c34c17e-12de-43ea-870c-818c97647836precedence_heuristic cell_id$2c34c17e-12de-43ea-870c-818c97647836downstream_cells_mapupstream_cells_mapframetitle$21df1900-3954-4506-b759-aeeee664d1dfprecedence_heuristic cell_id$21df1900-3954-4506-b759-aeeee664d1dfdownstream_cells_mapmodinv$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-f22fef9754afupstream_cells_mapmodgcdx$d830fffd-3781-40ca-85cb-c242f99667ceprecedence_heuristic cell_id$d830fffd-3781-40ca-85cb-c242f99667cedownstream_cells_mapfib_diag$ac5e1516-1574-4893-a965-f799947076cb$d882afdd-eb85-467c-bf18-525c0c5da5e7upstream_cells_map^D$19ef447f-9fdf-49e1-8d1a-7860b4d4e9ba\-*E$b5f3620d-0942-41bb-80b0-d2ddcfe65090$08b18315-c28e-44ed-beb2-5b17421b0224precedence_heuristic cell_id$08b18315-c28e-44ed-beb2-5b17421b0224downstream_cells_mapupstream_cells_map@md_strgetindex$8670abc2-63e6-496a-b20c-812197acd9adprecedence_heuristic cell_id$8670abc2-63e6-496a-b20c-812197acd9addownstream_cells_mapfast_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-82e2f1bd95fdupstream_cells_mapfast_power$58da5ba4-c858-4684-a9f4-5a39fdc4fb03mod*$227e415e-ab17-4f3a-b695-9573c9ee2b57precedence_heuristic cell_id$227e415e-ab17-4f3a-b695-9573c9ee2b57downstream_cells_mapupstream_cells_mapqa@md_strgetindex$67093a35-8e1b-4cd3-b11b-c7ff601f802eprecedence_heuristic cell_id$67093a35-8e1b-4cd3-b11b-c7ff601f802edownstream_cells_mapprimes_upper$16b677e4-c467-462a-b770-b7a31160e129upstream_cells_mapPlutoRunnerCore.applicableCoreBase.getgetindex@bindPlutoRunner.create_bond:Base@md_strSlider$7f9bd301-355b-43f5-b168-22fac9e52511precedence_heuristic cell_id$7f9bd301-355b-43f5-b168-22fac9e52511downstream_cells_mapupstream_cells_mapPrimes.primesPrimes$06679a09-47d7-4024-8232-4954c08747a0$3f1af973-a02b-4e06-8e6e-eff414fcaf67precedence_heuristic cell_id$3f1af973-a02b-4e06-8e6e-eff414fcaf67downstream_cells_mappgcdx$aee611f2-bc86-4e85-bbcb-add78c6a9175upstream_cells_map==onedivrem-zero*$fe2af566-4a8b-4052-9915-85266ee5ce98precedence_heuristic cell_id$fe2af566-4a8b-4052-9915-85266ee5ce98downstream_cells_mapupstream_cells_mappgcd$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0gcd_b$f39cccac-5b24-46e4-8749-1b0a944542efgcd_a$1a4da418-147f-46f4-9b95-7955183aa5cf$6ed7c73d-60da-4908-85cb-958745d81ebcprecedence_heuristic cell_id$6ed7c73d-60da-4908-85cb-958745d81ebcdownstream_cells_mapupstream_cells_map@md_strgetindex$708c442b-cbff-4e1a-b70d-e704453cfd3dprecedence_heuristic cell_id$708c442b-cbff-4e1a-b70d-e704453cfd3ddownstream_cells_mapupstream_cells_mapHAligndraw_fib$8315b53f-abca-483d-bbf6-7e9193e751c9@md_strgetindexfib_n$0c8ab02e-80b0-44d6-a4a8-c813aac38209fib_picker$0c8ab02e-80b0-44d6-a4a8-c813aac38209$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21eprecedence_heuristic cell_id$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21edownstream_cells_mapupstream_cells_map@md_strgetindex$a7d06375-e4dd-47b1-8aba-11dc4d62954bprecedence_heuristic cell_id$a7d06375-e4dd-47b1-8aba-11dc4d62954bdownstream_cells_mapupstream_cells_mapqa@md_strgetindexlast_save_timeAک?B-ܫnotebook_id$0ed1a440-b006-11f1-8f66-7f97717fc42fin_temp_dir¨metadatabondscell_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-e824780e659cprocess_statusreadycell_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-4d652c6b7ba8cell_inputs$a7985d16-500b-4024-aaa1-78e654b94be4metadatadisabled©show_logsîskip_as_script§cell_id$a7985d16-500b-4024-aaa1-78e654b94be4code_foldedäcodeBqa(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``. """)$eb311761-ace2-4632-9ebf-9c7c166659f7metadatadisabled©show_logsîskip_as_script§cell_id$eb311761-ace2-4632-9ebf-9c7c166659f7code_foldedäcodeJmd""" ```math A' \equiv B^a \pmod{p} \qquad B' \equiv A^b \pmod{p} ``` """$d8a28762-8aab-49e9-b9ac-38901d34abffmetadatadisabled©show_logsîskip_as_script§cell_id$d8a28762-8aab-49e9-b9ac-38901d34abffcode_foldedäcodeframetitle("Fast powering")$a826d9d1-47db-4645-be6e-3ae0ed8d4e18metadatadisabled©show_logsîskip_as_script§cell_id$a826d9d1-47db-4645-be6e-3ae0ed8d4e18code_foldedäcodemd""" 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} ``` """$8f6ba1c4-a971-4dc4-ac5d-2f30790aecdemetadatadisabled©show_logsîskip_as_script§cell_id$8f6ba1c4-a971-4dc4-ac5d-2f30790aecdecode_foldedäcode'frametitle("Fermat’s Little Theorem")$6c3595d2-4f68-44da-90e7-dc9c68479bcfmetadatadisabled©show_logsîskip_as_script§cell_id$6c3595d2-4f68-44da-90e7-dc9c68479bcfcode_folded¤code(cite(args...) = bibcite(biblio, args...)$a293bb0e-078d-4335-a446-3096a79c03bcmetadatadisabled©show_logsîskip_as_script§cell_id$a293bb0e-078d-4335-a446-3096a79c03bccode_foldedäcodeframetitle("Diffie-Hellman")$38744170-9af6-44b5-a0be-46a83da3253emetadatadisabled©show_logsîskip_as_script§cell_id$38744170-9af6-44b5-a0be-46a83da3253ecode_folded¤codeRfunction fib_pow(n) A = BigInt[1 1 1 0] x = A^(n-1) * [1, 0] return x[1] end$87fdefa1-3bbd-4b69-ad3a-72baca6e55eemetadatadisabled©show_logsîskip_as_script§cell_id$87fdefa1-3bbd-4b69-ad3a-72baca6e55eecode_folded¤codemod(mod(a, n) + mod(b, n), n)$77093b36-c232-4477-be49-845f1a631829metadatadisabled©show_logsîskip_as_script§cell_id$77093b36-c232-4477-be49-845f1a631829code_folded¤code/@time pow_1000 = fast_mod_power(2, power, 1000)$462fa407-d973-4e9e-8512-b7cd3bb98b7bmetadatadisabled©show_logsîskip_as_script§cell_id$462fa407-d973-4e9e-8512-b7cd3bb98b7bcode_folded¤codezfunction 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-559f7151585bmetadatadisabled©show_logsîskip_as_script§cell_id$ca8905ef-97a3-424c-bb2e-559f7151585bcode_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`. """$59817f59-429b-4f17-a46a-185571fd1e5ametadatadisabled©show_logsîskip_as_script§cell_id$59817f59-429b-4f17-a46a-185571fd1e5acode_foldedäcode#frametitle("Fast modular powering")$ee43c389-55f4-4cf9-a8db-ce37d1b89db4metadatadisabled©show_logsîskip_as_script§cell_id$ee43c389-55f4-4cf9-a8db-ce37d1b89db4code_foldedäcode5frametitle("Shanks's Babystep–Giantstep Algorithm")$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66bmetadatadisabled©show_logsîskip_as_script§cell_id$9b9fc5e6-1a41-43c5-ba43-2c93bc3ef66bcode_folded¤code@time fib_closed(20000)$cd481f6c-66f4-4ebf-9769-c3edc24f403bmetadatadisabled©show_logsîskip_as_script§cell_id$cd481f6c-66f4-4ebf-9769-c3edc24f403bcode_foldedäcode1frametitle("Algorithme d'Euclide : élaboration")$9752afbb-96e6-4f96-92cb-09654cf46155metadatadisabled©show_logsîskip_as_script§cell_id$9752afbb-96e6-4f96-92cb-09654cf46155code_foldedäcodeqa(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``. """)$bafc9870-3823-4d1d-b0b7-94c69ee764d5metadatadisabled©show_logsîskip_as_script§cell_id$bafc9870-3823-4d1d-b0b7-94c69ee764d5code_folded¤codeimport DocumenterCitations$7bad8c6c-45c7-402f-ad59-6857e9268901metadatadisabled©show_logsîskip_as_script§cell_id$7bad8c6c-45c7-402f-ad59-6857e9268901code_foldedäcodeVqa(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``. """,)$0c8ab02e-80b0-44d6-a4a8-c813aac38209metadatadisabled©show_logsîskip_as_script§cell_id$0c8ab02e-80b0-44d6-a4a8-c813aac38209code_folded¤codeFfib_picker = @bind fib_n Slider(1:12, default = 10, show_value = true)$059b0ada-2442-48e4-82dd-489cb97e5dccmetadatadisabled©show_logsîskip_as_script§cell_id$059b0ada-2442-48e4-82dd-489cb97e5dcccode_foldedäcodegp_picker$b319619e-8f8d-4650-8fb4-76e5ba953470metadatadisabled©show_logsîskip_as_script§cell_id$b319619e-8f8d-4650-8fb4-76e5ba953470code_foldedäcodemd""" ```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. """$7db2060b-d69e-42e7-ae81-fd37ee793876metadatadisabled©show_logsîskip_as_script§cell_id$7db2060b-d69e-42e7-ae81-fd37ee793876code_foldedäcodemd""" 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 ``` """$594829e2-585b-4d48-bb6e-b35d9543cfbemetadatadisabled©show_logsîskip_as_script§cell_id$594829e2-585b-4d48-bb6e-b35d9543cfbecode_foldedäcode(frametitle("Fast powering for matrices")$6107d03d-1e45-4eb9-b8e2-51e4a72485e6metadatadisabled©show_logsîskip_as_script§cell_id$6107d03d-1e45-4eb9-b8e2-51e4a72485e6code_foldedäcode&frametitle("Recursive implementation")$e1b5733f-a7a8-458f-a345-b358b9a03fcfmetadatadisabled©show_logsîskip_as_script§cell_id$e1b5733f-a7a8-458f-a345-b358b9a03fcfcode_foldedäcodemd""" 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} ``` """$b5f3620d-0942-41bb-80b0-d2ddcfe65090metadatadisabled©show_logsîskip_as_script§cell_id$b5f3620d-0942-41bb-80b0-d2ddcfe65090code_folded¤codeE = eigen([1 1; 1 0])$18031ccb-657f-409a-9080-9a0ada3ae8b5metadatadisabled©show_logsîskip_as_script§cell_id$18031ccb-657f-409a-9080-9a0ada3ae8b5code_folded¤code?slider_b = @bind b Slider(1:100, default=13, show_value = true)$1e27eedc-5308-4608-863f-fb81d60acdf0metadatadisabled©show_logsîskip_as_script§cell_id$1e27eedc-5308-4608-863f-fb81d60acdf0code_foldedäcodeHqa(md"Quelle est la complexité?", md"``\mathcal{O}(\sqrt{p}\log(p))``")$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82metadatadisabled©show_logsîskip_as_script§cell_id$4ef2c7e9-fb37-4e38-a252-b9c3f83d2a82code_foldedäcodeabn_picker$c8f85081-3659-4796-8550-2e708b09c8d7metadatadisabled©show_logsîskip_as_script§cell_id$c8f85081-3659-4796-8550-2e708b09c8d7code_foldedäcodemd"`power` = $power_slider"$bc9a718f-4b97-4e15-acf8-d180abc5b6d5metadatadisabled©show_logsîskip_as_script§cell_id$bc9a718f-4b97-4e15-acf8-d180abc5b6d5code_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")) """)$ce07d5c5-90a3-4c12-bada-30e4da1b99fdmetadatadisabled©show_logsîskip_as_script§cell_id$ce07d5c5-90a3-4c12-bada-30e4da1b99fdcode_folded¤codefast_mod_power.(g, 0:15, 17)$59254bfd-48f2-4585-9ba5-e4c809421072metadatadisabled©show_logsîskip_as_script§cell_id$59254bfd-48f2-4585-9ba5-e4c809421072code_folded¤code'shanks_x = shanks_discrete_log(3, g, p)$93aa2719-f962-497b-9fda-30f54fd848ebmetadatadisabled©show_logsîskip_as_script§cell_id$93aa2719-f962-497b-9fda-30f54fd848ebcode_folded¤code(collect(mod.(modinv(30, 7) .* (0:6), 7))$9f55cad1-b01a-45e3-93df-a4349e2dfbd3metadatadisabled©show_logsîskip_as_script§cell_id$9f55cad1-b01a-45e3-93df-a4349e2dfbd3code_folded¤codesort(all_powers)$a41722b8-8c21-4d3c-a38b-4d248a79e80ametadatadisabled©show_logsîskip_as_script§cell_id$a41722b8-8c21-4d3c-a38b-4d248a79e80acode_foldedäcodemd"Pas une solution unique:"$9cef898e-192c-418a-bec6-511f8b6da179metadatadisabled©show_logsîskip_as_script§cell_id$9cef898e-192c-418a-bec6-511f8b6da179code_folded¤code fast_mod_power(2, power, 999000)$ed023033-1044-4d48-aab1-39e9300043f7metadatadisabled©show_logsîskip_as_script§cell_id$ed023033-1044-4d48-aab1-39e9300043f7code_foldedäcodemd""" **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}. ``` """$2cb5c6e0-b431-4d2e-b023-cd2131112ecametadatadisabled©show_logsîskip_as_script§cell_id$2cb5c6e0-b431-4d2e-b023-cd2131112ecacode_foldedäcode*frametitle("Algorithme d'Euclide étendu")$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fdmetadatadisabled©show_logsîskip_as_script§cell_id$ab467d70-ceb1-40e5-b8fe-82e2f1bd95fdcode_folded¤codefast_mod_power(g, shanks_x, p)$a7d9703a-5121-4b43-8cd4-2acf9a0d91efmetadatadisabled©show_logsîskip_as_script§cell_id$a7d9703a-5121-4b43-8cd4-2acf9a0d91efcode_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})``. """$57816e2c-a675-43e7-b674-2877ffcf1415metadatadisabled©show_logsîskip_as_script§cell_id$57816e2c-a675-43e7-b674-2877ffcf1415code_folded¤codeFp_picker = @bind p Slider(primes(20), default = 11, show_value = true)$f4f49568-dcf2-4c76-ba66-065d2fda7a4ametadatadisabled©show_logsîskip_as_script§cell_id$f4f49568-dcf2-4c76-ba66-065d2fda7a4acode_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} ``` """$4a98507b-653e-4354-a825-7605f8fcb31bmetadatadisabled©show_logsîskip_as_script§cell_id$4a98507b-653e-4354-a825-7605f8fcb31bcode_folded¤codeFmod.(fast_mod_power.(g, 0:3, 17) * fast_mod_power.(g^4, 0:3, 17)', 17)$a59a20e2-a7c7-48a9-ad8d-8094e03a749dmetadatadisabled©show_logsîskip_as_script§cell_id$a59a20e2-a7c7-48a9-ad8d-8094e03a749dcode_folded¤code)collect(mod.(modinv(365, 7) .* (0:6), 7))$4e35d650-b9a6-4668-90f0-f27a50af29admetadatadisabled©show_logsîskip_as_script§cell_id$4e35d650-b9a6-4668-90f0-f27a50af29adcode_foldedäcode٤abn_picker = md""" | `a` | ``\alpha`` | `b` | ``\beta`` | `n` | |------|-----|-----|---|---| | $slider_a | $(mod(a, n)) | $slider_b | $(mod(b, n)) | $slider_n | """$4cff1d10-422f-4b12-b790-a589c972fbb7metadatadisabled©show_logsîskip_as_script§cell_id$4cff1d10-422f-4b12-b790-a589c972fbb7code_foldedäcodegp_picker$909b8a36-79bb-4c1a-9dd7-4acaffc0434emetadatadisabled©show_logsîskip_as_script§cell_id$909b8a36-79bb-4c1a-9dd7-4acaffc0434ecode_foldedäcode#frametitle("Théorème de Bézout")$642d545f-b1b9-49da-8a03-ad63e3214f59metadatadisabled©show_logsîskip_as_script§cell_id$642d545f-b1b9-49da-8a03-ad63e3214f59code_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} ``` """$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2metadatadisabled©show_logsîskip_as_script§cell_id$6c3bca1a-3109-4e48-97e1-e0ed4599ffb2code_foldedäcode"frametitle("Closed form solution")$a7afc0cb-a980-4f4f-b782-9791d932ee52metadatadisabled©show_logsîskip_as_script§cell_id$a7afc0cb-a980-4f4f-b782-9791d932ee52code_foldedäcodeCmd""" Voir $(cite("hoffstein2014Introduction", "Section 2.8")). """$d81bbd74-42df-4bb2-a045-9c2642cc19e5metadatadisabled©show_logsîskip_as_script§cell_id$d81bbd74-42df-4bb2-a045-9c2642cc19e5code_folded¤codeabn_picker$087cbe82-b42a-4f80-a1af-97f3aa93aeebmetadatadisabled©show_logsîskip_as_script§cell_id$087cbe82-b42a-4f80-a1af-97f3aa93aeebcode_foldedäcodemd"`power` = $power_slider"$8b16a522-9be4-4286-b64d-3d1bbdef7142metadatadisabled©show_logsîskip_as_script§cell_id$8b16a522-9be4-4286-b64d-3d1bbdef7142code_foldedäcodemd""" É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}``. """$bbc907b1-63f8-435a-badc-11ed88bd6cf5metadatadisabled©show_logsîskip_as_script§cell_id$bbc907b1-63f8-435a-badc-11ed88bd6cf5code_foldedäcodeframetitle("Exemples")$c2fab245-8a98-4b41-ade2-c5b16e9c39f9metadatadisabled©show_logsîskip_as_script§cell_id$c2fab245-8a98-4b41-ade2-c5b16e9c39f9code_foldedäcode'frametitle("Chinese remainder theorem")$35b7b8b7-bff6-4f64-91b9-b65035162365metadatadisabled©show_logsîskip_as_script§cell_id$35b7b8b7-bff6-4f64-91b9-b65035162365code_foldedäcode@md"""Voir $(cite("hoffstein2014Introduction", "Section 2.3"))"""$3cd40d9e-fcea-427d-9877-cea65e7ea413metadatadisabled©show_logsîskip_as_script§cell_id$3cd40d9e-fcea-427d-9877-cea65e7ea413code_folded¤code@time fib_seq(20000)$4cb070de-e8bf-4a1d-9625-043c19466c46metadatadisabled©show_logsîskip_as_script§cell_id$4cb070de-e8bf-4a1d-9625-043c19466c46code_folded¤code@time fib_pow(20000)$1a4da418-147f-46f4-9b95-7955183aa5cfmetadatadisabled©show_logsîskip_as_script§cell_id$1a4da418-147f-46f4-9b95-7955183aa5cfcode_foldedäcodeZmd"`gcd_a` = $(@bind gcd_a Slider(1:typemax(Int32), default=90284599, show_value = true))"$192f608c-0563-4179-903f-49fad2db4c74metadatadisabled©show_logsîskip_as_script§cell_id$192f608c-0563-4179-903f-49fad2db4c74code_folded¤code@time fib_pow(20000)$027fe67c-d2f0-49f6-b894-959795551d27metadatadisabled©show_logsîskip_as_script§cell_id$027fe67c-d2f0-49f6-b894-959795551d27code_folded¤code@time fib_rec(42)$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2metadatadisabled©show_logsîskip_as_script§cell_id$bcf73ad7-a08b-4cbb-bcd2-d0abc002e7e2code_foldedäcodeqa(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")). """)$cbabee34-2ca2-4ad4-93ba-2ec3c941da5emetadatadisabled©show_logsîskip_as_script§cell_id$cbabee34-2ca2-4ad4-93ba-2ec3c941da5ecode_foldedäcodedmd""" 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}``. """$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6metadatadisabled©show_logsîskip_as_script§cell_id$e1aafab7-c4f3-45ac-81ee-7f875ac7c8c6code_foldedäcodemd""" * **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}``. """$535f4bc1-e88c-47c7-990b-e3c8b5054accmetadatadisabled©show_logsîskip_as_script§cell_id$535f4bc1-e88c-47c7-990b-e3c8b5054acccode_folded¤codeOfib_closed(n) = (((1 + √big(5)) / 2)^n - ((1 - √big(5)) / 2)^n) / √big(5)$bd0c0258-7040-42e7-a20e-532b55af3a62metadatadisabled©show_logsîskip_as_script§cell_id$bd0c0258-7040-42e7-a20e-532b55af3a62code_foldedäcode4frametitle("Algorithme d'Euclide : implémentation")$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfmetadatadisabled©show_logsîskip_as_script§cell_id$65f4990f-1952-4682-8fa8-9e3dd4bf1ebfcode_folded¤code-@time pow_999 = fast_mod_power(2, power, 999)$d1b260fb-7500-47fb-bb48-21b5857ab55ametadatadisabled©show_logsîskip_as_script§cell_id$d1b260fb-7500-47fb-bb48-21b5857ab55acode_foldedäcode^md""" **Lemme**: Si ``a \equiv r \pmod{b}`` alors ``\text{gcd}(a, b) = \text{gcd}(b, r)``. """$31388128-33a3-4443-835e-74b91bf48268metadatadisabled©show_logsîskip_as_script§cell_id$31388128-33a3-4443-835e-74b91bf48268code_folded¤codemod(a + b, n)$9207b107-e1b0-4328-a004-f4b8152b423fmetadatadisabled©show_logsîskip_as_script§cell_id$9207b107-e1b0-4328-a004-f4b8152b423fcode_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)``. """)$06679a09-47d7-4024-8232-4954c08747a0metadatadisabled©show_logsîskip_as_script§cell_id$06679a09-47d7-4024-8232-4954c08747a0code_folded¤code?using PlutoUI, Primes, DataFrames, Luxor, Colors, LinearAlgebra$4714b7d7-32ee-42a1-bfa5-93eafda739d3metadatadisabled©show_logsîskip_as_script§cell_id$4714b7d7-32ee-42a1-bfa5-93eafda739d3code_foldedäcode2frametitle("Diagonalization to speed up powering")$3da58487-192f-458a-9d47-7a4ce98b6da3metadatadisabled©show_logsîskip_as_script§cell_id$3da58487-192f-458a-9d47-7a4ce98b6da3code_foldedäcodesection("Utils")$6cf004be-5205-429e-8131-ef607cebeaecmetadatadisabled©show_logsîskip_as_script§cell_id$6cf004be-5205-429e-8131-ef607cebeaeccode_folded¤codeE.vectors$0e3fb524-bea1-4ef0-9589-36230a84e949metadatadisabled©show_logsîskip_as_script§cell_id$0e3fb524-bea1-4ef0-9589-36230a84e949code_folded¤codergp_picker = HAlign( md"`g` = $(@bind g Slider(2:(p-1), default = 2, show_value = true))", md"`p` = $p_picker", )$aee611f2-bc86-4e85-bbcb-add78c6a9175metadatadisabled©show_logsîskip_as_script§cell_id$aee611f2-bc86-4e85-bbcb-add78c6a9175code_folded¤code)gcd_g, gcd_x, gcd_y = pgcdx(gcd_a, gcd_b)$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0metadatadisabled©show_logsîskip_as_script§cell_id$97736c6a-3f5d-4978-8dd2-0a11c09ba9f0code_folded¤codefunction pgcd(a, b) println("gcd($a, $b) = ") if b == 0 println(a) return a else return pgcd(b, mod(a, b)) end end$9722971a-16f1-4f28-ba31-c12b673b8a30metadatadisabled©show_logsîskip_as_script§cell_id$9722971a-16f1-4f28-ba31-c12b673b8a30code_foldedäcodemd"Et modulo 999 ?"$8a5a251f-5373-445a-97b1-4d652c6b7ba8metadatadisabled©show_logsîskip_as_script§cell_id$8a5a251f-5373-445a-97b1-4d652c6b7ba8code_folded¤code"refs(keys) = bibrefs(biblio, keys)$592ae01b-2819-402d-9538-17018df5c34bmetadatadisabled©show_logsîskip_as_script§cell_id$592ae01b-2819-402d-9538-17018df5c34bcode_foldedäcode frametitle("Fibonacci sequence")$191f8429-cbbb-44aa-8beb-271a94293e4bmetadatadisabled©show_logsîskip_as_script§cell_id$191f8429-cbbb-44aa-8beb-271a94293e4bcode_folded¤codeXchinese_remainder_theorem(big.(fast_mod_power.(2, power, prime_list)), big.(prime_list))$1072a756-5026-4de9-93a8-f942d54c474ametadatadisabled©show_logsîskip_as_script§cell_id$1072a756-5026-4de9-93a8-f942d54c474acode_foldedäcode@md"""Voir $(cite("hoffstein2014Introduction", "Section 2.7"))"""$59ac02af-7b54-44d4-b5f4-a0f60d4458a1metadatadisabled©show_logsîskip_as_script§cell_id$59ac02af-7b54-44d4-b5f4-a0f60d4458a1code_folded¤code+all_powers = fast_mod_power.(g, 1:(p-1), p)$09f44611-ba21-4982-ba1b-0691124642fcmetadatadisabled©show_logsîskip_as_script§cell_id$09f44611-ba21-4982-ba1b-0691124642fccode_foldedäcode/frametitle("Arithmétique modulaire : produit")$eeaec4f4-71bd-43df-b9c9-a00bc3b1864bmetadatadisabled©show_logsîskip_as_script§cell_id$eeaec4f4-71bd-43df-b9c9-a00bc3b1864bcode_folded¤codegcdx(gcd_a, gcd_b)$f6e22fc3-382e-4548-bc59-8f944e06d237metadatadisabled©show_logsîskip_as_script§cell_id$f6e22fc3-382e-4548-bc59-8f944e06d237code_folded¤code/E.vectors * Diagonal(E.values) * inv(E.vectors)$19ef447f-9fdf-49e1-8d1a-7860b4d4e9bametadatadisabled©show_logsîskip_as_script§cell_id$19ef447f-9fdf-49e1-8d1a-7860b4d4e9bacode_folded¤code8D = Diagonal([(1 - √big(5)) / 2, (1 + √big(5)) / 2])$82ba8fe1-435e-422b-abb7-cb50a7a85e1emetadatadisabled©show_logsîskip_as_script§cell_id$82ba8fe1-435e-422b-abb7-cb50a7a85e1ecode_foldedäcodeframetitle("Dicrete logarithm")$41cf9efd-65e5-4abb-94d3-e824780e659cmetadatadisabled©show_logsîskip_as_script§cell_id$41cf9efd-65e5-4abb-94d3-e824780e659ccode_foldedäcode#refs(["hoffstein2014Introduction"])$58da5ba4-c858-4684-a9f4-5a39fdc4fb03metadatadisabled©show_logsîskip_as_script§cell_id$58da5ba4-c858-4684-a9f4-5a39fdc4fb03code_folded¤codefunction 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$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986metadatadisabled©show_logsîskip_as_script§cell_id$ec25ce2a-de8a-4b69-a3f3-b47cd58ec986code_folded¤code;chinese_remainder_theorem([pow_1000, pow_999], [1000, 999])$256c8009-4d2b-42f8-adaa-6f238ef22c6dmetadatadisabled©show_logsîskip_as_script§cell_id$256c8009-4d2b-42f8-adaa-6f238ef22c6dcode_folded¤code>slider_n = @bind n Slider(1:100, default=5, show_value = true)$c5e906c8-0f73-4955-baa7-337195329e04metadatadisabled©show_logsîskip_as_script§cell_id$c5e906c8-0f73-4955-baa7-337195329e04code_foldedäcodemd""" É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``. """$f39cccac-5b24-46e4-8749-1b0a944542efmetadatadisabled©show_logsîskip_as_script§cell_id$f39cccac-5b24-46e4-8749-1b0a944542efcode_foldedäcode[md"`gcd_b` = $(@bind gcd_b Slider(1:typemax(Int32), default=249357461, show_value = true))"$9efb7a71-9a03-4716-8d34-aae233e9b898metadatadisabled©show_logsîskip_as_script§cell_id$9efb7a71-9a03-4716-8d34-aae233e9b898code_folded¤codex = discrete_log(3, g, p)$a1628317-7937-4316-85bf-2da860effce3metadatadisabled©show_logsîskip_as_script§cell_id$a1628317-7937-4316-85bf-2da860effce3code_folded¤codemod(a * b, n)$7330af43-bec3-460c-94f6-768ac2975b00metadatadisabled©show_logsîskip_as_script§cell_id$7330af43-bec3-460c-94f6-768ac2975b00code_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$f9f03579-5bfc-452d-bff9-9e7adfe095d3metadatadisabled©show_logsîskip_as_script§cell_id$f9f03579-5bfc-452d-bff9-9e7adfe095d3code_folded¤codegcd(364, 7)$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3metadatadisabled©show_logsîskip_as_script§cell_id$5c6c45b4-67e3-4ea8-bc09-0205ab24cbc3code_folded¤codemod(mod(a, n) * mod(b, n), n)$819f15ef-31d0-44b6-837a-e3e67f2667b9metadatadisabled©show_logsîskip_as_script§cell_id$819f15ef-31d0-44b6-837a-e3e67f2667b9code_foldedäcodemd"Revenons aux exemples:"$3c198d79-c46a-4781-8bd1-b6b68f06c31fmetadatadisabled©show_logsîskip_as_script§cell_id$3c198d79-c46a-4781-8bd1-b6b68f06c31fcode_folded¤code"@time fast_power(*, big(2), power)$ac5e1516-1574-4893-a965-f799947076cbmetadatadisabled©show_logsîskip_as_script§cell_id$ac5e1516-1574-4893-a965-f799947076cbcode_folded¤code@time fib_diag(20000)$4be6cea4-13a2-4bcb-b849-14eef57ab604metadatadisabled©show_logsîskip_as_script§cell_id$4be6cea4-13a2-4bcb-b849-14eef57ab604code_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$a4698418-ebf7-4992-a3ba-a15ff282bf87metadatadisabled©show_logsîskip_as_script§cell_id$a4698418-ebf7-4992-a3ba-a15ff282bf87code_foldedäcodeUqa(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)``.")$a1081bb2-2186-4b19-b667-0c246155f360metadatadisabled©show_logsîskip_as_script§cell_id$a1081bb2-2186-4b19-b667-0c246155f360code_folded¤code@time fib_pow(20000)$6332b2f2-ed2f-448a-b1df-247b110e335bmetadatadisabled©show_logsîskip_as_script§cell_id$6332b2f2-ed2f-448a-b1df-247b110e335bcode_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``. """)$2381babe-0777-45db-acff-cc647a8a68d3metadatadisabled©show_logsîskip_as_script§cell_id$2381babe-0777-45db-acff-cc647a8a68d3code_folded¤codeLpower_slider = @bind power Slider(1:10000, default = 256, show_value = true)$72ec8410-05d9-475a-93d4-47153cc0ce31metadatadisabled©show_logsîskip_as_script§cell_id$72ec8410-05d9-475a-93d4-47153cc0ce31code_folded¤codeJfib_rec(n) = (n == 0 ? 0 : (n == 1 ? 1 : fib_rec(n - 1) + fib_rec(n - 2)))$48eba223-6cce-4aa2-9977-4883ba7903fcmetadatadisabled©show_logsîskip_as_script§cell_id$48eba223-6cce-4aa2-9977-4883ba7903fccode_foldedäcodeqa(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``. """)$1ca71c26-f98c-4126-a1c5-98786fde7e9bmetadatadisabled©show_logsîskip_as_script§cell_id$1ca71c26-f98c-4126-a1c5-98786fde7e9bcode_foldedäcodemd""" 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``. """$3026f9c5-81d3-443a-940a-f22fef9754afmetadatadisabled©show_logsîskip_as_script§cell_id$3026f9c5-81d3-443a-940a-f22fef9754afcode_folded¤codehfunction giant_steps(g, n, p) gn = fast_mod_power(g, n, p) return baby_steps.(modinv(gn, p), n, p) end$821de132-559b-4420-b866-e97134c5bd9ametadatadisabled©show_logsîskip_as_script§cell_id$821de132-559b-4420-b866-e97134c5bd9acode_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$0ee6972c-5069-4ba0-887f-be64c7d000d0metadatadisabled©show_logsîskip_as_script§cell_id$0ee6972c-5069-4ba0-887f-be64c7d000d0code_foldedäcode-frametitle("Arithmétique modulaire : somme")$4853f4ef-fbb8-48c3-9523-13ab4969d097metadatadisabled©show_logsîskip_as_script§cell_id$4853f4ef-fbb8-48c3-9523-13ab4969d097code_folded¤codezfunction baby_steps(g, n, p) steps = [one(g)] for i in 1:n push!(steps, mod(steps[end] * g, p)) end return steps end$b57adc77-3783-4958-91a0-e90782338755metadatadisabled©show_logsîskip_as_script§cell_id$b57adc77-3783-4958-91a0-e90782338755code_folded¤code?slider_a = @bind a Slider(1:100, default=11, show_value = true)$c376513c-6553-4cd6-8384-ae6ff9d472d7metadatadisabled©show_logsîskip_as_script§cell_id$c376513c-6553-4cd6-8384-ae6ff9d472d7code_foldedäcodeHmd""" ```math A \equiv g^a \pmod{p} \qquad B \equiv g^b \pmod{p} ``` """$37585789-bd43-4ce5-b550-ad712b70d226metadatadisabled©show_logsîskip_as_script§cell_id$37585789-bd43-4ce5-b550-ad712b70d226code_foldedäcodemd""" > **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}``. """$78df9410-5ea4-4d9f-bbe5-862f76a100fcmetadatadisabled©show_logsîskip_as_script§cell_id$78df9410-5ea4-4d9f-bbe5-862f76a100fccode_foldedäcodeRmd"``30x \equiv j \pmod{7} \quad \Rightarrow \quad x \equiv (30)^{-1} j\pmod{7}``"$9e8a61d9-a700-4851-b1cd-49ce042c3530metadatadisabled©show_logsîskip_as_script§cell_id$9e8a61d9-a700-4851-b1cd-49ce042c3530code_folded¤code@time big(2)^power$e505716d-af01-455f-a55a-a9c225822ad5metadatadisabled©show_logsîskip_as_script§cell_id$e505716d-af01-455f-a55a-a9c225822ad5code_foldedäcode8md""" Comment calculer ``a^m`` pour un large ``m`` ? """$61462af5-69bd-42be-8918-7992c79ee00dmetadatadisabled©show_logsîskip_as_script§cell_id$61462af5-69bd-42be-8918-7992c79ee00dcode_foldedäcodeqa(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.")$15367f3b-c7e4-4004-a018-5422a7f22024metadatadisabled©show_logsîskip_as_script§cell_id$15367f3b-c7e4-4004-a018-5422a7f22024code_foldedäcode^md"On peut mettre le vecteur de taille ``n^2`` sous forme de matrice de taille ``n \times n``"$ba16d83d-21a5-4f0c-807b-674a167da4dcmetadatadisabled©show_logsîskip_as_script§cell_id$ba16d83d-21a5-4f0c-807b-674a167da4dccode_folded¤codebiblio = load_biblio!()$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82metadatadisabled©show_logsîskip_as_script§cell_id$6e5e3ec6-c96a-4a4a-bf4d-4b115f9b0d82code_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$64eb4b52-4946-467c-867a-a6fc437b15f6metadatadisabled©show_logsîskip_as_script§cell_id$64eb4b52-4946-467c-867a-a6fc437b15f6code_foldedäcode)frametitle("Meet in the middle approach")$bbb2793a-faa4-43bd-b2e8-e8d3ac93310fmetadatadisabled©show_logsîskip_as_script§cell_id$bbb2793a-faa4-43bd-b2e8-e8d3ac93310fcode_foldedäcode]md"S'il y avait 364 jours par ans, les fêtes seraient toujours le même jour de la semaine!"$ec14d629-b720-47cd-bc08-ff96f49271abmetadatadisabled©show_logsîskip_as_script§cell_id$ec14d629-b720-47cd-bc08-ff96f49271abcode_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$bc58ba24-90f0-4913-8f66-10bb6cb54076metadatadisabled©show_logsîskip_as_script§cell_id$bc58ba24-90f0-4913-8f66-10bb6cb54076code_foldedäcodemd""" **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} ``` """$f86a5efc-d31e-4e88-b81f-ebdbbeba11ecmetadatadisabled©show_logsîskip_as_script§cell_id$f86a5efc-d31e-4e88-b81f-ebdbbeba11eccode_foldedäcodemd""" 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. """$83852dd5-3546-45af-a845-b01dab0aa2a6metadatadisabled©show_logsîskip_as_script§cell_id$83852dd5-3546-45af-a845-b01dab0aa2a6code_foldedäcode+frametitle("Inverse et division modulaire")$8315b53f-abca-483d-bbf6-7e9193e751c9metadatadisabled©show_logsîskip_as_script§cell_id$8315b53f-abca-483d-bbf6-7e9193e751c9code_folded¤codefunction 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$4c2d45e3-56a2-467f-b87f-7b98cb873a05metadatadisabled©show_logsîskip_as_script§cell_id$4c2d45e3-56a2-467f-b87f-7b98cb873a05code_folded¤code%fast_mod_power.(2, power, prime_list)$3df688c8-1c52-462d-88be-daa153333c60metadatadisabled©show_logsîskip_as_script§cell_id$3df688c8-1c52-462d-88be-daa153333c60code_foldedäcodemd""" * 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")) """$e9633e3f-376d-413d-bc19-d015f6ce76e5metadatadisabled©show_logsîskip_as_script§cell_id$e9633e3f-376d-413d-bc19-d015f6ce76e5code_folded¤codebig(2)^power$ae89661a-2c0f-4752-adc2-023f09dc0e9fmetadatadisabled©show_logsîskip_as_script§cell_id$ae89661a-2c0f-4752-adc2-023f09dc0e9fcode_folded¤code+reshape(fast_mod_power.(g, 0:15, 17), 4, 4)$1b1d5c9b-5fc7-480e-9649-e9c44a49c38dmetadatadisabled©show_logsîskip_as_script§cell_id$1b1d5c9b-5fc7-480e-9649-e9c44a49c38dcode_folded¤codeinclude("utils.jl")$6f10de7b-ce05-4f82-82e7-4110be44e8ccmetadatadisabled©show_logsîskip_as_script§cell_id$6f10de7b-ce05-4f82-82e7-4110be44e8cccode_folded¤codeTmod(pow_1000 * 999 * modinv(999, 1000) + pow_999 * 1000 * modinv(1000, 999), 999000)$d6b89fda-308f-43da-8028-1a812b4516cfmetadatadisabled©show_logsîskip_as_script§cell_id$d6b89fda-308f-43da-8028-1a812b4516cfcode_foldedäcodeqa(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: """)$e2a3842d-4e07-4703-ab47-a5140649dd6ametadatadisabled©show_logsîskip_as_script§cell_id$e2a3842d-4e07-4703-ab47-a5140649dd6acode_folded¤codeunique(sort(all_powers))$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4metadatadisabled©show_logsîskip_as_script§cell_id$9d4858f8-e63d-46e0-a6cc-992d3cc4a9a4code_foldedäcodeqa(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}``. ")$d882afdd-eb85-467c-bf18-525c0c5da5e7metadatadisabled©show_logsîskip_as_script§cell_id$d882afdd-eb85-467c-bf18-525c0c5da5e7code_folded¤code@time fib_diag(20000)$03e49669-cdee-4241-862d-33ee91214455metadatadisabled©show_logsîskip_as_script§cell_id$03e49669-cdee-4241-862d-33ee91214455code_foldedäcode[md"The complexity is difficult to evaluate but can be shown to be ``O(\log(\min(a, b)))``."$e52d25b3-65bf-4617-ae8d-fae0d0c8d041metadatadisabled©show_logsîskip_as_script§cell_id$e52d25b3-65bf-4617-ae8d-fae0d0c8d041code_foldedäcodeTmd"``366x \equiv j \pmod{7} \quad \Rightarrow \quad x \equiv (366)^{-1} j\pmod{7}``"$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1metadatadisabled©show_logsîskip_as_script§cell_id$ed3d6ea6-08c9-45d0-8b77-3389a557bfd1code_folded¤code)collect(mod.(modinv(366, 7) .* (0:6), 7))$7da0705e-c925-4f8d-9ca4-8d8a0f859feametadatadisabled©show_logsîskip_as_script§cell_id$7da0705e-c925-4f8d-9ca4-8d8a0f859feacode_foldedäcodeTmd"``365x \equiv j \pmod{7} \quad \Rightarrow \quad x \equiv (365)^{-1} j\pmod{7}``"$c3411941-d77f-46cb-8378-23998a1a4828metadatadisabled©show_logsîskip_as_script§cell_id$c3411941-d77f-46cb-8378-23998a1a4828code_foldedäcode!frametitle("Division par 3 et 9")$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253metadatadisabled©show_logsîskip_as_script§cell_id$9bdb30ba-48a7-4e1b-96c2-ea0e059d5253code_folded¤code-if !isnothing(x) fast_mod_power(g, x, p) end$736307ec-a2a4-11ef-0f85-ad1a0093e06ametadatadisabled©show_logsîskip_as_script§cell_id$736307ec-a2a4-11ef-0f85-ad1a0093e06acode_foldedäcodemd"# La théorie des nombres"$40b8e474-16e0-4a61-bb28-11d90beefeeametadatadisabled©show_logsîskip_as_script§cell_id$40b8e474-16e0-4a61-bb28-11d90beefeeacode_folded¤codegcd_x * gcd_a + gcd_y * gcd_b$6e59ee60-ef73-45ca-86eb-4d8a44c73771metadatadisabled©show_logsîskip_as_script§cell_id$6e59ee60-ef73-45ca-86eb-4d8a44c73771code_foldedäcode5qa(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)``. """)$08dcbbd3-a531-4f74-a724-1cae8fae1636metadatadisabled©show_logsîskip_as_script§cell_id$08dcbbd3-a531-4f74-a724-1cae8fae1636code_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$16b677e4-c467-462a-b770-b7a31160e129metadatadisabled©show_logsîskip_as_script§cell_id$16b677e4-c467-462a-b770-b7a31160e129code_folded¤code$prime_list = primes(3, primes_upper)$2c34c17e-12de-43ea-870c-818c97647836metadatadisabled©show_logsîskip_as_script§cell_id$2c34c17e-12de-43ea-870c-818c97647836code_foldedäcode5frametitle("Inversion modulaire par Euclide étendu")$21df1900-3954-4506-b759-aeeee664d1dfmetadatadisabled©show_logsîskip_as_script§cell_id$21df1900-3954-4506-b759-aeeee664d1dfcode_folded¤codeAfunction modinv(a, n) g, x, y = gcdx(a, n) return mod(x, n) end$d830fffd-3781-40ca-85cb-c242f99667cemetadatadisabled©show_logsîskip_as_script§cell_id$d830fffd-3781-40ca-85cb-c242f99667cecode_folded¤codeWfunction fib_diag(n) x = E.vectors * D^(n - 1) * (E.vectors \ [1, 0]) return x[1] end$08b18315-c28e-44ed-beb2-5b17421b0224metadatadisabled©show_logsîskip_as_script§cell_id$08b18315-c28e-44ed-beb2-5b17421b0224code_foldedäcodemd""" > **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}``. """$8670abc2-63e6-496a-b20c-812197acd9admetadatadisabled©show_logsîskip_as_script§cell_id$8670abc2-63e6-496a-b20c-812197acd9adcode_foldedäcodeKfast_mod_power(a, power, n) = fast_power((a, b) -> mod(a * b, n), a, power)$227e415e-ab17-4f3a-b695-9573c9ee2b57metadatadisabled©show_logsîskip_as_script§cell_id$227e415e-ab17-4f3a-b695-9573c9ee2b57code_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. """)$67093a35-8e1b-4cd3-b11b-c7ff601f802emetadatadisabled©show_logsîskip_as_script§cell_id$67093a35-8e1b-4cd3-b11b-c7ff601f802ecode_foldedäcode[md"`primes_upper` = $(@bind primes_upper Slider(50:300, default = 100, show_value = true))"$7f9bd301-355b-43f5-b168-22fac9e52511metadatadisabled©show_logsîskip_as_script§cell_id$7f9bd301-355b-43f5-b168-22fac9e52511code_folded¤codePrimes.primes(10)$3f1af973-a02b-4e06-8e6e-eff414fcaf67metadatadisabled©show_logsîskip_as_script§cell_id$3f1af973-a02b-4e06-8e6e-eff414fcaf67code_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$fe2af566-4a8b-4052-9915-85266ee5ce98metadatadisabled©show_logsîskip_as_script§cell_id$fe2af566-4a8b-4052-9915-85266ee5ce98code_folded¤codepgcd(gcd_a, gcd_b)$6ed7c73d-60da-4908-85cb-958745d81ebcmetadatadisabled©show_logsîskip_as_script§cell_id$6ed7c73d-60da-4908-85cb-958745d81ebccode_foldedäcodeZmd"Par l'algo d'Euclide, ``\text{gcd}(n, n - 1) = 1`` donc ``\text{gcd}(1000, 999) = 1``."$708c442b-cbff-4e1a-b70d-e704453cfd3dmetadatadisabled©show_logsîskip_as_script§cell_id$708c442b-cbff-4e1a-b70d-e704453cfd3dcode_foldedäcode6HAlign( 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)) """, )$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21emetadatadisabled©show_logsîskip_as_script§cell_id$1b2245f8-2f02-4c4d-b6d2-e65af1f2a21ecode_foldedäcodemd"Last 3 digit:"$a7d06375-e4dd-47b1-8aba-11dc4d62954bmetadatadisabled©show_logsîskip_as_script§cell_id$a7d06375-e4dd-47b1-8aba-11dc4d62954bcode_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``. """)last_hot_reload_timeshortpath2_number.jlnbpkgbusy_packages,waiting_for_permission_but_probably_disabled§enabledðterminal_outputsLinearAlgebra+ 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_tbwrkwpzel/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_tbwrkwpzel/Manifest.toml` Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...DocumenterCitations+ 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_tbwrkwpzel/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_tbwrkwpzel/Manifest.toml` Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...PlutoUI+ 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_tbwrkwpzel/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_tbwrkwpzel/Manifest.toml` Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...nbpkg_sync+ 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_tbwrkwpzel/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_tbwrkwpzel/Manifest.toml` Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...Primes+ 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_tbwrkwpzel/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_tbwrkwpzel/Manifest.toml` Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...Colors+ 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_tbwrkwpzel/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_tbwrkwpzel/Manifest.toml` Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...Luxor+ 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_tbwrkwpzel/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_tbwrkwpzel/Manifest.toml` Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...DataFrames+ 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_tbwrkwpzel/Project.toml`  Manifest No packages added to or removed from `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_tbwrkwpzel/Manifest.toml` Instantiating... === Precompiling... === Waiting for notebook process to start... Done. Starting precompilation...waiting_for_permission·restart_recommended_msgrestart_required_msginstalled_versionsLinearAlgebrastdlibDocumenterCitations1.3.5Luxor4.1.0__internal_julia_version1.13.0PlutoUI0.7.60Primes0.5.6Colors0.12.11!__internal_julia_manifest_version1.13.0DataFrames1.7.0install_time_nsΉtinstantiatedípluto_versionv1.0.3