带有任务的欧拉数

2024-04-18

我想使用这个公式 =Σ((3k) 计算多线程的欧拉数 ^2 + 1)/(3k)! , k =0,... ,∞ ,但到目前为止我没有得到正确的结果,其中一个问题是,当我使用相当大的数字时,我超出了阶乘函数的小数范围,这就是我的结果到目前为止已经完成了

static void Main(string[] args)
{
   Console.WriteLine(Program.Calculate(5, 1));
}
public static decimal Calculate(int x, byte taskNumber)
{
   var tasks = new List<Task<decimal>>();

   for (int i = 0; i < x; i += (x / taskNumber))
   {
        int step = i;
        tasks.Add(Task.Run(() =>
        {
            int right = (step + x / taskNumber) > x ? x : (step + x / taskNumber);
            return ChunkE(step + 1, right);
        }));
    }

    Task.WaitAll(tasks.ToArray());

    return tasks.Select(t => t.Result).Aggregate(((i, next) => i + next));
    }

然后我有简单的阶乘和欧拉函数

public static decimal ChunkFactorial(int left, int right)
{
    //Console.WriteLine("ChunkFactorial Thread ID :" + Thread.CurrentThread.ManagedThreadId);
    if (left == right)
    {
        return left == 0 ? 1 : left;
    }
    else
    {
        return right * ChunkFactorial(left, right - 1);
    }
}

public static decimal ChunkE(int left, int right)
{
    if(left == right)
    {
        return left == 0 ? 1 : left;
    }
    else
    {
        return ((3 * right) * (3 * right) + 1) / ChunkFactorial(left, right) + ChunkE(left, right - 1);
    }
}

我想要实现的是计算欧拉数直到x使用不同数量的任务的精度。

如果我增加的话,我通过这个电话得到的是 41.01666..7x小数最终会溢出。我怎样才能解决这个问题我尝试使用 BigInteger 但后来它开始变得混乱并且我失去了结果的精度..有什么想法吗?

另外,当我用 1 个任务启动程序时,我得到一个结果,当我用 4 个任务(或 1 个不同的任务)启动程序时,我得到不同的结果,我不知道我错过了什么。


如果您被允许在实施之前改变条款,请考虑

(3k)^2/(3k)! = (3k)/(3k-1)! = 1/(3k-2)!+1/(3k-1)!

然后证明你的公式确实计算了欧拉数。

但你需要在 (3k) 中包含因子 3!在阶乘计算中。

使用浮点类型进行阶乘计算应该是完全可以的,因为在溢出发生之前很久就应该达到所需的精度。请注意,误差范围是部分和中下一项的两倍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有任务的欧拉数 的相关文章

随机推荐