SRC質問掲示板Mk2
(現在 過去ログ114 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■20305 / inTopicNo.1)  掛け算(筆算?)の処理速度を向上させるには?
  
□投稿者/ 匿名希望 -(2007/09/08(Sat) 01:06:36) [ID:2eMbhZ9o]
    15桁以上の掛け算をやるために
    ルーチンを作成したのですが、
    現状では処理速度に問題があります。
    現状で使っている変数と処理を書きます。

    「Args(2)」・・・・・左辺の値が入ります。
    「Args(2)」・・・・・右辺の値が入ります。
    「a」・・・・・・・・・・・左辺の値を一桁ごとにリスト化したものが入ります。
    「b」・・・・・・・・・・・右辺の値を一桁ごとにリスト化したものが入ります。
    「n」・・・・・・・・・・・処理用。掛け算の一桁目が入ります。
    「p」・・・・・・・・・・・処理用。今は使っていますが、できれば使わないようにしたいです。
    「temp」・・・・・・・・掛け算の一桁目と前の二桁目及びその繰り上がりの結果を足した合計が入ります。
    「shift」・・・・・・・掛け算の二桁目及び一桁目の繰り上がりの結果が入ります。

    ↓掛け算処理ここから

    For i = 1 To Len(Args(1) * Args(2))
     n[i] = 0
     p[i] = 0
     shift[i] = 0
    Next
    For i = 1 To LLength(a)
     For j = 1 To LLength(b)
      p[(j + (i - 1))] = p[(j + (i - 1))] + LIndex(a,i) * LIndex(b,j)
     Next
    Next
    For i = 1 To Count(n)
     p[i] = "$(Format(p[i],String((Count(n) - (i - 1)),0)))$(String((i - 1),0))"
    Next
    For i = 1 To Count(n)
     For j = 1 To Count(n)
      n[j] = n[j] + Left(Right(p[i],j),1)
     Next
    Next
    For i = 1 To Count(n)
     temp = n[i] + shift[i]
     If temp > 9 Then
      shift[i + 1] = Left(temp,1)
      temp = Right(temp,1)
     Else
      shift = 0
     EndIf
     answer = "$(temp)$(answer)"
    Next

    ↑掛け算処理ここまで

    For文の使いすぎだということはわかるので、なんとか減らしたいのですが、
    何をやってもうまくいかず現状ではこの処理を使っています。

    簡単に言えば掛け算の筆算をSRC上で再現すればいいのですが、
    その方法がわからずとりあえず動くので放置したところ、
    処理速度の遅さが露見してしまいました。

    一番上のFor文が絶対必要だというのはわかります。
    ですが、それ以外がよくわからないのです。
    よろしくお願いします。
