Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.13 KB | None | 0 0
  1. void swap(number* x, number* y) {
  2. number tmp = *x;
  3. *x = *y;
  4. *y = tmp;
  5. }
  6. void string_swap (number* matrix,int dimension, int f_string , int s_string) {
  7. int i;
  8. for (i=0; i<dimension;i++) {
  9. swap(&matrix[f_string*dimension + i],&matrix[s_string*dimension+i]);
  10. }
  11. }
  12. number determinant (number* matrix, int dimension, Zp field) {
  13. number res = copy_number(one);
  14. number* c_matrix = (number*)mlc(sizeof(number)*dimension*dimension);
  15. int i,j,k,count=0;
  16. for (i=0;i<dimension*dimension;i++)
  17. c_matrix[i] = copy_number(matrix[i]);
  18. number t;
  19. number deg = Zp_sub(field,field->n, new_number("2"));
  20. for (i=0;i<dimension;i++) {
  21. k = i;
  22. for(j=i+1;j<dimension;j++)
  23. if (Z_more(c_matrix[j*dimension+i], c_matrix[dimension*k+i]))
  24. k = j;
  25. if (Z_equals(c_matrix[k*dimension+i], zero)) {
  26. free_number(deg);
  27. for(i=0;i<dimension*dimension;i++)
  28. free_number(c_matrix[i]);
  29. fri(c_matrix);
  30. return zero;
  31. }
  32. if(i != k) {
  33. string_swap(c_matrix,dimension,i,k);
  34. count++;
  35. }
  36. res=Zp_mult_a(field,res, c_matrix[i*dimension+i]);
  37. for (j= i+1;j<dimension;j++){
  38. t = fast_pow_in_field(c_matrix[i*dimension+i],deg, field);
  39. c_matrix[i*dimension+j] = Zp_mult_a(field,c_matrix[i*dimension+j],t);
  40. free_number(t);
  41. }
  42. for (j=0; j<dimension; j++) {
  43. if (j != i && Z_more(c_matrix[j*dimension+i],zero))
  44. for (k=i+1 ; k<dimension ; k++) {
  45. t = Zp_mult(field,c_matrix[i*dimension+k], c_matrix[j*dimension+i]);
  46. c_matrix[j*dimension+k] = Zp_sub_a(field,c_matrix[j*dimension+k],t);
  47. free_number(t);
  48. }
  49. }
  50. }
  51. if (count&1) {
  52. t = copy_number(res);
  53. free_number(res);
  54. res=Z_sub(field->n,t);
  55. free_number(t);
  56. }
  57. free_number(deg);
  58. for(i=0;i<dimension*dimension;i++)
  59. free_number(c_matrix[i]);
  60. fri(c_matrix);
  61. return res;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement