1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| def get_prime_factors(n): """获取n的质因数分解""" factors = {} d = 2 temp = n while d * d <= temp: if temp % d == 0: count = 0 while temp % d == 0: count += 1 temp //= d factors[d] = factors.get(d, 0) + count d += 1 if temp > 1: factors[temp] = factors.get(temp, 0) + 1 return factors
def find_next_step(m): """ 寻找最小的 j > 0 使得 T_m + T_j = T_p 方程转化为: (2j+1) = v - u, 其中 u*v = m*(m+1), 且 v-u 是大于1的最小奇数 """ m_factors = get_prime_factors(m) m1_factors = get_prime_factors(m + 1) combined = m_factors.copy() for p, e in m1_factors.items(): combined[p] = combined.get(p, 0) + e two_power = 2 ** combined.pop(2, 0) odd_factors_list = list(combined.items()) factors_of_odd = [1] for p, e in odd_factors_list: new_factors = [] for f in factors_of_odd: for i in range(1, e + 1): new_factors.append(f * (p ** i)) factors_of_odd.extend(new_factors) M = m * (m + 1) min_diff = float('inf') best_u = 0 best_v = 0 odd_part_total = M // two_power for f in factors_of_odd: u1, v1 = f, M // f if u1 > v1: u1, v1 = v1, u1 diff1 = v1 - u1 if 1 < diff1 < min_diff: min_diff = diff1 best_u, best_v = u1, v1 u2, v2 = f * two_power, odd_part_total // f if u2 > v2: u2, v2 = v2, u2 diff2 = v2 - u2 if 1 < diff2 < min_diff: min_diff = diff2 best_u, best_v = u2, v2
j = (min_diff - 1) // 2 p = (best_u + best_v - 1) // 2 return j, p
n_idx = 0 m = 2 count = 1
print(f"第 {count} 个三角形数: a_{n_idx} = {m*(m+1)//2}")
while count < 70: j, p = find_next_step(m) n_idx += j m = p count += 1 if count % 10 == 0 or count <= 5: print(f"第 {count} 个三角形数: a_{n_idx} = {m*(m+1)//2}")
print("-" * 30) print(f"最终结果:第 70 个三角形数的下标 n 是 {n_idx}")
|