version 1.3, 2000/08/22 05:04:04 |
version 1.4, 2018/03/29 01:32:51 |
|
|
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* |
* |
* $OpenXM: OpenXM_contrib2/asir2000/engine/QM.c,v 1.2 2000/08/21 08:31:27 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/engine/QM.c,v 1.3 2000/08/22 05:04:04 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
|
|
Line 53 void addmq(m,n1,n2,nr) |
|
Line 53 void addmq(m,n1,n2,nr) |
|
int m; |
int m; |
MQ n1,n2,*nr; |
MQ n1,n2,*nr; |
{ |
{ |
int a; |
int a; |
|
|
if ( !n1 ) |
if ( !n1 ) |
*nr = n2; |
*nr = n2; |
else if ( !n2 ) |
else if ( !n2 ) |
*nr = n1; |
*nr = n1; |
else { |
else { |
a = (CONT(n1) + CONT(n2)) % m; STOMQ(a,*nr); |
a = (CONT(n1) + CONT(n2)) % m; STOMQ(a,*nr); |
} |
} |
} |
} |
|
|
void submq(m,n1,n2,nr) |
void submq(m,n1,n2,nr) |
int m; |
int m; |
MQ n1,n2,*nr; |
MQ n1,n2,*nr; |
{ |
{ |
int a; |
int a; |
|
|
if ( !n1 ) { |
if ( !n1 ) { |
a = (m - CONT(n2)) % m; STOMQ(a,*nr); |
a = (m - CONT(n2)) % m; STOMQ(a,*nr); |
} else if ( !n2 ) |
} else if ( !n2 ) |
*nr = n1; |
*nr = n1; |
else { |
else { |
a = (CONT(n1) - CONT(n2) + m) % m; STOMQ(a,*nr); |
a = (CONT(n1) - CONT(n2) + m) % m; STOMQ(a,*nr); |
} |
} |
} |
} |
|
|
void mulmq(m,n1,n2,nr) |
void mulmq(m,n1,n2,nr) |
int m; |
int m; |
MQ n1,n2,*nr; |
MQ n1,n2,*nr; |
{ |
{ |
int a,b; |
int a,b; |
|
|
if ( !n1 || !n2 ) |
if ( !n1 || !n2 ) |
*nr = 0; |
*nr = 0; |
else { |
else { |
a = dmb(m,CONT(n1),CONT(n2),&b); STOMQ(a,*nr); |
a = dmb(m,CONT(n1),CONT(n2),&b); STOMQ(a,*nr); |
} |
} |
} |
} |
|
|
void divmq(m,n1,n2,nq) |
void divmq(m,n1,n2,nq) |
int m; |
int m; |
MQ n1,n2,*nq; |
MQ n1,n2,*nq; |
{ |
{ |
int a,b; |
int a,b; |
|
|
if ( !n2 ) |
if ( !n2 ) |
error("divmq : division by 0"); |
error("divmq : division by 0"); |
else if ( !n1 ) |
else if ( !n1 ) |
*nq = 0; |
*nq = 0; |
else if ( n1 == n2 ) |
else if ( n1 == n2 ) |
*nq = ONEM; |
*nq = ONEM; |
else { |
else { |
a = dmb(m,CONT(n1),invm(CONT(n2),m),&b); STOMQ(a,*nq); |
a = dmb(m,CONT(n1),invm(CONT(n2),m),&b); STOMQ(a,*nq); |
} |
} |
} |
} |
|
|
void invmq(m,n1,nq) |
void invmq(m,n1,nq) |
int m; |
int m; |
MQ n1,*nq; |
MQ n1,*nq; |
{ |
{ |
int a; |
int a; |
|
|
if ( !n1 ) |
if ( !n1 ) |
error("invmq : division by 0"); |
error("invmq : division by 0"); |
else { |
else { |
a = invm(CONT(n1),m); STOMQ(a,*nq); |
a = invm(CONT(n1),m); STOMQ(a,*nq); |
} |
} |
} |
} |
|
|
void pwrmq(m,n1,n,nr) |
void pwrmq(m,n1,n,nr) |
|
|
Q n; |
Q n; |
MQ *nr; |
MQ *nr; |
{ |
{ |
int a; |
int a; |
|
|
if ( n == 0 ) |
if ( n == 0 ) |
*nr = ONEM; |
*nr = ONEM; |
else if ( !n1 ) |
else if ( !n1 ) |
*nr = 0; |
*nr = 0; |
else { |
else { |
a = pwrm(m,CONT(n1),QTOS(n)); STOMQ(a,*nr); |
a = pwrm(m,CONT(n1),QTOS(n)); STOMQ(a,*nr); |
} |
} |
} |
} |
|
|
void mkbcm(m,n,t) |
void mkbcm(m,n,t) |
int m,n; |
int m,n; |
MQ *t; |
MQ *t; |
{ |
{ |
int i,j; |
int i,j; |
int *a,*b,*c; |
int *a,*b,*c; |
|
|
W_CALLOC(n,int,a); W_CALLOC(n,int,b); |
W_CALLOC(n,int,a); W_CALLOC(n,int,b); |
for ( i = 1, a[0] = 1; i <= n; i++ ) { |
for ( i = 1, a[0] = 1; i <= n; i++ ) { |
for ( j = 1, b[0] = b[i] = 1; j < i; j++ ) |
for ( j = 1, b[0] = b[i] = 1; j < i; j++ ) |
b[j] = (a[j-1] + a[j]) % m; |
b[j] = (a[j-1] + a[j]) % m; |
c = a; a = b; b = c; |
c = a; a = b; b = c; |
} |
} |
for ( i = 0; i <= n; i++ ) |
for ( i = 0; i <= n; i++ ) |
STOMQ(a[i],t[i]); |
STOMQ(a[i],t[i]); |
} |
} |