📄 gfmul.c
字号:
/* ============================================================================ * Syntax: c = gfmul(a, b, p) * GFMUL Element-by-element multiply in GF(P) or GF(P^M). * C = BFMUL(A, B) multiplies A with B in GF(2) element-by-element. A and * B are scalar or vectors in GF(2). * * C = BFMUL(A, B, P) multiplies A with B in GF(P) element-by-element * when P is a prime number. In this case, A and B are scalars or vectors * in GF(P). When P is a matrix that contains the list of all tuple * elements in GF(p^M), this function multiplies A with B in GF(P^M). The * output C is alpha^C = alpha^A * alpha^B in GF(Q^M). In this case A and * B are scalars or vectors in GF(p^M). You can generate the tuple of all * elements in GF(Q^M) by P = GFTUPLE([-1:Q^M-2]', M, Q). * * The element in GF(p^M) is represented by power form. * [-Inf, 0, 1, 2,...] represents [0, 1, alpha, alpha^2,...] in GF(p^m). * * See also GFADD, GFDIV, GFTUPLE. * * ============================================================================ * Original designed by Wes Wang, * Jun Wu, The Mathworks, Inc. * Dec-12, 1995 * * Copyright (c) 1995-96 by The MAthWorks, Inc. * All Rights Reserved * $Revision: 1.1 $ $Date: 1996/04/01 18:14:31 $ * ========================================================================== */#include <math.h>#include "mex.h"#include "gflib.c"void mexFunction(int nlhs, Matrix *plhs[], int nrhs, Matrix *prhs[]){ int i, j, row, col, mat_flag; int ma, na, mb, nb, np, mp, nc, len_a, len_b; int *paa, *pbb, *pcc, *pp, *Iwork; double *pa, *pb, *p, *pc; if ( nrhs < 2 ){ mexErrMsgTxt("Not enough input for GFMUL!"); }else if ( nrhs == 2 ){ np = 1; mp = 1; }else if ( nrhs > 2 ){ p = mxGetPr(prhs[2]); np= mxGetM(prhs[2]); mp= mxGetN(prhs[2]); } /* get input arguments */ pa = mxGetPr(prhs[0]); pb = mxGetPr(prhs[1]); ma = mxGetM(prhs[0]); na = mxGetN(prhs[0]); mb = mxGetM(prhs[1]); nb = mxGetN(prhs[1]); len_a = ma*na; len_b = mb*nb; if( ma != 1 ){ if( na != 1 ){ if( ma != mb && na != nb) mexErrMsgTxt("The input matrix of GFMUL in GF() must be exactly matched!"); else mat_flag = 1; }else{ mat_flag = 0; } }else{ mat_flag = 0; } if( mb != 1 ){ if( nb != 1 ){ if( mb != ma && nb != na) mexErrMsgTxt("The input matrix of GFMUL in GF() must be exactly matched!"); else mat_flag = 1; }else{ mat_flag = 0; } }else{ mat_flag = 0; } /* the calculation lenth is max(len_a, len_b) */ if ( mat_flag == 0 ){ if (len_a >= len_b) nc = len_a; else nc = len_b; } else { row = ma; col = na; nc = row*col; } /* variable type conversion for calling functions in gflib.c */ paa = (int *)mxCalloc(len_a, sizeof(int)); pbb = (int *)mxCalloc(len_b, sizeof(int)); if ( mat_flag == 0 ){ for (i=0; i < len_a; i++) paa[i] = (int) pa[i]; for (i=0; i < len_b; i++) pbb[i] = (int) pb[i]; } else { for ( i=0; i < row; i++){ for ( j=0; j < col; j++){ paa[i+j*row] = (int)pa[i+j*row]; pbb[i+j*row] = (int)pb[i+j*row]; } } } pp = (int *)mxCalloc(np*mp, sizeof(int)); if ( nrhs > 2 ){ for (i=0; i < np*mp; i++) pp[i] = (int)p[i]; }else{ pp[0] = 2; } /* computation */ if(np <=1){ for (i=0; i < len_a; i++){ if (pa[i] < 0 || pa[i] != floor(pa[i]) || pa[i] >= pp[0]) mexErrMsgTxt("The polynomial coeficients must be in GF(P)"); } for (i=0; i < len_b; i++){ if (pb[i] < 0 || pb[i] != floor(pb[i]) || pb[i] >= pp[0]) mexErrMsgTxt("The polynomial coeficients must be in GF(P)"); } /* call gfmul() in gflib.c */ pcc = (int *)mxCalloc(nc, sizeof(int)); gfmul(paa, len_a, pbb, len_b, *pp, pcc); if ( mat_flag == 0 ){ if ( ma == 1 ) pc = mxGetPr(plhs[0]=mxCreateFull(1, nc, 0)); else if ( na == 1 ) pc = mxGetPr(plhs[0]=mxCreateFull(nc, 1, 0)); for(i=0; i < nc; i++){ if(pcc[i] == -Inf){ pc[i] = -mexGetInf(); }else{ pc[i] = (double)pcc[i]; } } } else { pc = mxGetPr(plhs[0]=mxCreateFull(row, col, 0)); for ( i=0; i < row; i++){ for ( j=0; j < col; j++){ if(pcc[i+j*row] == -Inf) pc[i+j*row] = -mexGetInf(); else pc[i+j*row] = (double)pcc[i+j*row]; } } } return; } else { /* call gfpmul() in gflib.c */ pcc = (int *)mxCalloc(nc, sizeof(int)); Iwork = (int *)mxCalloc(2*nc+nc*mp+np+1, sizeof(int)); Iwork[0] = nc; gfpmul(paa, len_a, pbb, len_b, pp, np, mp, pcc, Iwork, Iwork+1); if ( mat_flag == 0 ){ if ( ma == 1 ) pc = mxGetPr(plhs[0]=mxCreateFull(1, Iwork[0], 0)); else if ( na == 1 ) pc = mxGetPr(plhs[0]=mxCreateFull(Iwork[0], 1, 0)); for(i=0; i < Iwork[0]; i++){ if(pcc[i] == -Inf) pc[i] = -mexGetInf(); else pc[i] = (double)pcc[i]; } } else { pc = mxGetPr(plhs[0]=mxCreateFull(row, col, 0)); for ( i=0; i < row; i++){ for ( j=0; j < col; j++){ if ( i+j*row >= Iwork[0] ){ pcc[i+j*row] = 0; } else { if(pcc[i+j*row] == -Inf) pc[i+j*row] = -mexGetInf(); else pc[i+j*row] = (double)pcc[i+j*row]; } } } } return; }}/*--end of GFMUL.C--*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -