Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void swap(number* x, number* y) {
- number tmp = *x;
- *x = *y;
- *y = tmp;
- }
- void string_swap (number* matrix,int dimension, int f_string , int s_string) {
- int i;
- for (i=0; i<dimension;i++) {
- swap(&matrix[f_string*dimension + i],&matrix[s_string*dimension+i]);
- }
- }
- number determinant (number* matrix, int dimension, Zp field) {
- number res = copy_number(one);
- number* c_matrix = (number*)mlc(sizeof(number)*dimension*dimension);
- int i,j,k,count=0;
- for (i=0;i<dimension*dimension;i++)
- c_matrix[i] = copy_number(matrix[i]);
- number t;
- number deg = Zp_sub(field,field->n, new_number("2"));
- for (i=0;i<dimension;i++) {
- k = i;
- for(j=i+1;j<dimension;j++)
- if (Z_more(c_matrix[j*dimension+i], c_matrix[dimension*k+i]))
- k = j;
- if (Z_equals(c_matrix[k*dimension+i], zero)) {
- free_number(deg);
- for(i=0;i<dimension*dimension;i++)
- free_number(c_matrix[i]);
- fri(c_matrix);
- return zero;
- }
- if(i != k) {
- string_swap(c_matrix,dimension,i,k);
- count++;
- }
- res=Zp_mult_a(field,res, c_matrix[i*dimension+i]);
- for (j= i+1;j<dimension;j++){
- t = fast_pow_in_field(c_matrix[i*dimension+i],deg, field);
- c_matrix[i*dimension+j] = Zp_mult_a(field,c_matrix[i*dimension+j],t);
- free_number(t);
- }
- for (j=0; j<dimension; j++) {
- if (j != i && Z_more(c_matrix[j*dimension+i],zero))
- for (k=i+1 ; k<dimension ; k++) {
- t = Zp_mult(field,c_matrix[i*dimension+k], c_matrix[j*dimension+i]);
- c_matrix[j*dimension+k] = Zp_sub_a(field,c_matrix[j*dimension+k],t);
- free_number(t);
- }
- }
- }
- if (count&1) {
- t = copy_number(res);
- free_number(res);
- res=Z_sub(field->n,t);
- free_number(t);
- }
- free_number(deg);
- for(i=0;i<dimension*dimension;i++)
- free_number(c_matrix[i]);
- fri(c_matrix);
- return res;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement