无心人 发表于 2019-11-1 21:59:37

最接近平方数的阶乘数

4!=24, 5^2=25, 5^2-4!=1
5!=120, 11^2=121, 11^2-5!=1
7!=5040,   71^2=5041, 71^2-7!=1
问,还有没有其他阶乘数,跟平方数差很小

无心人 发表于 2019-11-1 22:08:39

目前找到的指标是阶乘的平方根的小数部分的值与1的差

\( MIN(1 - | \sqrt{n!} - [\sqrt{n!}]|,| \sqrt{n!} - [\sqrt{n!}]|) \)

无心人 发表于 2019-11-1 22:58:25

目前得到的结果n!,n<=10000以内
n=
224
309
879
1099
1494
2221
3739
最接近平方数

无心人 发表于 2019-11-1 22:59:44

3739!的平方根小数部分前几位0.9999954

hujunhua 发表于 2019-11-2 06:20:52

以前看过一道竞赛题\的解答,记得只有这三个解。

无心人 发表于 2019-11-2 08:58:41

hujunhua 发表于 2019-11-2 06:20
以前看过一道竞赛题\的解答,记得只有这三个解。

嗯,还可以找稍微接近平方数的

这些数,大概是
\( n! = x^2 + O(x), x \in \NN \)

mathe 发表于 2019-11-2 11:27:18

可以找出所有 n! 和平方数之差不超过 n 的数。

wayne 发表于 2019-11-2 12:57:41

写了一个C/GMP的小程序,跑了几分钟,算出14万以内$n<=140000$, $n!$跟最接近的完全平方数的差的绝对值 小于$100n$ 的只有 $1!-11!$, 前11个数.


然后看到 老胡的评论,我立马终止了程序
即最接近 n! 的平方数,与 n! 的差最大约为`\sqrt{n!}`



#include <gmp.h>
#include <stdio.h>

int main()
{
    mpz_t tmp, a, b;
    mpz_init(tmp);
    mpz_init(a);
    mpz_init(b);
   
    int n = 200000;
    mpz_fac_ui(tmp,n);
    for (int i = n+1; i < 5*n; ++i) {
      mpz_mul_ui(tmp,tmp, i);
      int ans = mpz_root(a, tmp, 2);
      mpz_add_ui(b, a, 1);
      mpz_mul(a, a, a);
      mpz_mul(b, b, b);
      mpz_sub(a, tmp, a);
      mpz_sub(b, b, tmp);
      if (mpz_cmpabs_ui(a, 1000*i) < 0) {
            gmp_fprintf(stderr,"%d! - %Zd\n", i, a);
      }
      if (mpz_cmpabs_ui(b, 1000*i) < 0) {
            gmp_fprintf(stderr,"%d! + %Zd\n", i, b);
      }
      gmp_fprintf(stdout,"%d\t", i);

    }
    mpz_clears(tmp, a, b, '\0');

    return 0;
}

hujunhua 发表于 2019-11-2 13:42:16

记 `x=\lfloor\sqrt{n!}\rfloor`, 那么最接近 n! 的平方数是 `x^2` 和 `(x+1)^2`之一,
设 `x^2=n!-a,(x+1)^2=n!+b`,
则 `a+b=2x+1` → `\min(a,b)≤x<\sqrt{n!}`
所我在6#的评论应该肯定地说“最接近 n! 的平方数,与 n! 的差小于`\sqrt{n!}`”

无心人 发表于 2019-11-2 16:58:17

后面的计算越来越难,主要是数字迅速变大,得分配更大的浮点数了
页: [1] 2
查看完整版本: 最接近平方数的阶乘数