Python 有可能使用素数(而不是素数分解)来找到GCD吗?

Python 有可能使用素数(而不是素数分解)来找到GCD吗?,python,primes,prime-factoring,greatest-common-divisor,Python,Primes,Prime Factoring,Greatest Common Divisor,我有一个代码挑战,要求我们使用前面的函数创建3个函数。我们使用的是“基本python”,因此没有导入。没有lambdas的版本将是理想的,但两者都是受欢迎的 查找系数功能 is_prime函数-使用find_factors函数 hcf函数-使用is_prime函数 前两个函数返回因子和素数,is_prime函数按照讲师的要求使用find_factors函数 def find_factors(num): factors = [] for i in range(1,num+1):

我有一个代码挑战,要求我们使用前面的函数创建3个函数。我们使用的是“基本python”,因此没有导入。没有lambdas的版本将是理想的,但两者都是受欢迎的

  • 查找系数
    功能
  • is_prime
    函数-使用
    find_factors
    函数
  • hcf
    函数-使用
    is_prime
    函数
  • 前两个函数返回因子和素数,
    is_prime
    函数按照讲师的要求使用
    find_factors
    函数

    def find_factors(num):
        factors = []
        for i in range(1,num+1):
            if num%i==0:
                factors.append(i)
        return factors
    
    
    def is_prime(x):
        if x < 2:
            return False
        else:
            for a in (find_factors(x):
                if x % a == 0:
                    return False
        return True
    

    甚至可以从正规素数中找到HCF吗?也许我们的指导老师的意思是?

    比方说,你的
    查找因子
    返回一个数字的所有除数。然后,您可以检查
    x
    y
    的所有公约数,并取除数的最大值。从技术上讲,您不需要
    is_prime
    函数

    比如说,

    如果我们有12和4。让我们先找出这些因素。我们将从find_factors中以排序方式获取它们

    12有几个因素:1,2,3,4,6,12

    4具有以下因素:1、2、4

    可能的解决方案集=[1,2,4](仅限常用解决方案)

    GCD或最大公约数仅为两个列表中的最大公约数。因此,答案是4

    def find_factors(num):
        divs = []
        for value in range(1, num + 1):
            if num % value == 0:
                divs.append(value)
        return divs
    
    def hcf(x, y):
        divx = find_factors(x)
        divy = find_factors(y)
        pos_sol = set(divx).intersection(divy)
        return max(pos_sol)
    
    print(hcf(56, 12)) 
    
    更简单的版本:

    def find_factors(num):
        divs = []
        for value in range(1, num + 1):
            if num % value == 0:
                divs.append(value)
        return divs
    
    def is_prime(x):
        if x < 2:
            return False
        else:
            for a in range(2,x-1): # technically you can go upto sqrt(n) but if math is allowed 
                if x % a == 0:
                    return False
        return True
    
    def hcf(x, y):
        if is_prime(x) and is_prime(y):
            return 1
    
        divx = find_factors(x)
        divy = find_factors(y)
        pos_sol = [x for x in divx if x in divy]
        return max(pos_sol)
    
    print(hcf(4, 12)) 
    
    def find_因子(num):
    divs=[]
    对于范围(1,num+1)中的值:
    如果num%value==0:
    divs.append(值)
    返回divs
    def是_素数(x):
    如果x<2:
    返回错误
    其他:
    对于(2,x-1)范围内的a:#从技术上讲,你可以达到sqrt(n),但如果数学允许的话
    如果x%a==0:
    返回错误
    返回真值
    def hcf(x,y):
    如果是素数(x)和素数(y):
    返回1
    divx=查找系数(x)
    divy=查找系数(y)
    pos_sol=[x表示x在divx中,如果x在divy中]
    返回最大值(pos_sol)
    印刷品(hcf(4,12))
    
    比方说,您的
    查找因子
    返回一个数字的所有除数。然后,您可以检查
    x
    y
    的所有公约数,并取除数的最大值。从技术上讲,您不需要
    is_prime
    函数

    比如说,

    如果我们有12和4。让我们先找出这些因素。我们将从find_factors中以排序方式获取它们

    12有几个因素:1,2,3,4,6,12

    4具有以下因素:1、2、4

    可能的解决方案集=[1,2,4](仅限常用解决方案)

    GCD或最大公约数仅为两个列表中的最大公约数。因此,答案是4

    def find_factors(num):
        divs = []
        for value in range(1, num + 1):
            if num % value == 0:
                divs.append(value)
        return divs
    
    def hcf(x, y):
        divx = find_factors(x)
        divy = find_factors(y)
        pos_sol = set(divx).intersection(divy)
        return max(pos_sol)
    
    print(hcf(56, 12)) 
    
    更简单的版本:

    def find_factors(num):
        divs = []
        for value in range(1, num + 1):
            if num % value == 0:
                divs.append(value)
        return divs
    
    def is_prime(x):
        if x < 2:
            return False
        else:
            for a in range(2,x-1): # technically you can go upto sqrt(n) but if math is allowed 
                if x % a == 0:
                    return False
        return True
    
    def hcf(x, y):
        if is_prime(x) and is_prime(y):
            return 1
    
        divx = find_factors(x)
        divy = find_factors(y)
        pos_sol = [x for x in divx if x in divy]
        return max(pos_sol)
    
    print(hcf(4, 12)) 
    
    def find_因子(num):
    divs=[]
    对于范围(1,num+1)中的值:
    如果num%value==0:
    divs.append(值)
    返回divs
    def是_素数(x):
    如果x<2:
    返回错误
    其他:
    对于(2,x-1)范围内的a:#从技术上讲,你可以达到sqrt(n),但如果数学允许的话
    如果x%a==0:
    返回错误
    返回真值
    def hcf(x,y):
    如果是素数(x)和素数(y):
    返回1
    divx=查找系数(x)
    divy=查找系数(y)
    pos_sol=[x表示x在divx中,如果x在divy中]
    返回最大值(pos_sol)
    印刷品(hcf(4,12))
    
    使用is\u prime并找到hcf的因子

    代码

    def find_factors(num):
      factors = []
      for value in range(1, num + 1):
          if num % value == 0:
            factors.append(value)
    
      return factors
    
    def is_prime(x):
        if x < 2:
            return False
        else:
          # prime if only factors are 1 and itself
          # i.e. length factors equals 2
          return len(find_factors(x))==2 
    
    def hcf(a, b):
      if a == b:
        return a
      elif is_prime(a) and is_prime(b):
        return 1
    
      # We know factors are in ascending order
      # based upon how the list is generated
      f_a = find_factors(a)
      f_b = find_factors(b)
    
      for num in f_a[::-1]: # go in reverse order
                            # to get the highestest number first
        if num in f_b:     
          return num        # Found if in other list
    
    输出

    for a, b in [(5, 15), (2, 3), (24, 8)]:
        print(f'For {a} & {b}, hcf = {hcf(a, b)}')
    
    For 5 & 15, hcf = 5
    For 2 & 3, hcf = 1
    For 24 & 8, hcf = 8
    

    使用is_素数并找到hcf的_因子

    代码

    def find_factors(num):
      factors = []
      for value in range(1, num + 1):
          if num % value == 0:
            factors.append(value)
    
      return factors
    
    def is_prime(x):
        if x < 2:
            return False
        else:
          # prime if only factors are 1 and itself
          # i.e. length factors equals 2
          return len(find_factors(x))==2 
    
    def hcf(a, b):
      if a == b:
        return a
      elif is_prime(a) and is_prime(b):
        return 1
    
      # We know factors are in ascending order
      # based upon how the list is generated
      f_a = find_factors(a)
      f_b = find_factors(b)
    
      for num in f_a[::-1]: # go in reverse order
                            # to get the highestest number first
        if num in f_b:     
          return num        # Found if in other list
    
    输出

    for a, b in [(5, 15), (2, 3), (24, 8)]:
        print(f'For {a} & {b}, hcf = {hcf(a, b)}')
    
    For 5 & 15, hcf = 5
    For 2 & 3, hcf = 1
    For 24 & 8, hcf = 8
    


    对于
    查找系数
    ,缩进是否正确。现在它只返回num。它应该返回最小的除数吗?如果是这样的话,这似乎是一个误导性的名字。我不知道为什么这是误导。在
    find_factors
    函数中,我输入
    12
    ,它会吐出
    1,2,3,4,6,12
    。所有的缩进似乎都能工作。在您当前的实现中,它甚至不返回数组!即使你修正了缩进,它也会返回第一个除数。我以前在那里有一个打印行,这就是返回的原因。但我把指纹放回去了。我需要它吗?@Edison——扎比尔·阿尔·纳粹主义的评论就是我在之前的评论中提到的。当您没有将项目放入列表时,它怎么能吐出多个值?您的缩进是否正确,以
    find\u factors
    。现在它只返回num。它应该返回最小的除数吗?如果是这样的话,这似乎是一个误导性的名字。我不知道为什么这是误导。在
    find_factors
    函数中,我输入
    12
    ,它会吐出
    1,2,3,4,6,12
    。所有的缩进似乎都能工作。在您当前的实现中,它甚至不返回数组!即使你修正了缩进,它也会返回第一个除数。我以前在那里有一个打印行,这就是返回的原因。但我把指纹放回去了。我需要它吗?@Edison——扎比尔·阿尔·纳粹主义的评论就是我在之前的评论中提到的。当你不把项目放入列表时,它怎么能吐出多个值呢?嗨。抱歉,我已经修复了“查找因子”功能。谢谢好的,但是对于我们的挑战,我们应该有三个功能。第三个hcf函数需要使用is_素数函数。gcd与作为一个数素数没有关系,但只有共素数关系。hcf是否必须仅基于Is_primt,或者沿Is_primt可以进行其他检查/循环等?我们可以编写我们想要的任何内容,只要我们有三个函数,并且每个函数都使用前面的函数。我们不能使用导入或高级语法,因为我们还没有讨论它们。只需基于python<代码>查找系数
    是素数
    hcf
    。您了解第一个实现吗?你错过了什么?代码还是算法思维方式?@ZabirAlNazi非常感谢你。我明天就会明白的:)嗨。抱歉,我已经修复了“查找因子”功能。Th