引用返信/返信 削除キー/
■20306 / inTopicNo.2)  Re[1]: 掛け算(筆算?)の処理速度を向上させるには?
□投稿者/ 中箱 -(2007/09/08(Sat) 03:00:42) [ID:jwikVFnr]
http://www.src.jpn.org/neko/multibbs/cbbs.cgi?mode=al2&namber=19210&rev=&no=2&KLOG=106
    毎度、中箱です。


    まず、根本的なところになってしまいますが
    この方法を取らなくてはならないのでしょうか?
    まずはそこからかと。


    なにせ匿名希望さんは、以前、今回と同様に大きな桁数を扱う計算についての質問をされています。
    この時のログは、今回の質問をされる前に見直されたのでしょうか?
    (念のため、ログのアドレスを参照URLに張っておきます)


    その時の回答には、大きな数値を扱う一般的な方法について調べる手がかりや、加算の場合の実例も示されています。
    しかし、今回匿名希望さんが示されたコードは、その時に回答された方から示されたコードとはだいぶ違っており、
    かなり効率の悪い方法を取っているように見受けられます。
    (表現を変えれば、以前の質問が生かされていない、とも)

    ですからどうしても、
      「加算の場合」に手を加えていくのではダメなのか?
    という疑問が。



    見直されていないのであれば、
    当時からすでに一年弱経過していますし、
    せっかくもらったコードなのですから、今一度、
    焦らず、
    じっくりと、
    読み解くことを試みても損は無いと思います。
    もちろん、一般的方法を調べて考えてみるのも有用かと。


    見直した上での質問であれば、
    解答する側の手間が多少省けますし、回答側の心構えや説明に用いる表現も変わってくるでしょうから
    以前の経過も書いていただいて欲しかったな、とは。



    ということで、少なくとも
    ・このような方法でなければならないのか
    ・以前にご自身が行った質問とその回答を見直した上での質問か
    ・見直した上であれば、その時に示されているコード(計算の原理)は、約1年経っても理解できているのか

    について、教えていただけませんでしょうか。



    ついでに、
    この件に関して私からのレスが不要だと思われるのであれば、
    その旨を一言明言していただければそれ以外に私へのレスは不要です。


    では。


    PS.
    "右辺"・"左辺"という言葉の使い方が間違っています。言いたい事は分かりはしますが
    用語の間違いは誤解や誤読に繋がって回答の障害になりますので、できれば勘弁を・・・。
    もしも自信が無いなら、別の表現を使うことも考えたほうが良いと思います。意図が伝わらないまま無駄なレスを重ねるのは良くないですから。
引用返信/返信 削除キー/
■20307 / inTopicNo.3)  Re[2]: 掛け算(筆算?)の処理速度を向上させるには?
□投稿者/ 匿名希望 -(2007/09/08(Sat) 03:32:04) [ID:2eMbhZ9o]
    右辺と左辺の使い方の件は了解しました。
    私が慌てていただけです。
    誤解を招くような真似をして誠に申し訳ありませんでした。

    まず足し算や引き算の筆算の方法を
    掛け算に当てはめることができないのはわかると思います。

    私は以前示されたコードを基にして、
    独自に足し算及び引き算の筆算を再現した処理の作成に成功しました。
    必要ならば次のレスポンスで公開させていただきます。
    独自の処理を構築した理由は二つあります。
    ・自分が作成したものではないので、迂闊にカスタマイズができない。
    ・引き算に対応していない。
    この二つです。
    構築した処理は正常動作を確認し、実際に使用しております。
    一部の変数は流用していますが、処理自体は独自のものです。

    そこで掛け算の筆算を再現するため、
    まず「かけられるべき数値」をかけた答えの文字数分の処理変数を用意しました。
    最後の処理は多少は変更していますが、足し算と引き算で使ったものと同じです。
    しかし、最初と最後ができたのに中身がわかりません。
    簡単な方法も試しました。それでも駄目だったんです。
    私のミスかもしれませんが、今となってはその理由もわかりません。

