无心人 发表于 2009-3-3 16:23:12

如果进行二次筛选, 得到的结果应该更少

mathe 发表于 2009-3-3 16:25:16

其实现在有个问题,就是是否存在12阶以上的整数。
当然通常我们回想当然认为应该存在。

无心人 发表于 2009-3-3 16:34:49

我想,筛选后
512位内的结果能保存成一个2^32长的位数组
n = 2^p * 3^q * 7^r
然后对上面的数据置为
对应(p << (11 + 10))+ (q << 10) + r位置的bit = 1
只要对任何的n查找
其数位乘积prod(n)对应的bit是否是1
不是,则清位

这么做,能大大缩小候选
再测试每个的阶

无心人 发表于 2009-3-3 16:37:27

是可以存在的

现在证明了11阶的存在
假设有数字n
则显然数位乘积prod(n) < n
而当n充分大时,我们可以证明一定能找到n, prod(n)可以大于任何指定的数字

或者说,应该存在任意阶的数字

无心人 发表于 2009-3-3 16:39:05

至于为什么不好找11阶的仅有因子2,3,7的数字
是5,0在作怪

数字里有5, 0的比例太大了

无心人 发表于 2009-3-3 16:43:41

比如, 对应2^26的在2^p * 3^q * 7^r的p, q, r
10^512内只有
26, 0, 2
26, 0, 4
26, 0, 5
26, 3, 0
26, 3, 6
26, 4, 7
26, 8, 9
26, 10, 30
26, 15, 0
26, 21, 1
26, 24, 16

无心人 发表于 2009-3-3 17:08:00


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

#define l2 1700
#define l3 1073
#define l7 605

mpz_t t2, t3, t7, tn;
mpz_t a, b, c;
char out;
unsigned int d;

int filter(unsigned int i, unsigned int j, unsigned int k)
{
char * c = out;
int e = 0, f = 0;
int dc;
if ((i == 0) && (j == 0)) return 0;
if ((j == 0) && (k == 0)) return 0;
mpz_pow_ui(a, t2, i);
mpz_pow_ui(b, t3, j);
mpz_pow_ui(tn, t7, k);
mpz_mul(tn, tn, a);
mpz_mul(tn, tn, b);
mpz_get_str(out, 10, tn);
//printf("%s\n", out);
while (*c)
{
    if (* c == '0')
      return 0;
    if (* c == '5') f = 1;
    if ((unsigned)(*c) % 2 == 0) e = 1;
    if ((f == 1) && (e == 1)) return 0;
    c ++;
}
return 1;
}

int main(void)
{
unsigned int i, j, k;
int p = 0;

mpz_init(t2);
mpz_init(t3);
mpz_init(t7);
mpz_init(tn);
mpz_init(a);
mpz_init(b);
mpz_init(c);
mpz_set_ui(t2, 2);
mpz_set_ui(t3, 3);
mpz_set_ui(t7, 7);
for (i = 0; i <= l2; i ++)
    for (j = 0; j <= l3; j ++)
      for (k = 0; k <= l7; k ++)
      if (log10(2.0) * i + log10(3.0) * j + log10(7.0) * k <= 512.0)
              if (filter(i, j, k))
          {
            fprintf(stdout, "%u, %u, %u\n", i, j, k);
            fflush(stdout);
                p ++;
              }

printf("Total: %u\n", p);
mpz_clear(c);
mpz_clear(b);
mpz_clear(a);
mpz_clear(tn);
mpz_clear(t2);
mpz_clear(t3);
mpz_clear(t7);
return 0;
}
用了更准确的筛选方式
但100内需要补充带5的

mathe 发表于 2009-3-3 17:08:52

原帖由 无心人 于 2009-3-3 16:37 发表 http://bbs.emath.ac.cn/images/common/back.gif
是可以存在的

现在证明了11阶的存在
假设有数字n
则显然数位乘积prod(n) < n
而当n充分大时,我们可以证明一定能找到n, prod(n)可以大于任何指定的数字

或者说,应该存在任意阶的数字
不一定。只要其中任何一次变换后任何位上出现5以及其它位中有一个是偶数,那么下一次变换就直接出现0,从而接着马上结束了.

无心人 发表于 2009-3-3 17:15:04

那假设出现一步0的概率是99.999999%

连续12次都不出现一步0的概率在n充分大的情况下也是很大的啊

比如我设定的512位,连续12步不出现一步0的概率是1 / 10^96
通过的数字也不少了

无心人 发表于 2009-3-3 17:17:24

不过
好像只有2,3,7的且数位不是一步0的数字组合
越来越少

我程序的输出慢了下来
页: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16
查看完整版本: 数字乘积