• ベストアンサー

かけ算に関してのアルゴリズム

アルゴリズムに関して全くの初心者なので、お力を貸してくれると幸いです。 タイトルにもありますが、かけ算を使ってのアルゴリズムですが、足し算なり、引き算なりを使ったほうが効率がいいのですが、どのようにすればいいのか悩んでおります。 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) ほかに効率の良いアルゴリズムはありますでしょうか? よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • goosyu
  • ベストアンサー率58% (36/62)
回答No.10

式が途中で破綻しています。訂正させて下さい。 数学の問題なのかな・・妄想してみます。 x=a*b-c*c+b*d y=b*b-c*c+a*d c*cを消してみる y-x = b*b-c*c+a*d - (a*b-c*c+b*d) y-x = b*b+a*d-a*b-b*d 何となく簡単にできそう・・・ y-x = (b-a)*(b-d) y = x + (b-a)*(b-d) ...式1 x=a*b-c*c+b*dを簡単にすると x = -c*c+b*(a+d) ...式2 式1に式2を代入すると y = (-c*c+b*(a+d)) + (b-a)*(b-d) 積算回数3回 -c*c , b*(a+d), (b-a)*(b-d) これはC言語云々ではないです・・・・ ここまで;;見直しは必要ですね。。すいません。

ibuneko
質問者

お礼

ありがとうございました。上記のやり方を教授に見せたら、なんか知りませんが、ほめられました。きっと、教授の思ってたことと違うやり方だったみたいでしたが、考え方はあってたので、大丈夫みたいです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (16)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.6

>アルゴリズムの課題として6回のかけ算を3回にとどめるということなのです。 >言葉足らずでもうしわけありません。 ということは、足し算なら何回やってもよいのですか? そうであれば、かけ算を足し算に変えられるので、かけ算の回数=0を実現できます。・・・が、このようなものは、望んではいないのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.5

そもそも、すなおに6回かけ算を使うのでなく、どうして 3回にとどめたいか、その理由を教えていただけますか? その演算を何億回も繰り返すのでない限り、 演算にかかる全体時間にはそれほどの違いはないと思います。

ibuneko
質問者

補足

アルゴリズムの課題として6回のかけ算を3回にとどめるということなのです。 言葉足らずでもうしわけありません。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

アルゴリズム以前に、数学の問題では? (展開の逆ってなんて言うんでしたっけ。) y=b*b-c*c+a*d これがどうなってこうなるのかわかりません。。。 temp=c*c y=b(b+a)-temp+a(d-b) +a*b-a*bが増えて複雑化してるだけのような気がしますが。

ibuneko
質問者

補足

仮に y=b*b-c*c+a*d という条件で、このままだとコストが高いから、足し算なり、引き算を付け加えてコストを下げようと言う考えてでいきたいのですが、上記の変換ではよけいにコストがあがってしまいますか?

全文を見る
すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1415)
回答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 中学生の因数分解みたいですね。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>かけ算の使用回数を3回までに押さえたいのです。 どの範囲で3回ですか? temp=c*c x=b*(a+d)-temp y=b*(b+a)-temp+a*(d-b) tempを求める式でのかけ算を含めると、 お考えになった上記の方法では4回必要です。

ibuneko
質問者

補足