引用返信/返信 削除キー/
■20308 / inTopicNo.4)  Re[3]: 掛け算(筆算?)の処理速度を向上させるには?
□投稿者/ 中箱 -(2007/09/08(Sat) 18:39:51) [ID:8NrUE61r]
    相変わらず、答えて欲しい所をあまり答えていただけないようで残念です。




    >まず足し算や引き算の筆算の方法を
    >掛け算に当てはめることができないのはわかると思います。

    どうやら「筆算」にこだわられているようですが、

    これが前回私が尋ねた、
    >・このような方法でなければならないのか
    に対する回答でしょうか?

    つまり
     「筆算」以外の方法は取らない
    ということですか?


    前回の冒頭で
    >この方法を取らなくてはならないのでしょうか?
    >まずはそこからかと。
    とも書いたわけですから、
    推察の必要が無いぐらい明確に答えて欲しかったのですが。



    今回、使用するFor文を減らすことは、言い換えれば、考え方を変える、ということに繋がります。
    つまり「筆算」にこだわることは、考え方の変更に、初めから制限を加えることになります。

    私はこれに関してコードを組んでいませんし、今回匿名希望さんが示されたコードも精査していませんが、
    一桁ずつリスト化して掛け合わせまくるこのやり方にこだわる限り、
    大幅な速度向上は期待できないでしょう。




    >独自に足し算及び引き算の筆算を再現した処理の作成に成功しました。
    >必要ならば次のレスポンスで公開させていただきます。


    要りません。




    >独自の処理を構築した理由は二つあります。
    >・自分が作成したものではないので、迂闊にカスタマイズができない。

    前回の質問時に示されたコードを
    >焦らず、
    >じっくりと、
    >読み解く
    は、試みていない、ということでよろしいでしょうか。


    なんにせよ、
    例え他人の作ったものでも、どういう処理を行っているかを読み解きさえすれば、カスタマイズが可能です。
    もちろん、元のコードの分かりやすさや、個人のコード作成・読解に対する向き不向きや慣れなど、色々関わりますが。

    そもそも今回の質問自体、ある意味では回答者に対して、
      他人の作ったものをカスタマイズして欲しいと依頼している
    という事に他ならない、ということは理解した上で。
    「他人が組んだコードだから弄くれない」
    とおっしゃるのですか?


    ・理解しようと努力するのがめんどくさいから、ぱっと見で分かる所以外は弄くらない事にした(この方針そのものは、悪い方針だとは言えません。極論すれば動けば良いんですから)
    ・理解しようとしたが、どうしても理解できなかった

    などのような理由であれば、それはそれで一つの立派な理由かと。


    >・引き算に対応していない。
    足し算と引き算は同じものですから、
    引き算への対応も、読み解いてさえいれば容易に可能です。

    読み解くことが不可能であったか、読み解く気がなかったか、のどちらか以外には考えられません。


    つまり、独自処理にした理由はただ一つ、
    前回に示されたコードを理解できなかった、もしくは理解しようとすることをやめた(しなかった)
    からです。
    (そのことを自覚していれば、別に酷い理由では無いと思います)




    >簡単な方法も試しました。それでも駄目だったんです。
    >私のミスかもしれませんが、今となってはその理由もわかりません。

    そうですか。
    …えー、「頑張ったみたいですね」とでもレスすれば良いのでしょうか?




    ということで

    ・このような方法でなければならないのか(違う方法ではダメなのか)
    ・前回に示されたコードは理解できておらず、これ以上理解しようと努力するのは諦めている、ということか

    について回答願います。

    では




    PS.
    少なくとも、大きな桁の掛け算を行うだけであれば

    「a」「b」が "値を一桁ごとにリスト化したもの" である必要は無いでしょう。
    (そもそも私にはリスト化する必要すら無いように思いますが、それは脇に置いといて、と)


    例えば、一桁ではなくて二桁ずつで区切るなどすれば、
    リストに含まれる要素数は減り、
    For文で回す回数は確実に減り、
    自然と処理速度も上がります。

    (「二桁*二桁」を、わざわざ「一桁*一桁を4回やってから足す」とやれば、
     普通に 「二桁*二桁」 を計算させるよりも遅くなるのは、試してみればすぐ分かることかと)


    まあ、二桁以上ずつにしてしまうと「筆算」と言えなくなるのが問題なのかもしれませんが
引用返信/返信 削除キー/
■20309 / inTopicNo.5)  Re[4]: 掛け算(筆算?)の処理速度を向上させるには?
□投稿者/ 匿名希望 -(2007/09/08(Sat) 19:38:47) [ID:2eMbhZ9o]
    中箱さんにとっては非常に残念な回答かもしれませんが、
    確かに私は以前のコードの解析をあきらめてしまいました。
    そのものの公開が必要ないというのであれば、
    足し算と引き算に関する点だけでも説明します。
    足し算や引き算の処理ではFor文は総合的に使った1回だけに止めております。

    一桁ずつのリストにしてしまった以上
    後には引けないと私は思っています。
    一桁ずつのリストを利用したものには
    他にどのような方法があるのでしょうか。

