{"id":128,"date":"2022-03-19T16:04:38","date_gmt":"2022-03-19T15:04:38","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?page_id=128"},"modified":"2023-06-01T12:29:41","modified_gmt":"2023-06-01T11:29:41","slug":"apl-et-rpl-produit-externe","status":"publish","type":"page","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/apl-et-rpl-produit-externe\/","title":{"rendered":"et RPL : Produit externe"},"content":{"rendered":"<p><strong>Produit externe<\/strong><\/p>\n<p>Le produit externe sert \u00e0 composer chacun des termes de l&rsquo;op\u00e9rande gauche avec chacun des termes de l&rsquo;op\u00e9rande droit par n&rsquo;importe quelle fonction dyadique.<\/p>\n<p>L&rsquo;exemple classique est la table de multiplication de Pythagore&nbsp;:<\/p>\n<pre>1 2 3 \u2218.\u00d7 1 2 3 4 5       \u235d \u2218 se prononce JOT\nOutput:\n1 2 3  4  5\n2 4 6  8 10\n3 6 9 12 15\n\n\u2374 1 2 3 \u2218.\u00d7 1 2 3 4 5\nOutput: 3 5      \u235d 3 lignes et 5 colonnes<\/pre>\n<p>Chacune des valeurs du vecteur 1 2 3 est multipli\u00e9e par chacune des valeurs du vecteur 1 2 3 4 5.<\/p>\n<p>On peut obtenir un r\u00e9sultat analogue en RPL de plusieurs fa\u00e7ons :<\/p>\n<pre>1: [ 1 2 3 ]      # Sous forme de matrice\n2: { 1 2 3 4 5 }  # Sous forme de liste\n\u00d7\n1: {[1 2 3] [2 4 6] [3 6 9] [4 8 12] [5 10 15]}<\/pre>\n<p><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/03\/Produit.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-129\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/03\/Produit.jpeg\" alt=\"Produit\" width=\"287\" height=\"162\"><\/a><\/p>\n<p>Ou encore, en inversant matrice et liste :<\/p>\n<pre>1: { 1 2 3 }      # Sous forme de liste\n2: [ 1 2 3 4 5 ]  # Sous forme de matrice\n\u00d7\n1: {[1 2 3 4 5] [2 4 6 8 10] [3 6 9 12 15]}<\/pre>\n<p>Cela fonctionne \u00e9galement avec la division d&rsquo;une matrice par une liste (pas l&rsquo;inverse) :<\/p>\n<pre>En APL :\n\n1 2 3 4 5 \u2218.\u00f7 1 2 3\nOutput:\n1 0.5 0.3333333333\n2 1   0.6666666667\n3 1.5 1           \n4 2   1.333333333 \n5 2.5 1.666666667\n\nEn RPL :\n\n1: [ 1 2 3 4 5]    # Matrice\n2: { 1 2 3 }       # Liste\n\u00f7\n1: {[1 2 3 4 5]\n    [.5 1 1.5 2 2.5] \n    [.333 .666 1 1.333 1.666]\n   }<\/pre>\n<p>Voici la version propos\u00e9e par&nbsp;<a title=\"Site Norman Brenner\" href=\"https:\/\/home.gwu.edu\/~nbrenner\/\" target=\"_blank\" rel=\"noopener\">Norman Brenner<\/a>&nbsp;pour le produit externe X \u2218. Y o\u00f9 X et Y peuvent \u00eatre des vecteurs ou des matrices. Nous appellerons&nbsp; <strong>PE.<\/strong> le produit externe :<\/p>\n<pre>\u00ab \u2192 x y f \u00ab y \u00ab x f EVAL \u00bb MAP \u00bb \u00bb\n'PE. <strong>STO<\/strong><\/pre>\n<p>Exemple avec la table de multiplication :<\/p>\n<pre>3: [ 1 2 3 ]          # ou { 1 2 3 }\n2: [ 1 2 3 4 5 ]      # ou { 1 2 3 4 5 }\n1: \u00ab \u00d7 \u00bb\n<strong>VAR<\/strong> PE.\n1: \u2308 1  2  3  4  5  \u2309\n   | 2  4  6  8  10 |\n   \u230a 3  6  9  12 15 \u230b<\/pre>\n<p><span style=\"text-decoration: underline\">Le principe<\/span> : On prend un par un les \u00e9l\u00e9ments de y (ici y = [1 2 3 4 5]) et on multiplie la valeur par la matrice x (ici x = [1 2 3]). Ce qui permet d&rsquo;obtenir les colonnes [1 2 3] puis [2 4 6] etc. Mais si l&rsquo;on veut faire une table d&rsquo;addition, le script propos\u00e9 fera 1 + [1 2 3] ce qui va renvoyer une erreur. Par contre, avec les listes on peut faire 1 ADD {1 2 3} pour obtenir la liste {2 3 4} (le \u00ab\u00a0+\u00a0\u00bb \u00e9tant r\u00e9serv\u00e9 \u00e0 la concat\u00e9nation)<\/p>\n<p>Table d&rsquo;addition en utilisant des listes :<\/p>\n<pre>3: { 1 2 3 }\n2: { 1 2 3 4 5 }\n1: \u00ab ADD \u00bb\n<strong>VAR<\/strong> PE.\n1: {{2 3 4 5 6} {3 4 5 6 7} {4 5 6 7 8}}<\/pre>\n<p>On peut inventer des tables de Pythagore g\u00e9n\u00e9ralis\u00e9es, par exemple la table des maximums :<\/p>\n<pre>5 4 8 \u2218.\u2308 7 3 9 1\nOutput:\n7 5 9 5\n7 4 9 4\n8 8 9 8<\/pre>\n<p>En RPL :<\/p>\n<pre>3: { 5 4 8 }\n2: { 7 3 9 1 }\n1: \u00ab MAX \u00bb\n<strong>VAR<\/strong> PE.\n1: {{7 5 9 5} {7 4 9 4} {8 8 9 8}}<\/pre>\n<p>La premi\u00e8re ligne correspond aux max entre 5 et les valeurs 7 3 9 1<br>\nLa seconde ligne aux max entre 4 et 7 3 9 1<br>\nEt la derni\u00e8re ligne aux max entre 8 et 7 3 9 1<\/p>\n<p><strong>Exemple &#8211; R\u00e9partition des \u00e2ges<\/strong><\/p>\n<p>On se donne une liste d&rsquo;\u00e2ges et une liste de r\u00e9partitions, par exemple on veut savoir combien de personnes ont entre 10 et 15 ans, entre 15 ans et 40 ans et plus de 40 ans.<\/p>\n<pre>AGES \u2190 27 12 18 75 40 22 35 6   \u235d Les \u00e2ges\nTRAN \u2190 10 15 40    \u235d Tranches d'\u00e2ges\nTRAN \u2218.&lt; AGES   \u235d Matrice des comparaisons\n1 1 1 1 1 1 1 0\n1 0 1 1 1 1 1 0\n0 0 0 1 0 0 0 0\nCUM \u2190 +\/ TRAN \u2218.&lt; AGES    \u235d Cumul des lignes\n7 6 1<\/pre>\n<p>7 personnes ont plus de 10 ans, 6 ont plus de 15 ans et 1 a plus de 40 ans.&nbsp;Pour obtenir le nombre de personnes par intervalle :<\/p>\n<pre>CUM - 1\u2193CUM,0   \u235d Diff\u00e9rence entre les termes\n1 5 1<\/pre>\n<p>1 personne a entre 10 et 15 ans, 5 personnes entre 15 et 40 ans et 1 personne a plus de 40 ans. L&rsquo;enfant de 6 ans a bien \u00e9t\u00e9 \u00e9limin\u00e9 de nos statistiques.<\/p>\n<p><span style=\"text-decoration: underline\">En RPL<\/span> :<\/p>\n<pre>3 : { 10 15 40 }\n2 : { 27 12 18 75 40 22 35 6 }\n1: \u00ab &lt; \u00bb\n<strong>VAR<\/strong> PE.\n1: {{1 1 1 1 1 1 1 0}\n   {1 0 1 1 1 1 1 0}\n   {0 0 0 1 0 0 0 0}}\n1: \u00ab \u2211LIST \u00bb\n<strong>PGR<\/strong> LIST PROC DOLIST\n1: { 7 6 1 }<\/pre>\n<p>La fonction&nbsp;\u25b3LIST transforme {x<sub>1<\/sub>, x<sub>2<\/sub>, &#8230; x<sub>n<\/sub>} en {x<sub>2<\/sub>-x<sub>1<\/sub>, &#8230; x<sub>n<\/sub>-x<sub>n-1<\/sub>}, or nous voulons {x<sub>1<\/sub>-x<sub>2<\/sub>, &#8230; x<sub>n-1 <\/sub>-x<sub>n<\/sub>, x<sub>n<\/sub>}. On va donc ajouter un 0 \u00e0 la liste, utiliser&nbsp;\u25b3LIST et prendre la valeur absolue (on pourrait aussi&nbsp; inverser la liste, ajouter un 0 en premi\u00e8re position puis&nbsp;\u25b3LIST et \u00e0 nouveau inverser la liste&#8230;).<\/p>\n<pre>1: { 7 6 1 }\n0 + \u25b3LIST ABS\n1: {1 5 1}<\/pre>\n<p>R\u00e9sumons cela sous la forme d&rsquo;un programme STAT, en APL :<\/p>\n<pre>STAT \u2190 {c - 1\u2193(c \u2190 +\/\u237a \u2218.&lt; \u2375),0}\nTRAN STAT AGES\nOutput:\n1 5 1<\/pre>\n<p><span style=\"text-decoration: underline\">Et en RPL<\/span> :<\/p>\n<pre>\u00ab \u00ab &lt; \u00bb PE. \u00ab \u2211LIST \u00bb DOLIST\n  0 + \u25b3LIST ABS\n\u00bb\n'STA <strong>STO<\/strong>\n\n3 : { 10 15 40 }\n2 : { 27 12 18 75 40 22 35 6 }\n<strong>VAR<\/strong> STAT\n1: { 1 5 1 }<\/pre>\n<p><strong>Exercice &#8211; Ann\u00e9es bissextiles<\/strong><\/p>\n<blockquote><p><span style=\"text-decoration: underline\">D\u00e9finition (Wikip\u00e9dia)<\/span> : Pour \u00eatre bissextile, une ann\u00e9e doit dans tous les cas \u00eatre divisible par 4 ; mais si c\u2019est une ann\u00e9e de centenaire (comme 1800, 1900, etc.), elle doit en compl\u00e9ment \u00eatre divisible par 400.<\/p><\/blockquote>\n<p>Voici une version en APL trouv\u00e9e sur le <a title=\"APL cart\" href=\"https:\/\/aplcart.info\/\" target=\"_blank\" rel=\"noopener\">site APLcart<\/a>&nbsp;et l\u00e9g\u00e8rement modifi\u00e9e pour ne faire apparaitre que les ann\u00e9es :<\/p>\n<pre>BIS \u2190 {(0 \u2260.= 400 100 4 \u2218.| \u2375) \/ \u2375}\nBIS 1900 2000 1908 2022 2024\nOutput:\n2000 1908 2024<\/pre>\n<p>On reconnait le produit externe \u2218.|, le produit interne \u2260.= et la compression logique \/. Voici l&rsquo;id\u00e9e du programme :<\/p>\n<p><code>400 100 4 \u2218.| \u2375<\/code> : On cherche les restes des divisions des ann\u00e9es par 400, 100 et 4. Ce qui fait une matrice de 3 lignes :<\/p>\n<pre>400 100 4 \u2218.| 1900 2000 1908 2022 2024\nOutput:\n300 0 308 22 24   \u235d Restes des divisions par 400\n  0 0   8 22 24   \u235d Restes des divisions par 100\n  0 0   0  2  0   \u235d Restes des divisions par 4<\/pre>\n<p><code>0 \u2260.=<\/code> : Rappelez-vous de +.\u00d7 qui signifie \u00ab\u00a0somme des produits\u00a0\u00bb, ou \u00ab\u00a0faire les produits puis r\u00e9duire&nbsp;par la somme\u00a0\u00bb. Ici on doit donc effectuer les tests 0 = \u00ab\u00a0termes de la matrice\u00a0\u00bb puis r\u00e9duire par \u2260&#8230; Essayons de comprendre :<\/p>\n<pre>0 = 400 100 4 \u2218.| 1900 2000 1908 2022 2024\nOutput:\n0 1 0 0 0\n1 1 0 0 0\n1 1 1 0 1<\/pre>\n<p>Un \u00ab\u00a01\u00a0\u00bb dans cette nouvelle matrice indique que la division tombe juste.<\/p>\n<p><span style=\"text-decoration: underline\">Voici maintenant l&rsquo;astuce utilis\u00e9e<\/span> : Si vous regardez les 8 cas a priori possibles pour une ann\u00e9e donn\u00e9e, \u00e0 savoir \u00eatre ou non divisible par 400 (not\u00e9 DIV 400. plus loin),&nbsp;\u00eatre ou non divisible par 100 et&nbsp;\u00eatre ou non divisible par 4, certains cas sont impossibles (par exemple \u00eatre divisible par 400 mais pas par 4, etc.). Il ne reste que 4 possibilit\u00e9s :<\/p>\n<pre>DIV 4.  DIV 100.  DIV 400.   BISSEXTILE ?\n    F         F         F    NON\n    V         F         F    OUI\n    V         V         F    NON\n    V         V         V    OUI<\/pre>\n<p>Effectuons maintenant les r\u00e9ductions de chacune des lignes en utilisant \u2260 :<\/p>\n<pre>(F \u2260 F) \u2260 F &lt;=&gt; F \u2260 F &lt;=&gt; F\n(V \u2260 F) \u2260 F &lt;=&gt; V \u2260 F &lt;=&gt; V\n(V \u2260 V) \u2260 F &lt;=&gt; F \u2260 F &lt;=&gt; F\n(V \u2260 V) \u2260 V &lt;=&gt; F \u2260 V &lt;=&gt; V<\/pre>\n<p>Donc le produit interne 0 \u2260.= indiquera bien si l&rsquo;ann\u00e9e est bissextile ou pas ! Je vous laisse 3 exemples \u00e0 m\u00e9diter :<\/p>\n<pre>0 = 400 100 4 \u2218.| 1900\nOutput: 0 1 1\n\u2260\/ 0 = 400 100 4 \u2218.| 1900\nOutput: 0\n0 = 400 100 4 \u2218.| 2024\nOutput: 0 0 1\n\u2260\/ 0 = 400 100 4 \u2218.| 2024\nOutput: 1\n0 = 400 100 4 \u2218.| 2022\nOutput: 0 0 0\n\u2260\/ 0 = 400 100 4 \u2218.| 2022\nOutput: 0<\/pre>\n<p>Il peut aussi \u00eatre int\u00e9ressant de remarquer qu&rsquo;avec les bool\u00e9ens X \u2260 Y est \u00e9quivalent \u00e0 X XOR Y (OU exclusif)<\/p>\n<p>Passons \u00e0 la traduction en RPL, en remarquant que MOD fonctionne entre un nombre et une liste :<\/p>\n<pre>2: 2024\n1: {4 100 400}\nMTH REAL MOD\n1: {0 24 24}<\/pre>\n<p>De plus, comme il n&rsquo;y a que 3 termes pour la r\u00e9duction, on peut \u00e9crire simplement \u2260 \u2260. Par exemple pour (V \u2260 F) \u2260 F :<\/p>\n<pre>3: 0     # FAUX\n2: 0     # FAUX\n1: 1     # VRAI\n\u2260\n2: 0     # FAUX\n1: 1     # VRAI\n\u2260\n1: 1     # VRAI<\/pre>\n<p>Et le test 0 = \u00ab\u00a0Restes de divisions par 4, 100 et 400\u00a0\u00bb est simplement le NOT en RPL (si le reste est 0, NOT donnera 1 et si le reste n&rsquo;est pas nul, NOT donnera 0). D&rsquo;o\u00f9 cette version fonctionnant avec une seule ann\u00e9e en param\u00e8tre :<\/p>\n<pre>\u00ab { 4 100 400 } MOD NOT OBJ\u2192 DROP \u2260 \u2260 \u00bb\n'BIS <strong>STO<\/strong><\/pre>\n<p>OBJ\u2192 met les \u00e9l\u00e9ments de la liste sur la pile en ajoutant au niveau 1 la taille de la liste (que l&rsquo;on supprime avec DROP).<\/p>\n<p><span style=\"text-decoration: underline\">V\u00e9rifions<\/span> :<\/p>\n<pre>1900\n<strong>VAR<\/strong> BIS\n0            # 1900 n'est pas bissextile\n2000\nBIS\n1            # Bissextile\n2024\nBIS\n1            # Bissextile\n2022\nBIS\n0            # Pas bissextile<\/pre>\n<p>On peut aussi \u00e9crire le programme de la fa\u00e7on suivante :<\/p>\n<pre>\u00ab { 4 100 400 } MOD NOT \u00ab \u2260 \u00bb STREAM \u00bb\n'BIS <strong>STO<\/strong><\/pre>\n<p>Pour extraire les ann\u00e9es bissextiles d&rsquo;une liste, on peut par exemple faire :<\/p>\n<pre>\u00ab DUP \u00ab BIS \u00bb MAP SWAP IFT \u00bb\n'BISL <strong>STO<\/strong>\n\n1: { 1900 2000 1908 2022 2024 }\n<strong>VAR<\/strong> BISL\n{ 2000 1908 2024 }<\/pre>\n<p>Traduction pour les Texas Instrument graphiques (TI-81, 82, 83, 84&#8230;) :<\/p>\n<p><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/03\/Biss.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-135\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/03\/Biss.png\" alt=\"Biss\" width=\"244\" height=\"184\"><\/a><\/p>\n<p><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/03\/19002000.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-136\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/03\/19002000.png\" alt=\"19002000\" width=\"244\" height=\"184\"><\/a><\/p>\n\n\n<p><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/et-rpl-exo-robinson\/\">Lire la suite&#8230;<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Produit externe Le produit externe sert \u00e0 composer chacun des termes de l&rsquo;op\u00e9rande gauche avec chacun des termes de l&rsquo;op\u00e9rande droit par n&rsquo;importe quelle fonction dyadique. L&rsquo;exemple classique est la table de multiplication de Pythagore&nbsp;: 1 2 3 \u2218.\u00d7 1 &hellip; <a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/apl-et-rpl-produit-externe\/\">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-128","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/128","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=128"}],"version-history":[{"count":3,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/128\/revisions"}],"predecessor-version":[{"id":1613,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/128\/revisions\/1613"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}