【问题标题】:Parallel for loop with BigINtegers使用 BigINtegers 的并行 for 循环
【发布时间】:2019-07-25 10:14:07
【问题描述】:

所以我正在开发一个程序来分解给定的数字。您在命令行中编写一个数字,它会为您提供所有因素。现在,按顺序执行此操作非常慢。因为它只使用一个线程,如果我没记错的话。现在,我想用Parallel.For 来做这件事,它只对整数有效,所以想用 BigIntegers 试试

这里是正常代码:

public static void Factor(BigInteger f)
        {
            for(BigInteger i = 1; i <= f; i++)
            {
                if (f % i == 0)
                {
                    Console.WriteLine("{0} is a factor of {1}", i, f);
                }
            }
        }

上面的代码应该很容易理解。但正如我所说,这对于大数字来说非常慢(超过 10 亿它开始变得不切实际),这是我的并行代码:

public static void ParallelFacotr(BigInteger d)
        {
            Parallel.For<BigInteger>(0, d, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, i =>
            {
                try
                {
                    if (d % i == 0)
                    {
                        Console.WriteLine("{0} is a factor of {1}", i, d);
                    }
                }
                catch (DivideByZeroException)
                {
                    Console.WriteLine("Done!");
                    Console.ReadKey();
                    Launcher.Main();
                }

            });
        }

现在,上面的代码(并行代码)可以很好地处理整数(int),但速度非常快。它在 2 秒内分解了 1000.000.000。所以我想为什么不尝试使用更大的整数。而且,我认为将&lt;Biginteger&gt; 放在parallel.for 之后就可以了。但事实并非如此。那么,您如何在 for 循环中并行处理 bigintegers 呢?我已经尝试了一个以 bigInteger 作为参数的常规并行循环,但是它给出了一个错误,说它不能从 BigInteger 转换为 int。那你呢

【问题讨论】:

    标签: c#


    【解决方案1】:

    首先提高您的算法效率。

    虽然可以使用 BigInteger,但您不会使用 CPU ALU 算术逻辑来解决硬件中的任意大数字逻辑,因此它会明显变慢。因此,除非您需要大于 9 quintillion 或恰好 9,223,372,036,854,775,807 的数字,否则您可以使用类型 long

    第二件事是你不需要遍历所有元素,因为它需要是多个元素,所以你可以减少

    for(BigInteger i = 1; i <= f; i++)
    for(long i = 1; i <= Math.Sqrt(f); i++)
    

    这意味着您不需要迭代超过 1000000000 个项目,而是迭代 31623 个项目。

    此外,如果您仍打算使用 BigInt,请检查参数:

    应该是

    Parallel.For(
       0,
       (int)d,
       () => BigInteger.Zero,
       (x, state, subTotal) => subTotal + BigInteger.One,
    

    只是为了琐事。一些编程语言在解决问题方面比其他语言更有效,在这种情况下,有一种语言 Wolfram(以前的 Mathematica)解决问题更简单,前提是你知道自己在做什么。

    但是他们确实有谷歌替代品,可以直接回答你,并且它有一个不错的人工智能,可以处理你的自然语言,尽可能地给你一个准确的答案。

    所以找到数字的因数很容易:

    Factor[9223372036854775809]
    

    或者使用web api https://www.wolframalpha.com/input/?i=factor+9223372036854775809

    您也可以从 C# 调用 Wolfram 内核,但须遵守条款和条件。

    【讨论】:

    • 谢谢!这个commentaar帮助很大
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多