《深度剖析算法优化:提升效率与精度的秘诀》
想象一下,你面前有一堆杂乱无章的数据,你需要从中找到特定的信息,或者按照一定的规则对这些数据进行排序。又或者,你要为一个物流公司规划最佳的配送路线,以降低成本和提高效率。这些问题看似复杂,但都可以通过特定的算法来解决。算法就像是一把神奇的钥匙,为解决各种各样的问题提供了方法和途径。无论是在科学研究、商业运营还是日常生活中,算法都发挥着不可或缺的作用。
原型—源码
原型
import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
原型—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
一次优化—源码
任何一个数只需要找其小于开根号的整数即可
import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
一次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
二次优化—源码
跳过小于2的数
import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
二次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
三次优化—源码
在检查大于2的数时,只检查奇数
import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
三次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
四次优化—源码
先算乘积
import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
四次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
五次优化—源码
任何一个数只需要找其小于开根号的整数即可 先算乘积
import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0) if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
五次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
六次优化—源码
跳过小于2的数 先算乘积
import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0) if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
六次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
七次优化—源码
在检查大于2的数时,只检查奇数 先算乘积
import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0) if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
七次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
八次次优化—源码
p、q循环减半
import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
八次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
九次优化—源码
任何一个数只需要找其小于开根号的整数即可 p、q循环减半
import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
九次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
十次优化—源码
跳过小于2的数 p、q循环减半
import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
十次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq02函数,传入的参数是99460729。
-
优化建议:
-
优化
is_prime函数,只需要检查到sqrt(n)就可以了。 -
对于
prime_pq02函数,可以考虑使用更高效的算法,如试除法结合埃拉托斯特尼筛法来找出质数因子。 -
可以添加更多的错误检查和边界条件处理,例如检查输入的n是否为正整数。
下面是优化后的代码:
import math
import timedef is_prime(n):if n <= 1:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if is_prime(p) and n % p == 0:q = n // pif is_prime(q):print(p, '*', q)end = time.time()print(end - start)returnprint("No prime factors found")if __name__ == '__main__':prime_pq02(99460729)
这个优化后的代码应该会更快地找到99460729的两个质数因子。
十一次优化—源码
在检查大于2的数时,只检查奇数 p、q循环减半
import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
十一次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
十二次优化—源码
减少p、q循环时间,并对判断p、q为循环优化依次调用
import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
十二次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。
-
然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
十三次优化—源码
任何一个数只需要找其小于开根号的整数即可 减少p、q循环时间,并对判断p、q为循环优化依次调用
import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
十三次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。
-
然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
十四次优化—源码
跳过小于2的数 减少p、q循环时间,并对判断p、q为循环优化依次调用
import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
十四次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。
-
然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
最终优化—源码
在检查大于2的数时,只检查奇数 减少p、q循环时间,并对判断p、q为循环优化依次调用
import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
最终优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。
-
然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
高阶优化
思路:
1、优化is_prime函数,只需要检查到sqrt(n)就可以了。
2、prime_pq函数,可以考虑使用更高效的算法,如试除法结合埃拉托斯特尼筛法/Pollard's rho算法来找出质数因子。
3、并行化处理在多核处理器上运行,可以将筛选质数或者试除的过程进行并行化,进一步提高效率。
4、添加更多的错误检查和边界条件处理,例如检查输入的n是否为正整数。
以后有时间再来演示高阶算法。

