- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
实际上,给定一个(可能非常大的)偶数 N,我想找到 N = F * R,其中 gcd(F,R) = 1, F>R,并且 F 尽可能小(因为我'将完全分解 F)。问题的核心是找到最大的除数 R,其中 R < sqrt(N)。
例如,N=36 应该给出 F=9 和 R=4。请注意,R 不一定是素数或素数次幂。请注意,我没有分解 N。对 F 和 R 的唯一限制是它们互质。
这是我快速而天真的版本,它正在运行:
def factor_partial(N):
for R in xrange(int(math.sqrt(N)),1,-1):
if N%R == 0 and gcd(R,N/R) == 1:
return N/R, R
我想象的另一种方法是按递增顺序查找除数,并在此过程中删除所有非除数的倍数。像这样的东西:
def factor_partial(N):
i = range(2, int(sqrt(N)) + 1)
while i:
if N % i[0] != 0:
remove_multiples(i, i[0]) #without removing i[0]
else:
if gcd(i[0], N/i[0]) == 1:
R = i[0]
i.pop(0) #remove i[0]
return N/R, R
我认为这会很慢并且会占用大量内存,但也许如果 i
是一个生成器,它可能会很高效。我没怎么用过发电机。
我可以改进第一个版本吗?第二个版本是否可行(我该怎么做)?有没有更好的完全不同的方法?
在 python、c 或伪代码中寻找答案。
这是一个关于数论类(class)的项目。我正在实现基于 Pocklington 的素数测试.虽然我需要一个因式分解算法,但我们还没有研究过任何算法,而且我可能不会使用二次筛之类的算法,它超出了我的类(class)范围。我正在寻求有关所提出问题的具体帮助。
最佳答案
维基百科有一个很好的分解算法列表:http://en.wikipedia.org/wiki/Integer_factorization#Factoring_algorithms
您的第二种方法有效地使用了筛子,并且具有在 N 是某个小素数的倍数时快速减少问题的良好特性。可以通过遍历素数而不是 2..sqrt(n) 的所有可能除数来改进代码。
此外,您可能希望从素性测试开始,以便在进行其他工作之前知道 N 是合数。
你的笔记说你没有分解 N 但问题是相关的。搜索 F 和 R 相当于探索 N 的素因子的非重叠组合。
在N==36
的情况下, N 的质因数分解为 2, 2, 3, 3
. F 和 R 的因子必须包括所有这些(因此 F*R==N
)并且不能有重叠(因此 GCD(F,R)==1
)。所以 4 和 9 立即出现。
一个更有启发性的例子可能是N==23256
.它的分解是2,2,2,3,3,17,19
.由于 F 和 R 之间不能有重叠,每个素数碱基只能进入两个桶中的一个(即你要么得到所有的两个,要么一个都没有) .因此,我们可以将这些因素分组为 8,9,17,19
.要找到 R,我们需要那些尽可能大但低于 152.49(23256 的平方根)的因子的组合。我们的选择是 {8}、{9}、{8,9}、{8,17} , {8,19}。其中最大的是 8*19
也就是152。对应的F是17*19
或 153。
上面列出的选择计算为[choice for choice in powerset([8,9,17,19]) if prod(choice) < math.sqrt(N)]
.
所以整个程序几乎可以归结为:
prime_factors = factorize(N) # [2,2,2,3,3,17,19]
clusters = [p**e for p, e in collections.Counter(prime_factors).items()] # [8,9,17,19]
R = max(prod(group) for group in powerset(clusters) if prod(group) < math.sqrt(N))
F = N // R
powerset只要集合的生成超过 N 的平方根,就可以通过修剪集合的生成来加快搜索速度。
请记住,因式分解的计算成本很高,幂集增长非常快,但它可能比开始原始算法要少得多,原始算法从 N 的平方根开始并向下计算.
关于python - 找到小于 sqrt(N) 的 N 的最大约数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8272905/
我看到以下宏 here . static const char LogTable256[256] = { #define LT(n) n, n, n, n, n, n, n, n, n, n, n,
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
所以我得到了这个算法我需要计算它的时间复杂度 这样的 for i=1 to n do k=i while (k<=n) do FLIP(A[k]) k
n 的 n 次方(即 n^n)是多项式吗? T(n) = 2T(n/2) + n^n 可以用master方法求解吗? 最佳答案 它不仅不是多项式,而且比阶乘还差。 O(n^n) 支配 O(n!)。同样
我正在研究一种算法,它可以在带有变音符号的字符(tilde、circumflex、caret、umlaut、caron)及其“简单”字符之间进行映射。 例如: ń ǹ ň ñ ṅ ņ ṇ
嗯..我从昨天开始学习APL。我正在观看 YouTube 视频,从基础开始学习各种符号,我正在使用 NARS2000。 我想要的是打印斐波那契数列。我知道有好几种代码,但是因为我没有研究过高深的东西,
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭12 年前。 Improve th
谁能帮我从 N * N * N → N 中找到一个双射数学函数,它接受三个参数 x、y 和 z 并返回数字 n? 我想知道函数 f 及其反函数 f',如果我有 n,我将能够通过应用 f'(n) 来
场景: 用户可以在字符串格式的方程式中输入任意数量的括号对。但是,我需要检查以确保所有括号 ( 或 ) 都有一个相邻的乘数符号 *。因此 3( 应该是 3*( 和 )3 应该是 )*3。 我需要将所有
在 Java 中,表达式: n+++n 似乎评估为等同于: n++ + n 尽管 +n 是一个有效的一元运算符,其优先级高于 n + n 中的算术 + 运算符。因此编译器似乎假设运算符不能是一元运算符
当我阅读 this 问题我记得有人曾经告诉我(很多年前),从汇编程序的角度来看,这两个操作非常不同: n = 0; n = n - n; 这是真的吗?如果是,为什么会这样? 编辑: 正如一些回复所指出
我正在尝试在reveal.js 中加载外部markdown 文件,该文件已编写为遵守数据分隔符语法: You can write your content as a separate file and
我试图弄清楚如何使用 Javascript 生成一个随机 11 个字符串,该字符串需要特定的字母/数字序列,以及位置。 ----------------------------------------
我最近偶然发现了一个资源,其中 2T(n/2) + n/log n 类型 的递归被 MM 宣布为无法解决。 直到今天,当另一种资源被证明是矛盾的(在某种意义上)时,我才接受它作为引理。 根据资源(下面
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我完成的一个代码遵循这个模式: for (i = 0; i < N; i++){ // O(N) //do some processing... } sort(array, array + N
有没有办法证明 f(n) + g(n) = theta(n^2) 还是不可能?假设 f(n) = theta(n^2) & g(n) = O(n^2) 我尝试了以下方法:f(n) = O(n^2) &
所以我目前正在尝试计算我拥有的一些数据的 Pearson R 和 p 值。这是通过以下代码完成的: import numpy as np from scipy.stats import pearson
ltree 列的默认排序为文本。示例:我的表 id、parentid 和 wbs 中有 3 列。 ltree 列 - wbs 将 1.1.12, 1.1.1, 1.1.2 存储在不同的行中。按 wbs
我的目标是编写一个程序来计算在 python 中表示数字所需的位数,如果我选择 number = -1 或任何负数,程序不会终止,这是我的代码: number = -1 cnt = 0 while(n
我是一名优秀的程序员,十分优秀!