
アルゴリズムに関して全くの初心者なので、お力を貸してくれると幸いです。
タイトルにもありますが、かけ算を使ってのアルゴリズムですが、足し算なり、引き算なりを使ったほうが効率がいいのですが、どのようにすればいいのか悩んでおります。
x=a*b-c*c+bd
y=b*b-cc+a*d
と全部で6つののかけ算があります。
新しい変数(例えば、temp=c*c のような)を作ってもかまいませんので、
かけ算の使用回数を3回までに押さえたいのです。
私が考えたのは、
x=b(a+d)-temp
y=b(b+a)-temp+a(d-b)
ほかに効率の良いアルゴリズムはありますでしょうか?
よろしくお願いします
No.7
- 回答日時:
全部足し算にしたいのであれば、
たとえばa*bを
int i;
for (i = 0; i < b; i++)
{
a += a;
}
で全て足し算にできます。
でもコストが高くなります。
私が提示したwikiを呼んでください。
コンパイラがコードを最適化している文法についても取り上げられています。
コストが高い低いはコンパイラの動作に習うのが最もよいと思いますよ。
たとえば、
共通式削除(common sub-expression elimination)
"(a+b)-(a+b)/4" という式があったとき、"(a+b)" が2回出現する共通式である。共通式削除では、"(a+b)" がこの間に変化しないと判断し、1回だけ計算するよう最適化する。
定数畳み込み(constant folding)と定数伝播(constant propagation)
定数からなる式(例えば、"3 + 5")をコンパイル時に計算結果("8")と置き換えてしまう。最近の言語処理系ではほとんど必ず行われる。

No.6
- 回答日時:
>アルゴリズムの課題として6回のかけ算を3回にとどめるということなのです。
>言葉足らずでもうしわけありません。
ということは、足し算なら何回やってもよいのですか?
そうであれば、かけ算を足し算に変えられるので、かけ算の回数=0を実現できます。・・・が、このようなものは、望んではいないのでしょうか。
No.4
- 回答日時:
アルゴリズム以前に、数学の問題では?
(展開の逆ってなんて言うんでしたっけ。)
y=b*b-c*c+a*d
これがどうなってこうなるのかわかりません。。。
temp=c*c
y=b(b+a)-temp+a(d-b)
+a*b-a*bが増えて複雑化してるだけのような気がしますが。
この回答への補足
仮に
y=b*b-c*c+a*d
という条件で、このままだとコストが高いから、足し算なり、引き算を付け加えてコストを下げようと言う考えてでいきたいのですが、上記の変換ではよけいにコストがあがってしまいますか?
No.3
- 回答日時:
p = (b+c)*(b-c) → b*b - c*c
q = b*(a+d-b) → a*b + a*d - b*b
r = a*d
x = p + q → b*b - c*c + a*b + b*d - b*b → a*b - c*c + b*d
y = p + r → b*b - c*c + a*d
中学生の因数分解みたいですね。
No.1
- 回答日時:
このあたりをじっくり読んでみてください。
ソースは基本的に、視認性を最重視したほうがよいのではないでしょうか?
x=a*b-c*c+b*d
今回は変数名が短いため、今のままでも十分見やすいですしこのままでも十分では?
変数が長くてみずらいのであれば、
int multipul_ab
int multipul_cc
int multipul_bd
multipul_ab= a*b
multipul_cc= c*c
multipul_bd= b*d
//算術の途中経過が正しいかを確認できる。
x=multipul_ab - multipul_cc + multipul_bd
などと記述する意味が出てきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正しい五十音順について
-
不明な署名アルゴリズムって?
-
暗号化アルゴリズムが256ビット...
-
ハノイの塔のさいきアルゴリズ...
-
退化木をバランス木にしたい
-
トップダウン解析とボトムアッ...
-
Officeのラスタ画像の拡大縮小...
-
確率論的な麻雀の勝ち方を教え...
-
(文字列検索の手法について)...
-
fortran 画像処理
-
脳内メーカーのようなサービス...
-
あるプログラムのコマンドライ...
-
読み込み中にアクセス違反が発...
-
ファイルの開き方
-
65536は2の何乗なのでしょうか?
-
VBAで仕様書は書きますか?
-
OS入ってる機器のソフト・アプ...
-
VBAで関数をつくる
-
XnViewにwebpを「いつも開く」...
-
matlabでの長時間の計算について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正しい五十音順について
-
C♯で電卓を作成しています。演...
-
一番近い組み合わせを見つけるには
-
シードを考慮したトーナメント...
-
アルゴリズムとプロトコールの違い
-
グループを均等に分けるには?...
-
多変数関数の最小値を求めるプ...
-
期間重複チェックがわかりません
-
プログラミングをしたいのです...
-
5人のテストの点数を入力すると...
-
ハノイの塔のさいきアルゴリズ...
-
マージソートの比較回数の計算...
-
トップダウン解析とボトムアッ...
-
ハッシュアルゴリズム
-
diffのアルゴリズムについて詳...
-
フリーセルの難易度について
-
C# 再帰よるスタックオーバー...
-
書籍のソースコードを別言語に...
-
最大公約数を求めたい!
-
複数の点を最短距離で全て繋ぐ...
おすすめ情報