实现一个函数inv(n),该函数返回python中Zn中可逆元素的数量

实现一个函数inv(n),该函数返回python中Zn中可逆元素的数量,python,function,Python,Function,我做这个作业已经一个多小时了,我甚至不知道从哪里开始。我想了解如何得到答案,而不仅仅是得到答案。我在python中工作。问题是: 实现一个函数inv(n),返回Zn中可逆元素的数量。例如,inv(5) 应输出4和inv(100)应输出40 谢谢 结果: 4 40 函数inv通常称为 计算它的一种方法是使用一个事实,即它等于除以n的每个素数p的(1-1/p)乘积的n倍 使用一个Erastothenes筛选,您可以相对高效地计算它,代码在时间O(sqrt(n)*logn)内运行 我将从def in

我做这个作业已经一个多小时了,我甚至不知道从哪里开始。我想了解如何得到答案,而不仅仅是得到答案。我在python中工作。问题是:

实现一个函数
inv(n)
,返回Zn中可逆元素的数量。例如,
inv(5)
应输出
4
inv(100)
应输出
40

谢谢

结果:

4
40

函数
inv
通常称为

计算它的一种方法是使用一个事实,即它等于除以n的每个素数p的(1-1/p)乘积的n倍

使用一个Erastothenes筛选,您可以相对高效地计算它,代码在时间O(sqrt(n)*logn)内运行


我将从def inv(n)开始:。。。没人知道你在说什么。。。我们不上那门课。。。乔兰·比斯利:例如,如果你“甚至不知道从哪里开始”我怀疑你现在的问题在于
python
function
(你使用的标记),可能更多的是关于数学/算法/…你编辑了这个问题,让它变得难以理解。它以前要求可逆元素的数量,并给出了一些例子,但现在它要求“乘法元素”的数量,这并不意味着什么。
4
40
import math

def totient(n):
    sn = int(math.sqrt(n)) + 2
    a = [True] * sn
    result = n
    for i in xrange(2, sn):
        if not a[i]:
            continue
        for j in xrange(i * 2, sn, i):
            a[j] = False
        if n % i == 0:
            result = result - result // i
    if result == n:
        # n is prime.
        result -= 1
    return result

for i in xrange(1, 101):
    print i, totient(i)