行列 M のスミス正規形を計算するアルゴリズムが必要です。通常は として記述されます。M = USVたとえば、WP の SNF を参照してください。ここで、行列は常にフル ランク、つまりdet(S) ~= 0です。
私は Mathematica から始めました.Mathematica では素晴らしいパッケージがこのアルゴリズムを提供しています. たとえばthis one、this one by Gilbert、this one using mapleなど、いくつかの実装がありますが、私は maple にアクセスできず (私は思う)、他の両方の実装は行列Uを計算しないかV、間違って計算します( [5,0;0,5]2 番目の実装で試してください。ここでU、 とVは単に単位行列である必要があります)
利用可能な他の実装はありますか?
おそらく、この Mathematica パッケージのアプローチに従うものです (もちろん、Mathematica で同様に)。これは、(Mathematica を使用する場合) 私のニーズに対して非常にうまく機能したためですが、UとVが正しく提供されている限り、私は気にしません。