- 締切済み
べき乗を最小回数の掛算で
いくつかの回答をいただいた「るい乗・べき乗の計算量」なのですが、説明がまずかったようなので再度、タイトルを変更して質問させて下さい。 例えば5の7乗を計算する場合、5×5×5×5×5×5×5と普通に考えれば6回の「かけ算」で計算ができます。「かけ算6回」ということですね。でも実際は、5×5で5の2乗を計算したら、(5の2乗)×(5の2乗)で5の4乗を計算して、それに5の2乗と5をかける。つまり、 (5×5)×(5の2乗)×(5の2乗)×5 の4回のかけ算で済みますよね。 16乗なら4回ですし、47乗ならば8回です。 どなたかこの「べき乗を(掛け算だけで)計算するための掛け算の最小回数」を求める求め方、、、を教えてください。 ちなみに、暗号などの世界や、プログラム言語内での定義では、 a^47=((((axa)xa^2)xa^4)xa^8)xa^16xa^8xa^4xa^2xa のように、2倍を基準に計算を省いています。実用的にはそれで十分なのですが、私が知りたいのは「実用」ではなくて、最小の回数を求める方法です。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- graphaffine
- ベストアンサー率23% (55/232)
mahler3さん、たびたび失礼します。#6の者です。 まだ、確認事項に答えてもらってませんよ。 >確認ですが、指数の範囲を教えて下さい。 強引とは言いましたが、さすがに総当たりは私もやる気がしません。 取り敢えず問題を次のように定式化します。 Fを次のような条件を充たす有限数列の全体とする。 1 初項は2 2 狭義単調増加 3 Fに属する任意の数列{f_n}の隣り合う2項f_n、f_n+1の差は1であるかまたは、あるk<nが存在してf_k に等しい。 このとき、与えられた自然数nに対し、Fに属する数列でnを末項とし、長さが最も短いものを求める事。 一応プログラミングの方針としては、重み付き根付き木を、キュー構造を利用して作っていく事になるでしょう。
- graphaffine
- ベストアンサー率23% (55/232)
確認ですが、指数の範囲を教えて下さい。 100ぐらいまでなら何とかプログラムで強引に求められるかもしれないが それ以上はかなり難しそう。 暗号計算云々といってるのですから100程度じゃお話にはならないかもしれないが。
補足
そうですね。私は十進ベーシックで総当たりの強引なプログラムを組んでみましたが、メモリやスピードはもう一杯一杯です。 なんとかもう少し美味いアルゴリズムを知りたいのですが。 もしかしてNP完全?
- mirage70
- ベストアンサー率28% (32/111)
47乗ならば8回です。と書いていますが、 a^47=((((axa)xa^2)xa^4)xa^8)xa^16xa^8xa^4xa^2xa この計算では9回となるのではないですか? (a^((2+2+1)^(2*2*2+1))×5^2) =(((axa)xa^2)xa)a^5xa^10xa^20xa^5xa^2=a^47 此が、8回となるのではないですか。
補足
その通りです。8回なのです。だから a^47=((((axa)xa^2)xa^4)xa^8)xa^16xa^8xa^4xa^2xa は駄目なんです。この例は、単に計算回数を減らすと言う「実用」では一般的に単純だし(2進数で表せばどう計算すれば良いかすぐ分かる)ということです。ネット上ではそう言う説明が多いので、きっとそう言う回答が多いだろうと思い、釘をさしておいたのですが、、、逆効果だったかも。拙い説明ですいません。
- ranx
- ベストアンサー率24% (357/1463)
計算の途中結果を再利用していることが問題を難しくしていますね。 再利用を許さないのであれば、 1.ターゲットの数を2進数で表す。 2.先頭の1を除く。 3.0を1、1を2と数えて、数字の合計を求める。 で良いと思います。 2進数で表した数は 0→現在の数を2乗する。 1→現在の数を2乗して元の数を掛ける。 に対応するからです。 途中結果の再利用を許すとすると、n乗の時の回数をC(n)と表したとして、 1. C(1)=0 2. C(n)=C(n-1)+1 3. C(n)=C(n/2)+1 4. C(n)=C(m)+1 但し、n>m、C(m)の計算過程にC(n-m)が使われる時 4’.C(n)=C(m)+C(n-m) 但し、n>m、C(m)の計算過程にC(n-m)が使われない時 のようなルールになると思いますから、再帰的に計算して答えは出せるかも しれません。 検証はしていません。
補足
考えていただいてありがとうございます。 この問題はなかなか難しいようです。 それでもなんとか、 解き方があるのならその解き方(あるごりずむ?) ないのであれば、まだ解けていないのだという確認 が欲しいのです。とはいっても、未解決って訳ではないだろうと思うのですが、、、。
- mirage70
- ベストアンサー率28% (32/111)
るい乗・べき乗の計算ですので、この問題は、 47にするために、1,2,括弧、+、かけ算、できあがった数のみをつかって最小限で作り上げる問題に変わるのではないですか。 47=5*9+2が最小となると思いますけど、 ((2+2+1)×(2*2*2+1))+2即ち(5^((2+2+1)^(2*2*2+1))×5^2)で、9回になると思います。 (1)最小回数でするためには、2,4,8,16、32でできあがるのがよい。 (2)此で出来なければ、(1)に1を加えた数で、出来た方がよい。 (3)できあがった数を利用出来る方がよい。 (4)端数については、(1) , (2) ,(3)の考えを繰り返すのみではないですか。
- shige_70
- ベストアンサー率17% (168/946)
#1です。 書いた後で、前記の2条件で計算したところ、47乗が8回にはなりませんでした。 ってことは、やはり間違っていたと。。。 でも、考え方としては的はずれでもない気がするので、もう少し条件を変えてあげると、帰納的に最低回数が算出できる漸化式が作れるのではないでしょうか。。。 うーん、、、やっぱり自信はないです。。。
補足
そのとおり。ですね。下にも書いた通りです。 数学の場合、「自信がない」のではなくて、検証できていません。ですよね。(笑)
- shige_70
- ベストアンサー率17% (168/946)
これは、一般解を出すのはかなり難しそうですね。 少しずつ、考えてみますか? 1は0回、2は1回、3は2回。。。途中まで調べて、以下の予測を立てました。 Claim. 1) nが奇数の時、n乗の時の回数は、(n-1)乗の時のの回数+1 である。 Claim. 2) nが偶数の時、n乗の時の回数は、(n/2)乗の時のの回数+1 である。 この辺が糸口になると思うんですが、、、上記が間違っている可能性も。。。 はっきりいって自信ないですが、どうでしょうか?
補足
そのとおりです。難しい?のですけど、 とっても難しいのか、ある分野の人にとっては簡単なことなのか、あるいは結果があるのか、 そのあたりを教えて欲しいわけです。 例えば、 n=ab(ただし、aもbも2以上)なら、a乗の時の回数+b乗の時の回数 そうではない、つまり、素数の場合は、n-1乗の時の回数+1 と考えれば良さそうに思いますが、実際のところは、例えばn=33のときは、 33=3×11 3は素数なので、3乗は2乗の回数+1、つまり2 11も素数なので、10乗+1 10=5×2 5は素数なので、5乗は4乗の回数+1、つまり3 よって、11乗の時の回数は5 よって33乗のときの回数は7回。 となるのですけど、33=2の5乗+1だと考えれば、6回で済みます。 なぜそんな事になるのか。 3×11と分けて考えたとき、どちらの場合にも2乗することを計算に入れているからではないでしょうか。 一から考えてそうそう簡単には解決しないようです。
補足
すいません。指数の範囲は「無制限」です。というか、どんな自然数に対しても、求められるようなアルゴリズムの存在を知りたかったのですが、、、どうやら無いようですね。 一生懸命考えていただいてありがとうございました。ツリーで探索ですか。うーん。そうですねえ。それしかないかあ。力業しか無いのでしょう、、、かあ、、、ねえ。きっと。