在C#中替代BigInteger.ModPow();的方法
我正在寻找C#的BigInteger软件包的替代方案,该软件包已与Net 4.x一起引入. 使用此对象的数学操作非常慢,我想这是由于算术学以比原始类型更高的级别完成的事实 - 或不良优化. int64/long/ulong或其他64位数字缩小的方式,无法正确计算 - 我说的是64位整数的64位成员. 希望有人可以建议我的东西.预先感谢. 解决方案 老实说,如果您的数字非常大,需要使用它们进行大量计算,并且BigInteger库仍然没有为您削减,为什么不使用任何语言或工具包将其卸载到外部过程中你知道最好吗?您是否真的被限制在编写您要在C#中完全完成的一切? 例如,您可以卸载到 c#. 中 其他解决方案 Biginteger确实非常慢.原因之一是它是不变性的. 如果您执行A = A -B,则将获得A的新副本.通常这很快.使用BigInteger并说2048块的整数需要分配额外的2KB. 它也应取决于整体化(我认为不是那么复杂).我的意思是,对
8 2024-04-26
编程技术问答社区
mscorlib.dll中发生了一个未处理的'System.FormatException'类型的异常。
using Org.BouncyCastle.Math; string p = "E7A69EBDF105F2A6BBDEAD7E798F76A209AD73FB466431E2E7352ED262F8C558F10BEFEA977DE9E21DCEE9B04D245F300ECCBBA03E72630556D011023F9E857F"; BigInteger P= new BigInteger(p); 投掷异常 System.FormatException: Input string was not in a correct format. at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffe r& number, NumberFormatInfo info, Boolean parseDecimal) at System.Number.Pars
4 2024-04-26
编程技术问答社区
我如何使BigInteger正确地看到这个Hex字符串的二进制表示?
问题 i具有转换为十六进制字符串的A byte[],然后像BigInteger.Parse(thatString,NumberSyles.Hexnumber)那样解析该字符串. 这似乎很浪费,因为Biginteger能够接受一个字节[],只要两者的补充被解释了. 一个工作(效率低下)示例 根据msdn 最后一个字节中最重要的位应该为零,以使以下十六进制为正数.以下是具有此问题的十六进制号的示例: byte[] ripeHashNetwork = GetByteHash(); foreach (var item in ripeHashNetwork) { Console.Write(item + "," ); } // Output: // 0,1,9,102,119,96,6,149,61,85,103,67,158,94,57,248,106,13,39,59,238,214,25,103,246 // Convert to He
0 2024-04-25
编程技术问答社区
在C#中实现RSA
我正在尝试在C#中实现RSA算法.当p和q很小时,下面的代码可行,但在试图复制RSA-100或更大的情况下p和q非常大的情况下. . 例如: p = 61, q = 53, n = 3233, phi(n) = 3120, e = 17, d = 2753 解密后,我得到了正确的原始混乱.我从 rsa wikipedia页面 .该代码还适用于p和q. 的其他小值 但是,使用 rsa-100 或更大,我没有得到支持我的原始信息.我尝试使用指数(e)的不同值,并确保它与phi(n)是企业,但我无法获得正确的结果.我是否缺少简单/明显的东西? 预先感谢您的帮助! //p and q for RSA-100 //string p = "37975227936943673922808872755445627854565536638199"; //string q = "400946909509208810306837352927614683892148997240
2 2024-04-23
编程技术问答社区
Mono.Math.BigInteger由于其保护级别而无法访问
因此,我正在使用IDEONE在C#中进行一个程序,并且首次与Mono合作.我正在尝试使用Biginteger类(Mono.math.biginteger),但我一直遇到错误.这是下面的我代码.发生了什么,我该如何解决?谢谢. using System; using Mono.Math; public class TFIB { public static int Main() { const int FIB_SEQUENCE_SIZE = 300; BigInteger[] FibonacciSequence = new BigInteger[FIB_SEQUENCE_SIZE]; // Calculate Fibonacci Sequence FibonacciSequence[0] = 0; FibonacciSequence[1] = 1;
6 2024-04-22
编程技术问答社区
如何在C#中把BigInteger转换成Pow Double?
我尝试使用BigInteger.Pow方法来计算类似10^12345.987654321之类的东西,但是此方法仅接受整数数字为类似的指数: biginteger.pow(biginteger x,int y) 那么,如何在上述方法中使用双重数字作为指数? 解决方案 C#中没有任意精度支持,因此不能直接完成.有一些替代方案(例如寻找第三方库),或者您可以尝试下面的代码类似的东西 - 如果基础足够小,例如在您的情况下. public class StackOverflow_11179289 { public static void Test() { int @base = 10; double exp = 12345.123; int intExp = (int)Math.Floor(exp); double fracExp = exp - intExp; BigInte
4 2024-04-21
编程技术问答社区
24位数的整数
要检查一些银行帐号,我想在帐号上进行模拟97. 但是很多帐号要大于UINT64. 我该如何在24位数字上进行操作? 谢谢, 示例代码(无法转换): (Convert.ToUInt64("756842356987456214536254") % 97 == 1); 解决方案 一种方法是使用System.Numeric's BigInteger bi = BigInteger.Parse("756842356987456214536254"); 其他解决方案 谢谢, 这是工作. Org.BouncyCastle.Math.BigInteger bi = new BigInteger("756842356987456214536254"); (Convert.ToInt32(bi.Mod(new BigInteger("97")).ToString()) == 1); 其他解决方案 如果数字最多具有28位数字,则也可以使用decimal
0 2024-04-20
编程技术问答社区
从一个隐含的无符号十六进制字符串构造一个BigInteger的正确方法是什么?
我遇到了一个问题,因为我有一个隐含的未签名的十六进制数字作为字符串,从用户输入中提供,需要将其转换为BigInteger. . 多亏了A BigInteger设置最高级位(0x8/1000b)的任何输入的签名性质(0x8/1000b),结果数被视为负.但是,不能通过简单地检查符号位并乘以-1或获得由于一个人的补充而获得绝对值来解决此问题,这将不尊重基础符号,例如将所有值处理为a -1. 如下所示,是一些示例输入/输出 var style = NumberStyles.HexNumber | NumberStyles.AllowHexSpecifier; BigInteger.TryParse("6", style) == 6 // 0110 bin BigInteger.TryParse("8", style) == -8 // 1000 bin BigInteger.TryParse("9", style) == -7 // 1001 bin BigInte
2 2024-04-19
编程技术问答社区
我可以在C#中找到BigInteger的位数吗?
我正在求解这个问题,他们要求他们在其中索要第一个fibonacci的索引.数字,我的第一个想法与: 类似 BigInteger x = 1; BigInteger y = 1; BigInteger tmp = 0; int currentIndex = 2; while (x.NoOfDigits
2 2024-04-19
编程技术问答社区
大整数到十六进制
快速问题... 我有一个愚蠢的长BigInteger我想将其写入文件作为十六进制字符串. 我知道java提供了这样做的.toString(16)方法,但是我在c#中找不到同等的方法. 我使用的是.net 4.0. 谢谢 解决方案 使用.ToString("X")或.ToString("x")取决于您喜欢的情况. 其他解决方案 您不能使用yourBI.ToString("X")? dd268260.aspx 其他解决方案 yourBI.ToString("x17").Substring(1) // If you need 16 length
0 2024-04-18
编程技术问答社区
对一个BigIntegers的列表进行求和
我看了看,但无法弄清楚.您如何概括bigintegers的列表? Using System.Numerics; Using System.Linq; List bigInts = new List(); BigInteger sum = bigInts.Sum(); // doesn't work BigInteger sum = bigInts.Sum(); // doesn't work BigInteger sum = bigInts.Sum(x => x); // doesn't work 您必须这样做吗? BigInteger sum = new BigInteger(0); foreach(BigInteger bigint in bigInts) sum += bigint; 解决方案 engent 函数是sum的更通用版本: v
6 2024-04-18
编程技术问答社区
将BigInteger值乘以双重值
我想将biginteger乘以这样的双人 buyableObjects[index - 1].cost = buyableObjects[index - 1].cost * BigInteger.Pow((BigInteger)multiplier, buyableObjects[index - 1].indexMultiplier); 问题是乘数是等于1.15的双重值,而BigInteger忽略了0.15.是否有一种方法可以将我的对象的成本乘以一个BigInteger值的成本以及双值1.15,然后将其四舍五入到BigInteger? 吗? 解决方案 我们可以看到在这里 biginteger.pow()采用biginteger,然后是常规的32个整数.因此,如果您只使用双重使用,我不知道为什么您正在使用biginteger.pow()函数. 由于我们知道乘数是双重和可购买的[index-1] .indexMultiplier是一个整数,所以 我会做 dou
4 2024-04-16
编程技术问答社区
1/BigInteger in c#
我想做 BigInteger.ModPow(1/BigInteger, 2,5); 但1/BigInteger总是返回0,这导致结果也为0.我试图为C#寻找一些BigDecimal课程,但我什么也没找到.即使没有BigDecimal? ,有什么方法可以计算这一点 解决方案 1/a为| a |> 1的0,因为BigIntegers使用整数划分,其中忽略了一个部门的分数部分.我不确定您期望的是什么. 我假设您想链接的Wikipedia页面列出了用于计算模块化乘法逆的两种标准算法: 我没有C#代码,但是从Wikipedia中移植伪代码应该直接向前. 使用Euler的定理: m是素数时,这是一个流行的选择,因此,当它简单地变成.如果您需要恒定的运行时,并且知道φ(m),这就是要走的方法. 在c#中,这变成BigInteger.ModPow(a, phiOfM-1, m) 其他解决方案 选择/的超载是以下内容: public static B
6 2024-04-16
编程技术问答社区
C#格式化任意大的BigInteger用于无尽的游戏
我正在尝试创建一个无尽的游戏,例如Tap Titans,Clicker Heroes等.我有一个BigInteger类,只要它们适合内存,它就可以代表任意的整数. 现在,我有一个将biginteger格式化为特定格式的课程.它为"较小"的数字使用K(千(百万),b(百万),b(十亿),t(数万亿),但在此之后,短手符号变得模棱两可和不直觉. Q由于千万千亿个已经模棱两可,但我可以忍受. Q之后,我想从字母a开始.因此,1000Q = 1.000a,然后1000a = 1.000b等.到达1000Z时,应格式为1.000AA.然后1000AA = 1.000 AB,1000 AZ = 1.000 ba,1000 bz = 1.000 ca等 到目前为止,我已经达到了上述功能,但是我的班级无法在1000zz之后格式化数字.我无法提出一种通用算法,该算法会自动确定需要多少个字符(对于非常大的数字可能是AAAZ). 我的班级看起来如下: public class Num
2 2024-04-16
编程技术问答社区
为什么BigInteger.ToString("x")对介于signed.MaxValue(排他性)和unsigned.MaxValue(包容性)之间的数值会预置一个0?
示例(奇怪行为旁边的星号): [Fact] public void BigInteger_ToString_behavior_is_odd() { writeHex(new BigInteger(short.MaxValue)); // 7fff writeHex(new BigInteger(short.MaxValue) + 1); // 08000 ** writeHex(new BigInteger(ushort.MaxValue)); // 0ffff ** writeHex(new BigInteger(ushort.MaxValue) + 1); // 10000 writeHex(new BigInteger(int.MaxValue)); // 7fffffff writeHex(new BigInteger(int.MaxValue) + 1
2 2024-04-15
编程技术问答社区
C# BigInteger.ModPow错误?
我正在使用.net modpow 错误的结果.我将其与我认为正确的Java进行了比较: // C# var a = new BigInteger(-1); var b = new BigInteger(3); var c = new BigInteger(5); var x = BigInteger.ModPow(a, b, c); // (x = -1) // Java BigInteger a = new BigInteger("-1"); BigInteger b = new BigInteger("3"); BigInteger c = new BigInteger("5"); BigInteger x = a.modPow(b, c); // (x = 4) 是.NET类中的错误还是我做错了什么? 解决方案 这只是定义问题.来自 c#: 模量操作返回的值的符号取决于股息的符号:如果股息为正,则模量操作将返回正结果;如果是负的,则模量操作将返回负面结果.
0 2024-04-15
编程技术问答社区
优化Karatsuba的实施
因此,我正在尝试改善.NET 4'S BigInteger类提供的一些操作,因为这些操作似乎是二次的.我已经做了一个粗糙的卡拉茨巴实现,但仍然比我期望的要慢. 主要问题似乎是BigInteger没有简单的方法来计算位数,因此,我必须使用BigInteger.log(...,2).根据Visual Studio的说法,大约80-90%的时间用于计算对数. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Numerics; namespace Test { class Program { static BigInteger Karatsuba(BigInteger x, BigInteger y) { int n = (int)Math.Max(BigInte
2 2024-04-15
编程技术问答社区
如何在一定范围内生成一个随机的BigInteger?
考虑此方法效果很好: public static bool mightBePrime(int N) { BigInteger a = rGen.Next (1, N-1); return modExp (a, N - 1, N) == 1; } 现在,要满足我要参加的课程的要求,mightBePrime必须接受BigInteger n,但这意味着我需要另一种方式来生成随机BigInteger a. 我的第一个想法是做BigInteger a = (N-1) * rGen.NextDouble ()之类的事情,但是A BigInteger不能乘以double. 如何在1和n-1之间生成随机BigInteger,其中n是BigInteger? 解决方案 这是NextBigInteger NextBigInteger类的扩展方法.它基于出色的Fabio Iotti的实施,修改为简洁. . /// /// Returns a
6 2024-04-14
编程技术问答社区
将BigInteger转换为十进制(Base 10)字符串的最快方法?
到目前为止的答案 所以这是代码分解. //Time: ~7s (linear loop algorithm) //100,000! (456,574 decimal digits) BigInteger bigIntVar = computeFactorial(100000); //The first three here are just for comparison and are not actually Base 10. bigIntVar.ToBase64String() //Time: 00.001s | Base 64 | Tetrasexagesimal bigIntVar.ToString("x") //Time: 00.016s | Base 16 | Hexadecimal bigIntVar.ToBinaryString() //Time: 00.026s | Base 02 | Binary bigIntVar.ToQuickString()
2 2024-04-14
编程技术问答社区