MIPS编程指令计数问题

时间:2016-09-26 02:01:28

标签: mips

我写了这个mips代码来找到gcf,但我对获取为此代码执行的指令数量感到困惑。我需要找到一个线性函数作为在答案之前必须计算余数的次数的函数。我尝试使用Qtspim单步执行此代码但不确定如何继续。

gcf:
    addiu   $sp,$sp,-4              # adjust the stack for an item
    sw      $ra,0($sp)              # save return address

    rem     $t4,$a0,$a1             # r = a % b
    beq     $t4,$zero,L1            # if(r==0) go to L1
    add     $a0,$zero,$a1           # a = b
    add     $a1,$zero,$t4           # b = r
    jr      gcf

L1:
    add     $v0,$zero,$a1           # return b
    addiu   $sp,$sp,4               # pop 2 items
    jr      $ra                     # return to caller

1 个答案:

答案 0 :(得分:2)

这里没有什么新东西可以展示,你刚刚实现的算法是欧几里德算法,它在文献 1 中是众所周知的。

尽管如此,我仍然会在这里写一个非正式的分析,因为只有链接问题是邪恶的。

首先让我们用高级公式重写代码:

unsigned int gcd(unsigned  int a, unsigned int b)
{
   if (a % b == 0)
      return b;

   return gcd(b, a % b);
}

unsigned intint的选择由MIPS ISA决定,使得rem对于负操作数未定义。 < / p>

目标是找到一个函数 T(a,b),它给出算法计算 a b的GDC所需的步数

由于直接的方法没有任何结果,我们试图通过反转问题 什么对(a,b)使 T(a,b)= 1 ,换句话说,哪些对使 gcd(a,b)终止于一步? 我们显然必须 a%b = 0 ,这意味着 a 必须是 b 的倍数。
实际上有一个(可数)无限数量的对,我们可以将自己限制为最小的对, a b 2

总结一下,要让 T(a,b)= 1 我们需要 a = nb ,我们选择(a,b)=( 1,1)

现在,如果一对(c,d)需要 N 步骤,我们如何找到一对新的(a,b)这样 T(a,b)= T(c,d)+ 1

由于 gcd(a,b)必须更进一步,然后 gcd(c,d),因为从 gcd(a,b)开始< / em>下一步是 gcd(b,a%b)我们必须拥有:

c = b     => b = c
d = a % b => d = a % c => a = c + d

步骤d = a % c => a = c + d来自 a 的最小值,我们需要最小的 a ,当除以 c 时给出< em> d ,所以我们可以采用 a = c + d ,因为(c + d)%c = c%cd%c = 0 + d = d

如果 d%c = d 为真,我们需要 d&lt; ç的。
我们的基础对是(1,1),它不满足这个假设,幸运的是我们可以把(2,1)作为基础对(说服你的自己< em> T(2,1)= 1 )。

然后我们有:

gcd(3, 2) = gcd(2, 1) = 1
T(3, 2) = 1 + T(2, 1) = 1 + 1 = 2

gcd(5, 3) = gcd(3, 2) = 1
T(5, 3) = 1 + T(3, 2) = 1 + 2 = 3

gcd(8, 5) = gcd(5, 3) = 1
T(8, 5) = 1 + T(5, 3) = 1 + 3 = 4

...

如果我们查看对(2,1)(3,2)(5,3)(8,5),...我们看到第n对(从1开始)由数字(F n + 1 ,F <子>名词
其中 F n 是第n个斐波纳契数。

我们没有:

T(F n + 1 ,F n = n

关于斐波那契数,我们知道 F n αφ n

我们现在将使用渐近分析的所有技巧,特别是在考虑φ n φ n + 1 是一样的 此外,我们不会明确地使用big-O符号,而是假设每个等式在限制中都是正确的。这是滥用,但使分析更紧凑。

我们可以假设不失一般性, N 是该对中两个数的上界,并且它与φ n
我们有Nαφ n 给出 log φ N = n ,这可以改写为 log(N)/ log(φ)= n (其中日志在基数10中, log(φ)可以取为1/5)。
因此,我们最终得到 5logN = n 或以相反顺序编写

n = 5 logN

其中 n gcd(a,b)所采取的步数,其中 0&lt; b&lt; a&lt; Ñ

我们可以进一步证明,如果 a = ng b = mg n m 互质,因此,取出最小对的限制不是 T(a,b)= T(n,m)

1 如果你重新发现了这样的算法,我强烈反对继续阅读这个答案。你肯定会有一个敏锐的头脑,从挑战中获益最多,而不是从答案中获益 2 我们稍后会发现这不会导致失去普遍性。