前提・実現したいこと
五次の行列式の値の計算を行いたいです。
各行列の成分は直接入力で行っており、
一番内部の{}の第一成分が分子、第二成分が分母を表しています。
自分は行列式の変換で求めようとしており、
階段行列にしたのちに対角成分をかけることで
行列式の値を求める式を書きました。
発生している問題・エラーメッセージ
エラーメッセージ 実行をしても何も起こらずに終了になってしまいます。
用いた言語
C言語を用いて作成しています。
###ソースコード
#include<stdio.h> int gcd(int n, int r) /* nとrの最大公約数 */ { int s=1; while (s!=0) { s=n%r; n=r; r=s; } return n; } void det_get(long long int a[5][5][2], int c[2]) /* 対角成分をかけて約分 */ { int bunshi = 1, bunbo = 1, d; for (int i = 0; i <=4; i++) { bunshi *= a[i][i][0]; bunbo *= a[i][i][1]; } d = gcd(bunshi, bunbo); if (d<0) d*=-1; c[0] = bunshi/d; c[1] = bunbo/d; if (c[1]<0) { c[0]*=-1; c[1]*=-1; } } int main(void) { /*行列は次のようにソースファイルに直接書く*/ long long int a[5][5][2] = {{{1,2},{3,1},{4,1},{-2,3},{0,1}}, {{0,1},{0,1},{-23,2},{2,9},{1,1}}, {{-1,1},{2,1},{0,1},{0,1},{1,1}}, {{4,5},{1,6},{-3,2},{1,1},{0,1}}, {{0,1},{-1,1},{0,1},{1,1},{1,1}}}; int b[5][5][2] = {0}; int det[2]; for (int s = 1; s <=4; s++) { for (int i = s; i <= 4; i++) { b[i][s-1][0] = a[i][s-1][0]*a[s-1][s-1][1]; b[i][s-1][1] = a[i][s-1][1]*a[s-1][s-1][0]; if (b[i][s-1][1]<0) { b[i][s-1][0]*=-1; b[i][s-1][1]*=-1; } for (int j = s; j <=4; j++) { a[j][s-1][0] = 0; a[i][j][0] = a[i][j][0]*a[s-1][j][1]*b[i][s-1][1] - a[s-1][j][0]*b[i][s-1][0]*a[i][j][1]; a[i][j][1] = a[i][j][1]*a[s-1][j][1]*b[i][s-1][1]; } } } det_get(a, det); if (det[1]!=1) printf("%d/%d",det[0],det[1]); else printf("%d",det[0]); return 0; }
試したこと
何も実行されない場合は無限ループか 計算量の膨大さが原因かと考えましたが、 自分が確認した限りでは無限ループに入る誤りを見つけられませんでした。 また、計算量もそれほど膨大と感じられません。 つたないソースコードで申し訳ありません。 よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。