拉马努金-纳格尔猜想
Ramanujan-Nagell 方程是指数丢番图方程的一个例子。丢番图方程是一个有两个或多个未知数的,系数为整数的多项式方程。丢番图方程只要求整数解。
Ramanujan-Nagell 方程是一个平方数与一个比2的幂小7的数之间的方程,其中2的幂只能是自然数。
拉马努金猜想丢番图方程 2y - 7 = x2 存在正整数解,后来被纳格尔证明。
$$\mathrm{2y−7=x^2\:has\:x\epsilon\:Z_+:x=1, 3, 5, 11, 181}$$
三角形数 - 它计算以等边三角形排列的对象的数量。第 n 个三角形数是在每边排列 n 个对象的三角形中的对象的数量。因此,第 3 个三角形数是在每边有 3 个对象的三角形中的对象总数 = 6。
三角形数的公式为:
$$\mathrm{T_n=\displaystyle\sum\limits_{k=1}^n \:k=1 + 2 + 3 + ⋅⋅⋅ +𝑛 =\frac{n(n+1)}{2}=\left(\begin{array}{c}n+1\ 2\end{array}\right)where\:n\geq0}$$
从第 0 个三角形数开始的三角形数序列为:
0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153 …
梅森数 - 它是一个比 2 的幂小 1 的数。
梅森数的公式为:
$$\mathrm{M_m=2^m−1\:where\:m\geq0}$$
问题陈述
问题是找到所有拉马努金-纳格尔数,即找到方程 $\mathrm{2^m−1=\frac{n(n+1)}{2}}$ 的所有正整数解,以及满足拉马努金-纳格尔方程 2y7=x2 的自然数。
示例
Input: x = 1, 3, 5, 11, 181
Expected Output: (0, 1, 3, 15, 4095), (3, 4, 5, 7, 15)
解决方案
从方程开始:
$\mathrm{2^m−1=\frac{n(n+1)}{2}}$ ….(1)
清除 (1) 的分母
$\mathrm{2^{m+1}−2=n^2+n}$ ….(2)
为了在 (2) 的右侧完成平方,将两边乘以 4
$\mathrm{2^{m+3}−8=4n^2+4n}$ ….(3)
进一步简化方程 (3)
$\mathrm{2^m+3−7=(2n+1)^2}$ ….(4)
方程 (4) 形式为拉马努金-纳格尔方程,即 $\mathrm{2^y−7=x^2}$。
根据拉马努金-纳格尔方程,x 只能取 1、3、5、11、181 的正整数。
因此,在方程 (4) 中,2n + 1 可以取 x = 1、3、5、11、181 的值。通过求解 2n + 1 与 x 的所有可能值,我们得到
$\mathrm{\Rightarrow𝑛 = 0, 1, 2, 5, 90}$
然后最终,可以使用 n 的值计算出满足 $\mathrm{2^m−1=\frac{n(n+1)}{2}}$ 的梅森数。
当 $\mathrm{n = 0,2^m− 1 = 0}$
$\mathrm{n = 1,2^m − 1 = 1}$
$\mathrm{n = 2,2^m − 1 = 3}$
$\mathrm{n = 5, 2^m − 1 = 15}$
$\mathrm{n = 90,2^m − 1 = 4095}$
因此,{0, 1, 3, 15, 4095} 是三角梅森数或拉马努金-纳格尔数。
在 $\mathrm{2^y−7=x^2}$ 中有 x 的值后,我们可以通过以下公式找到 y:
$$\mathrm{y=log_2(x^2+7)}$$
对于 x = 1,y = 3
对于 x = 3,y = 4
对于 x = 5,y = 5
对于 x = 11,y = 7
对于 x = 181,y = 15
伪代码
procedure rNagell (x[]) ans[] for i = 0 to 4 temp = (x[i] - 1) / 2 ans[i] = (temp^2 + temp) / 2 end procedure procedure rNagellNatural (x[]) ans[] for i = 0 to 4 temp = log2 (x[i]^2 + 7) ans[i] = temp end procedure
示例:C++ 实现
在以下程序中,我们使用上面部分中完成的计算来找到三角梅森数和满足拉马努金-纳格尔方程的自然数。
#include <bits/stdc++.h> using namespace std; // Functio for finding Triangular Mersenne or Ramanujan-nagell numbers vector<int> rNagell(int x[]){ vector<int> ans; for (int i = 0; i < 5; i++){ // Applying the formula from the section above i.e. 2n-1 = x // 2^m - 1 = n(n+1)/2 int temp = (x[i] - 1) / 2; ans.push_back((temp * temp + temp) / 2); } return ans; } // Function for finding natural numbers in Rmanujan-Nagell Equation i.e. 2^y - 7 = x^2 vector<int> rNagellNatural(int x[]){ vector<int> ans; // y can be found as log2(x^2 + 7) for (int i = 0; i < 5; i++){ int temp = (x[i] * x[i]) + 7; ans.push_back(log2(temp)); } return ans; } int main(){ int x[5] = {1, 3, 5, 11, 181}; cout << "Triangular Mersenne Numbers = "; vector<int> triM = rNagell(x); for (int i = 0; i < 5; i++){ cout << triM[i] << " "; } cout << "\nNatural numbers sstisfying Ramanujan-Nagell Equation = "; vector<int> num = rNagellNatural(x); for (int i = 0; i < 5; i++){ cout << num[i] << " "; } return 0; }
输出
Triangular Mersenne Numbers = 0 1 3 15 4095 Natural numbers sstisfying Ramanujan-Nagell Equation = 3 4 5 7 15
结论
总之,三角梅森数可以通过将方程调整为丢番图拉马努金-纳格尔方程的形式并与方程中 x 的值进行比较来找到。可以使用数学公式以恒定的时间复杂度找到解决方案。