【问题标题】:Efficient way to compute Eulers Totient Function for big input为大输入计算欧拉总函数的有效方法
【发布时间】:2021-05-09 09:03:39
【问题描述】:

根据维基百科关于Euler's Totient Function 的描述,我编写了以下代码:

from math import gcd

def phi(n):
    amount = 0
    for k in range(1, n + 1):
        if gcd(n, k) == 1:
            amount += 1
    return amount

它适用于小数字,但我想计算数字的 totient 函数,例如 n = 5692297035794675412610596123456169

有没有更好的方法来计算大输入的 Totoent 函数?

【问题讨论】:

  • 你需要用到一些数学。蛮力是不够的。
  • 如果这是 RSA 并且您的大数是 N = p*q 其中 p 和 q 是素数,那么有一种非常简单的方法可以计算 totient(N)。一点研究会帮助你。
  • 大?多大? factor(5692297035794675412610596123456169)phi = (47-1) * (2819-1) * (65713-1) * (891551-1) * (57247819-1) * (12809677289-1)
  • 这能回答你的问题吗? Computing Eulers Totient Function

标签: python python-3.x cryptography


【解决方案1】:

由于这也被标记为密码学,这更多地涉及到可能算法的有效性。

如果您知道n 的主要因子,则有一种方法可以非常快速地计算 Euler Totient φ。让 pik 的不同素数因子 n 然后

φ(n) = (p1 -1) * (p2-1) * ... * (pk -1)

也有一个主要力量的公式。这里没有必要这样做,因为 RSA 加密/签名或 Paillier 加密或 Rabin 签名都使用 n = p*q 和两个不同的素数 pq

正如我们所见,有效地找到 φ(n) 需要分解的知识。事实证明,对于 RSA,φ(n) 的知识等于n 的因式分解。一会儿看这里;

或参见原始 RSA 论文;

如果我们转向分解 (RSA),则在 2020 年达到的当前记录 CADO-NFSfactored828-bit n,具有“大约 2700 个核心年,使用 Intel Xeon Gold 6130 CPU 作为参考 (2.1GHz) )”。

但是,如果您需要使用 RSA,则应使用大小至少为 2048 位的模数,请参阅keylength.com。至少在一段合理的时间内,从经典分解和 Shor 的量子分解算法中分解是安全的。

因此,如果您不知道因式分解,则没有有效的算法来找到大n 的欧拉总数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2013-09-17
    相关资源
    最近更新 更多