cat inv.f /* inv.f May 3, 1987 */ inv(u,v,w) /* This function generates the modular inverse through a process which was developed using bc and avoids reentrant code. Inverter4 is the name of the bc script which this function was developed from. */ char *u , *v, *w ; { char *a[15],*b[15],*x[15],*y[15],*k[15],*z[15] ; char *r , *t , *s , *f, *malloc() ; int i, j ; r = malloc(15) ; t = malloc(15) ; s = malloc(15) ; f = malloc(15) ; j = 0 ; for( i = 0 ; i < 15 ; i++) a[i] = malloc(15) ; for( i = 0 ; i < 15 ; i++) b[i] = malloc(15) ; for( i = 0 ; i < 15 ; i++) x[i] = malloc(15) ; for( i = 0 ; i < 15 ; i++) y[i] = malloc(15) ; for( i = 0 ; i < 15 ; i++) k[i] = malloc(15) ; for( i = 0 ; i < 15 ; i++) z[i] = malloc(15) ; copy(u,r) ; copy(v,t) ; while(strcmp(r,one) > 0) { copy(r,a[j]) ; copy(t,b[j]) ; copy(b[j],r) ; residue(r,a[j]) ; copy(r,s) ; copy(a[j],r) ; sub(r,s) ; copy(b[j],x[j]) ; divide(x[j],a[j]) ; add(x[j],one) ; copy(one,y[j]) ; copy(b[j],f) ; residue(f,r) ; while(strcmp(f,xero) > 0 ) { copy(b[j],t) ; divide(t,r) ; add(t,one) ; multiply(x[j],t,v) ; multiply(y[j],t,v) ; add(y[j],one) ; multiply(y[j],one,v) ; copy(b[j],f) ; residue(f,r) ; sub(r,f) ; copy(b[j],f) ; residue(f,r) ; } copy(a[j],t) ; j = j + 1 ; } j = j - 1 ; copy(x[j],z[j]) ; copy(y[j],k[j]) ; if ( j == 0) { copy(z[0],w) ; return ; } while( j > 0 ) { i = j ; j = j - 1 ; copy(z[i],z[j]) ; multiply(z[j],x[j],v); while(strcmp(z[j],k[i]) < 0) add(z[j],v) ; sub(z[j],k[i] ) ; multiply(z[j],one,v) ; copy(z[i],k[j] ) ; multiply(k[j],y[j],v) ; } copy(z[0],w) ; } $