Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如果我可以在多达10^6次的计算中完成这项任务,那么如何获得10^18范围内的所有因子,即除数?_Algorithm_Math_Numbers - Fatal编程技术网

Algorithm 如果我可以在多达10^6次的计算中完成这项任务,那么如何获得10^18范围内的所有因子,即除数?

Algorithm 如果我可以在多达10^6次的计算中完成这项任务,那么如何获得10^18范围内的所有因子,即除数?,algorithm,math,numbers,Algorithm,Math,Numbers,我在获取一个数的所有因子时遇到了一些问题,我已经尝试了这段代码,但这给了我在竞争性编程问题上的一些技巧 for i in range(1,int(N**0.5)+1): if N%i==0: S.add(i) S.add(N//i) 我想用筛子来获取所有因素。我不想只找到计数,而是在列表中实际访问它们!我希望有人能向我解释如何在其中使用Erasethosense的Sieve除非你需要在小范围内计算许多数字的除数,否则Sieve不是这样做的方法。要找到一个数的除数,请将其因子化,

我在获取一个数的所有因子时遇到了一些问题,我已经尝试了这段代码,但这给了我在竞争性编程问题上的一些技巧

for i in range(1,int(N**0.5)+1):
if N%i==0:
    S.add(i)
    S.add(N//i)

我想用筛子来获取所有因素。我不想只找到计数,而是在列表中实际访问它们!我希望有人能向我解释如何在其中使用Erasethosense的Sieve

除非你需要在小范围内计算许多数字的除数,否则Sieve不是这样做的方法。要找到一个数的除数,请将其因子化,然后计算除数。这是Python的版本:

def divisors(n):
    fs = factors(n)
    divs = [1]
    for f in fs:
        temp = divs[:]
        for d in divs:
            if f * d not in temp:
                temp.append(f*d)
        divs = temp
    return sorted(divs)

在我的电脑中,它运行得非常快,它会给你所有的因素,但它是Java的,如果这有帮助的话

public class Factoring
{
   private static Set<Long> findFactors(long num)
   {
      Set<Long> nn = new HashSet<>();

      for (long i = 2; i <= Math.sqrt(num); i++)
         if (num % i == 0)
         {
            nn.add(i);
            nn.add(num / i);
         }

      return nn;
   }

   public static void main(String[] args)
   {
      Set<Long> myTreeSet = new TreeSet<>(findFactors(10050000911364137L));
      System.out.println(myTreeSet);
   }
}

-有了动画,当“X”除以“Y”时,除了重新计算之外,你可以使用“X”的所有因子的结果到“Y”。@zmb我认为wiki已经帮了我很多,所以我选择在这里写一个问题:)@ManojBanik如果你能为它写一个代码,那将是一个很大的帮助:(因为我在理解这么大的数字时遇到了一些问题,即使是一个位集,您仍然需要很多TB的ram,更不用说时间复杂性了……实际上,根据这个问题,我真的想对一系列数字使用除数,然后访问它们:)这里的因子是指素因子?是的,我指的是素因子。在任何合理的时间内,你都不会筛选到10**18。所以所有的工作都是通过
因子(n)完成的
如果
n
是大小为10^18的素数,则最有可能需要10^6次以上的运算。对大小为10**18的复合数进行因子分解不需要10^6次运算。只有当您将自己限制在试验除法时才是如此,这非常缓慢。其他因子分解算法要快得多。“TreeSet”允许您对所有因子进行排序,如果您不需要对它们进行排序,您可以使用Set,这将比这个稍快。您还可以缓存sqrt结果。
int sqrt=(int)Math.round(Math.sqrt(num));
i表示素数(~10^18)这个算法需要10^9运算,这超出了问题的10^6限制。@vivek_23我在编译时知道Java缓存该值,不是吗?问题并没有要求“非常快”,它要求的解决方案需要少于10**6个步骤。这更像是10**9个步骤。我不知道为什么问题中给出了10**6,但它就是这么说的。
[5233, 131627, 14590507, 688804091, 76352123131, 1920504664889]