Assignment 2 CS 300 - Applied Symbolic Computation Jeremy Johnson Due Tue May 30 (12:30 pm). (submit your Maple worksheet using webct) No late assignments will be accepted This assignment asks you to implement the "Three Primes" algorithm for integer multiplication. The algorithm is described in the handout from Lipson and is summarized in the slides on fast polynomial and integer multiplication. The algorithm relies on the FFT computed in Z_p for appropriately chosen primes p. The next section reviews the mod p FFT and provides code you may use.
<Text-field style="Heading 1" layout="Heading 1">FFT mod p Background and code.</Text-field> This section reviews how to compute N-th roots of unity mod p, the computation of the DFT mod p, and provides code to compute the FFT of a vector of elements in Z_p. with(LinearAlgebra); NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uYW1lR1EqMkR+T3V0cHV0RigvJSVzaXplR1EjMTJGKC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigtRiQ2Z3ktSSNtaUdGJTY5USMmeEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR0ZTLyUlYm9sZEdGOC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdGVi8lK2JhY2tncm91bmRHRlkvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHRjUvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdGUC8lKm1hdGhjb2xvckdGVi8lL21hdGhiYWNrZ3JvdW5kR0ZZLyUrZm9udGZhbWlseUdGXG8vJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YoLyUpbWF0aHNpemVHRlMtRi02M1EiLEYoL0YxUSZpbmZpeEYoL0Y0RjgvRjdGNS9GOlEkMGVtRigvRj1RM3Zlcnl0aGlja21hdGhzcGFjZUYoL0Y/RjhGQEZCRkVGSEZKRkxGTkZRRlRGVy1GZ242OVEkQWRkRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKEFkam9pbnRGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEzQmFja3dhcmRTdWJzdGl0dXRlRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRK0JhbmRNYXRyaXhGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEmQmFzaXNGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEtQmV6b3V0TWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRL0JpZGlhZ29uYWxGb3JtRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLUJpbGluZWFyRm9ybUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTVDaGFyYWN0ZXJpc3RpY01hdHJpeEYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTlDaGFyYWN0ZXJpc3RpY1BvbHlub21pYWxGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEnQ29sdW1uRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRMENvbHVtbkRpbWVuc2lvbkYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTBDb2x1bW5PcGVyYXRpb25GKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEsQ29sdW1uU3BhY2VGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEwQ29tcGFuaW9uTWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRMENvbmRpdGlvbk51bWJlckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5US9Db25zdGFudE1hdHJpeEYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5US9Db25zdGFudFZlY3RvckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USVDb3B5RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRMkNyZWF0ZVBlcm11dGF0aW9uRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLUNyb3NzUHJvZHVjdEYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5US1EZWxldGVDb2x1bW5GKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEqRGVsZXRlUm93RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLERldGVybWluYW50RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKURpYWdvbmFsRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRL0RpYWdvbmFsTWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKkRpbWVuc2lvbkYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UStEaW1lbnNpb25zRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRK0RvdFByb2R1Y3RGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVE2RWlnZW5Db25kaXRpb25OdW1iZXJzRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLEVpZ2VudmFsdWVzRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLUVpZ2VudmVjdG9yc0YoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USZFcXVhbEYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTJGb3J3YXJkU3Vic3RpdHV0ZUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5US5Gcm9iZW5pdXNGb3JtRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRNEdhdXNzaWFuRWxpbWluYXRpb25GKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEyR2VuZXJhdGVFcXVhdGlvbnNGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEvR2VuZXJhdGVNYXRyaXhGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEyR2V0UmVzdWx0RGF0YVR5cGVGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEvR2V0UmVzdWx0U2hhcGVGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVE1R2l2ZW5zUm90YXRpb25NYXRyaXhGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEsR3JhbVNjaG1pZHRGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEtSGFua2VsTWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLEhlcm1pdGVGb3JtRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRM0hlcm1pdGlhblRyYW5zcG9zZUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5US9IZXNzZW5iZXJnRm9ybUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5US5IaWxiZXJ0TWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRMkhvdXNlaG9sZGVyTWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRL0lkZW50aXR5TWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRMkludGVyc2VjdGlvbkJhc2lzRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRK0lzRGVmaW5pdGVGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEtSXNPcnRob2dvbmFsRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKklzU2ltaWxhckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USpJc1VuaXRhcnlGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEySm9yZGFuQmxvY2tNYXRyaXhGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVErSm9yZGFuRm9ybUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UShMQV9NYWluRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRMExVRGVjb21wb3NpdGlvbkYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5US1MZWFzdFNxdWFyZXNGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEsTGluZWFyU29sdmVGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEkTWFwRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJU1hcDJGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEqTWF0cml4QWRkRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRMk1hdHJpeEV4cG9uZW50aWFsRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRL01hdHJpeEZ1bmN0aW9uRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLk1hdHJpeEludmVyc2VGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVE1TWF0cml4TWF0cml4TXVsdGlwbHlGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVErTWF0cml4Tm9ybUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USxNYXRyaXhQb3dlckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTVNYXRyaXhTY2FsYXJNdWx0aXBseUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTVNYXRyaXhWZWN0b3JNdWx0aXBseUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTJNaW5pbWFsUG9seW5vbWlhbEYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USZNaW5vckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UShNb2R1bGFyRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKU11bHRpcGx5RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLE5vVXNlclZhbHVlRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJU5vcm1GKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEqTm9ybWFsaXplRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKk51bGxTcGFjZUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTNPdXRlclByb2R1Y3RNYXRyaXhGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEqUGVybWFuZW50RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJlBpdm90RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKlBvcG92Rm9ybUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTBRUkRlY29tcG9zaXRpb25GKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEtUmFuZG9tTWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLVJhbmRvbVZlY3RvckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USVSYW5rRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRNlJhdGlvbmFsQ2Fub25pY2FsRm9ybUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTZSZWR1Y2VkUm93RWNoZWxvbkZvcm1GKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEkUm93RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLVJvd0RpbWVuc2lvbkYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5US1Sb3dPcGVyYXRpb25GKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEpUm93U3BhY2VGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEtU2NhbGFyTWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRL1NjYWxhck11bHRpcGx5RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRLVNjYWxhclZlY3RvckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USpTY2h1ckZvcm1GKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEvU2luZ3VsYXJWYWx1ZXNGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEqU21pdGhGb3JtRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKlN1Yk1hdHJpeEYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USpTdWJWZWN0b3JGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEpU3VtQmFzaXNGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEwU3lsdmVzdGVyTWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRL1RvZXBsaXR6TWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJlRyYWNlRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKlRyYW5zcG9zZUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTBUcmlkaWFnb25hbEZvcm1GKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVErVW5pdFZlY3RvckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTJWYW5kZXJtb25kZU1hdHJpeEYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USpWZWN0b3JBZGRGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEsVmVjdG9yQW5nbGVGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVE1VmVjdG9yTWF0cml4TXVsdGlwbHlGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVErVmVjdG9yTm9ybUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UTVWZWN0b3JTY2FsYXJNdWx0aXBseUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UStaZXJvTWF0cml4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRK1plcm9WZWN0b3JGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEkWmlwRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnEtRi02M1EiXUYoL0YxUShwb3N0Zml4RihGM0Y2RjkvRj1RMnZlcnl0aGlubWF0aHNwYWNlRihGPkZARkJGRUZIRkpGTEZORlFGVEZXNyM3YnJJIyZ4R0YoSSRBZGRHNiQlKnByb3RlY3RlZEdGKkkoQWRqb2ludEdGKEkzQmFja3dhcmRTdWJzdGl0dXRlR0YoSStCYW5kTWF0cml4R0YoSSZCYXNpc0dGKEktQmV6b3V0TWF0cml4R0YoSS9CaWRpYWdvbmFsRm9ybUdGKEktQmlsaW5lYXJGb3JtR0YoSTVDaGFyYWN0ZXJpc3RpY01hdHJpeEdGKEk5Q2hhcmFjdGVyaXN0aWNQb2x5bm9taWFsR0YoSSdDb2x1bW5HRihJMENvbHVtbkRpbWVuc2lvbkdGKEkwQ29sdW1uT3BlcmF0aW9uR0YoSSxDb2x1bW5TcGFjZUdGKEkwQ29tcGFuaW9uTWF0cml4R0YoSTBDb25kaXRpb25OdW1iZXJHRihJL0NvbnN0YW50TWF0cml4R0YoSS9Db25zdGFudFZlY3RvckdGKEklQ29weUdGKEkyQ3JlYXRlUGVybXV0YXRpb25HRihJLUNyb3NzUHJvZHVjdEdGKEktRGVsZXRlQ29sdW1uR0YoSSpEZWxldGVSb3dHRihJLERldGVybWluYW50R0YoSSlEaWFnb25hbEdGKEkvRGlhZ29uYWxNYXRyaXhHRihJKkRpbWVuc2lvbkdGKEkrRGltZW5zaW9uc0dGKEkrRG90UHJvZHVjdEdGKEk2RWlnZW5Db25kaXRpb25OdW1iZXJzR0YoSSxFaWdlbnZhbHVlc0dGKEktRWlnZW52ZWN0b3JzR0YoSSZFcXVhbEdGKEkyRm9yd2FyZFN1YnN0aXR1dGVHRihJLkZyb2Jlbml1c0Zvcm1HRihJNEdhdXNzaWFuRWxpbWluYXRpb25HRihJMkdlbmVyYXRlRXF1YXRpb25zR0YoSS9HZW5lcmF0ZU1hdHJpeEdGKEkyR2V0UmVzdWx0RGF0YVR5cGVHRihJL0dldFJlc3VsdFNoYXBlR0YoSTVHaXZlbnNSb3RhdGlvbk1hdHJpeEdGKEksR3JhbVNjaG1pZHRHRihJLUhhbmtlbE1hdHJpeEdGKEksSGVybWl0ZUZvcm1HRihJM0hlcm1pdGlhblRyYW5zcG9zZUdGKEkvSGVzc2VuYmVyZ0Zvcm1HRihJLkhpbGJlcnRNYXRyaXhHRihJMkhvdXNlaG9sZGVyTWF0cml4R0YoSS9JZGVudGl0eU1hdHJpeEdGKEkySW50ZXJzZWN0aW9uQmFzaXNHRihJK0lzRGVmaW5pdGVHRihJLUlzT3J0aG9nb25hbEdGKEkqSXNTaW1pbGFyR0YoSSpJc1VuaXRhcnlHRihJMkpvcmRhbkJsb2NrTWF0cml4R0YoSStKb3JkYW5Gb3JtR0YoSShMQV9NYWluR0YoSTBMVURlY29tcG9zaXRpb25HRihJLUxlYXN0U3F1YXJlc0dGKEksTGluZWFyU29sdmVHRihJJE1hcEdGKEklTWFwMkdGKEkqTWF0cml4QWRkR0YoSTJNYXRyaXhFeHBvbmVudGlhbEdGKEkvTWF0cml4RnVuY3Rpb25HRihJLk1hdHJpeEludmVyc2VHRihJNU1hdHJpeE1hdHJpeE11bHRpcGx5R0YoSStNYXRyaXhOb3JtR0YoSSxNYXRyaXhQb3dlckdGKEk1TWF0cml4U2NhbGFyTXVsdGlwbHlHRihJNU1hdHJpeFZlY3Rvck11bHRpcGx5R0YoSTJNaW5pbWFsUG9seW5vbWlhbEdGKEkmTWlub3JHRihJKE1vZHVsYXJHRihJKU11bHRpcGx5R0ZeaWxJLE5vVXNlclZhbHVlR0YoSSVOb3JtR0ZeaWxJKk5vcm1hbGl6ZUdGKEkqTnVsbFNwYWNlR0YoSTNPdXRlclByb2R1Y3RNYXRyaXhHRihJKlBlcm1hbmVudEdGKEkmUGl2b3RHRihJKlBvcG92Rm9ybUdGKEkwUVJEZWNvbXBvc2l0aW9uR0YoSS1SYW5kb21NYXRyaXhHRihJLVJhbmRvbVZlY3RvckdGKEklUmFua0dGKEk2UmF0aW9uYWxDYW5vbmljYWxGb3JtR0YoSTZSZWR1Y2VkUm93RWNoZWxvbkZvcm1HRihJJFJvd0dGKEktUm93RGltZW5zaW9uR0YoSS1Sb3dPcGVyYXRpb25HRihJKVJvd1NwYWNlR0YoSS1TY2FsYXJNYXRyaXhHRihJL1NjYWxhck11bHRpcGx5R0YoSS1TY2FsYXJWZWN0b3JHRihJKlNjaHVyRm9ybUdGKEkvU2luZ3VsYXJWYWx1ZXNHRihJKlNtaXRoRm9ybUdGKEkqU3ViTWF0cml4R0YoSSpTdWJWZWN0b3JHRihJKVN1bUJhc2lzR0YoSTBTeWx2ZXN0ZXJNYXRyaXhHRihJL1RvZXBsaXR6TWF0cml4R0YoSSZUcmFjZUdGXmlsSSpUcmFuc3Bvc2VHRihJMFRyaWRpYWdvbmFsRm9ybUdGKEkrVW5pdFZlY3RvckdGKEkyVmFuZGVybW9uZGVNYXRyaXhHRihJKlZlY3RvckFkZEdGKEksVmVjdG9yQW5nbGVHRihJNVZlY3Rvck1hdHJpeE11bHRpcGx5R0YoSStWZWN0b3JOb3JtR0YoSTVWZWN0b3JTY2FsYXJNdWx0aXBseUdGKEkrWmVyb01hdHJpeEdGKEkrWmVyb1ZlY3RvckdGKEkkWmlwR0Yo with(numtheory); Warning, the protected name order has been redefined and unprotected NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uYW1lR1EqMkR+T3V0cHV0RigvJSVzaXplR1EjMTJGKC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigtRiQ2aXAtSSNtaUdGJTY5USZHSWdjZEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR0ZTLyUlYm9sZEdGOC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdGVi8lK2JhY2tncm91bmRHRlkvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHRjUvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdGUC8lKm1hdGhjb2xvckdGVi8lL21hdGhiYWNrZ3JvdW5kR0ZZLyUrZm9udGZhbWlseUdGXG8vJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YoLyUpbWF0aHNpemVHRlMtRi02M1EiLEYoL0YxUSZpbmZpeEYoL0Y0RjgvRjdGNS9GOlEkMGVtRigvRj1RM3Zlcnl0aGlja21hdGhzcGFjZUYoL0Y/RjhGQEZCRkVGSEZKRkxGTkZRRlRGVy1GZ242OVEpYmlnb21lZ2FGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEmY2ZyYWNGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEpY2ZyYWNwb2xGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVErY3ljbG90b21pY0YoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USlkaXZpc29yc0YoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USlmYWN0b3JFUUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USpmYWN0b3JzZXRGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEnZmVybWF0RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKWltYWd1bml0RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJmluZGV4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRL2ludGVncmFsX2Jhc2lzRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKWludmNmcmFjRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJ2ludnBoaUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USppc3NxcmZyZWVGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEnamFjb2JpRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKmtyb25lY2tlckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USdsYW1iZGFGKEZqbkZdb0Zfby9GYm9GOEZjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcS9GZHFRJ25vcm1hbEYoRmZxRmhxLUZnbjY5USlsZWdlbmRyZUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USltY29tYmluZUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USltZXJzZW5uZUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UShtaWdjZGV4RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKm1pbmtvd3NraUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UShtaXBvbHlzRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJW1sb2dGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEnbW9iaXVzRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJm1yb290RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJm1zcXJ0RihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKW5lYXJlc3RwRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRKm50aGNvbnZlckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USludGhkZW5vbUYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USludGhudW1lckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USdudGhwb3dGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEmb3JkZXJGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEpcGRleHBhbmRGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEkcGhpRihGam5GXW9GX29GZ3VGY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGaHVGZnFGaHEtRmduNjlRI3BpRihGam5GXW9GX29GZ3VGY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGaHVGZnFGaHEtRmduNjlRKnBwcmltcm9vdEYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5USlwcmltcm9vdEYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UShxdWFkcmVzRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRK3Jvb3RzdW5pdHlGKEZqbkZdb0Zfb0Zhb0Zjb0Zlb0Znb0Zpb0ZbcEZdcEZfcEZhcEZjcEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZmcUZocS1GZ242OVEqc2FmZXByaW1lRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJnNpZ21hRihGam5GXW9GX29GZ3VGY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGaHVGZnFGaHEtRmduNjlRKnNxMmZhY3RvckYoRmpuRl1vRl9vRmFvRmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRmZxRmhxLUZnbjY5UShzdW0yc3FyRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnFGaHEtRmduNjlRJHRhdUYoRmpuRl1vRl9vRmd1RmNvRmVvRmdvRmlvRltwRl1wRl9wRmFwRmNwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmh1RmZxRmhxLUZnbjY5USV0aHVlRihGam5GXW9GX29GYW9GY29GZW9GZ29GaW9GW3BGXXBGX3BGYXBGY3BGZXBGZ3BGaXBGW3FGXXFGX3FGYXFGY3FGZnEtRi02M1EiXUYoL0YxUShwb3N0Zml4RihGM0Y2RjkvRj1RMnZlcnl0aGlubWF0aHNwYWNlRihGPkZARkJGRUZIRkpGTEZORlFGVEZXNyM3UUkmR0lnY2RHRihJKWJpZ29tZWdhR0YoSSZjZnJhY0dGKEkpY2ZyYWNwb2xHRihJK2N5Y2xvdG9taWNHRihJKWRpdmlzb3JzR0YoSSlmYWN0b3JFUUdGKEkqZmFjdG9yc2V0R0YoSSdmZXJtYXRHRihJKWltYWd1bml0R0YoSSZpbmRleEc2JCUqcHJvdGVjdGVkR0YqSS9pbnRlZ3JhbF9iYXNpc0dGKEkpaW52Y2ZyYWNHRihJJ2ludnBoaUdGKEkqaXNzcXJmcmVlR0YoSSdqYWNvYmlHRihJKmtyb25lY2tlckdGKEknbGFtYmRhR0YoSSlsZWdlbmRyZUdGKEkpbWNvbWJpbmVHRihJKW1lcnNlbm5lR0YoSShtaWdjZGV4R0YoSSptaW5rb3dza2lHRihJKG1pcG9seXNHRihJJW1sb2dHRihJJ21vYml1c0dGKEkmbXJvb3RHRihJJm1zcXJ0R0YoSSluZWFyZXN0cEdGKEkqbnRoY29udmVyR0YoSSludGhkZW5vbUdGKEkpbnRobnVtZXJHRihJJ250aHBvd0dGKEkmb3JkZXJHRmZcbEkpcGRleHBhbmRHRihJJHBoaUdGKEkjcGlHRihJKnBwcmltcm9vdEdGKEkpcHJpbXJvb3RHRihJKHF1YWRyZXNHRihJK3Jvb3RzdW5pdHlHRihJKnNhZmVwcmltZUdGKEkmc2lnbWFHRihJKnNxMmZhY3RvckdGKEkoc3VtMnNxckdGKEkkdGF1R0YoSSV0aHVlR0Yo First review how to access subvectors of a vector. This is needed to get the even and odd elements of a vector in the FFT. a := Vector(8,(i)->i-1); LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6LyUpY29tcG9zZWRHRjcvJSpjb252ZXJ0ZWRHRjcvJStpbXNlbGVjdGVkR0Y3LyUscGxhY2Vob2xkZXJHRjcvJTBmb250X3N0eWxlX25hbWVHUSoyRH5PdXRwdXRGJy8lKm1hdGhjb2xvckdGQy8lL21hdGhiYWNrZ3JvdW5kR0ZGLyUrZm9udGZhbWlseUdGMS8lLG1hdGh2YXJpYW50R1EnaXRhbGljRicvJSltYXRoc2l6ZUdGNC1JI21vR0YkNjNRIzo9RicvJSVmb3JtR1EmaW5maXhGJy8lJmZlbmNlR0Y3LyUqc2VwYXJhdG9yR0Y3LyUnbHNwYWNlR1EvdGhpY2ttYXRoc3BhY2VGJy8lJ3JzcGFjZUdGam8vJSlzdHJldGNoeUdGNy8lKnN5bW1ldHJpY0dGNy8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjcvJS5tb3ZhYmxlbGltaXRzR0Y3LyUnYWNjZW50R0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZXLyUlc2l6ZUdGNC8lK2ZvcmVncm91bmRHRkMvJStiYWNrZ3JvdW5kR0ZGLUYjNiUtRl5vNjNRIltGJy9GYm9RJ3ByZWZpeEYnL0Zlb0Y6RmZvL0Zpb1EudGhpbm1hdGhzcGFjZUYnL0ZccEZeci9GXnBGOkZfcEZhcEZkcEZncEZpcEZbcUZdcUZfcUZhcUZjcS1GIzYjLUknbXRhYmxlR0YkNiotSSRtdHJHRiQ2Iy1JJG10ZEdGJDYjLUkjbW5HRiQ2OVEiMEYnRi9GMkY1L0Y5RjdGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm4vRmluUSdub3JtYWxGJ0Zbby1GZ3I2Iy1GanI2Iy1GXXM2OUZmcEYvRjJGNUZgc0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZhc0Zbby1GZ3I2Iy1GanI2Iy1GXXM2OVEiMkYnRi9GMkY1RmBzRjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmFzRltvLUZncjYjLUZqcjYjLUZdczY5USIzRidGL0YyRjVGYHNGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYXNGW28tRmdyNiMtRmpyNiMtRl1zNjlRIjRGJ0YvRjJGNUZgc0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZhc0Zbby1GZ3I2Iy1GanI2Iy1GXXM2OVEiNUYnRi9GMkY1RmBzRjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmFzRltvLUZncjYjLUZqcjYjLUZdczY5USI2RidGL0YyRjVGYHNGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYXNGW28tRmdyNiMtRmpyNiMtRl1zNjlRIjdGJ0YvRjJGNUZgc0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZhc0Zbby1GXm82M1EiXUYnL0Zib1EocG9zdGZpeEYnRlxyRmZvRl1yL0ZccFEydmVyeXRoaW5tYXRoc3BhY2VGJ0ZgckZfcEZhcEZkcEZncEZpcEZbcUZdcUZfcUZhcUZjcQ== b := a[[seq(2*i+1,i=0..3)]]; LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6LyUpY29tcG9zZWRHRjcvJSpjb252ZXJ0ZWRHRjcvJStpbXNlbGVjdGVkR0Y3LyUscGxhY2Vob2xkZXJHRjcvJTBmb250X3N0eWxlX25hbWVHUSoyRH5PdXRwdXRGJy8lKm1hdGhjb2xvckdGQy8lL21hdGhiYWNrZ3JvdW5kR0ZGLyUrZm9udGZhbWlseUdGMS8lLG1hdGh2YXJpYW50R1EnaXRhbGljRicvJSltYXRoc2l6ZUdGNC1JI21vR0YkNjNRIzo9RicvJSVmb3JtR1EmaW5maXhGJy8lJmZlbmNlR0Y3LyUqc2VwYXJhdG9yR0Y3LyUnbHNwYWNlR1EvdGhpY2ttYXRoc3BhY2VGJy8lJ3JzcGFjZUdGam8vJSlzdHJldGNoeUdGNy8lKnN5bW1ldHJpY0dGNy8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjcvJS5tb3ZhYmxlbGltaXRzR0Y3LyUnYWNjZW50R0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZXLyUlc2l6ZUdGNC8lK2ZvcmVncm91bmRHRkMvJStiYWNrZ3JvdW5kR0ZGLUYjNiUtRl5vNjNRIltGJy9GYm9RJ3ByZWZpeEYnL0Zlb0Y6RmZvL0Zpb1EudGhpbm1hdGhzcGFjZUYnL0ZccEZeci9GXnBGOkZfcEZhcEZkcEZncEZpcEZbcUZdcUZfcUZhcUZjcS1GIzYjLUknbXRhYmxlR0YkNiYtSSRtdHJHRiQ2Iy1JJG10ZEdGJDYjLUkjbW5HRiQ2OVEiMEYnRi9GMkY1L0Y5RjdGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm4vRmluUSdub3JtYWxGJ0Zbby1GZ3I2Iy1GanI2Iy1GXXM2OVEiMkYnRi9GMkY1RmBzRjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmFzRltvLUZncjYjLUZqcjYjLUZdczY5USI0RidGL0YyRjVGYHNGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYXNGW28tRmdyNiMtRmpyNiMtRl1zNjlRIjZGJ0YvRjJGNUZgc0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZhc0Zbby1GXm82M1EiXUYnL0Zib1EocG9zdGZpeEYnRlxyRmZvRl1yL0ZccFEydmVyeXRoaW5tYXRoc3BhY2VGJ0ZgckZfcEZhcEZkcEZncEZpcEZbcUZdcUZfcUZhcUZjcQ== c := a[[seq(2*i+2,i=0..3)]]; LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiY0YnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6LyUpY29tcG9zZWRHRjcvJSpjb252ZXJ0ZWRHRjcvJStpbXNlbGVjdGVkR0Y3LyUscGxhY2Vob2xkZXJHRjcvJTBmb250X3N0eWxlX25hbWVHUSoyRH5PdXRwdXRGJy8lKm1hdGhjb2xvckdGQy8lL21hdGhiYWNrZ3JvdW5kR0ZGLyUrZm9udGZhbWlseUdGMS8lLG1hdGh2YXJpYW50R1EnaXRhbGljRicvJSltYXRoc2l6ZUdGNC1JI21vR0YkNjNRIzo9RicvJSVmb3JtR1EmaW5maXhGJy8lJmZlbmNlR0Y3LyUqc2VwYXJhdG9yR0Y3LyUnbHNwYWNlR1EvdGhpY2ttYXRoc3BhY2VGJy8lJ3JzcGFjZUdGam8vJSlzdHJldGNoeUdGNy8lKnN5bW1ldHJpY0dGNy8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjcvJS5tb3ZhYmxlbGltaXRzR0Y3LyUnYWNjZW50R0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZXLyUlc2l6ZUdGNC8lK2ZvcmVncm91bmRHRkMvJStiYWNrZ3JvdW5kR0ZGLUYjNiUtRl5vNjNRIltGJy9GYm9RJ3ByZWZpeEYnL0Zlb0Y6RmZvL0Zpb1EudGhpbm1hdGhzcGFjZUYnL0ZccEZeci9GXnBGOkZfcEZhcEZkcEZncEZpcEZbcUZdcUZfcUZhcUZjcS1GIzYjLUknbXRhYmxlR0YkNiYtSSRtdHJHRiQ2Iy1JJG10ZEdGJDYjLUkjbW5HRiQ2OUZmcEYvRjJGNS9GOUY3RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuL0ZpblEnbm9ybWFsRidGW28tRmdyNiMtRmpyNiMtRl1zNjlRIjNGJ0YvRjJGNUZfc0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZgc0Zbby1GZ3I2Iy1GanI2Iy1GXXM2OVEiNUYnRi9GMkY1Rl9zRjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmBzRltvLUZncjYjLUZqcjYjLUZdczY5USI3RidGL0YyRjVGX3NGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYHNGW28tRl5vNjNRIl1GJy9GYm9RKHBvc3RmaXhGJ0ZcckZmb0Zdci9GXHBRMnZlcnl0aGlubWF0aHNwYWNlRidGYHJGX3BGYXBGZHBGZ3BGaXBGW3FGXXFGX3FGYXFGY3E= # Compute DFT using the Fast Fourier Transform # Inputs: N - an integer such that N = 2^k # a - a vector of size N with elements in Z_p # w - a primitive N-th root of unity in Z_p # p - an odd prime such that N|(p-1) # Output: A - a vector of size N with elements in Z_p such that A = DFT_N*a FFTmodp := proc(N,a,w,p) local n,b,c,A,B,C,k,i; if N = 1 then return a; else n := N/2; b := a[[seq(2*i+1,i=0..n-1)]]; c := a[[seq(2*i+2,i=0..n-1)]]; B := FFTmodp(n,b,w^2 mod p,p); C := FFTmodp(n,c,w^2 mod p,p); A := Vector(N); for k from 0 to n-1 do A[k+1] := (B[k+1] + w^k*C[k+1]) mod p; A[k+n+1] := (B[k+1] - w^k*C[k+1]) mod p; end do; end if; return A; end; NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5UShGRlRtb2RwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHRjsvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYoLyUqbWF0aGNvbG9yR0ZELyUvbWF0aGJhY2tncm91bmRHRkcvJStmb250ZmFtaWx5R0YyLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGKC8lKW1hdGhzaXplR0Y1LUkjbW9HRiU2M1EjOj1GKC8lJWZvcm1HUSZpbmZpeEYoLyUmZmVuY2VHRjgvJSpzZXBhcmF0b3JHRjgvJSdsc3BhY2VHUS90aGlja21hdGhzcGFjZUYoLyUncnNwYWNlR0ZbcC8lKXN0cmV0Y2h5R0Y4LyUqc3ltbWV0cmljR0Y4LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGOC8lLm1vdmFibGVsaW1pdHNHRjgvJSdhY2NlbnRHRjgvJTBmb250X3N0eWxlX25hbWVHRlgvJSVzaXplR0Y1LyUrZm9yZWdyb3VuZEdGRC8lK2JhY2tncm91bmRHRkctRiQ2KS1GX282M1ElcHJvY0YoL0Zjb1EhRihGZW9GZ28vRmpvUSQwZW1GKC9GXXBGXnJGXnBGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHEtRiQ2JS1GX282M1EiKEYoL0Zjb1EncHJlZml4RigvRmZvRjtGZ28vRmpvUS50aGlubWF0aHNwYWNlRigvRl1wRmlyL0ZfcEY7RmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxLUYkNiktRi02OVEiTkYoRjBGM0Y2RjlGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvLUZfbzYzUSIsRihGYm9GZW8vRmhvRjtGXXIvRl1wUTN2ZXJ5dGhpY2ttYXRoc3BhY2VGKEZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1GLTY5USJhRihGMEYzRjZGOUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG9GYXMtRi02OVEid0YoRjBGM0Y2RjlGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRmFzLUYtNjlRInBGKEYwRjNGNkY5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZpbkZcby1GX282M1EiKUYoL0Zjb1EocG9zdGZpeEYoRmdyRmdvRmhyL0ZdcFEydmVyeXRoaW5tYXRoc3BhY2VGKEZbc0ZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1JJ21zcGFjZUdGJTYmLyUnaGVpZ2h0R1EnMC4wfmV4RigvJSZ3aWR0aEdRJzAuM35lbUYoLyUmZGVwdGhHRlx1LyUqbGluZWJyZWFrR1ExZmlyc3Rwcm9jbmV3bGluZUYoLUYkNiYtRl9vNjNRJmxvY2FsRihGW3JGZW9GZ29GXXIvRl1wUTBtZWRpdW1tYXRoc3BhY2VGKEZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1GJDYxLUYtNjlRIm5GKEYwRjNGNkY5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zhcy1GLTY5USJiRihGMEYzRjZGOUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG9GYXMtRi02OVEiY0YoRjBGM0Y2RjlGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRmFzLUYtNjlRIkFGKEYwRjNGNkY5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zhcy1GLTY5USJCRihGMEYzRjZGOUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG9GYXMtRi02OVEiQ0YoRjBGM0Y2RjlGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRmFzLUYtNjlRImtGKEYwRjNGNkY5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zhcy1GLTY5USJpRihGMEYzRjZGOUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG8tRl9vNjNRIjtGKEZib0Zlb0Zkc0ZdckZccEZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcUZndC1GJDYkLUYkNiUtRiQ2JS1GJDYoLUZfbzYzUSNpZkYoRltyRmVvRmdvRl1yRmp1Rl5wRmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxLUYkNiVGXnMtRl9vNjNRIj1GKEZib0Zlb0Znb0Zpb0ZccEZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1JI21uR0YlNjlGZ3BGMEYzRjYvRjpGOEY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ24vRmpuUSdub3JtYWxGKEZcby1GX282M1EldGhlbkYoRltyRmVvRmdvL0Zqb0ZbdkZqdUZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1GaHQ2JkZqdEZddUZgdS9GY3VRNmluY3JlYXNlaW5kZW50bmV3bGluZUYoLUYkNiQtRl9vNjNRJ3JldHVybkYoRltyRmVvRmdvRl1yRmp1Rl5wRmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxRmdzLUZodDYmRmp0L0ZedVEnMC4wfmVtRihGYHUvRmN1UTZkZWNyZWFzZWluZGVudG5ld2xpbmVGKC1GJDYmLUZfbzYzUSVlbHNlRihGW3JGZW9GZ29GYnlGanVGXnBGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHFGY3ktRiQ2KS1GJDYlLUYkNiVGXnZGXm8tRiQ2JS1GJDYlRml4LUZfbzYzUSIvRihGYm9GZW9GZ29GaHJGanJGW3NGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHEtRmp4NjlRIjJGKEYwRjNGNkZceUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GXXlGXG8tRl9vNjNRIipGKEZib0Zlb0Znb0ZockZqckZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1GJDYjRl5zRmZ3Rmd0LUYkNiUtRiQ2JUZhdkZeby1GJDYmRmdzLUZfbzYzUSJbRihGZXJGZ3JGZ29GaHJGanJGW3NGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHEtRiQ2Iy1GJDYlRmJcbC1GJDYjLUYkNiUtRi02OVEkc2VxRihGMEYzRjZGOUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG8tRl9vNjNRMCZBcHBseUZ1bmN0aW9uO0YoRmJvRmVvRmdvRl1yRl9yRl5wRmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxLUYkNiVGYnItRiQ2JS1GJDYlLUYkNiVGZFtsRmdbbEZjdy1GX282M1EiK0YoRmJvRmVvRmdvRmJ5Rmp1Rl5wRmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxRml4RmFzLUYkNiVGY3dGZngtRiQ2JS1Gang2OVEiMEYoRjBGM0Y2Rlx5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZdeUZcby1GX282M1EjLi5GKEZjdEZlb0Znb0ZieUZfckZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1GJDYlRl52LUZfbzYzUSp+Jm1pbnVzO35GKEZbckZlb0Znb0ZdckZfckZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcUZpeEZgdC1GX282M1EiXUYoRmN0RmdyRmdvRmhyRmV0RltzRmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxRl1fbEZmd0ZndC1GJDYlLUYkNiVGZHZGXm8tRiQ2JkZnc0ZiXGwtRiQ2Iy1GJDYlRmJcbC1GJDYjLUYkNiVGXV1sRmBdbC1GJDYlRmJyLUYkNiUtRiQ2JUZpXWxGW15sRmRbbEZhc0ZeXmxGYHRGXV9sRl1fbEZmd0ZndC1GJDYlLUYkNiVGanZGXm8tRiQ2JUYsRmBdbC1GJDYlRmJyLUYkNilGXnZGYXNGYXZGYXMtRiQ2JS1GLTY5USRtb2RGKEYwRjNGNkY5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0ZgXWwtRiQ2JUZici1GJDYlLUYkNiMtRiQ2JUZqcy1GX282M1EiXkYoRmJvRmVvRmdvL0Zqb0ZmdEZldEZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcUZkW2xGYXNGXXRGYHRGYXNGXXRGYHRGZndGZ3QtRiQ2JS1GJDYlRl13Rl5vLUYkNiVGLEZgXWwtRiQ2JUZici1GJDYpRl52RmFzRmR2RmFzRl5hbEZhc0ZddEZgdEZmd0ZndC1GJDYlLUYkNiVGZ3ZGXm8tRiQ2JS1GLTY5USdWZWN0b3JGKEYwRjNGNkY5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0ZgXWwtRiQ2JUZickZqW2xGYHRGZndGZ3QtRiQ2Jy1GJDYpLUZfbzYzUSRmb3JGKEZbckZlb0Znb0ZdckZqdUZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcUZgdy1GX282M1ElZnJvbUYoRltyRmVvRmdvRmJ5Rmp1Rl5wRmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxRmJebC1GX282M1EjdG9GKEZbckZlb0Znb0ZieUZqdUZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcUZoXmwtRl9vNjNRI2RvRihGW3JGZW9GZ29GYnlGanVGXnBGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHFGY3ktRiQ2JC1GJDYlLUYkNiUtRiQ2JkZndkZiXGwtRiQ2Iy1GJDYlRmB3RltebEZpeEZdX2xGXm8tRiQ2JUZgYWxGYF1sLUYkNiVGYnItRiQ2JS1GJDYlLUYkNiZGanZGYlxsRlxlbEZdX2xGW15sLUYkNiUtRiQ2JUZqc0ZbYmxGYHdGZ1tsLUYkNiZGXXdGYlxsRlxlbEZdX2xGYXNGXXRGYHRGZndGZ3QtRiQ2JS1GJDYmRmd2RmJcbC1GJDYjLUYkNidGYHdGW15sRl52RltebEZpeEZdX2xGXm8tRiQ2JUZgYWxGYF1sLUYkNiVGYnItRiQ2JS1GJDYlRmhlbEZqXmxGamVsRmFzRl10RmB0Rlx6LUZfbzYzUSdlbmR+ZG9GKEZbckZlb0Znb0ZieUZfckZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcUZcei1GX282M1EnZW5kfmlmRihGW3JGZW9GZ29GYnlGX3JGXnBGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHFGZndGZ3QtRiQ2JEZpeUZndkZcei1GX282M1EpZW5kfnByb2NGKEZbckZlb0Znb0ZieUZfckZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcTcjLV9GKUksbXByaW50c2xhc2hHRig2JDcjPkkoRkZUbW9kcEdGKGYqNiZJIk5HRihJImFHRihJIndHRihJInBHRig2KkkibkdGKEkiYkdGKEkiY0dGKEkiQUdGKEkiQkdGKEkiQ0dGKEkia0dGKEkiaUdGKEYoRihDJEAlL0ZlaGwiIiJPRmZobEMpPkZqaGwsJComI0ZlaWwiIiNGZWlsRmVobEZlaWxGZWlsPkZbaWwmRmZobDYjNyMtSSRzZXFHJSpwcm90ZWN0ZWRHNiQsJiomRlxqbEZlaWxGYWlsRmVpbEZlaWxGZWlsRmVpbC9GYWlsOyIiISwmRmpobEZlaWxGZWlsISIiPkZcaWwmRmZobDYjNyMtRmJqbDYkLCZGZmpsRmVpbEZcamxGZWlsRmdqbD5GXmlsLUZiaGw2JkZqaGxGW2lsLUkkbW9kR0YoNiQqJClGZ2hsRlxqbEZlaWxGaGhsRmhobD5GX2lsLUZiaGw2JkZqaGxGXGlsRmZbbUZoaGw+Rl1pbC1JJ1ZlY3Rvckc2JEZjamxGKjYjRmVobD8oRmBpbEZpamxGZWlsRmpqbEkldHJ1ZUdGY2psQyQ+JkZdaWw2IywmRmBpbEZlaWxGZWlsRmVpbC1GZ1ttNiQsJiZGXmlsRmhcbUZlaWwqJilGZ2hsRmBpbEZlaWwmRl9pbEZoXG1GZWlsRmVpbEZoaGw+JkZdaWw2IywoRmBpbEZlaWxGamhsRmVpbEZlaWxGZWlsLUZnW202JCwmRl1dbUZlaWxGXl1tRltbbUZoaGxPRl1pbEYoRihGKDcjRmNobA== # Construct the DFT matrix DFT_N is the N X N matrix whose (i,j) element = w^((i-1)*(j-1)), # where w is a primitive Nth root of unity in Z_p, p a prime with N|(p-1) DFT := proc(N,w,p) Matrix(N,(i,j)->w^((i-1)*(j-1)) mod p); end; NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRERlRGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25seUdGOy8lKWNvbXBvc2VkR0Y4LyUqY29udmVydGVkR0Y4LyUraW1zZWxlY3RlZEdGOC8lLHBsYWNlaG9sZGVyR0Y4LyUwZm9udF9zdHlsZV9uYW1lR1EqMkR+T3V0cHV0RigvJSptYXRoY29sb3JHRkQvJS9tYXRoYmFja2dyb3VuZEdGRy8lK2ZvbnRmYW1pbHlHRjIvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YoLyUpbWF0aHNpemVHRjUtSSNtb0dGJTYzUSM6PUYoLyUlZm9ybUdRJmluZml4RigvJSZmZW5jZUdGOC8lKnNlcGFyYXRvckdGOC8lJ2xzcGFjZUdRL3RoaWNrbWF0aHNwYWNlRigvJSdyc3BhY2VHRltwLyUpc3RyZXRjaHlHRjgvJSpzeW1tZXRyaWNHRjgvJShtYXhzaXplR1EpaW5maW5pdHlGKC8lKG1pbnNpemVHUSIxRigvJShsYXJnZW9wR0Y4LyUubW92YWJsZWxpbWl0c0dGOC8lJ2FjY2VudEdGOC8lMGZvbnRfc3R5bGVfbmFtZUdGWC8lJXNpemVHRjUvJStmb3JlZ3JvdW5kR0ZELyUrYmFja2dyb3VuZEdGRy1GJDYoLUZfbzYzUSVwcm9jRigvRmNvUSFGKEZlb0Znby9Gam9RJDBlbUYoL0ZdcEZeckZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1GJDYlLUZfbzYzUSIoRigvRmNvUSdwcmVmaXhGKC9GZm9GO0Znby9Gam9RLnRoaW5tYXRoc3BhY2VGKC9GXXBGaXIvRl9wRjtGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHEtRiQ2Jy1GLTY5USJORihGMEYzRjZGOUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG8tRl9vNjNRIixGKEZib0Zlby9GaG9GO0Zdci9GXXBRM3Zlcnl0aGlja21hdGhzcGFjZUYoRl5wRmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxLUYtNjlRIndGKEYwRjNGNkY5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zhcy1GLTY5USJwRihGMEYzRjZGOUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG8tRl9vNjNRIilGKC9GY29RKHBvc3RmaXhGKEZnckZnb0Zoci9GXXBRMnZlcnl0aGlubWF0aHNwYWNlRihGW3NGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHEtSSdtc3BhY2VHRiU2Ji8lJ2hlaWdodEdRJzAuMH5leEYoLyUmd2lkdGhHUScwLjN+ZW1GKC8lJmRlcHRoR0ZpdC8lKmxpbmVicmVha0dRMWZpcnN0cHJvY25ld2xpbmVGKC1GJDYlLUYtNjlRJ01hdHJpeEYoRjBGM0Y2RjlGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvLUZfbzYzUTAmQXBwbHlGdW5jdGlvbjtGKEZib0Zlb0Znb0ZdckZfckZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1GJDYlRmJyLUYkNiVGXnNGYXMtRiQ2KUZocS1GJDYlRmJyLUYkNiUtRi02OVEiaUYoRjBGM0Y2RjlGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRmFzLUYtNjlRImpGKEYwRjNGNkY5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0ZddC1GZXQ2JkZndEZqdEZddS9GYHVRNmluY3JlYXNlaW5kZW50bmV3bGluZUYoLUYkNiYtRl9vNjNRJ29wdGlvbkYoRltyRmVvRmdvL0Zqb1EwbWVkaXVtbWF0aHNwYWNlRigvRl1wRmR3Rl5wRmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxLUYkNiUtRi02OVEpb3BlcmF0b3JGKEYwRjNGNkY5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zhcy1GLTY5USZhcnJvd0YoRjBGM0Y2RjlGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvLUZfbzYzUSI7RihGYm9GZW9GZHNGXXJGXHBGXnBGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHFGZHQtRiQ2JS1GLTY5USRtb2RGKEYwRjNGNkY5RjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0ZndS1GJDYlRmJyLUYkNiUtRiQ2JUZncy1GX282M1EiXkYoRmJvRmVvRmdvL0Zqb0ZjdEZidEZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1GJDYlRmJyLUYkNiUtRiQ2JUZici1GJDYlRmR2LUZfbzYzUSp+Jm1pbnVzO35GKEZbckZlb0Znb0ZdckZfckZecEZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcS1JI21uR0YlNjlGZ3BGMEYzRjYvRjpGOEY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ24vRmpuUSdub3JtYWxGKEZcb0ZddC1GX282M1EiKkYoRmJvRmVvRmdvRmhyRmpyRl5wRmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxLUYkNiVGYnItRiQ2JUZndkZoeUZbekZddEZddEZhc0Zqc0ZddC1GZXQ2JkZndC9GW3VRJzAuMH5lbUYoRl11L0ZgdVE2ZGVjcmVhc2VpbmRlbnRuZXdsaW5lRigtRl9vNjNRKWVuZH5wcm9jRihGW3JGZW9GZ29GY3dGX3JGXnBGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHFGXXRGaHpGXltsNyMtX0YpSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSRERlRHRihmKjYlSSJOR0YoSSJ3R0YoSSJwR0YoRihGKEYoLUknTWF0cml4R0YoNiRGW1xsZio2JEkiaUdGKEkiakdGKEYoNiRJKW9wZXJhdG9yR0YoSSZhcnJvd0dGKEYoLUkkbW9kR0YoNiQpRlxcbComLCZGY1xsIiIiRl5dbCEiIkZeXWwsJkZkXGxGXl1sRl5dbEZfXWxGXl1sRl1cbEYoRig2JkZcXGw5JUZdXGw5JkYoRihGKDcjRmlbbA== Test FFTmodp using p = 17 and N = 8. We will test the FFT by applying it to a vector with all 1's. As shown in class, the DFT of such a vector is a vector whose first element is N and all other elements are equal to 0. This is shown by direct computation of the DFT and then is verified with the FFT code. We know by the primitive element theorem that there exists a primitive (p-1)st root of unity in Z_p. If \316\261 is a primitive element in Z_p then all of the non-zero elements of Z_p can be expressed as powers of \316\261. Alternatively the numbers LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYtLUkjbW5HRiQ2OVEiMUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR0Y3LyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGNy8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR1EoMkR+TWF0aEYnLyUqbWF0aGNvbG9yR0ZCLyUvbWF0aGJhY2tncm91bmRHRkUvJStmb250ZmFtaWx5R0YxLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy8lKW1hdGhzaXplR0Y0LUkjbW9HRiQ2M1EiLEYnLyUlZm9ybUdRJmluZml4RicvJSZmZW5jZUdGNy8lKnNlcGFyYXRvckdRJXRydWVGJy8lJ2xzcGFjZUdRJDBlbUYnLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRicvJSlzdHJldGNoeUdGNy8lKnN5bW1ldHJpY0dGNy8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdGLi8lKGxhcmdlb3BHRjcvJS5tb3ZhYmxlbGltaXRzR0Y3LyUnYWNjZW50R0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZWLyUlc2l6ZUdGNC8lK2ZvcmVncm91bmRHRkIvJStiYWNrZ3JvdW5kR0ZFLUkjbWlHRiQ2OVEoJmFscGhhO0YnRi9GMkY1RjhGOkY8Rj5GQEZDRkZGSEZKRkxGTkZQRlJGVEZXRllGZW5GZ25Gam5GXG8tSSVtc3VwR0YkNiVGZXEtRiw2OVEiMkYnRi9GMkY1RjhGOkY8Rj5GQEZDRkZGSEZKRkxGTkZQRlJGVEZXRllGZW5GZ25Gam4vJTFzdXBlcnNjcmlwdHNoaWZ0R1EiMEYnRlxvLUZdbzYzUSMuLkYnRmBvRmNvL0Zmb0Y3RmhvL0ZccEZqb0ZecEZgcEZicEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcS1GXW82M1EiLkYnRmBvRmNvRmVyRmhvRmZyRl5wRmBwRmJwRmVwRmdwRmlwRltxRl1xRl9xRmFxRmNxRlxvLUZqcTYlRmVxLUYjNiUtRmZxNjlRInBGJ0YvRjJGNS9GOUZnb0Y6RjxGPkZARkNGRkZIRkpGTEZORlBGUkZURldGWUZlbi9GaG5RJ2l0YWxpY0YnRmpuLUZdbzYzUSgmbWludXM7RidGYG9GY29GZXIvRmlvUS90aGlja21hdGhzcGFjZUYnL0ZccEZoc0ZecEZgcEZicEZlcEZncEZpcEZbcUZdcUZfcUZhcUZjcUYrRl9yLUZmcTY5USFGJ0YvRjJGNUZhc0Y6RjxGPkZARkNGRkZIRkpGTEZORlBGUkZURldGWUZlbkZic0Zqbg== are distinct. The Maple command primroot in the numtheory package computes a primitive element in Z_p. Given a primitive element \316\261 in Z_p and a divisor d of p-1, then LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEhRicvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lJXNpemVHUSMxMkYnLyUlYm9sZEdRJmZhbHNlRicvJSdpdGFsaWNHUSV0cnVlRicvJSp1bmRlcmxpbmVHRjcvJSpzdWJzY3JpcHRHRjcvJSxzdXBlcnNjcmlwdEdGNy8lK2ZvcmVncm91bmRHUShbMCwwLDBdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y3LyUpY29tcG9zZWRHRjcvJSpjb252ZXJ0ZWRHRjcvJStpbXNlbGVjdGVkR0Y3LyUscGxhY2Vob2xkZXJHRjcvJTBmb250X3N0eWxlX25hbWVHUSgyRH5NYXRoRicvJSptYXRoY29sb3JHRkMvJS9tYXRoYmFja2dyb3VuZEdGRi8lK2ZvbnRmYW1pbHlHRjEvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLyUpbWF0aHNpemVHRjQtSSVtc3VwR0YkNiUtRiw2OVEoJmFscGhhO0YnRi9GMkY1L0Y5RjdGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm4vRmluUSdub3JtYWxGJ0Zbby1GIzYlRistSSZtZnJhY0dGJDYqLUYjNiUtRiw2OVEicEYnRi9GMkY1RjhGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GaG5GW28tSSNtb0dGJDYzUSgmbWludXM7RicvJSVmb3JtR1EmaW5maXhGJy8lJmZlbmNlR0Y3LyUqc2VwYXJhdG9yR0Y3LyUnbHNwYWNlR1EvdGhpY2ttYXRoc3BhY2VGJy8lJ3JzcGFjZUdGXXEvJSlzdHJldGNoeUdGNy8lKnN5bW1ldHJpY0dGNy8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjcvJS5tb3ZhYmxlbGltaXRzR0Y3LyUnYWNjZW50R0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZXLyUlc2l6ZUdGNC8lK2ZvcmVncm91bmRHRkMvJStiYWNrZ3JvdW5kR0ZGLUkjbW5HRiQ2OUZpcUYvRjJGNUZjb0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZkb0Zbby1GLDY5USJkRidGL0YyRjVGOEY7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZobkZbby8lLmxpbmV0aGlja25lc3NHUSIxRicvJStkZW5vbWFsaWduR1EnY2VudGVyRicvJSludW1hbGlnbkdGY3MvJSliZXZlbGxlZEdGN0ZkckZmckYrLyUxc3VwZXJzY3JpcHRzaGlmdEdRIjBGJ0Yr is a primitive d-th root of unity. p := 17; NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHRjsvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYoLyUqbWF0aGNvbG9yR0ZELyUvbWF0aGJhY2tncm91bmRHRkcvJStmb250ZmFtaWx5R0YyLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGKC8lKW1hdGhzaXplR0Y1LUkjbW9HRiU2M1EjOj1GKC8lJWZvcm1HUSZpbmZpeEYoLyUmZmVuY2VHRjgvJSpzZXBhcmF0b3JHRjgvJSdsc3BhY2VHUS90aGlja21hdGhzcGFjZUYoLyUncnNwYWNlR0ZbcC8lKXN0cmV0Y2h5R0Y4LyUqc3ltbWV0cmljR0Y4LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGOC8lLm1vdmFibGVsaW1pdHNHRjgvJSdhY2NlbnRHRjgvJTBmb250X3N0eWxlX25hbWVHRlgvJSVzaXplR0Y1LyUrZm9yZWdyb3VuZEdGRC8lK2JhY2tncm91bmRHRkctSSNtbkdGJTY5USMxN0YoRjBGM0Y2L0Y6RjhGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduL0ZqblEnbm9ybWFsRihGXG83Iy1fRilJLG1wcmludHNsYXNoR0YoNiQ3Iz5JInBHRigiIzw3I0Zlcg== N := 8; NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJORigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHRjsvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYoLyUqbWF0aGNvbG9yR0ZELyUvbWF0aGJhY2tncm91bmRHRkcvJStmb250ZmFtaWx5R0YyLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGKC8lKW1hdGhzaXplR0Y1LUkjbW9HRiU2M1EjOj1GKC8lJWZvcm1HUSZpbmZpeEYoLyUmZmVuY2VHRjgvJSpzZXBhcmF0b3JHRjgvJSdsc3BhY2VHUS90aGlja21hdGhzcGFjZUYoLyUncnNwYWNlR0ZbcC8lKXN0cmV0Y2h5R0Y4LyUqc3ltbWV0cmljR0Y4LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGOC8lLm1vdmFibGVsaW1pdHNHRjgvJSdhY2NlbnRHRjgvJTBmb250X3N0eWxlX25hbWVHRlgvJSVzaXplR0Y1LyUrZm9yZWdyb3VuZEdGRC8lK2JhY2tncm91bmRHRkctSSNtbkdGJTY5USI4RihGMEYzRjYvRjpGOEY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ24vRmpuUSdub3JtYWxGKEZcbzcjLV9GKUksbXByaW50c2xhc2hHRig2JDcjPkkiTkdGKCIiKTcjRmVy alpha := primroot(p); NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USZhbHBoYUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y4LyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZWRHRjgvJSpjb252ZXJ0ZWRHRjgvJStpbXNlbGVjdGVkR0Y4LyUscGxhY2Vob2xkZXJHRjgvJTBmb250X3N0eWxlX25hbWVHUSoyRH5PdXRwdXRGKC8lKm1hdGhjb2xvckdGQy8lL21hdGhiYWNrZ3JvdW5kR0ZGLyUrZm9udGZhbWlseUdGMi8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRigvJSltYXRoc2l6ZUdGNS1JI21vR0YlNjNRIzo9RigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR0Y4LyUqc2VwYXJhdG9yR0Y4LyUnbHNwYWNlR1EvdGhpY2ttYXRoc3BhY2VGKC8lJ3JzcGFjZUdGW3AvJSlzdHJldGNoeUdGOC8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uYW1lR0ZYLyUlc2l6ZUdGNS8lK2ZvcmVncm91bmRHRkMvJStiYWNrZ3JvdW5kR0ZGLUkjbW5HRiU2OVEiM0YoRjBGM0Y2RjlGO0Y9Rj9GQUZERkdGSUZLRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvNyMtX0YpSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSZhbHBoYUdGKCIiJDcjRmJy Verify that \316\261 is a primitive element for Z_p. seq(alpha^i mod p,i=0..p-1); NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkMtSSNtbkdGJTY5USIxRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjgvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYoLyUqbWF0aGNvbG9yR0ZDLyUvbWF0aGJhY2tncm91bmRHRkYvJStmb250ZmFtaWx5R0YyLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGKC8lKW1hdGhzaXplR0Y1LUkjbW9HRiU2M1EiLEYoLyUlZm9ybUdRJmluZml4RigvJSZmZW5jZUdGOC8lKnNlcGFyYXRvckdGTS8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOC8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdGLy8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uYW1lR0ZYLyUlc2l6ZUdGNS8lK2ZvcmVncm91bmRHRkMvJStiYWNrZ3JvdW5kR0ZGLUYtNjlRIjNGKEYwRjNGNkY5RjtGPUY/RkFGREZHRklGS0ZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zeby1GLTY5USI5RihGMEYzRjZGOUY7Rj1GP0ZBRkRGR0ZJRktGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG9GXm8tRi02OVEjMTBGKEYwRjNGNkY5RjtGPUY/RkFGREZHRklGS0ZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zeby1GLTY5USMxM0YoRjBGM0Y2RjlGO0Y9Rj9GQUZERkdGSUZLRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRl5vLUYtNjlRIjVGKEYwRjNGNkY5RjtGPUY/RkFGREZHRklGS0ZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zeby1GLTY5USMxNUYoRjBGM0Y2RjlGO0Y9Rj9GQUZERkdGSUZLRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRl5vLUYtNjlRIzExRihGMEYzRjZGOUY7Rj1GP0ZBRkRGR0ZJRktGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG9GXm8tRi02OVEjMTZGKEYwRjNGNkY5RjtGPUY/RkFGREZHRklGS0ZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zeby1GLTY5USMxNEYoRjBGM0Y2RjlGO0Y9Rj9GQUZERkdGSUZLRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRl5vLUYtNjlRIjhGKEYwRjNGNkY5RjtGPUY/RkFGREZHRklGS0ZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zeby1GLTY5USI3RihGMEYzRjZGOUY7Rj1GP0ZBRkRGR0ZJRktGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG9GXm8tRi02OVEiNEYoRjBGM0Y2RjlGO0Y9Rj9GQUZERkdGSUZLRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRl5vLUYtNjlRIzEyRihGMEYzRjZGOUY7Rj1GP0ZBRkRGR0ZJRktGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG9GXm8tRi02OVEiMkYoRjBGM0Y2RjlGO0Y9Rj9GQUZERkdGSUZLRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRl5vLUYtNjlRIjZGKEYwRjNGNkY5RjtGPUY/RkFGREZHRklGS0ZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zeb0YsNyM2MyIiIiIiJCIiKiIjNSIjOCIiJiIjOiIjNiIjOyIjOSIiKSIiKCIiJSIjNyIiIyIiJ0ZldA== Construct a primitive N-th root of unity as a power of \316\261 and verify that it is a primitive N-th root of unity. w := Power(alpha,(p-1)/N) mod p; NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJ3RigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHRjsvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYoLyUqbWF0aGNvbG9yR0ZELyUvbWF0aGJhY2tncm91bmRHRkcvJStmb250ZmFtaWx5R0YyLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGKC8lKW1hdGhzaXplR0Y1LUkjbW9HRiU2M1EjOj1GKC8lJWZvcm1HUSZpbmZpeEYoLyUmZmVuY2VHRjgvJSpzZXBhcmF0b3JHRjgvJSdsc3BhY2VHUS90aGlja21hdGhzcGFjZUYoLyUncnNwYWNlR0ZbcC8lKXN0cmV0Y2h5R0Y4LyUqc3ltbWV0cmljR0Y4LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGOC8lLm1vdmFibGVsaW1pdHNHRjgvJSdhY2NlbnRHRjgvJTBmb250X3N0eWxlX25hbWVHRlgvJSVzaXplR0Y1LyUrZm9yZWdyb3VuZEdGRC8lK2JhY2tncm91bmRHRkctSSNtbkdGJTY5USI5RihGMEYzRjYvRjpGOEY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ24vRmpuUSdub3JtYWxGKEZcbzcjLV9GKUksbXByaW50c2xhc2hHRig2JDcjPkkid0dGKCIiKjcjRmVy seq(w^i mod p,i=0..N); NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNjMtSSNtbkdGJTY5USIxRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjgvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYoLyUqbWF0aGNvbG9yR0ZDLyUvbWF0aGJhY2tncm91bmRHRkYvJStmb250ZmFtaWx5R0YyLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGKC8lKW1hdGhzaXplR0Y1LUkjbW9HRiU2M1EiLEYoLyUlZm9ybUdRJmluZml4RigvJSZmZW5jZUdGOC8lKnNlcGFyYXRvckdGTS8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOC8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdGLy8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uYW1lR0ZYLyUlc2l6ZUdGNS8lK2ZvcmVncm91bmRHRkMvJStiYWNrZ3JvdW5kR0ZGLUYtNjlRIjlGKEYwRjNGNkY5RjtGPUY/RkFGREZHRklGS0ZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zeby1GLTY5USMxM0YoRjBGM0Y2RjlGO0Y9Rj9GQUZERkdGSUZLRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRl5vLUYtNjlRIzE1RihGMEYzRjZGOUY7Rj1GP0ZBRkRGR0ZJRktGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG9GXm8tRi02OVEjMTZGKEYwRjNGNkY5RjtGPUY/RkFGREZHRklGS0ZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zeby1GLTY5USI4RihGMEYzRjZGOUY7Rj1GP0ZBRkRGR0ZJRktGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG9GXm8tRi02OVEiNEYoRjBGM0Y2RjlGO0Y9Rj9GQUZERkdGSUZLRk5GUEZSRlRGVkZZRmVuRmduRmluRlxvRl5vLUYtNjlRIjJGKEYwRjNGNkY5RjtGPUY/RkFGREZHRklGS0ZORlBGUkZURlZGWUZlbkZnbkZpbkZcb0Zeb0YsNyM2KyIiIiIiKiIjOCIjOiIjOyIiKSIiJSIiI0Zdcw== Test FFT code. a := Vector(N,1); LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6LyUpY29tcG9zZWRHRjcvJSpjb252ZXJ0ZWRHRjcvJStpbXNlbGVjdGVkR0Y3LyUscGxhY2Vob2xkZXJHRjcvJTBmb250X3N0eWxlX25hbWVHUSoyRH5PdXRwdXRGJy8lKm1hdGhjb2xvckdGQy8lL21hdGhiYWNrZ3JvdW5kR0ZGLyUrZm9udGZhbWlseUdGMS8lLG1hdGh2YXJpYW50R1EnaXRhbGljRicvJSltYXRoc2l6ZUdGNC1JI21vR0YkNjNRIzo9RicvJSVmb3JtR1EmaW5maXhGJy8lJmZlbmNlR0Y3LyUqc2VwYXJhdG9yR0Y3LyUnbHNwYWNlR1EvdGhpY2ttYXRoc3BhY2VGJy8lJ3JzcGFjZUdGam8vJSlzdHJldGNoeUdGNy8lKnN5bW1ldHJpY0dGNy8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjcvJS5tb3ZhYmxlbGltaXRzR0Y3LyUnYWNjZW50R0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZXLyUlc2l6ZUdGNC8lK2ZvcmVncm91bmRHRkMvJStiYWNrZ3JvdW5kR0ZGLUYjNiUtRl5vNjNRIltGJy9GYm9RJ3ByZWZpeEYnL0Zlb0Y6RmZvL0Zpb1EudGhpbm1hdGhzcGFjZUYnL0ZccEZeci9GXnBGOkZfcEZhcEZkcEZncEZpcEZbcUZdcUZfcUZhcUZjcS1GIzYjLUknbXRhYmxlR0YkNiotSSRtdHJHRiQ2Iy1JJG10ZEdGJDYjLUkjbW5HRiQ2OUZmcEYvRjJGNS9GOUY3RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuL0ZpblEnbm9ybWFsRidGW29GZnJGZnJGZnJGZnJGZnJGZnJGZnItRl5vNjNRIl1GJy9GYm9RKHBvc3RmaXhGJ0ZcckZmb0Zdci9GXHBRMnZlcnl0aGlubWF0aHNwYWNlRidGYHJGX3BGYXBGZHBGZ3BGaXBGW3FGXXFGX3FGYXFGY3E= F8 := DFT(8,w,p); LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjRjhGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGOi8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR1EqMkR+T3V0cHV0RicvJSptYXRoY29sb3JHRkMvJS9tYXRoYmFja2dyb3VuZEdGRi8lK2ZvbnRmYW1pbHlHRjEvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLyUpbWF0aHNpemVHRjQtSSNtb0dGJDYzUSM6PUYnLyUlZm9ybUdRJmluZml4RicvJSZmZW5jZUdGNy8lKnNlcGFyYXRvckdGNy8lJ2xzcGFjZUdRL3RoaWNrbWF0aHNwYWNlRicvJSdyc3BhY2VHRmpvLyUpc3RyZXRjaHlHRjcvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZUdGVy8lJXNpemVHRjQvJStmb3JlZ3JvdW5kR0ZDLyUrYmFja2dyb3VuZEdGRi1GIzYlLUZebzYzUSJbRicvRmJvUSdwcmVmaXhGJy9GZW9GOkZmby9GaW9RLnRoaW5tYXRoc3BhY2VGJy9GXHBGXnIvRl5wRjpGX3BGYXBGZHBGZ3BGaXBGW3FGXXFGX3FGYXFGY3EtRiM2Iy1JJ210YWJsZUdGJDYqLUkkbXRyR0YkNiotSSRtdGRHRiQ2Iy1JI21uR0YkNjlGZnBGL0YyRjUvRjlGN0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbi9GaW5RJ25vcm1hbEYnRltvRmlyRmlyRmlyRmlyRmlyRmlyRmlyLUZncjYqRmlyLUZqcjYjLUZdczY5USI5RidGL0YyRjVGX3NGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYHNGW28tRmpyNiMtRl1zNjlRIzEzRidGL0YyRjVGX3NGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYHNGW28tRmpyNiMtRl1zNjlRIzE1RidGL0YyRjVGX3NGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYHNGW28tRmpyNiMtRl1zNjlRIzE2RidGL0YyRjVGX3NGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYHNGW28tRmpyNiMtRl1zNjlRIjhGJ0YvRjJGNUZfc0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZgc0Zbby1GanI2Iy1GXXM2OVEiNEYnRi9GMkY1Rl9zRjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmBzRltvLUZqcjYjLUZdczY5USIyRidGL0YyRjVGX3NGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYHNGW28tRmdyNipGaXJGaXNGY3RGXXVGaXJGaXNGY3RGXXUtRmdyNipGaXJGXnRGXXVGZHNGY3RGYnVGaXNGaHQtRmdyNipGaXJGY3RGaXJGY3RGaXJGY3RGaXJGY3QtRmdyNipGaXJGaHRGaXNGYnVGY3RGZHNGXXVGXnQtRmdyNipGaXJGXXVGY3RGaXNGaXJGXXVGY3RGaXMtRmdyNipGaXJGYnVGXXVGaHRGY3RGXnRGaXNGZHMtRl5vNjNRIl1GJy9GYm9RKHBvc3RmaXhGJ0ZcckZmb0Zdci9GXHBRMnZlcnl0aGlubWF0aHNwYWNlRidGYHJGX3BGYXBGZHBGZ3BGaXBGW3FGXXFGX3FGYXFGY3E= A := MatrixVectorMultiply(F8,a) mod p; LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6LyUpY29tcG9zZWRHRjcvJSpjb252ZXJ0ZWRHRjcvJStpbXNlbGVjdGVkR0Y3LyUscGxhY2Vob2xkZXJHRjcvJTBmb250X3N0eWxlX25hbWVHUSoyRH5PdXRwdXRGJy8lKm1hdGhjb2xvckdGQy8lL21hdGhiYWNrZ3JvdW5kR0ZGLyUrZm9udGZhbWlseUdGMS8lLG1hdGh2YXJpYW50R1EnaXRhbGljRicvJSltYXRoc2l6ZUdGNC1JI21vR0YkNjNRIzo9RicvJSVmb3JtR1EmaW5maXhGJy8lJmZlbmNlR0Y3LyUqc2VwYXJhdG9yR0Y3LyUnbHNwYWNlR1EvdGhpY2ttYXRoc3BhY2VGJy8lJ3JzcGFjZUdGam8vJSlzdHJldGNoeUdGNy8lKnN5bW1ldHJpY0dGNy8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjcvJS5tb3ZhYmxlbGltaXRzR0Y3LyUnYWNjZW50R0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZXLyUlc2l6ZUdGNC8lK2ZvcmVncm91bmRHRkMvJStiYWNrZ3JvdW5kR0ZGLUYjNiUtRl5vNjNRIltGJy9GYm9RJ3ByZWZpeEYnL0Zlb0Y6RmZvL0Zpb1EudGhpbm1hdGhzcGFjZUYnL0ZccEZeci9GXnBGOkZfcEZhcEZkcEZncEZpcEZbcUZdcUZfcUZhcUZjcS1GIzYjLUknbXRhYmxlR0YkNiotSSRtdHJHRiQ2Iy1JJG10ZEdGJDYjLUkjbW5HRiQ2OVEiOEYnRi9GMkY1L0Y5RjdGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm4vRmluUSdub3JtYWxGJ0Zbby1GZ3I2Iy1GanI2Iy1GXXM2OVEiMEYnRi9GMkY1RmBzRjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmFzRltvRmNzRmNzRmNzRmNzRmNzRmNzLUZebzYzUSJdRicvRmJvUShwb3N0Zml4RidGXHJGZm9GXXIvRlxwUTJ2ZXJ5dGhpbm1hdGhzcGFjZUYnRmByRl9wRmFwRmRwRmdwRmlwRltxRl1xRl9xRmFxRmNx A := FFTmodp(N,a,w,p); LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6LyUpY29tcG9zZWRHRjcvJSpjb252ZXJ0ZWRHRjcvJStpbXNlbGVjdGVkR0Y3LyUscGxhY2Vob2xkZXJHRjcvJTBmb250X3N0eWxlX25hbWVHUSoyRH5PdXRwdXRGJy8lKm1hdGhjb2xvckdGQy8lL21hdGhiYWNrZ3JvdW5kR0ZGLyUrZm9udGZhbWlseUdGMS8lLG1hdGh2YXJpYW50R1EnaXRhbGljRicvJSltYXRoc2l6ZUdGNC1JI21vR0YkNjNRIzo9RicvJSVmb3JtR1EmaW5maXhGJy8lJmZlbmNlR0Y3LyUqc2VwYXJhdG9yR0Y3LyUnbHNwYWNlR1EvdGhpY2ttYXRoc3BhY2VGJy8lJ3JzcGFjZUdGam8vJSlzdHJldGNoeUdGNy8lKnN5bW1ldHJpY0dGNy8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjcvJS5tb3ZhYmxlbGltaXRzR0Y3LyUnYWNjZW50R0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZXLyUlc2l6ZUdGNC8lK2ZvcmVncm91bmRHRkMvJStiYWNrZ3JvdW5kR0ZGLUYjNiUtRl5vNjNRIltGJy9GYm9RJ3ByZWZpeEYnL0Zlb0Y6RmZvL0Zpb1EudGhpbm1hdGhzcGFjZUYnL0ZccEZeci9GXnBGOkZfcEZhcEZkcEZncEZpcEZbcUZdcUZfcUZhcUZjcS1GIzYjLUknbXRhYmxlR0YkNiotSSRtdHJHRiQ2Iy1JJG10ZEdGJDYjLUkjbW5HRiQ2OVEiOEYnRi9GMkY1L0Y5RjdGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm4vRmluUSdub3JtYWxGJ0Zbby1GZ3I2Iy1GanI2Iy1GXXM2OVEiMEYnRi9GMkY1RmBzRjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmFzRltvRmNzRmNzRmNzRmNzRmNzRmNzLUZebzYzUSJdRicvRmJvUShwb3N0Zml4RidGXHJGZm9GXXIvRlxwUTJ2ZXJ5dGhpbm1hdGhzcGFjZUYnRmByRl9wRmFwRmRwRmdwRmlwRltxRl1xRl9xRmFxRmNx Compute inverse DFT and inverse FFT. wp := 1/w mod p; NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN3cEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R0Y7LyUpY29tcG9zZWRHRjgvJSpjb252ZXJ0ZWRHRjgvJStpbXNlbGVjdGVkR0Y4LyUscGxhY2Vob2xkZXJHRjgvJTBmb250X3N0eWxlX25hbWVHUSoyRH5PdXRwdXRGKC8lKm1hdGhjb2xvckdGRC8lL21hdGhiYWNrZ3JvdW5kR0ZHLyUrZm9udGZhbWlseUdGMi8lLG1hdGh2YXJpYW50R1EnaXRhbGljRigvJSltYXRoc2l6ZUdGNS1JI21vR0YlNjNRIzo9RigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR0Y4LyUqc2VwYXJhdG9yR0Y4LyUnbHNwYWNlR1EvdGhpY2ttYXRoc3BhY2VGKC8lJ3JzcGFjZUdGW3AvJSlzdHJldGNoeUdGOC8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uYW1lR0ZYLyUlc2l6ZUdGNS8lK2ZvcmVncm91bmRHRkQvJStiYWNrZ3JvdW5kR0ZHLUkjbW5HRiU2OVEiMkYoRjBGM0Y2L0Y6RjhGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduL0ZqblEnbm9ybWFsRihGXG83Iy1fRilJLG1wcmludHNsYXNoR0YoNiQ3Iz5JI3dwR0YoIiIjNyNGZXI= w*wp mod p; NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIxRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZEdGNS8lKmNvbnZlcnRlZEdGNS8lK2ltc2VsZWN0ZWRHRjUvJSxwbGFjZWhvbGRlckdGNS8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYoLyUqbWF0aGNvbG9yR0ZALyUvbWF0aGJhY2tncm91bmRHRkMvJStmb250ZmFtaWx5R0YvLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGKC8lKW1hdGhzaXplR0YyNyMiIiI= F8inv := 1/8 * DFT(8,wp,p) mod p; LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEmRjhpbnZGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGOi8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR1EqMkR+T3V0cHV0RicvJSptYXRoY29sb3JHRkMvJS9tYXRoYmFja2dyb3VuZEdGRi8lK2ZvbnRmYW1pbHlHRjEvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLyUpbWF0aHNpemVHRjQtSSNtb0dGJDYzUSM6PUYnLyUlZm9ybUdRJmluZml4RicvJSZmZW5jZUdGNy8lKnNlcGFyYXRvckdGNy8lJ2xzcGFjZUdRL3RoaWNrbWF0aHNwYWNlRicvJSdyc3BhY2VHRmpvLyUpc3RyZXRjaHlHRjcvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZUdGVy8lJXNpemVHRjQvJStmb3JlZ3JvdW5kR0ZDLyUrYmFja2dyb3VuZEdGRi1GIzYlLUZebzYzUSJbRicvRmJvUSdwcmVmaXhGJy9GZW9GOkZmby9GaW9RLnRoaW5tYXRoc3BhY2VGJy9GXHBGXnIvRl5wRjpGX3BGYXBGZHBGZ3BGaXBGW3FGXXFGX3FGYXFGY3EtRiM2Iy1JJ210YWJsZUdGJDYqLUkkbXRyR0YkNiotSSRtdGRHRiQ2Iy1JI21uR0YkNjlRIzE1RidGL0YyRjUvRjlGN0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbi9GaW5RJ25vcm1hbEYnRltvRmlyRmlyRmlyRmlyRmlyRmlyRmlyLUZncjYqRmlyLUZqcjYjLUZdczY5USMxM0YnRi9GMkY1RmBzRjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmFzRltvLUZqcjYjLUZdczY5USI5RidGL0YyRjVGYHNGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYXNGW28tRmpyNiMtRl1zNjlGZnBGL0YyRjVGYHNGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYXNGW28tRmpyNiMtRl1zNjlRIjJGJ0YvRjJGNUZgc0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZhc0Zbby1GanI2Iy1GXXM2OVEiNEYnRi9GMkY1RmBzRjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmFzRltvLUZqcjYjLUZdczY5USI4RidGL0YyRjVGYHNGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYXNGW28tRmpyNiMtRl1zNjlRIzE2RidGL0YyRjVGYHNGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GYXNGW28tRmdyNipGaXJGanNGY3RGXXVGaXJGanNGY3RGXXUtRmdyNipGaXJGX3RGXXVGZXNGY3RGYnVGanNGaHQtRmdyNipGaXJGY3RGaXJGY3RGaXJGY3RGaXJGY3QtRmdyNipGaXJGaHRGanNGYnVGY3RGZXNGXXVGX3QtRmdyNipGaXJGXXVGY3RGanNGaXJGXXVGY3RGanMtRmdyNipGaXJGYnVGXXVGaHRGY3RGX3RGanNGZXMtRl5vNjNRIl1GJy9GYm9RKHBvc3RmaXhGJ0ZcckZmb0Zdci9GXHBRMnZlcnl0aGlubWF0aHNwYWNlRidGYHJGX3BGYXBGZHBGZ3BGaXBGW3FGXXFGX3FGYXFGY3E= MatrixMatrixMultiply(F8,F8inv) mod p; LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYnLyUlc2l6ZUdRIzEyRicvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLUYjNiMtSSdtdGFibGVHRiQ2Ki1JJG10ckdGJDYqLUkkbXRkR0YkNiMtSSNtbkdGJDY5RkYvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lJXNpemVHRlIvJSVib2xkR0Y3LyUnaXRhbGljR0Y3LyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR0ZVLyUrYmFja2dyb3VuZEdGWC8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGNC8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZPLyUqbWF0aGNvbG9yR0ZVLyUvbWF0aGJhY2tncm91bmRHRlgvJStmb250ZmFtaWx5R0Zjby8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRicvJSltYXRoc2l6ZUdGUi1GXG82Iy1GX282OVEiMEYnRmFvRmRvRmZvRmhvRmpvRlxwRl5wRmBwRmJwRmRwRmZwRmhwRmpwRlxxRl5xRmBxRmJxRmRxRmZxRmhxRmpxRl1yRl9yRl9yRl9yRl9yRl9yRl9yLUZpbjYqRl9yRltvRl9yRl9yRl9yRl9yRl9yRl9yLUZpbjYqRl9yRl9yRltvRl9yRl9yRl9yRl9yRl9yLUZpbjYqRl9yRl9yRl9yRltvRl9yRl9yRl9yRl9yLUZpbjYqRl9yRl9yRl9yRl9yRltvRl9yRl9yRl9yLUZpbjYqRl9yRl9yRl9yRl9yRl9yRltvRl9yRl9yLUZpbjYqRl9yRl9yRl9yRl9yRl9yRl9yRltvRl9yLUZpbjYqRl9yRl9yRl9yRl9yRl9yRl9yRl9yRltvLUYsNjNRIl1GJy9GMFEocG9zdGZpeEYnRjJGNUY4L0Y8UTJ2ZXJ5dGhpbm1hdGhzcGFjZUYnRj1GP0ZBRkRGR0ZJRktGTUZQRlNGVg== When multipling A = F8*a by F8inv, we should get a back. I.E. F8inv * A = F8inv * F8 * a = a. Test this directly and then by using the FFT. MatrixVectorMultiply(F8inv,A) mod p; LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYnLyUlc2l6ZUdRIzEyRicvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLUYjNiMtSSdtdGFibGVHRiQ2Ki1JJG10ckdGJDYjLUkkbXRkR0YkNiMtSSNtbkdGJDY5RkYvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lJXNpemVHRlIvJSVib2xkR0Y3LyUnaXRhbGljR0Y3LyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR0ZVLyUrYmFja2dyb3VuZEdGWC8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGNC8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZPLyUqbWF0aGNvbG9yR0ZVLyUvbWF0aGJhY2tncm91bmRHRlgvJStmb250ZmFtaWx5R0Zjby8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRicvJSltYXRoc2l6ZUdGUkZobkZobkZobkZobkZobkZobkZobi1GLDYzUSJdRicvRjBRKHBvc3RmaXhGJ0YyRjVGOC9GPFEydmVyeXRoaW5tYXRoc3BhY2VGJ0Y9Rj9GQUZERkdGSUZLRk1GUEZTRlY= (1/N)*FFTmodp(N,A,wp,p) mod p; LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYnLyUlc2l6ZUdRIzEyRicvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLUYjNiMtSSdtdGFibGVHRiQ2Ki1JJG10ckdGJDYjLUkkbXRkR0YkNiMtSSNtbkdGJDY5RkYvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lJXNpemVHRlIvJSVib2xkR0Y3LyUnaXRhbGljR0Y3LyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR0ZVLyUrYmFja2dyb3VuZEdGWC8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGNC8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR0ZPLyUqbWF0aGNvbG9yR0ZVLyUvbWF0aGJhY2tncm91bmRHRlgvJStmb250ZmFtaWx5R0Zjby8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRicvJSltYXRoc2l6ZUdGUkZobkZobkZobkZobkZobkZobkZobi1GLDYzUSJdRicvRjBRKHBvc3RmaXhGJ0YyRjVGOC9GPFEydmVyeXRoaW5tYXRoc3BhY2VGJ0Y9Rj9GQUZERkdGSUZLRk1GUEZTRlY=
<Text-field style="Heading 1" layout="Heading 1">Question 1 (Integer to Polynomial conversion) 20 points</Text-field> Write a Maple procedure that takes as input an integer A,a radix b, and a name x and returns the polynomial whose coefficients are the digits in the base b representation of A. I.E. If LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGNy8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR1EoMkR+TWF0aEYnLyUqbWF0aGNvbG9yR0ZDLyUvbWF0aGJhY2tncm91bmRHRkYvJStmb250ZmFtaWx5R0YxLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy8lKW1hdGhzaXplR0Y0LUkjbW9HRiQ2M1ExJkludmlzaWJsZVRpbWVzO0YnLyUlZm9ybUdRJmluZml4RicvJSZmZW5jZUdGNy8lKnNlcGFyYXRvckdGNy8lJ2xzcGFjZUdRL3RoaWNrbWF0aHNwYWNlRicvJSdyc3BhY2VHRmpvLyUpc3RyZXRjaHlHRjcvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZUdGVy8lJXNpemVHRjQvJStmb3JlZ3JvdW5kR0ZDLyUrYmFja2dyb3VuZEdGRi1GXm82M1EiPUYnRmFvRmRvRmZvRmhvRltwRl1wRl9wRmFwRmRwRmdwRmlwRltxRl1xRl9xRmFxRmNxLUZebzYzRmBvRmFvRmRvL0Znb0Y6L0Zpb1EkMGVtRicvRlxwUTN2ZXJ5dGhpY2ttYXRoc3BhY2VGJ0ZdcEZfcEZhcEZkcEZncEZpcEZbcUZdcUZfcUZhcUZjcS1GIzYpLUYsNjlRIUYnRi9GMkY1RjhGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GaG5GW28tSSttdW5kZXJvdmVyR0YkNictRl5vNjNRJiZTdW07RicvRmJvUSdwcmVmaXhGJ0Zkb0Zmb0Zbci9GXHBRLnRoaW5tYXRoc3BhY2VGJy9GXnBGOkZfcEZhcEZkcC9GaHBGOi9GanBGOkZbcUZdcUZfcUZhcUZjcS1GIzYnRmFyLUYsNjlRImlGJ0YvRjJGNUY4RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmhuRltvRmVxLUkjbW5HRiQ2OVEiMEYnRi9GMkY1L0Y5RjdGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm4vRmluUSdub3JtYWxGJ0Zbb0Zhci1GLDY5USJuRidGLy9GM1EjMTBGJ0Y1RjhGO0Y9Rj8vRkJRLFsyMDAsMCwyMDBdRidGREZHRklGS0ZNRk9GUS9GVEY6RlUvRllGY3RGWkZmbkZobi9GXG9GYXRGW3EvJSxhY2NlbnR1bmRlckdGN0Zhci1JJW1zdWJHRiQ2Ji1GLDY5USJhRidGL0YyRjVGOEY7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZobkZbb0Zjcy8lL3N1YnNjcmlwdHNoaWZ0R1EiMEYnLyUscGxhY2Vob2xkZXJHRjctRl5vNjNRJyZzZG90O0YnRmFvRmRvRmpxRltyRl1yRl1wRl9wRmFwRmRwRmdwRmlwRltxRl1xRl9xRmFxRmNxLUklbXN1cEdGJDYlLUYsNjlRImJGJ0YvRjJGNUY4RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmhuRltvRmNzLyUxc3VwZXJzY3JpcHRzaGlmdEdGYXVGYXItRl5vNjNRIixGJ0Zhb0Zkb0ZqcUZbckZdckZdcEZfcEZhcEZkcEZncEZpcEZbcUZdcUZfcUZhcUZjcUZocQ==then the polynomial LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2OVEiYUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGNy8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR1EoMkR+TWF0aEYnLyUqbWF0aGNvbG9yR0ZDLyUvbWF0aGJhY2tncm91bmRHRkYvJStmb250ZmFtaWx5R0YxLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy8lKW1hdGhzaXplR0Y0LUkjbW9HRiQ2M1ExJkludmlzaWJsZVRpbWVzO0YnLyUlZm9ybUdRJmluZml4RicvJSZmZW5jZUdGNy8lKnNlcGFyYXRvckdGNy8lJ2xzcGFjZUdRL3RoaWNrbWF0aHNwYWNlRicvJSdyc3BhY2VHRmpvLyUpc3RyZXRjaHlHRjcvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZUdGVy8lJXNpemVHRjQvJStmb3JlZ3JvdW5kR0ZDLyUrYmFja2dyb3VuZEdGRi1GXm82M1EiPUYnRmFvRmRvRmZvRmhvRltwRl1wRl9wRmFwRmRwRmdwRmlwRltxRl1xRl9xRmFxRmNxRl1vLUYjNiktRiw2OVEhRidGL0YyRjVGOEY7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZobkZbby1JK211bmRlcm92ZXJHRiQ2Jy1GXm82M1EmJlN1bTtGJy9GYm9RJ3ByZWZpeEYnRmRvRmZvL0Zpb1EkMGVtRicvRlxwUS50aGlubWF0aHNwYWNlRicvRl5wRjpGX3BGYXBGZHAvRmhwRjovRmpwRjpGW3FGXXFGX3FGYXFGY3EtRiM2J0ZqcS1GLDY5USJpRidGLy9GM1EjMTBGJ0Y1RjhGO0Y9Rj8vRkJRLFsyMDAsMCwyMDBdRidGREZHRklGS0ZNRk9GUS9GVEY6RlUvRllGZHNGWkZmbkZobi9GXG9GYnNGZXEtSSNtbkdGJDY5USIwRidGL0YyRjUvRjlGN0Y7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbi9GaW5RJ25vcm1hbEYnRltvRmpxLUYsNjlRIm5GJ0YvRmFzRjVGOEY7Rj1GP0Zjc0ZERkdGSUZLRk1GT0ZRRmVzRlVGZnNGWkZmbkZobkZnc0ZbcS8lLGFjY2VudHVuZGVyR0Y3RmpxLUklbXN1YkdGJDYmRistRiw2OUZgc0YvRjJGNUY4RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmhuRltvLyUvc3Vic2NyaXB0c2hpZnRHUSIwRicvJSxwbGFjZWhvbGRlckdGNy1GXm82M1EnJnNkb3Q7RidGYW9GZG9GZm9GaG9GW3BGXXBGX3BGYXBGZHBGZ3BGaXBGW3FGXXFGX3FGYXFGY3EtSSVtc3VwR0YkNiUtRiw2OVEieEYnRi9GMkY1RjhGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GaG5GW29GZ3QvJTFzdXBlcnNjcmlwdHNoaWZ0R0ZbdUZqcUZqcQ==LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbW9HRiQ2M1ExJkludmlzaWJsZVRpbWVzO0YnLyUlZm9ybUdRJmluZml4RicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRjQvJSdsc3BhY2VHUS90aGlja21hdGhzcGFjZUYnLyUncnNwYWNlR0Y5LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjQvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y0LyUubW92YWJsZWxpbWl0c0dGNC8lJ2FjY2VudEdGNC8lMGZvbnRfc3R5bGVfbmFtZUdRKDJEfk1hdGhGJy8lJXNpemVHUSMxMkYnLyUrZm9yZWdyb3VuZEdRKFswLDAsMF1GJy8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRic=is returned. Verify that a(b) = A for some sample integers.
<Text-field style="Heading 1" layout="Heading 1">Question 2 (Fast modular polynomial multiplication) 30 points</Text-field> Write a Maple procedure that uses the FFT to multiply two polynomials LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2OVEiYUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGNy8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR1EoMkR+TWF0aEYnLyUqbWF0aGNvbG9yR0ZDLyUvbWF0aGJhY2tncm91bmRHRkYvJStmb250ZmFtaWx5R0YxLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy8lKW1hdGhzaXplR0Y0LUkjbW9HRiQ2M1ExJkludmlzaWJsZVRpbWVzO0YnLyUlZm9ybUdRJmluZml4RicvJSZmZW5jZUdGNy8lKnNlcGFyYXRvckdGNy8lJ2xzcGFjZUdRL3RoaWNrbWF0aHNwYWNlRicvJSdyc3BhY2VHRmpvLyUpc3RyZXRjaHlHRjcvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZUdGVy8lJXNpemVHRjQvJStmb3JlZ3JvdW5kR0ZDLyUrYmFja2dyb3VuZEdGRi1GXm82M1EiPUYnRmFvRmRvRmZvRmhvRltwRl1wRl9wRmFwRmRwRmdwRmlwRltxRl1xRl9xRmFxRmNxLUZebzYzRmBvL0Zib1EhRidGZG9GZm8vRmlvUSQwZW1GJy9GXHBGXXJGXXBGX3BGYXBGZHBGZ3BGaXBGW3FGXXFGX3FGYXFGY3EtRiM2KS1GLDY5RltyRi9GMkY1RjhGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GaG5GW28tSSttdW5kZXJvdmVyR0YkNictRl5vNjNRJiZTdW07RicvRmJvUSdwcmVmaXhGJ0Zkb0Zmb0Zcci9GXHBRLnRoaW5tYXRoc3BhY2VGJy9GXnBGOkZfcEZhcEZkcC9GaHBGOi9GanBGOkZbcUZdcUZfcUZhcUZjcS1GIzYnRmFyLUYsNjlRImlGJ0YvL0YzUSMxMEYnRjVGOEY7Rj1GPy9GQlEsWzIwMCwwLDIwMF1GJ0ZERkdGSUZLRk1GT0ZRL0ZURjpGVS9GWUZoc0ZaRmZuRmhuL0Zcb0Zmc0ZlcS1JI21uR0YkNjlRIjBGJ0YvRjJGNS9GOUY3RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuL0ZpblEnbm9ybWFsRidGW29GYXItRiw2OVEibUYnRi9GMkY1RjhGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GaG5GW29GW3EvJSxhY2NlbnR1bmRlckdGN0Zhci1JJW1zdWJHRiQ2JkYrLUYsNjlGZHNGL0YyRjVGOEY7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZobkZbby8lL3N1YnNjcmlwdHNoaWZ0R1EiMEYnLyUscGxhY2Vob2xkZXJHRjctRl5vNjNRJyZzZG90O0YnRmpxRmRvRmZvRlxyRl5yRl1wRl9wRmFwRmRwRmdwRmlwRltxRl1xRl9xRmFxRmNxLUklbXN1cEdGJDYlLUYsNjlRInhGJ0YvRjJGNUY4RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmhuRltvRlt1LyUxc3VwZXJzY3JpcHRzaGlmdEdGX3VGYXJGYXI= and b =