{"id":1721,"date":"2023-08-22T13:22:46","date_gmt":"2023-08-22T12:22:46","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?page_id=1721"},"modified":"2026-04-06T08:58:10","modified_gmt":"2026-04-06T07:58:10","slug":"dc","status":"publish","type":"page","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/dc\/","title":{"rendered":"dc (desk calculator) sur macOS, Windows, UNIX, FreeBSD&#8230;"},"content":{"rendered":"\n<p>Cr\u00e9ez en <strong>1971<\/strong> par <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lorinda_Cherry\">Lorinda Cherry<\/a>&nbsp;et&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_Morris_(cryptographer)\">Robert Morris<\/a>, <strong>dc<\/strong> est une calculatrice <strong>RPN<\/strong> (Notation Polonaise Inverse) \u00e0 pr\u00e9cision arbitraire. D\u00e9couvrons ensemble quelques unes de ses fonctionnalit\u00e9s.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"D\u00e9couvrons &amp; Programmons &quot;dc&quot; (desk calculator) - 1971\" width=\"584\" height=\"329\" src=\"https:\/\/www.youtube.com\/embed\/MDENRcTWDSY?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">Pr\u00e9sentation en vid\u00e9o<\/figcaption><\/figure>\n\n\n\n<p>Si vous n&rsquo;\u00eates pas sous Windows, lancez un <strong>Terminal<\/strong> puis tapez <strong>dc<\/strong>, sinon <a rel=\"noreferrer noopener\" href=\"https:\/\/tio.run\/#dc\" data-type=\"link\" data-id=\"https:\/\/tio.run\/#dc\" target=\"_blank\">utilisez la version en ligne<\/a> (tapez les commandes dans la zone <strong>Code<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Calculs \u00e9l\u00e9mentaires<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>% dc                 # Lancement de l'outil\n&gt;&gt;&gt; 2 3 6 * + p      # 2 + 3 * 6 = 20\n20                   # p : afficher le sommet de la pile\n\n&gt;&gt;&gt; _7 _8 * p        # Ecriture des nombres n\u00e9gatifs\n56\n\n&gt;&gt;&gt; 100 k 5 v f\n2.236067977499789696409173668731276235440618359611525724270897245410\\\n5209256378048994144144083787822749\n56\n20\n\n# 100 k : on veut une pr\u00e9cision avec 100 d\u00e9cimales\n# 5 v : racine carr\u00e9e de 5\n# f : voir la pile compl\u00e8te (on retrouve donc les 20 et 56 pr\u00e9c\u00e9dents)\n\n&gt;&gt;&gt; c 2023 sa    # c : effacer toute la pile et <strong>s<\/strong>(TO) 2023 dans registre 'a'\n&gt;&gt;&gt; f            # f : s(TO) supprime l'\u00e9l\u00e9ment de la pile -&gt; pile vide\n\n&gt;&gt;&gt; la f         # l(OAD) le registre 'a' et affiche la pile\n2023<\/code><\/pre>\n\n\n\n<p><strong>dc<\/strong> n&rsquo;a pas de fonctions math\u00e9matiques avanc\u00e9es (trigo, log&#8230;) contrairement \u00e0 <strong>bc<\/strong> mais qui travaille en mode alg\u00e9brique.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-7.png\"><img loading=\"lazy\" decoding=\"async\" width=\"703\" height=\"411\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-7.png\" alt=\"\" class=\"wp-image-1759\" style=\"width:421px;height:246px\" srcset=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-7.png 703w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-7-300x175.png 300w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-7-500x292.png 500w\" sizes=\"auto, (max-width: 703px) 100vw, 703px\" \/><\/a><figcaption class=\"wp-element-caption\">Aper\u00e7u du r\u00e9sultat avec la version en ligne<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">changement de bases<\/h3>\n\n\n\n<p>On peut passer facilement d&rsquo;une base \u00e0 une autre. Par exemple, je veux taper des valeurs en binaire et connaitre leurs traductions en base 10 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; 2i      # les valeurs entr\u00e9es (input) seront en base 2\n&gt;&gt;&gt; c 10 111 1010 1111111111 f \n1023\n10\n7\n2\n\n# Pour revenir \u00e0 une saisie en base 10 il faut taper 1010i car 10 en d\u00e9cimal s'\u00e9crit 1010 en binaire. Et on veut que les sorties soient en base 16 :\n\n&gt;&gt;&gt; 1010i 16o       # Entr\u00e9e en base 10 et sortie (output) en base 16\n&gt;&gt;&gt; c 3 14 159 265358 f\n40C8E\n9F\nE\n3  <\/code><\/pre>\n\n\n\n<p>Une autre solution est de taper : <strong>Ai Ao<\/strong> (\u00ab\u00a0A\u00a0\u00bb correspondant \u00e0 la base 10)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9ation de macros<\/h3>\n\n\n\n<p>Cr\u00e9ons 2 macros, la premi\u00e8re divise un nombre par 2, la seconde le multiplie par 3 et ajoute 1.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;2\/]sp           # programme 2 \/ enregistr\u00e9 dans 'p'\n&gt;&gt;&gt; &#091;3*1+]si         # programme 3 * 1 + enregistr\u00e9 dans 'i'\n&gt;&gt;&gt; c 27 li x p      # on efface la pile, ajout de 27 et ex\u00e9cution de 'i'\n82                   # 27 * 3 + 1 = 82\n\n&gt;&gt;&gt; 27 lpxp          # Les espaces sont optionnels ! 27 lp x p\n13                   # programme 'p' avec 27 et affichage top de la pile<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ajouter des commentaires<\/h3>\n\n\n\n<p>Vous pouvez utiliser <strong>#<\/strong> \u00e0 la fin d&rsquo;une ligne ou \u00e9crire un commentaire entre <strong>[ ]<\/strong> puis le mettre dans un registre \u00ab\u00a0bidon\u00a0\u00bb :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; 16 25 # ajout 2 nombres sur la pile\n&gt;&gt;&gt; 16 25 &#091;ajout de 2 nombres sur la pile]sz<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Commandes sur la pile<\/h3>\n\n\n\n<p>On a d\u00e9j\u00e0 vu <strong>c<\/strong> pour effacer toute la pile et <strong>p<\/strong> pour afficher l&rsquo;\u00e9l\u00e9ment au top de la pile sans le supprimer.<\/p>\n\n\n\n<p>Il y a \u00e9galement <strong>r<\/strong> pour inverser (SWAP) les 2 \u00e9l\u00e9ments au top de la pile et <strong>d<\/strong> pour dupliquer (DUP) l&rsquo;\u00e9l\u00e9ment qui est au top de la pile.<\/p>\n\n\n\n<p><strong>R<\/strong> permet d&rsquo;effacer l&rsquo;\u00e9l\u00e9ment au top de la pile (DROP) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; 45 78 89 f\n89\n78\n45\n&gt;&gt;&gt; R f\n78\n45<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Exercices corrig\u00e9s<\/h3>\n\n\n\n<p>Les exercices et corrig\u00e9s sont de mon cru, il est donc probable que vous trouviez des solutions meilleures ou plus \u00e9l\u00e9gantes.<\/p>\n\n\n\n<p>Expliquez le d\u00e9roulement du programme nomm\u00e9 &lsquo;.&rsquo; (les noms des registres ne se limitent pas aux lettres de l&rsquo;alphabet !)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;dsarla]s.\n&gt;&gt;&gt; 4 8 l.xf<\/code><\/pre>\n\n\n\n<p>Corrig\u00e9 : Le programme &lsquo;.&rsquo; s&rsquo;\u00e9crit <strong>[d sa r la]<\/strong> en version \u00e9clat\u00e9e. C&rsquo;est-\u00e0-dire dupliquer le top de la pile, le m\u00e9moriser dans le registre &lsquo;a&rsquo; (donc la version dupliqu\u00e9e disparait de la pile), inverser les 2 \u00e9l\u00e9ments et mettre &lsquo;a&rsquo; sur la pile.<\/p>\n\n\n\n<p>On aura donc successivement : 4 8 <strong>-d-&gt;<\/strong> 4 8 8 <strong>-sa-&gt;<\/strong> 4 8 et 8 dans &lsquo;a&rsquo; <strong>-r-&gt;<\/strong> 8 4 <strong>-la-&gt;<\/strong> 8 4 8<\/p>\n\n\n\n<p>Vous avez peut-\u00eatre reconnue la commande OVER qui permet de passer de <strong>x y<\/strong> \u00e0 <strong>y x y<\/strong><\/p>\n\n\n\n<p>Que fait ce programme nomm\u00e9 &lsquo;:&rsquo; ?<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;sndlnrln]s:\n&gt;&gt;&gt; 4 8 l:xf<\/code><\/pre>\n\n\n\n<p>Corrig\u00e9 : <\/p>\n\n\n\n<p>4 8 <strong>-sn-&gt;<\/strong> 4 et 8 dans registre &lsquo;n&rsquo; <strong>-d-&gt;<\/strong> 4 4 <strong>-ln-&gt;<\/strong> 4 4 8 <strong>-r-&gt;<\/strong> 4 8 4 <strong>-ln-&gt;<\/strong> 4 8 4 8<\/p>\n\n\n\n<p>C&rsquo;\u00e9tait une traduction de la commande DUP2 qui duplique les 2 \u00e9l\u00e9ments au top de la pile : <strong>x y<\/strong> -&gt; <strong>x y x y<\/strong><\/p>\n\n\n\n<p>Que fait ce programme nomm\u00e9 &lsquo;r&rsquo; ?<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;sasblarlb]sr\n&gt;&gt;&gt; c 4 8 12 f\n&gt;&gt;&gt; c 4 8 12 lrxf<\/code><\/pre>\n\n\n\n<p>Corrig\u00e9 : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; c 4 8 12 f\n12\n8\n4<\/code><\/pre>\n\n\n\n<p>En appliquant la macro &lsquo;r&rsquo; aux 3 \u00e9l\u00e9ments :<\/p>\n\n\n\n<p>4 8 12 <strong>-sa-&gt;<\/strong> 4 8 et 12 dans &lsquo;a&rsquo; <strong>-sb-&gt;<\/strong> 4 et 8 dans &lsquo;b&rsquo; <strong>-la-&gt;<\/strong> 4 12 <strong>-r-&gt;<\/strong> 12 4 <strong>-lb-&gt;<\/strong>12 4 8 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; c 4 8 12 lrxf\n8\n4\n12<\/code><\/pre>\n\n\n\n<p>On reconnait ROT qui permet de passer de <strong>x y z<\/strong> \u00e0 <strong>z x y<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Les boucles<\/h3>\n\n\n\n<p>Cr\u00e9er une boucle consiste \u00e0 r\u00e9p\u00e9ter une macro un certain nombre de fois. Ce nombre \u00e9tant g\u00e9r\u00e9 par un test, en voici quelques uns qui lanceront ou non le programme &lsquo;r&rsquo; :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;2023]sr      # le programme 'r' met 2023 sur la pile\n&gt;&gt;&gt; c 1 1 =r f    # comme 1=1 le programme est ex\u00e9cut\u00e9\n2023\n&gt;&gt;&gt; c 1 2 =r f    # comme 1\u22602 le programme n'est pas ex\u00e9cut\u00e9\n\n&gt;&gt;&gt; c 1 2 &lt;r f    # 2 n'est pas &lt; \u00e0 1 \n\n&gt;&gt;&gt; c 2 2 !&lt;r f   # 2 est \u2265 \u00e0 2, le programme s'ex\u00e9cute\n2023\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Exercices corrig\u00e9s<\/h3>\n\n\n\n<p>Comprendre le d\u00e9roulement du programme ci-dessous :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;sn 0 d ss &#091;dd * ls + ss 1 + d ln !&lt;f] sf lfx ls p] s.\n&gt;&gt;&gt; 5 l.x\n55\n&gt;&gt;&gt; 10 l.x\n385<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-8.png\"><img loading=\"lazy\" decoding=\"async\" width=\"568\" height=\"365\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-8.png\" alt=\"\" class=\"wp-image-1761\" style=\"width:385px;height:247px\" srcset=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-8.png 568w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-8-300x193.png 300w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-8-467x300.png 467w\" sizes=\"auto, (max-width: 568px) 100vw, 568px\" \/><\/a><figcaption class=\"wp-element-caption\">Version en ligne<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Corrig\u00e9 : <\/p>\n\n\n\n<p><strong>sn 0 d ss<\/strong> : initialisation en mettant le nombre dans &lsquo;n&rsquo; et 0 dans &lsquo;s&rsquo; (future somme)<\/p>\n\n\n\n<p>Avant d&rsquo;entrer dans la macro &lsquo;f&rsquo; il n&rsquo;y a que <strong>0<\/strong> (compteur) sur la pile. On duplique 2 fois cette valeur, on en fait le produit (carr\u00e9) que l&rsquo;on ajoute \u00e0 &lsquo;s&rsquo;. Le compteur augmente de 1 et on le compare \u00e0 &lsquo;n&rsquo;. Si n \u2265 compteur on applique \u00e0 nouveau la macro &lsquo;f&rsquo;.<\/p>\n\n\n\n<p>Tout le programme [&#8230;] est m\u00e9moris\u00e9 dans &lsquo;f&rsquo; (qui disparait donc de la pile) et on applique &lsquo;f&rsquo; \u00e0 0. Bien voir que l&rsquo;on aurait pu \u00e0 part d\u00e9finir &lsquo;f&rsquo; et donc \u00e9crire :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;dd * ls + ss 1 + d ln !&lt;f] sf\n&gt;&gt;&gt; &#091;sn 0 d ss lfx ls p] s.\n&gt;&gt;&gt; 10 l.x\n385\n\n# Ou inversement tout compacter :\n&gt;&gt;&gt; &#091;sn0dss&#091;dd*ls+ss1+dln!&lt;f]sflfxlsp]s.\n&gt;&gt;&gt; 10 l.x\n385<\/code><\/pre>\n\n\n\n<p>Le programme permet donc de calculer la somme des carr\u00e9s des entiers entre 1 et N.<\/p>\n\n\n\n<p>Que va faire ce programme ?<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;sndlnrln&lt;r]s.\n&gt;&gt;&gt; &#091;r]sr\n&gt;&gt;&gt; c 4 8 l.x f\n?\n?\n&gt;&gt;&gt; c 8 4 l.x f\n?\n?\n<\/code><\/pre>\n\n\n\n<p>Corrig\u00e9 : la macro &lsquo;.&rsquo; d\u00e9bute par DUP2 (duplication des 2 valeurs saisies). Plus pr\u00e9cis\u00e9ment si <strong>x y<\/strong> sont sont sur la pile, <strong>sndlnrln<\/strong> donnera x y &#8211;<strong>snd-&gt;<\/strong> x x <strong>-lnr-&gt;<\/strong> x y x <strong>-ln-&gt;<\/strong> x y x y puis on teste si <strong>y &lt; x<\/strong>. Si c&rsquo;est vrai alors le programme &lsquo;r&rsquo; inverse les 2 \u00e9l\u00e9ments. On aura donc toujours max(x,y) au-dessus de min(x,y). <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; c 4 8 l.x f \n8\n4\n&gt;&gt;&gt; c 8 4 l.x f\n8\n4<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Somme des chiffres<\/h3>\n\n\n\n<p>Ecrire un programme &lsquo;s&rsquo; qui donne la somme des chiffres d&rsquo;un entier quelconque<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; 123 lsx\n6\n&gt;&gt;&gt; 123456789 lsx\n45<\/code><\/pre>\n\n\n\n<p>Une proposition :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;&#091;d10%r10\/d0&lt;f+]sflfxp]ss<\/code><\/pre>\n\n\n\n<p>Comprendre le programme pas \u00e0 pas.<\/p>\n\n\n\n<p>Correction : Il y a une premi\u00e8re macro <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#091;d 10 % r 10 \/ d 0 &lt;f +] sf\n\n# dupliquer le nombre et chercher N % 10 (N modulo 10)\n# on a donc N et N%10 sur la pile\n# inverser (SWAP) les 2 et faire la division par 10\n# on a N%10 et N\/10 sur la pile\n# on duplique le top de la pile : N%10 N\/10 N\/10\n# Si cette valeur est &gt;0 recommencer la macro 'f'\n# Par exemple avec 1234 on aura donc 4 123 au premier tour\n# puis 4 3 12, ensuite 4 3 2 1 et enfin 4 3 2 1 0\n# Ensuite '+' est appliqu\u00e9 r\u00e9cursivement soit 0 + 1 + 2 + 3 + 4<\/code><\/pre>\n\n\n\n<p>Version 2<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;&#091;d10%r10\/d0&lt;f+]sflfxp]ss     # Version 1\n&gt;&gt;&gt; &#091;?&#091;10~rd0&lt;f+]dsfxp]ss        # Version 2\n&gt;&gt;&gt; lsx        # On lance la macro 's'\n?&gt; 123         # ? : prompt\n6<\/code><\/pre>\n\n\n\n<p>~ permet d&rsquo;avoir le reste et le quotient en une seule fois :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; 123 10 ~ f\n3\n12<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">PGCD entre 2 nombres<\/h3>\n\n\n\n<p>Ecrire une macro qui \u00e0 partir de 2 nombres donne leur PGCD. On pourra supposer que le 1er nombre est plus grand que le 2e :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; 220220 53482 # Votre macro ici\n3146<\/code><\/pre>\n\n\n\n<p>Pensez \u00e0 l&rsquo;algorithme d&rsquo;Euclide, le PGCD est le dernier reste non nul des divisions successives.<\/p>\n\n\n\n<p>Corrig\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; 220220 53482 &#091;dsa%lard0&lt;:]ds:x+p\n3146\n\n# d sa % : on m\u00e9morise la 2e valeur et calcul du reste\n# la r : on rappelle la 2e valeur que l'on met en premi\u00e8re position\n# Ainsi, \u00e0 la premi\u00e8re \u00e9tape on aura : \n# 220220 53482 -d sa-&gt; 220220 53482 et 53482 dans registre 'a'\n# 6292 -la-&gt; 6292 53482 -r-&gt; 53482 6292\n# d 0&lt;: Si le reste est &gt;0 on recommence la macro ':'\n# ds:x on m\u00e9morise la macro et on l'ex\u00e9cute\n# En sortant de la boucle on a le dernier reste non nul et 0\n# Pour l'exemple on aura 3146 0\n# +p : on en fait la somme et on affiche le r\u00e9sultat<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Somme de tous les \u00e9l\u00e9ments de la pile<\/h3>\n\n\n\n<p>Analysons cette commande :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; c\n&gt;&gt;&gt; 1 4 3 10 &#091;+z1&lt;+]s+l+xp\n18\n\n# On efface le contenu pr\u00e9c\u00e9dent de la pile avec 'c'\n# On place 1 4 3 10 sur la pile\n# On ajoute les 2 \u00e9l\u00e9ments au top\n# 'z' permet de compter le nombre d'\u00e9l\u00e9ments sur la pile (ici 4)\n# Comme on a fait une addition, le nombre d'\u00e9l\u00e9ments diminue de 1\n# si ce nombre est &gt;1 on relance la macro '+'\n# l+x permet d'ex\u00e9cuter la macro '+' et 'p' d'afficher le r\u00e9sultat<\/code><\/pre>\n\n\n\n<p>Remarques : Au lieu d&rsquo;\u00e9crire <strong>s+<\/strong> pour stocker le programme puis <strong>l+x<\/strong> pour le lancer, on peut aussi \u00e9crire <strong>d s+ x<\/strong> ou <strong>ds+x<\/strong>; Ce qui signifie : dupliquer (la chaine de caract\u00e8res), stocker dans &lsquo;+&rsquo; et ex\u00e9cuter (&lsquo;x&rsquo;).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; c\n&gt;&gt;&gt; 1 4 3 10 &#091;+z1&lt;+]ds+xp\n18<\/code><\/pre>\n\n\n\n<p>On peut \u00e9galement ajouter un prompt qui va demander la liste des nombres :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; c?&#091;+z1&lt;+]ds+xp\n?&gt; 5 10 9 12\n36<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Sortir d&rsquo;une boucle, affichage de textes<\/h3>\n\n\n\n<p>Ecrivons un programme qui teste si une ann\u00e9e est bissextile ou non. Si une ann\u00e9e n&rsquo;est pas divisible par 4 elle n&rsquo;est pas bissextile, sinon, si elle n&rsquo;est pas divisible par 100 elle est bissextile (elle est donc divisible par 4 et pas par 100), sinon si elle n&rsquo;est pas divisible par 400 elle n&rsquo;est pas bissextile, sinon elle est bissextile !<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;&#091;NON BISSEXTILE]pcq]s0     # Affiche texte, efface la pile et quitte\n&gt;&gt;&gt; &#091;&#091;BISSEXTILE]pcq]s1\n&gt;&gt;&gt; &#091;d s. 4 % 0!=0 l. 100 % 0!=1 l. 400 % 0!=0 l1x] sb\n\n&gt;&gt;&gt; 2023 lbx\nNON BISSEXTILE\n&gt;&gt;&gt; 2024 lbx\nBISSEXTILE\n&gt;&gt;&gt; 1900 lbx\nNON BISSEXTILE\n&gt;&gt;&gt; 2000 lbx\nBISSEXTILE<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ecrire un nombre dans toutes les bases entre 2 et 16<\/h3>\n\n\n\n<p>A partir d&rsquo;un nombre (2023 pour l&rsquo;exemple), on voudrait voir le texte \u00ab\u00a0Base\u00a0\u00bb suivi d&rsquo;un nombre entre 2 et 16 et \u00e0 c\u00f4t\u00e9 la traduction dans la base correspondante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;2 &#091;&#091;Base ]nd 10o dn&#091; : ]n o r p r 1 + d 16!&lt;:] ds:x] sb\n&gt;&gt;&gt; 2023 lbx\nBase 2 : 11111100111\nBase 3 : 2202221\nBase 4 : 133213\nBase 5 : 31043\nBase 6 : 13211\nBase 7 : 5620\nBase 8 : 3747\nBase 9 : 2687\nBase 10 : 2023\nBase 11 : 157A\nBase 12 : 1207\nBase 13 : BC8\nBase 14 : A47\nBase 15 : 8ED\nBase 16 : 7E7<\/code><\/pre>\n\n\n\n<p>Explications de la macro :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># &#091;Base ]nd 10o dn&#091; : ]n o\n\n# &#091;Base ]n : Affiche \"Base \" sans retour \u00e0 la ligne ('n')\n# d : on duplique le chiffre qui sera la base\n# 10o : on se met momentan\u00e9ment en base 10\n# n&#091; : ]n : On affiche le chiffre sans retour \u00e0 la ligne suivi de \" : \"\n# o : on impose la sortie dans la base voulue\n\n# r : On inverse la base et le nombre \u00e0 transformer\n# p : on imprime ce nombre\n# r : On inverse \u00e0 nouveau base et nombre\n\n# 1 + d 16!&lt;: La base augmente de 1 et on recommence si elle est \u226416<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Factorisation d&rsquo;un entier<\/h3>\n\n\n\n<p>Ecrire un programme &lsquo;f&rsquo; qui factorise un entier, par exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; 178307670177 lfx\n3\n3\n7\n13\n17\n23\n37\n101\n149<\/code><\/pre>\n\n\n\n<p>Voici une version qui n&rsquo;utilise pas beaucoup la pile mais plut\u00f4t des registres :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#091;&#091;lnlip\/sn]s.&#091;li1+si]s:&#091;lnli%d0=.d0!=:ln1&lt;;]s;sn2sil;x]sf<\/code><\/pre>\n\n\n\n<p>Essayez de comprendre le d\u00e9roulement&#8230;<\/p>\n\n\n\n<p>Corrig\u00e9 : Il y a plusieurs macros que nous allons d\u00e9composer :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#091;ln li p \/ sn] s.\n\n# on rappelle 'n' et 'i', cette derni\u00e8re est affich\u00e9e\n# puis on effectue la division et le r\u00e9sultat est stock\u00e9 dans 'n'\n# cette macro '.' actualise 'n' par 'n\/i' lorsque 'i' est un diviseur\n\n&#091;li 1 + si] s:\n# Incr\u00e9mentation de 'i'\n\n&#091;ln li % d 0=. d 0!=: ln 1&lt;;] s;\n\n# on cherche le reste de la division de 'n' par 'i'\n# si le reste est nul on applique la macro '.'\n# sinon on augmente 'i' de 1 (macro ':')\n# Tant que n &gt; 1 on refait la macro ';'\n\nsn 2 si l;x\n\n# Initialisation de 'n' et lancement de la macro 'f'<\/code><\/pre>\n\n\n\n<p>L&rsquo;id\u00e9e est donc de tester la division de &lsquo;n&rsquo; par &lsquo;i&rsquo; en commen\u00e7ant par i = 2. Tant que la division tombe juste on affiche &lsquo;i&rsquo; et on met \u00e0 jour &lsquo;n&rsquo; en le rempla\u00e7ant par &lsquo;n \/ i&rsquo;. Sinon on augmente &lsquo;i&rsquo; de 1 et on arr\u00eate lorsque n = 1.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline\">Remarque<\/span> : J&rsquo;ai trouv\u00e9 cet autre programme page 308 dans <a href=\"https:\/\/tldp.org\/LDP\/abs\/abs-guide.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">Advanced Bash-Scripting<\/a> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; 124 &#091;p]s2&#091;lip\/dli%0=1dvsr]s12sid2%0=13sidvsr&#091;dli%0=1lrli2+dsi!&gt;.]ds.xd1&lt;2\n2\n2\n31<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Conjecture de Syracuse<\/h3>\n\n\n\n<p>Programmez la conjecture de Syracuse (Collatz) : Partir d&rsquo;un entier N non nul, le diviser par 2 s&rsquo;il est pair, le multiplier par 3 et ajouter 1 s&rsquo;il est impair. R\u00e9p\u00e9ter jusqu&rsquo;\u00e0 obtenir 1. Quel maximum a \u00e9t\u00e9 atteint et combien d&rsquo;it\u00e9rations aura-t-il fallu faire ?<\/p>\n\n\n\n<p>Exemple : N = <strong>27<\/strong> -&gt; 82 -&gt; 41 -&gt; 124 -&gt; 62 -&gt; &#8230; -&gt; <strong>9232<\/strong> -&gt; &#8230; 4 -&gt; 2 -&gt; <strong>1<\/strong><\/p>\n\n\n\n<p>Le maximum est 9232 et il faut 111 it\u00e9rations avant d&rsquo;arriver \u00e0 1.<\/p>\n\n\n\n<p>Une solution :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; &#091;2\/q]sp\n&gt;&gt;&gt; &#091;d d 2 % 0=p 3 * 1 +]sn\n&gt;&gt;&gt; &#091;d sm]s.\n&gt;&gt;&gt; &#091;c? d sm &#091;lnx d lm&lt;. d 1&lt;:]s: l:x z 1 - st c lt lm f]ss\n\n&gt;&gt;&gt; lsx\n?&gt; 27\n9232      # Max atteint\n111       # Temps de vol (nb d'it\u00e9rations)\n\n&gt;&gt;&gt; lsx\n?&gt; 6171\n975400\n261\n\n&gt;&gt;&gt; lsx\n?&gt; 8400511\n159424614880\n685\n\n&gt;&gt;&gt; lsx\n?&gt; 12345678901234567890123\n55555555055555555505556\n575<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-9.png\"><img loading=\"lazy\" decoding=\"async\" width=\"542\" height=\"429\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-9.png\" alt=\"\" class=\"wp-image-1763\" style=\"width:423px;height:335px\" srcset=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-9.png 542w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-9-300x237.png 300w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2023\/08\/image-9-379x300.png 379w\" sizes=\"auto, (max-width: 542px) 100vw, 542px\" \/><\/a><figcaption class=\"wp-element-caption\">Version en ligne, remarquez l&rsquo;absence de c?<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Explications :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#091;2\/q]sp : diviser par 2 et quitter la macro appelante\n&#091;d d 2 % 0=p 3 * 1 +] sn : si nombre est pair, lancer programme 'p'\nsinon multiplier par 3 + 1 (le 'q' de la macro 'p' permet donc\nde sortir de la macro 'n' quand le nombre est pair)\n&#091;d sm]s. : La macro '.' \u00e9crase le max avec la valeur courante\n\nc? d sm : On efface la pile, demande de la valeur initiale et\non la met dans le max.\n\n&#091;lnx d lm&lt;. d 1&lt;:]s: On applique la macro 'n' qui donne le nombre suivant (et laisse le pr\u00e9c\u00e9dent sur la pile), si max est &lt; \u00e0 la valeur courante on ex\u00e9cute\nla macro '.', si valeur actuelle &gt; 1 on recommence.\n\nl:x z 1 - st c lt lm f : On ex\u00e9cute la macro ':', \u00e0 la sortie on r\u00e9cup\u00e8re le nb d'\u00e9l\u00e9ments de la pile (-1), on efface la pile et on affiche le temps de vol\net le max.<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Fonctions scientifiques<\/h3>\n\n\n\n<p><code>dc<\/code> ne conna\u00eet nativement que <code>+<\/code>, <code>-<\/code>, <code>*<\/code>, <code>\/<\/code>, <code>^<\/code> (puissance enti\u00e8re), <code>v<\/code> (racine carr\u00e9e) et <code>%<\/code> (modulo). Tout le reste doit \u00eatre construit \u00e0 partir de ces primitives.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Fonctions trigonom\u00e9triques<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># sin(x) par s\u00e9rie de Taylor (convergence maximale pour |x| &lt; \u03c0\/4 \u2248 0.785)\n\n# sin(x) = x - x\u00b3\/6 + x\u2075\/120 - x\u2077\/5040 + ...\n# En utilisant la m\u00e9thode de H\u00f6rner : \n# sin(x) = x\u00b7(1 - x\u00b2\/6\u00b7(1 - x\u00b2\/20\u00b7(\u2026)))\n# registres : x (argument), q (x\u00b2)\n\n&#091; d sx d * sq\n  1\n  lq 72 \/ * _1 * 1 r +\n  lq 42 \/ * _1 * 1 r +\n  lq 20 \/ * _1 * 1 r +\n  lq  6 \/ * _1 * 1 r +\n  lx *\n] sS\n\n&gt;&gt;&gt; .5 lSx p\n.47942553861641589506  # Valeur exacte : .479425538604\n\n&gt;&gt;&gt; 1 lSx p\n.84147100970017636685  # Valeur exacte : .841470984808\n\n# cos(x) par s\u00e9rie de Taylor\n# cos(x) = 1 - x\u00b2\/2\u00b7(1 - x\u00b2\/12\u00b7(\u2026))\n# registre : q (x\u00b2)\n\n&#091; d * sq\n  1\n  lq 90 \/ * _1 * 1 r +\n  lq 56 \/ * _1 * 1 r +\n  lq 30 \/ * _1 * 1 r +\n  lq 12 \/ * _1 * 1 r +\n  lq  2 \/ * _1 * 1 r +\n] sC\n\n&gt;&gt;&gt; .5 lCx p\n.87758256188986372906  # Valeur exacte : .87758256189\n\n&gt;&gt;&gt; 1 lCx p\n.54030230379188712522  # Valeur exacte : .540302305868<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Fonctions hyperboliques<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>20k\n2.71828182845904523536 sE\n\n# sinh(x) = (e^x - e^(-x)) \/ 2\n\n&#091;d lE r ^ r _1 * lE r ^ - 2 \/] sS\n\n# cosh(x) = (e^x + e^(-x)) \/ 2\n\n&#091;d lE r ^ r _1 * lE r ^ + 2 \/] sC\n\n\n&gt;&gt;&gt; 2 lSx p \n3.62686040784701876766  # Valeur exacte : 3.62686040785\n&gt;&gt;&gt; 2 lCx p\n3.76219569108363145955  # Valeur exacte : 3.76219569108<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># tanh = sinh\/cosh\n\n&#091;d lSx r lCx \/] sT\n\n&gt;&gt;&gt; 3 lTx p\n.99505475368673045133  # Valeur exacte : .995054753687<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Cr\u00e9ez en 1971 par Lorinda Cherry&nbsp;et&nbsp;Robert Morris, dc est une calculatrice RPN (Notation Polonaise Inverse) \u00e0 pr\u00e9cision arbitraire. D\u00e9couvrons ensemble quelques unes de ses fonctionnalit\u00e9s. Si vous n&rsquo;\u00eates pas sous Windows, lancez un Terminal puis tapez dc, sinon utilisez la &hellip; <a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/dc\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":4913,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1721","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/1721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/users\/4913"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/comments?post=1721"}],"version-history":[{"count":58,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/1721\/revisions"}],"predecessor-version":[{"id":2080,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/1721\/revisions\/2080"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=1721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}