Cullen Number in Java

2025 年 5 月 7 日 | 阅读 3 分钟

Cullen 数是整数序列中的一个成员,该序列在 OEIS 序列 **A002064** 中定义。它最早由 **James Cullen** 于 1905 年进行研究。在本节中,我们将讨论 **Cullen 数是什么**,并创建 Java 程序 来检查给定的数字是否为 **Cullen 数**。Cullen 数程序经常出现在 Java 编码面试和学术中。

Cullen 数

形式为 **2n*n + 1** 或 **(n*2n) +1** 的数字,其中 n 是整数。大多数 Cullen 数是合数。它表示为 **Cn** 或 **C(n)**。如果 p 是素数且形式为 **8k-3**,则它 divisible by p=2n-1。

如果形式为 **2n*n + 1** 或 **(n*2n) +1** 的任何数字是素数,则称其为 **素数 Cullen 数**。它在 OEIS 序列 **A005849** 中定义。

有时,广义 Cullen 数基 b 定义为形式为 n*bn + 1 的数字,其中 n + 2 > b;如果一个素数可以写成该形式,则称其为 **广义 Cullen 素数**。Woodall 数(**2n*n - 1**)有时也称为**第二类 Cullen 数**。

已知最大的广义 Cullen 素数是 **2805222 * 252805222 + 1**,这是一个长度为 3,921,539 位的数字,由 **Tom Greer** 于 2020 年 3 月发现。

Cullen 数示例

3 = 21 * 1 + 1

9 = 22 * 2 + 1

25 = 23 * 3 + 1

其他一些 Cullen 数是 1, 3, 9, 25, 65, 161, 385, 897, 2049, 4609, 10241, 22529, 49153, 106497, 229377, 491521, 1048577, 2228225, 4718593, 9961473, 20971521, 44040193, 92274689, 192937985, 402653185, 838860801, 1744830465, 3623878657, 7516192769, 15569256449, 32212254721。

1 * 21 + 1 = 3,这是一个素数。

141 * 2141 + 1 = 393050634124102232869567034555427371542904833,这也是一个素数。

下一个素数 Cullen 数很难计算,因为它是一个大约 1423 位长的巨大数字。

其他一些素数 Cullen 数是 1, 141, 4713, 5795, 6611, 18496, 32292, 32469, 59656, 90825, 262419, 361275, 481899, 1354828, 6328548, 6679881。

仍然**推测**存在无限多个 Cullen 素数。

Cullen 数 Java 程序

有两种方法可以找到 Cullen 数

使用位移左移运算符

在下面的程序中,我们使用了位移左移 (<<) 运算符来查找第 n 个 Cullen 数。该 运算符 将一个数字的位向左移动指定的位数。

假设 n=7,根据语句 **(1 << n) * n + 1:**

(1<<7) * 7 + 1 (其中 1<<7 等于 1*27 = 128)

128 * 7 + 1

896 + 1 = 897

让我们在 Java 程序中实现上述逻辑。

CullenNumberExample1.java

输出

Enter the number: 7
Cullen Number for the value n = 7 is: 897

让我们看看相同的另一个逻辑。

使用 Lambda 表达式

在下面的程序中,我们使用了 **Function** 接口,它是一个函数式接口。它可以作为 lambda 表达式或方法引用的赋值目标。它属于 **java.util.function** 包。Function 接口的语法如下:

其中 T 和 R 是类型参数。**T** 是**函数的输入类型**,**R** 是**函数的输出类型**。

该接口提供了 **apply()** 方法。它将此函数应用于给定的参数。

语法

它接受 **t**(函数参数)作为参数并返回函数结果。

CullenNumberExample2.java

输出

false
true