找回密码
 欢迎注册
楼主: medie2005

[讨论] 数字乘积

[复制链接]
发表于 2009-3-3 16:23:12 | 显示全部楼层
如果进行二次筛选, 得到的结果应该更少
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <gmp.h>
  4. #include <math.h>

  5. #define l2 1700
  6. #define l3 1073
  7. #define l7 605

  8. mpz_t t2, t3, t7, tn;
  9. mpz_t a, b, c;
  10. char out[1024];
  11. unsigned int d[10][3];

  12. int filter(unsigned int i, unsigned int j, unsigned int k)
  13. {
  14.   char * c = out;
  15.   int e = 0, f = 0;
  16.   int dc;
  17.   if ((i == 0) && (j == 0)) return 0;
  18.   if ((j == 0) && (k == 0)) return 0;
  19.   mpz_pow_ui(a, t2, i);
  20.   mpz_pow_ui(b, t3, j);
  21.   mpz_pow_ui(tn, t7, k);
  22.   mpz_mul(tn, tn, a);
  23.   mpz_mul(tn, tn, b);
  24.   mpz_get_str(out, 10, tn);
  25. //  printf("%s\n", out);
  26.   while (*c)
  27.   {
  28.     if (* c == '0')
  29.       return 0;
  30.     if (* c == '5') f = 1;
  31.     if ((unsigned)(*c) % 2 == 0) e = 1;
  32.     if ((f == 1) && (e == 1)) return 0;
  33.     c ++;
  34.   }
  35.   return 1;  
  36. }

  37. int main(void)
  38. {
  39.   unsigned int i, j, k;
  40.   int p = 0;
  41.   
  42.   mpz_init(t2);
  43.   mpz_init(t3);
  44.   mpz_init(t7);
  45.   mpz_init(tn);
  46.   mpz_init(a);
  47.   mpz_init(b);
  48.   mpz_init(c);
  49.   mpz_set_ui(t2, 2);
  50.   mpz_set_ui(t3, 3);
  51.   mpz_set_ui(t7, 7);
  52.   for (i = 0; i <= l2; i ++)
  53.     for (j = 0; j <= l3; j ++)
  54.       for (k = 0; k <= l7; k ++)
  55.         if (log10(2.0) * i + log10(3.0) * j + log10(7.0) * k <= 512.0)
  56.               if (filter(i, j, k))
  57.           {
  58.             fprintf(stdout, "%u, %u, %u\n", i, j, k);
  59.             fflush(stdout);
  60.                 p ++;
  61.               }

  62.   printf("Total: %u\n", p);
  63.   mpz_clear(c);  
  64.   mpz_clear(b);
  65.   mpz_clear(a);
  66.   mpz_clear(tn);
  67.   mpz_clear(t2);
  68.   mpz_clear(t3);
  69.   mpz_clear(t7);
  70.   return 0;
  71. }
复制代码
用了更准确的筛选方式
但100内需要补充带5的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-3 17:08:52 | 显示全部楼层
原帖由 无心人 于 2009-3-3 16:37 发表
是可以存在的

现在证明了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的数字组合
越来越少

我程序的输出慢了下来
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-24 16:53 , Processed in 0.044329 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表