在本文中,给出了使用二进制分裂的Chudnovsky pi公式的快速递归公式.在python中:
C = 640320
C3_OVER_24 = C**3 // 24
def bs(a, b):
if b - a == 1:
if a == 0:
Pab = Qab = 1
else:
Pab = (6*a-5)*(2*a-1)*(6*a-1)
Qab = a*a*a*C3_OVER_24
Tab = Pab * (13591409 + 545140134*a) # a(a) * p(a)
if a & 1:
Tab = -Tab
else:
m = (a + b) // 2
Pam, Qam, Tam = bs(a, m)
Pmb, Qmb, Tmb = bs(m, b)
Pab = Pam * Pmb …
Run Code Online (Sandbox Code Playgroud) 我需要做一些实时DFT,当我可以将样本数量分解成小因子时,我使用的算法效率最高.
假设我有一个数字n
和因素2, 3, 5
.如何找到最接近的数字(相比较n
),其素数因子化除了没有数字2,3,5
?
n
几乎总是在下面,50,000
所以粗暴的强迫可能是一个好主意.
我有一个函数可以逐字节读取文件并将其转换为浮点数组。它还返回所述数组中的元素数量。现在我想将数组重塑为二维数组,形状尽可能接近正方形。
我们以数字 800 为例:
sqrt(800) = 28.427...
现在我可以通过反复试验找出25*32
我正在寻找的解决方案。如果整数相乘的结果太高,我会递减sqrt
(四舍五入到最接近的整数),如果结果太低,我会增加它们。
我知道对素数执行此操作的算法,但这对我来说不是必需的。我的问题是,即使我实现的蛮力方法有时也会卡住并且永远无法完成(这就是我任意限制迭代的原因):
import math
def factor_int(n):
nsqrt = math.ceil(math.sqrt(n))
factors = [nsqrt, nsqrt]
cd = 0
result = factors[0] * factors[1]
ii = 0
while (result != n or ii > 10000):
if(result > n):
factors[cd] -= 1
else:
factors[cd] += 1
result = factors[0] * factors[1]
print factors, result
cd = 1 - cd
ii += 1
return "resulting factors: {0}".format(factors)
input = 80000
factors = factor_int(input)
Run Code Online (Sandbox Code Playgroud)
使用上面的脚本,输出将陷入循环打印 …
我正在学习数学课程,我们必须做一些整数分解作为问题的中间步骤.我决定编写一个Python程序来为我做这个(我们没有测试我们的因素能力,所以这完全在板上).该计划如下:
#!/usr/bin/env python3
import math
import sys
# Return a list representing the prime factorization of n. The factorization is
# found using trial division (highly inefficient).
def factorize(n):
def factorize_helper(n, min_poss_factor):
if n <= 1:
return []
prime_factors = []
smallest_prime_factor = -1
for i in range(min_poss_factor, math.ceil(math.sqrt(n)) + 1):
if n % i == 0:
smallest_prime_factor = i
break
if smallest_prime_factor != -1:
return [smallest_prime_factor] \
+ factorize_helper(n // smallest_prime_factor,
smallest_prime_factor)
else:
return [n]
if n < 0: …
Run Code Online (Sandbox Code Playgroud) 嘿,所以我正在制作一个保理程序,我想知道是否有人能够以有效的方式给我任何想法,找到两个数字到指定数字的多个,并且还添加到指定的数字.
比如我可能有
(a)(b)= 6
a + b = 5
所以基本上我只需要一种方法来找到a和b值.在这种情况下,他们将是2和3.
任何人都可以给我任何关于从哪里开始的想法?还必须考虑使用负数.
所以我对递归的想法是新的,我写了这个简单的代码来计算一个数字($ n)这是代码:
$n = 120;
$y = 1;
function factor($n, $y) {
if($y > $n) {
return 1;
} else {
$x = $n / $y;
list($whole, $dec) = array_pad(explode('.', $x), 2, Null);
if($dec == '') {
echo 'x:' . $x . ' y:' . $y . '</br>';
return factor($n, ($y + 1));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是代码输出的内容:
x:120 y:1
x:60 y:2
x:40 y:3
x:30 y:4
x:24 y:5
x:20 y:6
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么它会在它完成之前停止?
我最近偶然发现了一个算法问题,我无法理解它.你得到一个正整数N <10 ^ 13,你需要选择一个非负整数M,这样得和:M N + N(N-1)/ 2的除数最小,介于1和N,包括在内.有人能指出我解决这个问题的正确方向吗?感谢您的时间.