
No.8ベストアンサー
- 回答日時:
> long PowerMod_C(long a, long n, long m)
> {
> unsigned long pw;
> pw = 1;
(中略)
> return pw;
> }
関数の引数と戻り値の型がlongなのに、pwだけunsigned longにしてもだめです。
実際に変数の値をループ1回ごとに表示させてみると
a=412, n=1423, m=64543, pw=1
a=40658, n=711, m=64543, pw=412
a=62191, n=355, m=64543, pw=34459
a=-36698, n=177, m=64543, pw=18440
a=53509, n=88, m=64543, pw=40139
a=-61389, n=44, m=64543, pw=40139
a=-9810, n=22, m=64543, pw=40139
a=2487, n=11, m=64543, pw=40139
a=53584, n=5, m=64543, pw=42215
a=-32746, n=2, m=64543, pw=10039
a=47657, n=1, m=64543, pw=10039
a=-31882, n=0, m=64543, pw=35907
この中で複数回aがマイナスになっています。
ちなみにすべての変数を、long long int (64bit int)にしてみると
a=412, n=1423, m=64543, pw=1
a=40658, n=711, m=64543, pw=412
a=62191, n=355, m=64543, pw=34459
a=45749, n=177, m=64543, pw=18440
a=35140, n=88, m=64543, pw=34550
a=47467, n=44, m=64543, pw=34550
a=49045, n=22, m=64543, pw=34550
a=23501, n=11, m=64543, pw=34550
a=2550, n=5, m=64543, pw=8610
a=48200, n=2, m=64543, pw=10880
a=14715, n=1, m=64543, pw=10880
a=54003, n=0, m=64543, pw=32560
となりました。
こちらが求めている解なのではありませんか?
ということで、途中でオーバーフローが発生しています。
No.7
- 回答日時:
> pw = a * pw % m の部分も a = (a * a ) % m の部分もすべて正の整数であるべきなのにマイナスがでて来て理解できなくなしました。
おそらく、a * a のところでオーバーフローが発生して負になっているのかと思います。
No.6
- 回答日時:
> c = a % b
の手前で、デバックを出力してみてはどうでしょうか。
printf("a=%d\nb=%d\n",a, b);
c = a % b
printf("c=%d\n",c);
で出力した結果を見せてください。
※ a, b, c はすべて int だと仮定しています。
No.5
- 回答日時:
例えば、次のような場合です。
int c;
unsigned int a = UINT_MAX-1, b = UINT_MAX;
a < bなので、cにはaの値がそのまま格納されますが、cの表現範囲を超えているので、処理系定義のシグナルが発生するか、処理系定義の値になります。ここで、負の値になるように処理系が定めていれば(多くはそうなります)、cは負になります。
あるいは、cもunsigned intに宣言したとしても、結果を出力するときに間違った場合、例えば
printf("%d\n", c);
のようにした場合は、やはり負になる可能性があります。
または、bが0の場合、動作が未定義になりますので、その結果としてcが負になることはあり得ます。
> また、回避策などわかりましたら教えていただきたいのですが。
まずは原因を特定しなければ、回避策はありません。
この回答への補足
longをunsigned longにしたところ正常動作しました。お騒がせしました。
ただ、ひとつ疑問に残るところがあります。はずかしながら、ソースをupしますと、
long PowerMod_C(long a, long n, long m)
{
unsigned long pw;
pw = 1;
while (n >= 1)
{
if ((n % 2) == 1)
{
pw = a * pw % m;
}
a = (a * a ) % m;
n = n / 2;
}
return pw;
}
これは a^n mod mを求めるプログラムですが、例えばa=412, n=1423, m=64543の時 pw=-52279となります。
pw = a * pw % m の部分も a = (a * a ) % m の部分もすべて正の整数であるべきなのにマイナスがでて来て理解できなくなしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのマイナス表示 3 2022/03/28 16:35
- 化学 化学のエンタルピ変化を求め方について ある例題では各物質のモール数を換算して計算することもあり、ある 1 2022/06/20 23:22
- その他(Microsoft Office) Excelで時間計算(負) 8 2023/02/26 05:47
- その他(教育・科学・学問) 小学生の算数の商について 3 2023/03/06 14:11
- 簿記検定・漢字検定・秘書検定 満期保有目的債券の償却原価法の計算について(簿記2級) 1 2022/06/18 15:40
- Excel(エクセル) スプレッドシートの関数 2 2022/11/16 17:36
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 電車・路線・地下鉄 マニアに質問。JR電車内で車掌に乗り越し精算、乗車区間変更をお願いする時の事ですが・・・ 2 2022/10/02 20:58
- 高校受験 数学の問題がわからず困っています。 映画館とコンサート会場を含んだ総合施設がある。それぞれの座席数の 3 2023/01/27 22:54
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
!(否定)演算子について
-
H8マイコン C言語でのプロ...
-
収束計算
-
エクセルで特定の列が0表示の場...
-
教えて下さい
-
Excel・Word リサーチ機能を無...
-
VBAでfunctionを利用しようとし...
-
特定のPCだけ動作しないVBAマク...
-
配列数式の解除
-
Excel マクロ VBA プロシー...
-
Excel_マクロ_現在開いているシ...
-
Excel VBAからAccessマクロを実...
-
お助けください!VBAのファイル...
-
UserForm1.Showでエラーになり...
-
ExcelのVBA。public変数の値が...
-
ExcelVBAでPDFを閉じるソース
-
メッセージボックスのOKボタ...
-
エクセルで別のセルにあるふり...
-
一つのTeratermのマクロで複数...
-
秀丸マクロでマクロのURLを開く...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
繰り返し1行~28行までを順順に...
-
MATLABにおける行の挿入方法
-
!(否定)演算子について
-
H8マイコン C言語でのプロ...
-
C言語で余りがマイナスになる場合
-
Z80のフラグレジスタについて
-
C++
-
ExcelのVBAのテクニック
-
Pythonで行列の要素積(アダマ...
-
Matlabのspdiags関数
-
if文について教えてください
-
8085系プログラミングについて
-
matlab、対角行列の作り方
-
五目並べ
-
OPENCVを使ったエピポーラ幾何...
-
mathematicaの質問です
-
cのプログラミングで虚数を含...
-
パイソンのプログラミングにつ...
-
演算装置とフラグレジスタの関係
-
【MATLAB】配列内の数値のキャ...
おすすめ情報