引用返信/返信 削除キー/
■20310 / inTopicNo.6)  Re[5]: 掛け算(筆算?)の処理速度を向上させるには?
□投稿者/ 中箱 -(2007/09/08(Sat) 20:11:42) [ID:8NrUE61r]
    2007/09/08(Sat) 20:32:29 編集(投稿者)

    >中箱さんにとっては非常に残念な回答かもしれませんが、
    >確かに私は以前のコードの解析をあきらめてしまいました。

    了解です。
    あえて表現するならば、「もしかして」が「やっぱり」になっただけですのでお気になさらず。


    >そのものの公開が必要ないというのであれば、
    >足し算と引き算に関する点だけでも説明します。
    >足し算や引き算の処理ではFor文は総合的に使った1回だけに止めております。

    そうですか。


    例え、そのものを提示していただいた所で
    この件を解決することに関しては何の参考にもならないだろう、と判断した上での
    「要りません」
    だったのですが…すでに説明をされた以上は今更ですね。



    >一桁ずつのリストにしてしまった以上
    >後には引けないと私は思っています。

    そうですか。

    処理速度よりも、自作したものという(私から見れば)意地じみたもの?を優先する、という方針ということですね。

    そういう優先順位も、アリといえばアリなのでしょう。


    ただ、そういう方針であるなら、
    別に自分が口を出さなくていいな、と私は思いましたので
    以後のレスは控えさせていただきます。



    最後に一言、

    最初の質問文に、「一桁ずつのリストを使うことが前提である」ことさえ一言書いておけば、
    お互い無駄なレスをしなくて済んだかと思います。


    この数回のやりとりが、今後の質問に生かされることを望みます。

    頑張ってください。
    では
引用返信/返信 削除キー/
■20311 / inTopicNo.7)  Re[6]: 掛け算(筆算?)の処理速度を向上させるには?
□投稿者/ 匿名希望 -(2007/09/10(Mon) 18:28:59) [ID:2eMbhZ9o]
    ↓掛け算ここから

    For i = 1 To LLength(a)
     For j = 1 To LLength(b)
      If Len(LIndex(a,i) * LIndex(b,j)) = 2 Then
       n[(i + (j - 1))] = n[(i + (j - 1))] + Right(LIndex(a,i) * LIndex(b,j),1)
       n[(j + i)] = n[(i + j)] + Left(LIndex(a,i) * LIndex(b,j),1)
      Else
       n[(i + (j - 1))] = n[(i + (j - 1))] + (LIndex(a,i) * LIndex(b,j))
      EndIf
     Next
    Next
    For i = 1 To ((Len(Args(1)) + Len(Args(2))) - 1)
     temp = n[i] + shift[i]
     If temp > 9 Then
      If temp > 99 Then
       shift[i + 2] = shift[i + 2] + Left(temp,1)
       shift[i + 1] = shift[i + 1] + Mid(temp,2,1)
       temp = Right(temp,1)
      Else
       shift[i + 1] = shift[i + 1] + Left(temp,1)
       temp = Right(temp,1)
      EndIf
     Else
      shift = 0
     EndIf
     answer = "$(temp)$(answer)"
    Next

    ↑掛け算ここまで

    中箱さん、ありがとうございます。
    中箱さんのおかげでなんとかここまではできました。

    For文を1個にしたいのですが、
    回数不定の計算のやり方がわかりません。

    回数不定というのは
    「1+1+1」にも
    「1+1」にもなる可能性があるということです。
    こういった計算を一まとめにして行うにはどうすればいいのでしょうか。
    これさえわかればあとはできるような気がするのです。
    どうすればいいのでしょうか。
引用返信/返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Pass/

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

- Child Tree -
- Antispam Version -