C语言中真大数的因式分解

C语言中真大数的因式分解,c,math,numbers,integer,primes,C,Math,Numbers,Integer,Primes,我正在写一篇关于素数在当今社会中的重要性的文章。我想开发一个小应用程序,显示用C低级语言编写的程序需要多长时间,至少对我来说,将一个复合数分解为其素因子需要多长时间。我想出了一个简单的算法,但我遇到了一个问题: 我希望用户能够键入巨大的数字,例如:7777772 因此,计算机需要几个小时来处理这些数据,以显示我们基于素数的脚本有多好 但在C语言中,我能找到的最大数据类型是LONG,最高可达2147483646 你们知道我怎么能用C语言输入和处理一个大数字吗 提前感谢就像在纸上一样。您可以将数字分

我正在写一篇关于素数在当今社会中的重要性的文章。我想开发一个小应用程序,显示用C低级语言编写的程序需要多长时间,至少对我来说,将一个复合数分解为其素因子需要多长时间。我想出了一个简单的算法,但我遇到了一个问题:

我希望用户能够键入巨大的数字,例如:7777772

因此,计算机需要几个小时来处理这些数据,以显示我们基于素数的脚本有多好


但在C语言中,我能找到的最大数据类型是LONG,最高可达2147483646

你们知道我怎么能用C语言输入和处理一个大数字吗


提前感谢

就像在纸上一样。您可以将数字分成几段,然后使用长除法、长加法和长乘法

也许最简单的方法是将数字存储为以10为基数的字符串,然后编写代码对这些字符串执行所需的所有操作。你可以像在纸上做加法一样做加法。乘法是用一位数的乘法加上加法来完成的,你已经做过了。等等

有很多库可供您使用,例如libgmp的MPZ库和OpenSSL的BN库

真大数的因式分解 我希望用户能够键入巨大的数字,例如:7777772

这是一个93位的数字,没有那么大,所以可以简单地用蛮力来强迫它

如果您有权访问未签名的_int128,则类似于下面的内容。C确实指定了64位类型,但除此之外,您还可以自己选择

我估计这种适度的因式分解可能需要几分钟

以秒为单位报告答案

当然可以有很多改进

unsigned __int128 factor(unsigned __int128 x) {
  if (x <= 3) {
    return x;
  }
  if (x %2 == 0) return 2;
  for (unsigned __int128 i = 3; i <= x/i; i += 2) {
    static unsigned long n = 0;
    if (++n >= 100000000) {
      n = 0;
      printf(" %llu approx %.0f\n", (unsigned long long) i, (double)(x/i));
      fflush(stdout);
    }
    if (x%i == 0) {
      return i;
    }
  }
  return x;
}

void factors(unsigned __int128 x) {
  do {
    unsigned __int128 f = factor(x);
    printf("%llu approx %.0f\n", (unsigned long long) f, (double)x);
    fflush(stdout);
    x /= f;
  } while (x > 1);
}

void factors(unsigned __int128 x) {
  do {
    unsigned __int128 f = factor(x);
    printf("approx %0.f approx %.0f\n", (double) f, (double)x);
    fflush(stdout);
    x /= f;
  } while (x > 1);
}

正确的答案是使用更高效的算法,然后考虑所需的类型。

< P>可以使用结构,只需设置所需的数字,下面的代码没有被测试,但应该给你一些方向。 我相信这将使您能够获得4294967295 max_int,x x是您在结构中定义的位置的幂

typedef struct big_number{
    int thousands;
    int millions;
    int billions;
}

//Then do some math
big_number add(big_number n1, big_number n2){
    int thousands = n1.thousands + n2.thousands; 
    int millions = n1.millions + n2.millions;
    //etc... (note each part of your struct will have a maximum value of 999
    if(thousands > 999){
         int r = thousands - 999;
         millions += r; //move the remainder up
    }
}

为了把数字分解成碎片,我必须在字符数组中分解它,对吗?事实证明,用C语言做这件事太难了,例如,用Java做这件事要容易得多。你会推荐我使用Java还是在C中有其他选择?@MatheusMinguini我会在C中使用gmp,或者在Java中使用BigInteger。我自己更喜欢C,但这完全是个人对语言本身的偏好。@MatheusMinguini语言的选择是个人的偏好,但我不推荐C,因为缺少带析构函数和值语义的类使得它很难使用。C++,例如,提升多精度将是一个很好的选择。JavaScript也有一个很好的大数字库。感谢所有回答并帮助我解决这个问题的人!我真的很感激!我最终使用了Java,项目一完成,我就在这里发布GitHub repositoryLook查找多个单词整数或任意精度整数。在C语言中,我能找到的最大数据类型是LONG->Try-uintmax\t。这至少是18446744073709551615。对于93位的777 2来说还不够。请查看支持int128\t的实现。当然,777…772不是素数。但即使你这样做,它也只会显示出你的算法是如何运行的,而不是说分解实际上很难。@harold,你认为怎样才能最好地向学生展示现代计算机将一个复合数分解成素数因子有多难?我愿意接受建议,因为我确实希望他们理解这个概念。我不确定。大数的因式分解技术,如GNFS,需要大量的基础工作才能理解它们的作用,并且过于复杂,无法作为练习重现。较简单的算法在数字方面有很多麻烦,而这些数字现在不被认为是难以计算的,比如RSA-100M谢谢,伙计!我做了测试,它成功了!但是我更喜欢使用Java,这是一种我更习惯的语言,并且有更多的经验!不过,我很感激你为帮助我所做的努力!谢天谢地,阿加尼不知道你在哪里要求java,但我认为不懂java你也可以做同样的事情,不客气!谢谢,伙计!这使我对这个问题敞开了心扉!我想这是正确的选择!正如我所说,一旦我完成了这个用于教育目的的项目,我就在这里发布Github存储库!巴西的欢呼声
typedef struct big_number{
    int thousands;
    int millions;
    int billions;
}

//Then do some math
big_number add(big_number n1, big_number n2){
    int thousands = n1.thousands + n2.thousands; 
    int millions = n1.millions + n2.millions;
    //etc... (note each part of your struct will have a maximum value of 999
    if(thousands > 999){
         int r = thousands - 999;
         millions += r; //move the remainder up
    }
}