【发布时间】:2008-12-20 20:51:36
【问题描述】:
嗯,我有这段代码大大减慢了程序的速度,因为它是线性复杂度,但被调用了很多次,使程序成为二次复杂度。如果可能的话,我想降低它的计算复杂度,否则我会尽可能地优化它。到目前为止,我已经减少到:
def table(n):
a = 1
while 2*a <= n:
if (-a*a)%n == 1: return a
a += 1
有人看到我错过的任何东西吗?谢谢!
编辑:我忘了说:n 总是一个素数。
编辑 2:这是我改进后的新程序(感谢所有贡献!):
def table(n):
if n == 2: return 1
if n%4 != 1: return
a1 = n-1
for a in range(1, n//2+1):
if (a*a)%n == a1: return a
编辑 3:在真实环境中对其进行测试,它要快得多!好吧,这个问题似乎已解决,但有很多有用的答案。我还应该说,除了上述优化之外,我还使用 Python 字典记住了函数...
【问题讨论】:
-
你多次调用这个:对于很多不同的 n 值?它们是 n 值的模式吗?
-
是否有可能会多次调用 n 的某些值? (在这种情况下,存储计算值可能会有一些价值,以节省重新运行计算)
-
n 的最大值是多少,通常有多大?
-
我添加了您的代码的改进(更快)版本...在我的答案中查看。
-
这个函数被调用(和记忆)许多不同的素数 n。有的 n 很大,有的很小...... strager,谢谢!
标签: algorithm python-3.x complexity-theory time-complexity