相关文章:
《深度剖析算法优化:提升效率与精度的秘诀》
想象一下,你面前有一堆杂乱无章的数据,你需要从中找到特定的信息,或者按照一定的规则对这些数据进行排序。又或者,你要为一个物流公司规划最佳的配送路线,以降低成本和提高效率。这些问题看似复杂,但都可以…...
Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引工作原理,索引失效,索引创建原则等)
索引是数据库中用于加速查询操作的重要机制。通过索引,MySQL可以快速定位到满足查询条件的数据行,而不需要扫描整个表。合理的索引设计可以显著提高查询性能,但不合理的索引可能会导致性能下降和磁盘空间浪费。因此,理解索引的工作…...
matlab使用 BP 神经网络进行数据预测的完整流程,包括数据读取、数据预处理等等
%% 初始化程序 warning off % 关闭报警信息 close all % 关闭所有图窗 clear % 清空变量 clc % 清空命令行 setdemorandstream(172) %设置随机种子为1%% 读取数据 data xlsread(Y.xlsx); %% 划分训练集…...
systemd-networkd NetworkManager 介绍
systemd-networkd 和 NetworkManager 的详细介绍 systemd-networkd 和 NetworkManager 都是 Linux 系统中常用的网络管理工具,但它们的设计目标和使用场景不同。以下是它们的详细介绍、功能、使用场景和差异。 1. systemd-networkd systemd-networkd 是一个由 syst…...
本地部署项目管理工具 Leantime 并实现外部访问
Leantime 是一款开源 AI 项目。它可以在本地直接运行大语言模型 LLM、生成图像、音频等。直接降低了用户使用AI的门褴。本文将详细的介绍如何利用 Docker 在本地部署 Leantime 并结合路由侠实现外网访问本地部署的 Leantime 。 第一步,本地部署安装 Leantime 1&am…...
PHP cURL 函数初学者完全指南
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
C#中的Array数组,List集合和ArrayList集合--07
目录 一.Array数组概念的简单理解 1.数组的初始化 2.数组的长度 3.数组的克隆和复制 4.数组的清空 5.数组的查找 6.数组的逆转 7.数组的拓展和缩减 8.数组的比较 9.数组的合并 10.使用Array类中的静态方法,如Array.Sort,Array.BinarySearch 等 二.Array数组进阶 1.二…...
基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用
在使用 PySide6 进行开发时,管理应用程序的资源(如图标、图片、字体、样式表、音视频等)是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc,它能够将资源文件(.qrc)编译成 Python 模块,然后…...
硬件实用技巧:TPS54331DR横杠标识识别1引脚
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/145116969 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
《C++11》nullptr介绍:从NULL说起
在C11之前,我们通常使用NULL来表示空指针。然而,NULL在C中有一些问题和限制,这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中,NULL实际上是一个整数0,而不是一个真正的…...
自然语言处理基础:全面概述
自然语言处理基础:全面概述 什么是NLP及其重要性、NLP的核心组件、NLU与NLG、NLU与NLG的集成、NLP的挑战以及NLP的未来 自然语言处理(NLP)是人工智能(AI)中最引人入胜且具有影响力的领域之一。它驱动着我们日常使用的…...
网络安全的几种攻击方法
攻击方法 挂马: 就是在别人的网站文件里面放入网页木马或者是将代码潜入到对方正常的网页文件里,以使浏览者中马。 挖洞: 指漏洞挖掘。 加壳: 就是利用特殊的算法,将EXE可执行程序或者DLL动态连接库文件的编码进行改变(比如实现压缩、加密&a…...
国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)
参考文章:Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具,放到C盘根目录, 2.1 打开windows Powershell(WinX),下边那个最好。 输入两条指令&a…...
【pycharm发现找不到python打包工具,且无法下载】
发现找不到python打包工具,且无法下载 解决方法: 第一步:安装distutils,在CMD命令行输入: python -m ensurepip --default-pip第二步:检查和安装setuptools和wheel: python -m pip install --upgrade …...
C++ QT 自绘表盘
文章目录 效果图代码 效果图 代码 代码没什么好说的,直接上源码.h #pragma once#include <QWidget> #include <QPainter> #include <QResizeEvent> #include <QtMath> #include <QCoreApplication>class DialPlateWidget : public …...
数据科学与数据工程:两者的区别与交集
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...
MAC AndroidStudio模拟器无网络
先确认PC端是正常访问网络的; 模拟器端修改Wifi设置:设置 - 网络和互联网 - WALN设置 按照上图修改; IP设置:从DHCP修改为静态,IP地址:10.0.2.16 ,网关:10.0.2.2 , DNS…...
PHP语言的多线程编程
PHP语言的多线程编程 引言 在现代Web开发中,PHP以其简洁和易用性广受欢迎。它常用于构建动态网站和应用程序。然而,PHP本身是单线程的,这意味着它在处理多个任务时可能会受到性能限制。随着互联网的发展,对高并发、高可用性和实…...
当自动包布机遇上Profinet转ModbusTCP网关,“妙啊”,工业智能“前景无限
在自动化控制技术日新月异的当下,Profinet与ModbusTCP这两种协议在工业通信领域占据着举足轻重的地位。ModbusTCP是基于以太网的串行通信协议,而Profinet则是依托工业以太网的现场总线协议。它们在数据传输速度、实时性表现以及兼容性等方面各具特色。不…...
浅析大语言模型安全和隐私保护国内外标准和政策
过去两年,大模型技术已经普及并逐步渗透到各行各业,2025年注定是大模型应用井喷式发展的一年,AI在快速发展的同时,其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载:600多…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
