File indexing completed on 2024-05-12 04:02:07

0001 <!DOCTYPE html>
0002 <html><head>
0003 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
0004 <title>highlight.mac</title>
0005 <meta name="generator" content="KF5::SyntaxHighlighting - Definition (Maxima) - Theme (Breeze Light)"/>
0006 </head><body style="background-color:#ffffff;color:#1f1c1b"><pre>
0007 <span style="color:#898887">/*</span>
0008 <span style="color:#898887">------------------------------------------------------------------------</span>
0009 <span style="color:#898887">Efficient Galois Fields in Maxima</span>
0010 
0011 <span style="color:#898887">by Alasdair McAndrew</span>
0012 <span style="color:#898887">and later extended by Fabrizio Caruso and Jacopo Daurizio</span>
0013 
0014 <span style="color:#898887">it is distribuited together with gf_roots by Jacopo Daurizio</span>
0015 
0016 <span style="color:#898887">Authors:</span>
0017 
0018 <span style="color:#898887">Fabrizio Caruso   (optimizations, testing)</span>
0019 <span style="color:#898887">Jacopo D'Aurizio   (optimizations, modular roots)</span>
0020 <span style="color:#898887">Alasdair McAndrew (original version of the package, pohlig-helman log, etc... )</span>
0021 <span style="color:#898887">------------------------------------------------------------------------*/</span>
0022 
0023 <span style="color:#898887">/* Released under terms of the GNU General Public License, version 2,</span>
0024 <span style="color:#898887"> * by permission of the authors to Robert Dodier circa 2007-12-02.</span>
0025 <span style="color:#898887"> */</span>
0026 
0027 <span style="color:#898887">/* Defines a flag for dealing with large fields.  If it is set to "false",</span>
0028 <span style="color:#898887">then lookup tables are used for exponentiation and logarithms.  Otherwise</span>
0029 <span style="color:#898887">other algorithms are used */</span>
0030 
0031 <span style="color:#644a9b">define_variable</span>(<span style="color:#aa5500">largefield</span>,<span style="font-weight:bold">true</span>,<span style="color:#aa5500">bool</span>)$
0032 <span style="color:#644a9b">define_variable</span>(<span style="color:#aa5500">gf_char</span>,<span style="color:#b08000">0</span>,<span style="color:#aa5500">integer</span>)$
0033 <span style="color:#644a9b">define_variable</span>(<span style="color:#aa5500">gf_exp</span>,<span style="color:#b08000">0</span>,<span style="color:#aa5500">integer</span>)$
0034 <span style="color:#644a9b">define_variable</span>(<span style="color:#aa5500">gf_order</span>,<span style="color:#b08000">0</span>,<span style="color:#aa5500">integer</span>)$
0035 <span style="color:#644a9b">define_variable</span> (<span style="color:#aa5500">gf_one</span>, <span style="color:#607880;font-weight:bold">'</span><span style="color:#aa5500">gf_one</span>, <span style="color:#aa5500">any_check</span>)$
0036 <span style="color:#644a9b">define_variable</span> (<span style="color:#aa5500">gf_prim</span>, <span style="color:#607880;font-weight:bold">'</span><span style="color:#aa5500">gf_prim</span>, <span style="color:#aa5500">any_check</span>)$
0037 <span style="color:#644a9b">define_variable</span> (<span style="color:#aa5500">gf_irr</span>, <span style="color:#607880;font-weight:bold">'</span><span style="color:#aa5500">gf_irr</span>, <span style="color:#aa5500">any_check</span>)$
0038 <span style="color:#644a9b">define_variable</span> (<span style="color:#aa5500">gf_list</span>, <span style="color:#607880;font-weight:bold">'</span><span style="color:#aa5500">gf_list</span>, <span style="color:#aa5500">any_check</span>)$
0039 <span style="color:#644a9b">define_variable</span> (<span style="color:#aa5500">gen_powers</span>, <span style="color:#607880;font-weight:bold">'</span><span style="color:#aa5500">gf_list</span>, <span style="color:#aa5500">any_check</span>)$
0040 <span style="color:#644a9b">remvalue</span>(<span style="color:#aa5500">x</span>,<span style="color:#aa5500">z</span>,<span style="color:#aa5500">gf_char</span>,<span style="color:#aa5500">gf_exp</span>,<span style="color:#aa5500">gf_irr</span>,<span style="color:#aa5500">pg</span>,<span style="color:#aa5500">gp</span>,<span style="color:#aa5500">lg</span>,<span style="color:#aa5500">gf_prim</span>,<span style="color:#aa5500">gf_one</span>,<span style="color:#aa5500">gf_order</span>,<span style="color:#aa5500">gf_list</span>,<span style="color:#aa5500">gen_powers</span>)$
0041 
0042 
0043 <span style="color:#898887">/* --------------------------------------------------------------------------------------------- */</span>
0044 <span style="color:#898887">/* Settings */</span>
0045 
0046 <span style="color:#aa5500">GF_VERBOSE</span>:<span style="font-weight:bold">false</span>; <span style="color:#898887">/* Verbosity */</span>
0047 <span style="color:#aa5500">GF_WARNING</span>: <span style="font-weight:bold">true</span>; <span style="color:#898887">/* Warnings */</span>
0048 <span style="color:#aa5500">GF_IRREDUCIBILITY_CHECK</span>:<span style="font-weight:bold">false</span>;   <span style="color:#898887">/* Irreducibility test for the minimal polynomial of the extension */</span>
0049 
0050 <span style="color:#898887">/*</span>
0051 <span style="color:#898887">------------------------------------------------------------------------------------------------ */</span>
0052 
0053 
0054 <span style="color:#898887">/* It defines a new current field with gf_char=b, min. pol.= p of deg= e*/</span>
0055 <span style="color:#aa5500">gf_set</span>([<span style="color:#aa5500">ars</span>]):=<span style="color:#644a9b">block</span>([<span style="color:#aa5500">gj</span>,<span style="color:#aa5500">m</span>,<span style="color:#aa5500">i</span>,<span style="color:#aa5500">j</span>,<span style="color:#aa5500">dg</span>],
0056   <span style="font-weight:bold">if</span> <span style="color:#644a9b">length</span>(<span style="color:#aa5500">ars</span>)=<span style="color:#b08000">1</span> <span style="font-weight:bold">then</span>
0057     (
0058     <span style="color:#aa5500">gf_setp</span>(<span style="color:#aa5500">ars</span>[<span style="color:#b08000">1</span>]),
0059     <span style="color:#644a9b">return</span>(<span style="font-weight:bold">true</span>)
0060     )
0061   <span style="font-weight:bold">else</span>
0062     (
0063     <span style="font-weight:bold">if</span> <span style="color:#644a9b">length</span>(<span style="color:#aa5500">ars</span>)=<span style="color:#b08000">2</span> <span style="font-weight:bold">then</span>
0064        (
0065        <span style="font-weight:bold">if</span> <span style="color:#644a9b">numberp</span>(<span style="color:#aa5500">ars</span>[<span style="color:#b08000">2</span>]) <span style="font-weight:bold">then</span>
0066          (
0067          <span style="font-weight:bold">if</span> <span style="color:#aa5500">ars</span>[<span style="color:#b08000">2</span>]=<span style="color:#b08000">0</span> <span style="font-weight:bold">and</span> <span style="color:#aa5500">GF_WARNING</span> <span style="font-weight:bold">then</span>
0068            (
0069            <span style="color:#644a9b">print</span>(<span style="color:#bf0303">"WARNING: the irreducible is zero! We assume GF("</span>,<span style="color:#aa5500">ars</span>[<span style="color:#b08000">1</span>],<span style="color:#bf0303">")"</span>),
0070            <span style="color:#aa5500">gf_setp</span>(<span style="color:#aa5500">ars</span>[<span style="color:#b08000">1</span>]),
0071            <span style="color:#644a9b">return</span>(<span style="font-weight:bold">true</span>)
0072            )
0073          <span style="font-weight:bold">else</span>
0074            (
0075            <span style="color:#644a9b">error</span>(<span style="color:#bf0303">"ERROR: you tried to extend with a non-zero constant!"</span>),
0076            <span style="color:#644a9b">return</span>(<span style="font-weight:bold">false</span>)
0077            )
0078          )
0079        <span style="font-weight:bold">else</span>
0080          (
0081          <span style="color:#aa5500">dg</span>:<span style="color:#644a9b">hipow</span>(<span style="color:#aa5500">ars</span>[<span style="color:#b08000">2</span>],<span style="color:#aa5500">x</span>),
0082 
0083          <span style="font-weight:bold">if</span> <span style="color:#aa5500">dg</span>=<span style="color:#b08000">1</span> <span style="font-weight:bold">then</span>
0084            <span style="color:#aa5500">gf_setp</span>(<span style="color:#aa5500">ars</span>[<span style="color:#b08000">1</span>]),
0085          <span style="color:#aa5500">gf_irr</span>:<span style="color:#aa5500">ars</span>[<span style="color:#b08000">2</span>],
0086          <span style="color:#aa5500">gf_exp</span>:<span style="color:#aa5500">dg</span>,
0087          <span style="color:#644a9b">return</span>(<span style="font-weight:bold">true</span>)
0088          )
0089        )
0090     <span style="font-weight:bold">else</span>
0091        (
0092        <span style="color:#aa5500">gf_exp</span>:<span style="color:#aa5500">ars</span>[<span style="color:#b08000">2</span>],
0093        <span style="font-weight:bold">if</span> <span style="color:#aa5500">gf_exp</span>=<span style="color:#b08000">1</span> <span style="font-weight:bold">then</span>
0094           (
0095           <span style="color:#aa5500">gf_setp</span>(<span style="color:#aa5500">ars</span>[<span style="color:#b08000">1</span>]),
0096           <span style="color:#aa5500">gf_irr</span>:<span style="color:#644a9b">rat</span>(<span style="color:#aa5500">ars</span>[<span style="color:#b08000">3</span>]),
0097           <span style="color:#644a9b">return</span>(<span style="font-weight:bold">true</span>)
0098           ),
0099        <span style="color:#aa5500">gf_irr</span>:<span style="color:#644a9b">rat</span>(<span style="color:#aa5500">ars</span>[<span style="color:#b08000">3</span>])
0100        )
0101     ),
0102 
0103   <span style="color:#aa5500">gf_char</span>:<span style="color:#aa5500">ars</span>[<span style="color:#b08000">1</span>],
0104   <span style="color:#aa5500">gf_one</span>:<span style="color:#644a9b">rat</span>(<span style="color:#b08000">1</span>,<span style="color:#aa5500">x</span>),
0105   <span style="color:#aa5500">gf_order</span>:<span style="color:#aa5500">gf_char</span>^<span style="color:#aa5500">gf_exp</span><span style="color:#b08000">-1</span>,
0106 
0107   <span style="color:#aa5500">m</span>:<span style="color:#644a9b">makelist</span>(<span style="color:#644a9b">coeff</span>(<span style="color:#aa5500">gf_irr</span>,<span style="color:#aa5500">x</span>,<span style="color:#aa5500">i</span>),<span style="color:#aa5500">i</span>,<span style="color:#b08000">0</span>,<span style="color:#aa5500">gf_exp</span>),
0108   <span style="color:#aa5500">gf_list</span>:[[<span style="color:#644a9b">first</span>(<span style="color:#aa5500">m</span>),<span style="color:#b08000">0</span>]],<span style="color:#aa5500">j</span>:<span style="color:#b08000">1</span>,
0109   <span style="font-weight:bold">for</span> <span style="color:#aa5500">i</span>:<span style="color:#b08000">2</span> <span style="font-weight:bold">thru</span> <span style="color:#aa5500">gf_exp</span><span style="color:#b08000">+1</span> <span style="font-weight:bold">do</span> <span style="font-weight:bold">if</span> <span style="color:#aa5500">m</span>[<span style="color:#aa5500">i</span>]=<span style="color:#b08000">0</span> <span style="font-weight:bold">then</span> <span style="color:#aa5500">j</span>:<span style="color:#aa5500">j</span><span style="color:#b08000">+1</span> <span style="font-weight:bold">else</span> ( <span style="color:#aa5500">gf_list</span>:<span style="color:#644a9b">endcons</span>([<span style="color:#aa5500">m</span>[<span style="color:#aa5500">i</span>],<span style="color:#aa5500">j</span>],<span style="color:#aa5500">gf_list</span>), <span style="color:#aa5500">j</span>:<span style="color:#b08000">1</span> ),
0110 
0111   <span style="font-weight:bold">if</span> <span style="font-weight:bold">not</span>(<span style="color:#644a9b">primep</span>(<span style="color:#aa5500">gf_char</span>)) <span style="font-weight:bold">then</span> <span style="color:#644a9b">error</span>(<span style="color:#bf0303">"ERROR: Gf_Char must be a prime number."</span>)
0112     <span style="font-weight:bold">else</span>
0113       <span style="color:#0057ae;font-style:italic">modulus</span>:<span style="color:#aa5500">gf_char</span>,
0114   <span style="font-weight:bold">if</span> <span style="color:#aa5500">GF_IRREDUCIBILITY_CHECK</span> <span style="font-weight:bold">and</span>
0115        <span style="color:#644a9b">hipow</span>(<span style="color:#644a9b">args</span>(<span style="color:#644a9b">factor</span>(<span style="color:#aa5500">ars</span>[<span style="color:#b08000">3</span>]))[<span style="color:#b08000">1</span>],<span style="color:#aa5500">x</span>)#<span style="color:#644a9b">hipow</span>(<span style="color:#644a9b">rat</span>(<span style="color:#aa5500">ars</span>[<span style="color:#b08000">3</span>]),<span style="color:#aa5500">x</span>) <span style="font-weight:bold">then</span>
0116       <span style="color:#644a9b">error</span>(<span style="color:#bf0303">"ERROR: Polynomial is not irreducible"</span>),
0117 
0118   <span style="font-weight:bold">if</span> <span style="font-weight:bold">not</span>(<span style="color:#aa5500">largefield</span>) <span style="font-weight:bold">then</span>
0119      (
0120      <span style="color:#aa5500">pg</span>:<span style="color:#aa5500">mkpowers</span>(),
0121      <span style="color:#aa5500">lg</span>:<span style="color:#aa5500">mklogs</span>()
0122      )
0123   <span style="font-weight:bold">else</span>
0124      (
0125      <span style="font-weight:bold">if</span> <span style="color:#aa5500">GF_VERBOSE</span> <span style="font-weight:bold">then</span>
0126        <span style="color:#644a9b">print</span>(<span style="color:#bf0303">"finding a primitive element..."</span>),
0127 
0128      <span style="color:#aa5500">gf_prim</span>:<span style="color:#644a9b">rat</span>(<span style="color:#aa5500">gf_findprim</span>(),<span style="color:#aa5500">x</span>),
0129      <span style="font-weight:bold">if</span> <span style="color:#aa5500">GF_VERBOSE</span> <span style="font-weight:bold">then</span>
0130      <span style="color:#644a9b">print</span>(<span style="color:#bf0303">"...primitive element found."</span>)
0131 
0132      ),
0133   <span style="color:#0057ae;font-style:italic">modulus</span>:<span style="font-weight:bold">false</span>, <span style="color:#898887">/* it resets the modulus */</span>
0134   <span style="color:#644a9b">return</span>(<span style="font-weight:bold">true</span>)
0135 
0136   )$
0137 
0138 
0139 <span style="color:#898887">/* Prints out information about the field */</span>
0140 <span style="color:#aa5500">gf_info</span>():=<span style="color:#644a9b">block</span>(
0141   <span style="color:#644a9b">print</span>(<span style="color:#bf0303">"Prime gf_char value: "</span>,<span style="color:#aa5500">gf_char</span>),
0142   <span style="color:#644a9b">print</span>(<span style="color:#bf0303">"Exponent: "</span>, <span style="color:#aa5500">gf_exp</span>),
0143   <span style="color:#644a9b">print</span>(<span style="color:#bf0303">"Multiplicative order: "</span>,<span style="color:#aa5500">gf_order</span>),
0144   <span style="color:#644a9b">print</span>(<span style="color:#bf0303">"Irreducible polynomial: "</span>,<span style="color:#aa5500">gf_irr</span>),
0145   <span style="color:#644a9b">print</span>(<span style="color:#bf0303">"Primitive element: "</span>,<span style="color:#aa5500">gf_prim</span>),
0146   <span style="font-weight:bold">if</span> (<span style="color:#aa5500">largefield</span>) <span style="font-weight:bold">then</span>
0147     <span style="color:#644a9b">print</span>(<span style="color:#bf0303">"Largefield flag is true; powers and logarithms not computed."</span>)
0148     <span style="font-weight:bold">else</span>
0149     <span style="color:#644a9b">print</span>(<span style="color:#bf0303">"Largefield flag is false; powers and logarithms computed."</span>),
0150   <span style="color:#644a9b">disp</span>()
0151 )$
0152 </pre></body></html>