2010年2月22日月曜日

べき剰余っす

llModPowっていうのもあるんっすけど、
関数に設定されたディレイは脅威の1.0秒っす。
頻繁に使うものではないんっすけど、1.0秒は問題アリっす。
どうもぺんぎんっす( ◎v◎ )



タイムはディレイの関係もあって圧勝っす。
下のをそのまま使うと、だいたい102.7秒 vs 0.025秒っすね。
ケタが違うっす。
100回は少ないと思われるかも知れないっすけど、
誰かがTPしてきたりすると結果も違ってくるもんっすから、
ほぼ一定の条件で可能な2,3分でやりたかったわけっす。

ディレイなしとしても2.7秒 vs 0.025秒で100倍違うっすね。
あ、前置きが長くなったっすね。
下がコードっす。(テストコード含む)
pmModPowはllModPowと同じカタチっすから、
問題なく使えると思うっす。



integer pmModPow(integer a, integer b, integer c) // べき剰余を返す
{
  // a 底
  // b 指数
  // c 法
  integer result = 1;

  while(b > 0)
  {
    if((b & 1) == 1)
    {
      result = (result * a) % c;
    }

    b = b >> 1;
    a = (a * a) % c;
  }
  return result;
}

default
{
  // 以下テスト
  touch_start(integer num_detected)
  {
    integer test_a = 5;
    integer test_b = 7;
    integer test_c = 31;
    integer i;

    llResetTime();
    for(i = 0; i < 100; i++)
    {
      llModPow(test_a, test_b, test_c);
    }
    llOwnerSay("llModPow time:" + (string)llGetTime());

    llResetTime();
    for(i = 0; i < 100; i++)
    {
      pmModPow(test_a, test_b, test_c);
    }
    llOwnerSay("pmModPow time:" + (string)llGetTime());
  }
}

0 件のコメント:

コメントを投稿

Free Avatar