Difference between revisions of "ApCoCoALib:RingF16"
m (New page: {{stub}} ==about== ApCoCoA will soon contain an implementation of the field <math>\mathbb{F}_16</math> The field is constructed via <math>\mathbb{F}_16 = \mathbb{F}[u]/(x^4 + x^3 + 1)</m...) |
(updated / rewritten.) |
||
(15 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | + | ==User documentation for files RingF16.C and RingF16.H== | |
− | + | These files contain an implementation of the field with 16 elements. | |
− | + | The fields representation is ((Z/(2))[x])/(x^4 + x^3 +1). | |
− | The | ||
− | |||
− | + | Internally, the fields elements are stored as numbers | |
− | + | (unsigned char's, to be specific). These numbers, interpreted as bit-streams, | |
− | + | correspond to the univariate polynomial's sequence of coefficients. For example | |
− | + | 11 = 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 <-> (1011) | |
− | x^ | + | <-> 1*x^3 + 0*x^2 + 1*x^1 + 1*x^0 = x^3 + x + 1 |
+ | So the field element x^3 + x + 1 is internally stored as '11'. | ||
− | + | An instance of RingF16 can be created via | |
− | |||
− | |||
− | |||
− | + | CoCoA::ring R = ApCoCoA::AlgebraicCore::NewRingF16(); | |
− | [[ | + | To see if a given CoCoA::ring R is an instance of RingF16 you can check |
+ | |||
+ | bool b = ApCoCoa::AlgebraicCore::IsRingF16(R); | ||
+ | |||
+ | Furthermore, any instance of RingF16 can be used like any other ring in CoCoA. | ||
+ | To create an element proceed as follows: | ||
+ | |||
+ | CoCoA::ring R = ApCoCoA::AlgebraicCore::NewRingF16(); | ||
+ | CoCoA::RingElem e(r,11); | ||
+ | |||
+ | and e represents the ring element 'x^3+x+1' or equivalently '11'. | ||
+ | A warning: adding the element '3' to the element '2' does NOT lead to the | ||
+ | element '5', since '3' <-> 'x+1', '2' <-> 'x' and (x+1) + (x) = 1 <-> '1'. | ||
+ | Some more details on how elements can be stored and retrieved from this ring | ||
+ | can be found in the example ex-RingF16.C in ApCoCoALib's example directory. | ||
+ | |||
+ | ==Maintainer documentation for files RingF16.C and RingF16.H== | ||
+ | |||
+ | Currently, this fields uses 'semi-logarithmic' multiplication and division | ||
+ | matrixes. This means both matrices are of size 4 times 16. | ||
+ | |||
+ | To multiply a and b, we split a into its exponents (a_0, ... a_3) and | ||
+ | XOR the elements {m_(i,b) | i=0,..3, a_i =1 } of the multiplication matrix. | ||
+ | |||
+ | To divide a through b, we again split a like above and XOR the elements | ||
+ | {d_(i,b) | i=0,..3, a_i =1 } of the division matrix. | ||
+ | |||
+ | Other options would be the usage of a logarithmic matrices or two 'full' | ||
+ | 16 times 16 matrices. So we have to make a decision between XOR operations | ||
+ | and memory usage. Which of this versions is optimal has to be checked | ||
+ | for different problem settings. Since a 4 times 16 matrix of unsigned chars | ||
+ | is rather small, here do not occur any paging conflicts, but eventually | ||
+ | a 16 times 16 matrix could be more efficient. | ||
+ | |||
+ | ==Bugs, Shortcomings and other ideas== | ||
+ | |||
+ | The current implementation does not support a lot of intractability with | ||
+ | other rings. A set of Ringhomomorphisms could be implemented to allow a more | ||
+ | easy switch between other representations of F_16 or to map elements in Z[x] | ||
+ | or Z/(2)[x] into F_16. | ||
+ | |||
+ | Also isomorphisms between different representations of F_16 could be | ||
+ | implemented. Any irreducible polynomial of degree 4 in Z/(2)[x] can be used | ||
+ | to create a representation of F_16. Based in the galois group of F_16 and the | ||
+ | irreducible polynomial's roots in F_16 an isomorphism can be described, mapping | ||
+ | one representation to another. This might be handy, if a special modulus is | ||
+ | given for a computation which is not the one, used for this implementations | ||
+ | multiplication / division matrices. | ||
+ | |||
+ | ==References== | ||
+ | |||
+ | [[http://apcocoa.org/wiki/ApCoCoA:Representation_of_finite_fields http://apcocoa.org/wiki/ApCoCoA:Representation_of_finite_fields]] - more | ||
+ | information on the representation of finite fields.. | ||
+ | |||
+ | [[http://apcocoa.org/wiki/HowTo:Construct_fields http://apcocoa.org/wiki/HowTo:Construct_fields]] - a description, how the | ||
+ | multiplication / division matrices were constructed, including the needed | ||
+ | source-code / tools. | ||
+ | |||
+ | |||
+ | [[Category:ApCoCoALib_Manual]] | ||
+ | __NOTOC__ |
Latest revision as of 17:14, 6 March 2008
User documentation for files RingF16.C and RingF16.H
These files contain an implementation of the field with 16 elements. The fields representation is ((Z/(2))[x])/(x^4 + x^3 +1).
Internally, the fields elements are stored as numbers (unsigned char's, to be specific). These numbers, interpreted as bit-streams, correspond to the univariate polynomial's sequence of coefficients. For example
11 = 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 <-> (1011) <-> 1*x^3 + 0*x^2 + 1*x^1 + 1*x^0 = x^3 + x + 1
So the field element x^3 + x + 1 is internally stored as '11'.
An instance of RingF16 can be created via
CoCoA::ring R = ApCoCoA::AlgebraicCore::NewRingF16();
To see if a given CoCoA::ring R is an instance of RingF16 you can check
bool b = ApCoCoa::AlgebraicCore::IsRingF16(R);
Furthermore, any instance of RingF16 can be used like any other ring in CoCoA. To create an element proceed as follows:
CoCoA::ring R = ApCoCoA::AlgebraicCore::NewRingF16(); CoCoA::RingElem e(r,11);
and e represents the ring element 'x^3+x+1' or equivalently '11'. A warning: adding the element '3' to the element '2' does NOT lead to the element '5', since '3' <-> 'x+1', '2' <-> 'x' and (x+1) + (x) = 1 <-> '1'. Some more details on how elements can be stored and retrieved from this ring can be found in the example ex-RingF16.C in ApCoCoALib's example directory.
Maintainer documentation for files RingF16.C and RingF16.H
Currently, this fields uses 'semi-logarithmic' multiplication and division matrixes. This means both matrices are of size 4 times 16.
To multiply a and b, we split a into its exponents (a_0, ... a_3) and XOR the elements {m_(i,b) | i=0,..3, a_i =1 } of the multiplication matrix.
To divide a through b, we again split a like above and XOR the elements {d_(i,b) | i=0,..3, a_i =1 } of the division matrix.
Other options would be the usage of a logarithmic matrices or two 'full' 16 times 16 matrices. So we have to make a decision between XOR operations and memory usage. Which of this versions is optimal has to be checked for different problem settings. Since a 4 times 16 matrix of unsigned chars is rather small, here do not occur any paging conflicts, but eventually a 16 times 16 matrix could be more efficient.
Bugs, Shortcomings and other ideas
The current implementation does not support a lot of intractability with other rings. A set of Ringhomomorphisms could be implemented to allow a more easy switch between other representations of F_16 or to map elements in Z[x] or Z/(2)[x] into F_16.
Also isomorphisms between different representations of F_16 could be implemented. Any irreducible polynomial of degree 4 in Z/(2)[x] can be used to create a representation of F_16. Based in the galois group of F_16 and the irreducible polynomial's roots in F_16 an isomorphism can be described, mapping one representation to another. This might be handy, if a special modulus is given for a computation which is not the one, used for this implementations multiplication / division matrices.
References
[http://apcocoa.org/wiki/ApCoCoA:Representation_of_finite_fields] - more information on the representation of finite fields..
[http://apcocoa.org/wiki/HowTo:Construct_fields] - a description, how the multiplication / division matrices were constructed, including the needed source-code / tools.