# 来源:NumPy Cookbook 2e Ch3.2from __future__ import print_function
import numpy as np
# 13195 的质因数是 5, 7, 13 和 29# 600851475143 的最大质因数是多少呢?
N =600851475143
LIM =10**6deffactor(n):# 1. 创建搜索范围的数组# a 是 sqrtn ~ sqrtn + lim - 1 的数组# 其中 sqrtn 是 n 平方根向上取整# lim 是 sqrtn 和 10e6 的较小值
a = np.ceil(np.sqrt(n))
lim =min(n, LIM)
a = np.arange(a, a + lim)
b2 = a **2- n
# 2. 检查 b 是否是平方数# modf 用于取小数部分
fractions = np.modf(np.sqrt(b2))[0]# 3. 寻找没有小数部分的地方# 这里的 b 为平方数# where 用于把布尔索引变成位置索引# 但是效果是一样的
indices = np.where(fractions ==0)# 4. 寻找 b 为平方数时,a 的值,并取出第一个
a = np.ravel(np.take(a, indices))[0]# 或者 a = a[indices][0]# 求出 c 和 d
a =int(a)
b = np.sqrt(a **2- n)
b =int(b)
c = a + b
d = a - b
# 到达终止条件则返回if c ==1or d ==1:return# 打印当前 c 和 d 并递归print(c, d)
factor(c)
factor(d)
factor(N)'''
1234169 486847
1471 839
6857 71
'''
寻找回文数
# 来源:NumPy Cookbook 2e Ch3.3# 回文数正着读还是反着读都一样# 由两个两位数的乘积构成的最大回文数是 9009 = 91 x 99# 寻找两个三位数乘积构成的最大回文数# 1. 创建三位数的数组
a = np.arange(100,1000)
np.testing.assert_equal(100, a[0]) np.testing.assert_equal(999, a[-1])# 2. 创建两个数组中元素的乘积# outer 计算数组的外积,也就是 a[i] x a[j] 的矩阵# ravel 将其展开之后,就是每个元素乘积的数组了
numbers = np.outer(a, a)
numbers = np.ravel(numbers)
numbers.sort()
np.testing.assert_equal(810000,len(numbers))
np.testing.assert_equal(10000, numbers[0])
np.testing.assert_equal(998001, numbers[-1])#3. 寻找最大的回文数for number in numbers[::-1]:
s =str(numbers[i])if s == s[::-1]:print(s)break