JISX0512を参考にエラーコードの作成を使用としています。
C言語での作成方法は乗っていたのですが(後述)現在使用できるエディタがProcessingなのでそれで使えるように書き換えようとしています。
しかし、想定していた挙動がなされないため質問させていただきました。
JISX0512
https://www.kikakurui.com/x0/X0512-2015-01.html
(別紙Eに載っているコード。これをProcessingで再現したい)
C
1/* "prod(x, y, log, alog, gf)" returns the product "x" times "y" */ 2int prod(int x, int y, int *log, int *alog, int gf) { 3 if (!x || !y) return 0; 4 else return alog[(log[x] + log[y]) % (gf-1)]; 5} 6/* "ReedSolomon(wd, nd, nc, gf.pp)" takes "nd" data codeword values in wd[] */ 7/* and adds on "nc" check codewords, all within GF(gf) where "gf" is a */ 8/* power of 2 and "pp" is the value of its prime modulus polynomial */ 9void ReedSolomon(int *wd, int nd, int nc, int gf, int pp) { 10 int i, j, k, *log,*alog,*c; 11/* allocate, then generate the log & antilog arrays: */ 12 log = malloc(sizeof(int) * gf); 13 alog = malloc(sizeof(int) * gf); 14 15 log[0] = 1-gf; alog[0] = 1; 16 for (i = 1; i < gf; i++) { 17 alog[i] = alog[i-1] * 2; 18 if (alog[i] >= gf) alog[i] ^= pp; 19 log[alog[i]] = i; 20 } 21/* allocate, then generate the generator polynomial coefficients: */ 22 c = malloc(sizeof(int) * (nc+1)); 23 for (i=1; i<=nc; i++) c[i] = 0; c[0] = 1; 24 for (i=1; i<=nc; i++) { 25 c[i] = c[i-1]; 26 for (j=i-1; j>=1; j--) { 27 c[j] = c[j-1] ^ prod(c[j],alog[i],log,alog,gf); 28 } 29 c[0] = prod(c[0],alog[i],log,alog,gf); 30 } 31 /* clear, then generate "nc" checkwords in the array wd[] : */ 32 for (i=nd; i<=(nd+nc); i++) wd[i] = 0; 33 for (i=0; i<nd; i++) { 34 k = wd[nd] ^ wd[i] ; 35 for (j=0; j<nc; j++) { 36 wd[nd+j] = wd[nd+j+l] ^ prod(k,c[nc-j-1],log, alog,gf); 37 } 38 } 39 free(c); 40 free(alog); 41 free(log); 42} 43
webでRuntimeErrorが出たもの
ideoneというサイトで回しました
C
1#include <stdio.h> 2#include <stdlib.h> 3 4int prod(int x,int y,int *log,int *alog,int gf){ 5 if(!x || !y) 6 return 0; 7 else 8 return alog[(log[x] + log[y]) %(gf-1)]; 9} 10 11void ReedSolomon(int *wd, int nd, int nc, int gf, int pp) { 12 int i,j,k,*log,*alog,*c; 13 log = malloc(sizeof(int) * gf); 14 alog = malloc(sizeof(int) * gf); 15 log[0] = 1-gf; alog[0] = 1; 16 for (i = 1; i < gf; i++) { 17 alog[i] = alog[i-1] * 2; 18 if (alog[i] >= gf) alog[i] ^= pp; 19 log[alog[i]] = i; 20 } 21 c = malloc(sizeof(int) * (nc+1)); 22 23 for (i=1; i<=nc; i++) c[i] = 0; 24 c[0] = 1; 25 for (i=1; i<=nc; i++) { 26 c[i] = c[i-1]; 27 for (j=i-1; j>=1; j--) { 28 c[j] = c[j-1] ^ prod(c[j],alog[i],log,alog,gf); 29 } 30 c[0] = prod(c[0],alog[i],log,alog,gf); 31 } 32 for (i=nd; i<=(nd+nc); i++) { 33 wd[i] = 0; 34 } 35 for (i=0; i<nd; i++) { 36 k = wd[nd] ^ wd[i]; 37 for (j=0; j<nc; j++) { 38 wd[nd+j] = wd[nd+j+1] ^ prod(k,c[nc-j-1],log, alog,gf); 39 } 40 } 41 free(c); 42 free(alog); 43 free(log); 44} 45int main() 46{ 47 printf("Hello, World!\n"); 48 int wd[3] = {142,164,186}; 49 ReedSolomon(wd,3,5,28,301); 50 return 0; 51}
//追記
gfを28としていますが調べてみたところガロア体なのでGF(2^8=256)ではないかと考えています。
processing用に書き換えたもの
processing
1void draw(){ 2 int[] inst = {142,164,186}; 3 ReedSolomon(inst,3,5,28,301); 4} 5 6IntDict logDic = new IntDict(); 7IntDict alogDic = new IntDict(); 8 9int prod(int x, int y, IntDict log, IntDict alog, int gf) { 10 if (x == 0 || y == 0) { 11 return 0; 12 } else { 13 return alogDic.get( str( ( logDic.get(str(x)) + logDic.get(str(y)) )%(gf-1))); 14 } 15} 16 17void ReedSolomon(int[] wd, int nd, int nc, int gf, int pp) { 18 int k; 19 logDic.set(str(0), 1-gf); 20 alogDic.set(str(0), 1); 21 22 for (int i = 1; i < gf; i++) { 23 alogDic.set(str(i), alogDic.get(str(i-1))*2); 24 if (alogDic.get(str(i)) >=gf) 25 alogDic.set(str(i), alogDic.get(str(i))^pp); 26 //logDic.set( str(i), ( alogDic.get( str(i) ) ) ); 27 logDic.set( str ( alogDic.get( str(i) )) ,(i) ); 28 } 29 30 int[] c = new int[nc + 1]; 31 for (int i = 1; i <= nc; i++) { 32 c[i] = 0; 33 } 34 c[0] = 1; 35 println("c"); 36 for (int i = 1; i <= nc; i++) { 37 c[i]=c[i-1]; 38 for (int j = i-1; j >= 1; j--) { 39 c[j] = c[j-1]^prod(c[j], alogDic.get(str(i)), logDic, alogDic, gf); 40 //このprod()で該当するx,yが存在しないとエラーが出る 41 } 42 c[0] = prod(c[0], alogDic.get(str(i)), logDic, alogDic, gf); 43 } 44 45 int[] wd2 = new int[nd + nc+1]; 46 for (int i = 0; i < nd; i++) { 47 wd2[i] = wd[i]; 48 } 49 for (int i=nd; i <= (nd+nc); i++) { 50 wd2[i] = 0; 51 } 52 for (int i=0; i < nd; i++) { 53 k = wd2[nd] ^ wd2[i] ; 54 for (int j=0; j < nc; j++) { 55 wd2[nd+j] = wd2[nd+j+1] ^ prod(k, c[nc-j-1], logDic, alogDic, gf); 56 } 57 } 58} 59//wd2の中に142,164,186,114,25,5,88,102が入ってほしい
ーーー
現在起こっていること
Processingでは配列の動的確保の方法が異なるためDictionaryを利用。
配列の追加についても別の配列を新しく作成して代用
書き換えはおそらくできたが情報が足りないということでエラーが発生する。
No key named '823'
変数logに該当する値がないとのこと。
ちなみにそもそもCのほうがあっているかどうか試してみようと思いWebのほうではありますが試したところRuntimeErrorというのが出て検証できませんでした。
足りない情報等あれば指摘していただけると助かります。
回答2件
あなたの回答
tips
プレビュー