【问题标题】:Java BigInteger factorization: division and multiplication differJava BigInteger分解:除法和乘法不同
【发布时间】:2016-04-17 14:11:51
【问题描述】:

我正在编写代码以在 Java 中分解一个大数字(超过 30 位)。

数字 (n) 是这样的:8705702225074732811211966512111

代码似乎可以工作,结果是:

  • 7
  • 2777
  • 14742873817

按照逻辑,最后一项应该可以通过 (n/(fact1 * fact2 * fact3)) 获得,结果是:

  • 30377199961175839

对此我非常满意,但随后决定进行一个小测试:我乘以所有期望找到 n 的因子...但我没有!

这是我的校验码:

BigInteger n = new BigInteger("8705702225074732811211966512111");

BigInteger temp1 = new BigInteger("7");
BigInteger temp2 = new BigInteger("2777");
BigInteger temp3 = new BigInteger("14742873817");
BigInteger temp4 = n.divide(temp1).divide(temp2).divide(temp3);

System.out.println(n.mod(temp1));
System.out.println(n.mod(temp2));
System.out.println(n.mod(temp3));
System.out.println(n.mod(temp4));

System.out.println(n.divide(temp1).divide(temp2).divide(temp3).divide(temp4));
System.out.println(temp1.multiply(temp2).multiply(temp3).multiply(temp4));

System.out.println(n);

如您所见,我只是定义了数字 n 和因子(最后一个定义为 n/(fact1 * fact2 * fact3) 然后检查 n/eachfactor 是否给出余数 0。

然后我检查 ((((N / (fact1)) / fact2) / fact3) / fact4) = 1

最后我检查了 fact1 * fact2 * fact3 * fact4 = n

问题是:

  1. n mod temp4 不是 0,而是 245645763538854
  2. fact1 * fact2 * fact3 * fact4 与 n 不同
  3. 但是 ((((N / fact1) / fact2) / fact3) / fact4) = 1

这是确切的输出:

0
0
0
245645763538854
1
8705702225074732565566202973257
8705702225074732811211966512111

这没有意义……第四个因素怎么可能同时是对的?

【问题讨论】:

  • 你的第三个因素14742873817 不是素数;这是7 * 2106124831
  • 我现在注意到了!还是谢谢你!
  • 记住BigInteger.divide 向下舍入。这可能导致((((N / (fact1)) / fact2) / fact3) / fact4) = 1 没有实际除N 的所有因素。
  • 如何将其标记为已解决?

标签: java biginteger bigint factorization


【解决方案1】:
System.out.println(temp3.mod(temp1));

上面的代码给出了 0,这意味着 temp3 不是素数。 temp4 不是一个因素。

【讨论】:

  • 谢谢你,我意识到我的错误
  • Yes and no ;) 这不是来自 euler 项目的问题,而是一个朋友让我解决的问题(所以不)但我喜欢解决这些问题,有时使用 BigIntegers(所以:是的)
【解决方案2】:

很抱歉报告:

8705702225074732811211966512111/(7*2777*14742873817) = 30377199961175839.8571428571

它应该是一个整数。

所以,你的因式分解是错误的...哎呀..

在 linux 下尝试 bc,对于 windows:http://gnuwin32.sourceforge.net/packages/bc.htm.

它可以处理这些数字

【讨论】:

  • 那以后真的很有用!非常感谢!
【解决方案3】:

this page 表示您的 BigInteger 的实际分解是 7*2777*2106124831*212640399728230879

【讨论】:

  • 这个也挺好用的!
  • 声誉不够,抱歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
相关资源
最近更新 更多