00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdio.h>
00022 #include <stdlib.h>
00023
00024 #include "gf.h"
00025
00026 #define MAX_EXT_DEG 16//this is our primary consideration....think about changing!?
00027
00028 static unsigned prim_poly[MAX_EXT_DEG + 1] = {
00029 01,
00030 03,
00031 07,
00032 013,
00033 023,
00034 045,
00035 0103,
00036 0203,
00037 0435,
00038 01041,
00039 02011,
00040 04005,
00041 010123,
00042 020033,
00043 042103,
00044 0100003,
00045 0210013
00046
00047 };
00048
00049
00051
00052
00053
00054 void gf_init_exp() {
00055 int i;
00056
00057 gf_exp = (gf_t *) malloc((1 << gf_extd()) * sizeof (gf_t));
00058
00059 gf_exp[0] = 1;
00060 for (i = 1; i < gf_ord(); ++i) {
00061 gf_exp[i] = gf_exp[i - 1] << 1;
00062 if (gf_exp[i - 1] & (1 << (gf_extd()-1)))
00063 gf_exp[i] ^= prim_poly[gf_extd()];
00064 }
00065
00066 gf_exp[gf_ord()] = 1;
00067 }
00068
00069
00070 void gf_init_log()
00071 {
00072 int i;
00073
00074 gf_log = (gf_t *) malloc((1 << gf_extd()) * sizeof (gf_t));
00075
00076 gf_log[0] = gf_ord();
00077 for (i = 0; i < gf_ord() ; ++i)
00078 gf_log[gf_exp[i]] = i;
00079 }
00080
00081 int init_done = 0;
00082
00083 int gf_init(int extdeg)
00084 {
00085 if (extdeg > MAX_EXT_DEG) {
00086 fprintf(stderr,"Extension degree %d not implemented !\n", extdeg);
00087 exit(0);
00088 }
00089 if (init_done != extdeg) {
00090 if (init_done) {
00091 free(gf_exp);
00092 free(gf_log);
00093 }
00094 init_done = gf_extension_degree = extdeg;
00095 gf_cardinality = 1 << extdeg;
00096 gf_multiplicative_order = gf_cardinality - 1;
00097 gf_init_exp();
00098 gf_init_log();
00099 }
00100
00101 return 1;
00102 }
00103
00104
00105 gf_t gf_pow(gf_t x, int i) {
00106 if (i == 0)
00107 return 1;
00108 else if (x == 0)
00109 return 0;
00110 else {
00111
00112 while (i >> gf_extd())
00113 i = (i & (gf_ord())) + (i >> gf_extd());
00114 i *= gf_log[x];
00115 while (i >> gf_extd())
00116 i = (i & (gf_ord())) + (i >> gf_extd());
00117 return gf_exp[i];
00118 }
00119 }
00120
00121
00122 gf_t gf_rand(int (*u8rnd)()) {
00123 return (u8rnd() ^ (u8rnd() << 8)) & gf_ord();
00124 }