どの範囲で3回までなのかを確認しますが、私の判断からすると、 x= と y= の右辺の式のなかのかけ算を3つまでに押さえたいということだと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E6%9C%80%E9%81%A9%E5%8C%96 このあたりをじっくり読んでみてください。 ソースは基本的に、視認性を最重視したほうがよいのではないでしょうか? 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

  • 計算の順序 a×b÷c

    小学生の算数で, たし算,ひき算は,かけ算,わり算より先 たし算と,ひき算が,又は,かけ算,わり算が, 複数ある時は,普通,左からと習います。 しかし, たし算だけ, かけ算だけなら,どこからでも計算できます。 a×b÷c は,b÷cを先に計算することは,できますか? いくつか,問題を作って解いてみましたが, a×bを先に計算した時と,答えが同じになりました。 よろしくお願いします。

  • エクセルの関数

    エクセル2000で足し算の合計はSUM関数ですが、引き算の合計の関数や、掛け算の合計の関数はないですか?例えば、「=A1-B1-C1-D1」「=A1*B1*C1*D1」などです。教えてください。

  • 数学orアルゴリズムが得意の方(線分と線分の交点判別)

    C言語のアルゴリズムを勉強中です。 線分A(A(x1,y1),B(x2,y2))と線分B(C(x3,y3),D(x4,x4))が交差するかどうかを判別し、交差するのであればその交点P(X,Y)を求める。 また、その交点がどちらか一方の線分上にあるかどうかも判別したいのです。 一番効率よくやるにはどのようにすればよいでしょうか。 例えば 1、三角形の符号付き面積を使って交差するかどうかと各点が線分上にあるかどうかを判別し、その後交点を求める 2、とり合えず交点を求めてその交点が各線分内(上)にあるかどうかを判別 他にもたくさんありそうですがとにかく出来るだけ計算回数を減らしたいのです。(さっき求めた~~を~~するといったかんじで) 出来れば流れ全体を書いていただきたいのですが書き込むのが大変だと思うのでせめて使う判別式だけでも教えてください。 これが出来たら、 多角形と多角形の交点判別のアルゴリズムにも挑戦しようと思っています。 数学の得意な方、アルゴリズムを考えるのが好きな方 よろしくお願いします。

  • エクセルの掛け算

    当方、エクセル初心者です。色々と調べてみたのですが、望む回答を得られませんでした。宜しくお願いします。 セルC1にA1・B1セルの積を求めるには、=A1*B1 となります。 この掛け算を =A2*B2(C3の答え) =A3*B3(C3の答え) ・・・続く・・と何十行にも渡る掛け算を、一度で設定する方法はどのようにしたらいいのでしょうか? 一度に複数の列、行の合計(足し算)を求めるには、合計範囲を選択(ドラッグ)して、オートSUMボタンをクリックすると、一発で合計値を求める事が出来ますが、掛け算の場合にはこういった操作は出来ないのでしょうか?

  • 直線を描くアルゴリズムが解りません(T_T)

    直線を描くアルゴリズムを教えて下さい。 直線の公式はわかるのですが、これからどうやって発展させていけばよいのか検討がつきません。 yの方が傾きが大きいのでyが常にインクリメントされるのはわかります。 xはどうやって判断するのでしょうか? (aは傾き、bは切片) y = ax + b 始点(3,3)終点(5,7) 7y-3y = 4 5x-3x = 2 ------------------------- a = 2 3 = 2*3 + b -> -3 = b 7 = 2*5 + b -> -3 = b --------------------------- b = -3

  • 掛け算と割り算の順番

    社会人ですが、SPIの試験で久しぶりに計算に取り組んでいる中で、 掛け算と割り算の順番について、どうだったかな?と思うところがあったので、 教えてください。 <1>20×10÷2 (a)(20×10)÷2=200÷2=100 (b)20×(10÷2)=20×5=100 (a)でも(b)でも同じですよね。 <2>20÷10×2 (a)(20÷10)×2=2×2=4 (b)20÷(10×2)=20÷20=1 (b)が間違っているのは分かります。 上記のように、具体的な数字でしかも単純な数字なら、 わざわざ(b)のような間違いはしません。 たまたまaやx(エックス)といった変数が入り、かつ数字も面倒な数字だったため、 なぜか掛け算や割り算は順序を入れ替えても良いと思ってしまって、 (b)のような解き方をしてしまいました。 例えば、360a ÷60b ×6 こういう式があると心情的に60×6が360だから消せる! と思ってしまったり(すいません、実際に疑問に思うきっかけになった式を忘れました)。 <2>で÷10を×1/10に直せば、間違えようがない、ということなのでしょうが、 学生時代、こんなこと疑問に思ったことがないということは、 基本的なルールをド忘れしているのかなと思いますので、 僕が<2>の(b)について、どんなルールを忘れたために間違ってしまったのか、 教えていただけませんでしょうか? 実際には変数が入ってきたり、小数やら分数が混じるからこそ、 左から右ではなく、効率的にできるところはしたいなという考えが起きてしまいます。

  • 公式で

    公式で Y=A^a×B^b×C^cのとき △Y/Y=a×△A/A+b×△B/B+c×△C/C というのがありますが、成り立たないように思います。 足し算ではなく掛け算ではないでしょうか

  • 分岐処理(アルゴリズム)

    C言語の初心者です。 C言語の分岐処理の書き方(アルゴリズム)について 分からない事があり質問しました。 A、B、C、Dという変数があり、 この変数にはランダムに、ある浮動小数が代入されます。 A、B、C、Dの値を比較して、 (1)一番小さい値が存在する場合 (2)一番小さい値が2つ存在する場合 (3)上記以外の場合 といったように場合分けを行い、 (1)一番小さい値をディスプレイに表示。 (2)アルファベット順で早い方  (Ex. AとBならA、但しDとAの場合はD)  をディスプレイに表示。 (3)Aをディスプレイに表示。 といったように、場合分けによってそれぞれ 処理を行いたいのです。 条件を&&や||で増やせばできると思うのですが、 端的に書くにはどうしたらよいか悩んでいます。 よろしくお願いします。

  • 乗積 Π のアルゴリズム

     はじめまして。  質問内容が表題と多少ズレる事をご承知下さい。  アルゴリズムを教えて頂きたいと思っています。  ************************  Π(2x-1) ,x=1~m  上式においてm=3とすると、総数は15となります。  今、A~Fまで6つのアルファベットがあります。  このうち2つをペアにしてグループを作ります。  上式により、グループ総数は15となります。  ペアの組み方は以下のようになります。  <例>  (1) A-B、 C-D、 E-F  (2) A-B、 C-E、 D-F  (3) A-B、 C-F、 D-E   ・   ・   ・  (14) A-F、 B-D、 C-E  (15) A-F、 B-E、 C-D  ************************  このような取り方をプログラムしようと思うのですが  どこから手をつけてよいかわかりません。  是非アドバイスをお願いします。    

  • ベクトルの四則演算

    A,Bをベクトルとして ・足し算  A+B ・引き算  A-B ・割り算  A/Bがありません。 掛け算もなかったような。どうしてでしょうか? 定義できないのでしょうか?