具有大阶乘的数学(例如除法?

Mathematics with large factorials (e.g. division?)

本文关键字:除法 阶乘      更新时间:2023-10-16

我试图找到长度超过 50 的循环的 100 个数字的排列的百分比。这涉及由具有大阶乘的除法组成的数学,这些除法不能很快手动完成,所以我需要求助于编程。例如,这些术语包含

(3!/100!(*((99!/3!)+ (98!/2!)+ (97!/1!)+ (96!/0!

我可以重新排列所有术语以提供一个只需要除以 100 的大数 (>2^64( 即可得到我的答案。

我想了很久,对C++还是新手,我不确定如何用大数进行除法。通常,当我处理大阶乘时,我会将数字的数字输出到数组中并通过它进行乘法,但我不完全确定如何以这种方式进行除法。在C++处理大数数学的最佳方法是什么?

从方程的结构(非常大的阶乘乘与一些大小大致相同的大阶乘的倒数(可以明显看出,可能会发生很多抵消。这意味着这个问题可以用一些非常简单的代数来解决,即使没有任何计算,也需要一点额外的运气。

让我们用一些无辜的小字母代替阶乘,以避免被大数字吓倒。

根据定义,0! = 1 和 1!=1,我们可以跳过这些值并使用以下替换:

a = 2!, b = 3!,

v = 96!, w = 97!, x = 98!, y = 99!, z = 100!

这给了

(b/z)*(y/b + x/a + w + v)

扩大

b*(y/b + x/a + w + v) * 1/z

扩展分子(让我们使用一些 ASCII 艺术来提高易读性(

                      b*x
 y +  (b*w) + (b*v) + ---
                       a
 ------------------------
            z

将其全部压缩成一份

(a*y) + (a*b*w) + (a*b*v) + (x*b)
---------------------------------
             (a*z)

拆开

 a*y     a*b*w     a*b*v     x*b 
----- + ------- + ------- + -----
 a*z      a*z       a*z      a*z 

是的,看起来不错,我们可以把数字放回去

 2!*99!       2!*3!*96!       2!*3!*97!      3!*98!
--------- + ------------- + ------------- + ---------
 2!*100!       2!*100!         2!*100!       2!*100!

第一轮取消(可能在信件阶段已经完成(

  99!      3!*96!      3!*97!     3!*98!
------ + ---------- + -------- + --------
 100!       100!        100!      2!*100!

阶乘相互抵消,但只是部分抵消

第一步

 1         1*2*3        1*2*3     1*2*3
---  + ------------ + --------- + ------
100    97*98*99*100   98*99*100   1*2*99*100

第二步

 1           1            1          1
---  + ------------ + -------- + -------
100    97*98*33*50    98*33*50   2*33*50

公分母

97*98*33*50*2 + 100*2 + 100*97*2 + 100*97*98
--------------------------------------------
           100*97*98*33*50*2

通过分解 100 稍微按摩分子

97*98*33*50*2 + 100*(2*98 + 97*98)
----------------------------------
       100*97*98*33*50*2

部分

  97*98*33*50*2      100*(2*98 + 97*98)
----------------- + -------------------
100*97*98*33*50*2    100*97*98*33*50*2

取消

 1     2*98 + 97*98
--- + --------------
100   97*98*33*50*2

部分

 1        2*98             97*98
--- + -------------- + --------------
100   97*98*33*50*2    97*98*33*50*2 

取消

 1        1          1
--- + -------- + -------
100   97*33*50   33*50*2 

我们少了总结,摆脱了98。冲洗并重复,直到找到最终结果:

  1
 ----
  97

是的,有时你只需要一支锋利的铅笔和一张白纸;-(