/// <summary>开方</summary> static internal BigNumber Sqrt(BigNumber value, int precision) { if (!value.IsPlus) throw new ExpressionException("只有正数才有开平方运算"); List<int> div = new List<int>(); int index = 0; int resultIntCount = (value.IntPart.Count + 1) / 2; List<int> result = GetFirstDiv(value, ref div, ref index); div = FirstTry(result, div); div.AddRange(GetNewTwoDiv(value, ref index)); BigCalculate.RemoveStartZero(div); //考虑精度的计算 while (true) { div = TryDiv(div, result); if (result.Count - resultIntCount >= precision) break; div.AddRange(GetNewTwoDiv(value, ref index)); BigCalculate.RemoveStartZero(div); } return new BigNumber(result.GetRange(0, resultIntCount), result.GetRange(resultIntCount, result.Count - resultIntCount), true); }
//仅限于寻找有序数列中的众数 //多个众数时返回最小的众数 public static string Mode(BigNumber[] NumberSeries) { double MaxCount = 0; double CurrentCount = 0; BigNumber MaxNumber = new BigNumber("0"); BigNumber CurrentNumber = new BigNumber("0"); int len = NumberSeries.Length; for (int i = 1; i < len; i++) { if (CompareNumber.Compare(NumberSeries[i - 1], NumberSeries[i]) == 0) { CurrentCount++; if (CurrentCount > MaxCount) { MaxCount = CurrentCount; MaxNumber = NumberSeries[i]; } } else { CurrentCount = 0; } } if (MaxCount == 0) { return "NA"; } else { return MaxNumber.ToString(); } }
/// <summary>减</summary> public static BigNumber Minus(BigNumber one, BigNumber two) { BigNumber oneAbsolute = one.AbsoluteNumber; BigNumber twoAbsolute = two.AbsoluteNumber; //正数减正数 if (one.IsPlus && two.IsPlus) { if (oneAbsolute.CompareTo(twoAbsolute) == 1) return PlusMinus(one, two); else if (oneAbsolute.CompareTo(twoAbsolute) == -1) return PlusMinus(two, one).ReverseNumber; else return BigNumber.Zero; } //正数减负数 else if (one.IsPlus && !two.IsPlus) { return PlusAdd(oneAbsolute, twoAbsolute); } //负数减正数 else if (!one.IsPlus && two.IsPlus) { return PlusAdd(oneAbsolute, twoAbsolute).ReverseNumber; } //负数减负数 else if (!one.IsPlus && !two.IsPlus) { return Add(one, twoAbsolute); } throw new Exception("不可能到达的地方"); }
static void Main(string[] args) { BigNumber e = new BigNumber("1"); BigNumber[,] table = new BigNumber[3, 3] { { 52*e, 64*e, 24*e },{60*e,59*e,52*e},{50*e,65*e,74*e} }; Console.WriteLine(contingency(table)); Console.ReadKey(); }
public static void Main(string[] args) { Console.WriteLine("请输入x的值,用逗号分开"); string numberseriesx = Console.ReadLine(); Console.WriteLine("请输入y的值,用逗号分开"); string numberlinresy = Console.ReadLine(); char[] separator = { ',' }; string[] numbersx = numberseriesx.Split(separator); string[] numbersy = numberlinresy.Split(separator); int n = numbersx.Length; BigNumber[] x = new BigNumber[n]; BigNumber[] y = new BigNumber[n]; for (int i = 0; i < n; i++) { x[i] = new BigNumber(numbersx[i]); } for (int j = 0; j < n; j++) { y[j] = new BigNumber(numbersy[j]); } Console.WriteLine( Regression(x,y,n)); Console.ReadKey(); }
static BigNumber Quantile(BigNumber[] NumberSeries, double quan) { int len = NumberSeries.Length; double position = quan * (double)len; position = Convert.ToDouble(round(position.ToString(), 0)); return NumberSeries[Convert.ToInt32(position - 1)]; }
public void BigNum() { var x = new BigNumber(9007199254740992); Assert.Equal(@"{ ""Number"": ""9007199254740992"" }", JsonObject.FromObject(x).ToString()); }
public void LilNumber() { var x = new BigNumber(1); Assert.Equal(@"{ ""Number"": 1 }", JsonObject.FromObject(x).ToString()); }
public static string Regression(BigNumber[] x,BigNumber[] y,int n) { BigNumber sumx = new BigNumber("0"); BigNumber sumy = new BigNumber("0"); BigNumber lxy = new BigNumber("0"); BigNumber lxx = new BigNumber("0"); BigNumber xbar, ybar, beta0, beta1; for (int i = 0; i < n; i++) { sumx = sumx + x[i]; } xbar = sumx / new BigNumber(x.Length.ToString()); for (int a = 0; a <= n-1; a++) { lxx = lxx + (x[a] - xbar).Power(new BigNumber("2")); } for (int i = 0; i <= n-1; i++) { sumy = sumy + y[i]; } ybar = sumy / new BigNumber(y.Length.ToString()); for (int i = 0; i <= n-1; i++) { lxy = lxy + (x[i] - xbar) * (y[i] - ybar); } beta1 = lxy / lxx; beta0 = ybar - beta1 * xbar; BigNumber[] Ey = new BigNumber[n]; BigNumber[] residual = new BigNumber[n]; BigNumber SSR = new BigNumber("0"); BigNumber SSE = new BigNumber("0"); BigNumber Fvalue, Rsquare; for (int i =0;i <= n-1; i++) { Ey[i] = beta0 + beta1 * x[i]; } for (int i=0; i <= n-1;i++) { residual[i] = y[i] - Ey[i]; } for (int i = 0; i <= n - 1; i++) { SSR = SSR + (Ey[i] - ybar).Power(new BigNumber("2")); SSE = SSE + (y[i] - Ey[i]).Power(new BigNumber("2")); } Fvalue = SSR / SSE * (new BigNumber( n.ToString()) - new BigNumber("2")); string f = Fvalue.ToString(); double F = Convert.ToDouble(f); Rsquare = SSR / (SSR+SSE); // BigNumber Fa = new BigNumber(Stat.FdistUa(0.05, 2,1).ToString()); //BigNumber FF =new BigNumber("1") / Fa; BigNumber p = new BigNumber(Stat.FCDF(F, 1, 2).ToString()); return p.ToString()+" "+f;//+" "+ Fvalue.ToString();//"回归方程为:y=" + MathV.round(beta0.ToString(),3,0)+ "+" + MathV.round(beta1.ToString(),3,0) + "*x"+" Rsquare:"+MathV.round(Rsquare.ToString(),3,0)+" Fvalue:"+MathV.round(Fvalue.ToString(),3,0); }
private void test_ecdh_curve(Asn1Object obj, string text, BigNumber.Context ctx) { Key a = Key.FromCurveName(obj); Key b = Key.FromCurveName(obj); BigNumber x_a = new BigNumber(); BigNumber y_a = new BigNumber(); BigNumber x_b = new BigNumber(); BigNumber y_b = new BigNumber(); try { Console.Write("Testing key generation with {0}", text); a.GenerateKey(); if (a.Group.Method.FieldType == Objects.NID.X9_62_prime_field.NID) { a.PublicKey.GetAffineCoordinatesGFp(x_a, y_a, ctx); } else { a.PublicKey.GetAffineCoordinatesGF2m(x_a, y_a, ctx); } Console.Write("."); b.GenerateKey(); if (b.Group.Method.FieldType == Objects.NID.X9_62_prime_field.NID) { b.PublicKey.GetAffineCoordinatesGFp(x_b, y_b, ctx); } else { b.PublicKey.GetAffineCoordinatesGF2m(x_b, y_b, ctx); } Console.Write("."); byte[] abuf = new byte[MessageDigest.SHA1.Size]; int aout = a.ComputeKey(b, abuf, KDF1_SHA1); Console.Write("."); byte[] bbuf = new byte[MessageDigest.SHA1.Size]; int bout = b.ComputeKey(a, bbuf, KDF1_SHA1); Console.Write("."); Assert.Greater(aout, 4); Assert.AreEqual(aout, bout); Assert.IsTrue(Compare(abuf, bbuf)); Console.Write(" ok"); } finally { a.Dispose(); b.Dispose(); x_a.Dispose(); y_a.Dispose(); x_b.Dispose(); y_b.Dispose(); } Console.WriteLine(); }
static BigNumber Mean(BigNumber[] NumberSeries) { BigNumber sum = new BigNumber("0"); foreach (BigNumber SingleNumber in NumberSeries) { sum += SingleNumber; } int len = NumberSeries.Length; BigNumber len_bignumber = new BigNumber(len.ToString()); return sum / len_bignumber; }
//输入为BigNumber数组,返回为BigNumber值 //n - 1个自由度 public static BigNumber Variance(BigNumber[] NumberSeries) { BigNumber sum = new BigNumber("0"); int len = NumberSeries.Length; BigNumber mean_series = Mean(NumberSeries); foreach (BigNumber SingleNumber in NumberSeries) { sum += (SingleNumber - mean_series).Power(new BigNumber("2"), 30); } return sum / new BigNumber((len - 1).ToString()); }
/// <summary>e次幂</summary> public static BigNumber Exp(BigNumber value, int precision) { BigNumber sum = new BigNumber("0"); for (BigNumber n = new BigNumber("0"); ; n++) { BigNumber r = BigNumber.Division(value.Power(n), n.Factorial(), precision + 1); if (r.GetPrecision(0) > precision) break; sum = sum + r; } Remove(sum, precision); return sum; }
} //计算分位数值 static string ParaEasti(BigNumber[] NumberSeries, double significance, int tail, BigNumber goalnumber) { //总体均值的区间估计 //tail == 1单尾,为2则双尾 BigNumber n = new BigNumber(NumberSeries.Length.ToString()); if (tail == 2) { significance = significance / 2; } BigNumber lower = Proportion(NumberSeries, goalnumber)-new BigNumber(NORMSINV(significance).ToString())*(Proportion(NumberSeries, goalnumber) * (new BigNumber("1") - Proportion(NumberSeries, goalnumber)) / n).Power(new BigNumber("0.5")); BigNumber upper = Proportion(NumberSeries, goalnumber)+new BigNumber(NORMSINV(significance).ToString())*(Proportion(NumberSeries, goalnumber) * (new BigNumber("1") - Proportion(NumberSeries, goalnumber)) / n).Power(new BigNumber("0.5")); return lower.ToString() + "," + upper.ToString(); }
internal static BigNumber Division(BigNumber one, BigNumber two, int precision) { List<int> oneInt = new List<int>(); List<int> oneDecimal = new List<int>(); oneInt.AddRange(one.IntPart); oneDecimal.AddRange(one.DecimalPart); List<int> twoText = new List<int>(); twoText.AddRange(two.IntPart); twoText.AddRange(two.DecimalPart); RemoveStartZero(twoText); //将15/2.3 移位为 150/23 //DecimalLength for (int i = 0; i < two.DecimalPart.Count; i++) { if (oneDecimal.Count != 0) { oneInt.Add(oneDecimal[0]); oneDecimal.RemoveAt(0); } else { oneInt.Add(0); } } List<int> resultInt = new List<int>(); List<int> resultDecimal = new List<int>(); int index = twoText.Count < oneInt.Count ? twoText.Count - 1 : oneInt.Count - 1; List<int> div = oneInt.GetRange(0, index + 1); //正数部分的除法 while (true) { resultInt.Add(Division(div, twoText)); div = IntMinus(div, Multiply(twoText, new List<int> { resultInt[resultInt.Count - 1] }), 0); index++; if (index >= oneInt.Count) break; div.Add(oneInt[index]); } index = 0; //小数部分的除法 while (true) { //满足精度后退出 if (resultDecimal.Count >= precision) break; if (index >= oneDecimal.Count) div.Add(0); else { div.Add(oneDecimal[index]); } int r = Division(div, twoText); resultDecimal.Add(r); div = IntMinus(div, Multiply(twoText, new List<int> { r }), 0); index++; } return new BigNumber(resultInt, resultDecimal, !(one.IsPlus ^ two.IsPlus)); }
/// <summary> 乘 </summary> public static BigNumber Multiply(BigNumber one, BigNumber two) { List<int> oneText = new List<int>(); List<int> twoText = new List<int>(); oneText.AddRange(one.IntPart); oneText.AddRange(one.DecimalPart); twoText.AddRange(two.IntPart); twoText.AddRange(two.DecimalPart); List<int> resultText = Multiply(oneText, twoText); int decimalLength = one.DecimalPart.Count + two.DecimalPart.Count; List<int> intPart = resultText.GetRange(0, resultText.Count - decimalLength); List<int> decimalPart = resultText.GetRange(resultText.Count - decimalLength, decimalLength); return new BigNumber(intPart, decimalPart, !(one.IsPlus ^ two.IsPlus)); }
static void Sort(int n, BigNumber[] NumberSeries) { BigNumber temp = new BigNumber("0"); if (n <= 1){ return; } for (int i = 0;i < n - 1;i++){ if (CompareNumber.Compare(NumberSeries[i] , NumberSeries[i+1]) == 1){ temp = NumberSeries[i +1]; NumberSeries[i + 1]= NumberSeries[i]; NumberSeries[i]=temp; } Sort(n - 1, NumberSeries); } }
static string HT(BigNumber H0, BigNumber[] NumberSeries, double significance, int tail, BigNumber goalnumber) { //Hypothesis Testing假设检验 string result = ParaEasti(NumberSeries, significance, tail, goalnumber); char[] separator = { ',' }; string[] intervals = result.Split(separator); BigNumber lower = new BigNumber(intervals[0]); BigNumber upper = new BigNumber(intervals[1]); if (tail == 2) { significance = significance / 2; if (CompareNumber.Compare(lower, H0) == -1 && CompareNumber.Compare(upper, H0) == 1) { return "不拒绝原假设"; } else { return "拒绝原假设"; } } else if (tail == -1)//左单尾 { significance = significance / 1; if (CompareNumber.Compare(lower, H0) == -1) { return "不拒绝原假设"; } else { return "拒绝原假设"; } } else//右单尾 { significance = significance / 1; if (CompareNumber.Compare(upper, H0) == -1) { return "拒绝原假设"; } else { return "不拒绝原假设"; } } }
/// <summary>获取第一个除数</summary> static List<int> GetFirstDiv(BigNumber value, ref List<int> div, ref int index) { //这里有待加入对0.02和0.002的考虑 if (value.IntPart.Count == 1 && value.IntPart[0] == 0) { List<int> result = new List<int>(); result.Add(0); while (true) { if (value.DecimalPart[index] != 0) { for (int i = 0; i < index / 2; i++) { result.Add(0); } //0.005 if (index % 2 == 0) { div.Add(value.DecimalPart[index]); if (index + 1 < value.DecimalPart.Count) { div.Add(value.DecimalPart[index + 1]); } else { div.Add(0); } } //0.05 else { div.Add(value.DecimalPart[index]); } index++; break; } index++; if (index == value.DecimalPart.Count) break; } index++; return result; } else { //如果是偶数则第一次取两位 if (value.IntPart.Count % 2 == 0) { div = value.IntPart.GetRange(0, 2); index = 2; } //是奇数则只取一位 else { div = value.IntPart.GetRange(0, 1); index = 1; } return new List<int>(); } }
static BigNumber Proportion(BigNumber[] NumberSeries,BigNumber goalnumber) { int n = NumberSeries.Length; BigNumber count= new BigNumber("0"); BigNumber goal= new BigNumber(goalnumber.ToString()); for (int i = 0; i< n; i++ ) { if (CompareNumber.Compare(NumberSeries[i],goal) == 0) { count = count + new BigNumber("1"); } else { count = count + new BigNumber("0"); } } return count / new BigNumber(n.ToString()); }//计算目标样本比例p
static int ComparePlus( BigNumber one, BigNumber two ) { BigCalculate.RemoveStartZero( one.IntPart ); BigCalculate.RemoveStartZero( two.IntPart ); int minDecimalLength = one.DecimalPart.Count < two.DecimalPart.Count ? one.DecimalPart.Count : two.DecimalPart.Count; //通过正数的长短比较 if ( one.IntPart.Count > two.IntPart.Count ) return 1; else if ( one.IntPart.Count < two.IntPart.Count ) return -1; else { //从最高位依次比较 for ( int i = 0; i < one.IntPart.Count; i++ ) { if ( one.IntPart[i] > two.IntPart[i] ) return 1; else if ( one.IntPart[i] < two.IntPart[i] ) return -1; } //比较小数部分,行判断是否有小数位 if ( one.DecimalPart .Count == 0 && two.DecimalPart .Count != 0 ) return -1; else if ( one.DecimalPart .Count != 0 && two.DecimalPart .Count == 0 ) return 1; else if ( one.DecimalPart .Count == 0 && two.DecimalPart .Count == 0 ) return 0; else { for ( int i = 0; i < minDecimalLength; i++ ) { if ( one.DecimalPart[i] > two.DecimalPart[i] ) return 1; else if ( one.DecimalPart[i] < two.DecimalPart[i] ) return -1; } if ( one.DecimalPart .Count > two.DecimalPart .Count ) return 1; else if ( one.DecimalPart .Count < two.DecimalPart .Count ) return -1; } return 0; } }
static string round(string number, int digits) { int NumOriginLen = number.Length; char[] digit_dot = { '.' }; string[] NumberBroken; NumberBroken = number.Split(digit_dot); if (digits < 0) { digits = 0; } if (NumberBroken[0].Length == NumOriginLen) { return NumberBroken[0] + ".".PadRight(digits + 1, '0'); } else { string decimal_part = " "; BigNumber zero_point_one = new BigNumber("0.1"); BigNumber one = new BigNumber("1"); if (NumberBroken[1].Length > digits) { if (Convert.ToInt32(NumberBroken[1].Substring(digits, 1)) > 4) { BigNumber carry = new BigNumber(digits.ToString()); carry = zero_point_one.Power(carry, 200); BigNumber number_changed = new BigNumber(number); number_changed = number_changed + carry; return number_changed.ToString().Substring(0, NumOriginLen - (NumberBroken[1].Length - digits)); } else { decimal_part = NumberBroken[1].Substring(0, digits); } } else { decimal_part = NumberBroken[1].PadRight(digits, '0'); } return NumberBroken[0] + '.' + decimal_part; } }
public static int Compare( BigNumber one, BigNumber two) { if ( one.IsPlus && two.IsPlus ) { return ComparePlus(one,two ); } else if ( one.IsPlus && !two.IsPlus ) { return 1; } else if ( !one.IsPlus && two.IsPlus ) { return -1; } else { return ( -1 ) * ComparePlus(one ,two ); } }
// GET api/values/5 public Object Get(int id) { Invocations++; Trace.TraceInformation("Otro cliente al que atender."); if (id < 10) { var ex = new ArgumentException("Requerida una precisión superior a 10."); // Telemetría para App Insights var telemetry = new TelemetryClient(); var telemetryInfo = new Dictionary<string, string> { { "invocaciones", Convert.ToString(Invocations) } }; var telemetryMeasurements = new Dictionary<string, double> { { "digitos", id } }; telemetry.TrackException(ex, telemetryInfo, telemetryMeasurements); // Mensaje para Applications Logs Trace.TraceError("El cliente anda despistado."); throw ex; } BigNumber x = new BigNumber(id); BigNumber y = new BigNumber(id); x.ArcTan(16, 5); y.ArcTan(4, 239); x.Subtract(y); string pi = x.AsPrintableString(); if (pi.Length > 1000) { Trace.TraceWarning("Resultado de " + pi.Length + " caracteres!"); } var resultado = new { pi = pi, invocations = Invocations }; return resultado; }
/// <summary>加</summary> public static BigNumber Add(BigNumber one, BigNumber two) { BigNumber oneAbsolute = one.AbsoluteNumber; BigNumber twoAbsolute = two.AbsoluteNumber; //正数加正数 if (one.IsPlus && two.IsPlus) { return PlusAdd(one, two); } //正数加负数 else if (one.IsPlus && !two.IsPlus) { return Minus(oneAbsolute, twoAbsolute); } //负数加正数 else if (!one.IsPlus && two.IsPlus) { return Add(two, one); } //负数加负数 else if (!one.IsPlus && !two.IsPlus) { BigNumber result = PlusAdd(one.AbsoluteNumber, two.AbsoluteNumber); return new BigNumber(result.IntPart, result.DecimalPart, false); } throw new Exception("不可能到达的地方"); }
public static RsaKeyPair GenerateRsaPrivateKey(int bits = 2048, BigNumber e = null, RsaKeyGeneratorCallback cb = null, object cbArg = null) { if (e == null) e = E_F4; using (var rsa = new RSA()) { BigNumber.GeneratorHandler cbWrapper = null; if (cb != null) cbWrapper = (x,y,z) => cb(x,y,z); Cipher enc = null; string pwd = null; PasswordHandler pwdCb = null; // If we choose to encrypt: // Cipher.DES_CBC; // Cipher.DES_EDE3_CBC; // Cipher.Idea_CBC; // Cipher.AES_128_CBC; // Cipher.AES_192_CBC; // Cipher.AES_256_CBC; // and pwd != null || pwdCb != null // We can use a pwdCb to get a password interactively or we can // simply pass in a fixed password string (no cbPwd, just pwd) if (pwd != null) pwdCb = DefaultPasswordHandler; // Ref: http://openssl.org/docs/manmaster/crypto/RSA_generate_key_ex.html rsa.GenerateKeys(bits, e, cbWrapper, cbArg); using (var bio = BIO.MemoryBuffer()) { // Ref: http://openssl.org/docs/manmaster/crypto/PEM_write_bio_RSAPrivateKey.html rsa.WritePrivateKey(bio, enc, pwdCb, pwd); return new RsaKeyPair(bits, e.ToHexString(), bio.ReadString()); } } }
static void Main(string[] args) { Console.WriteLine("请输入你要输入数字个数:"); int n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入一列数,用逗号分隔:"); string number_series = Console.ReadLine(); char[] separator = {','}; string[] numbers = number_series.Split(separator); BigNumber[] x = new BigNumber[n]; for (int i = 0; i < n; i++) { x[i] = new BigNumber(numbers[i]); } //Console.WriteLine(Mean(x).ToString()); Sort(x.Length, x); for (int i = 0; i < n; i++) { Console.WriteLine("{0}",x[i]); } Console.ReadKey(); }
public static BigNumber[,] MatPlus(BigNumber[,] mat1, BigNumber[,] mat2) {//矩阵加法 int len11 = mat1.GetLength(0); int len12 = mat1.GetLength(1); int len21 = mat2.GetLength(0); int len22 = mat2.GetLength(1); if (len11 == len21 && len12 == len22) { BigNumber[,] a = new BigNumber[len11, len12]; for (int i = 0; i < len11; i++) { for (int j = 0; j < len12; j++) { a[i, j] = mat1[i, j] + mat2[i, j]; } } return a; } else { return null; } }
static void Main(string[] args) { Console.WriteLine("请输入你要输入数字个数:"); int n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入一列数,用逗号分隔:"); string number_series = Console.ReadLine(); char[] separator = { ',' }; string[] numbers = number_series.Split(separator); BigNumber[] x = new BigNumber[n]; for (int i = 0; i < n; i++) { x[i] = new BigNumber(numbers[i]); } Console.WriteLine(Stat.Mean(x).ToString()); Stat.Sort(x.Length, x); for (int i = 0; i < n; i++) { Console.WriteLine("{0}", x[i]); } Console.WriteLine("数列的中位数是:{0}", Stat.Quantile(x, 0.5).ToString()); Console.WriteLine("这列数的方差是:{0}", Stat.Variance(x)); Console.WriteLine("对方差进行四舍五入,取3位小数:{0}", MathV.round(Stat.Variance(x).ToString(), 3, 0)); Console.ReadKey(); }
/// <summary> /// Default constructor /// </summary> /// <param name="publicKey"></param> public Encryption() { Multiplier = 0; Modulus = 0; }
public void Should_throw_exception_when_changing_inner_char(string value, int index, string newElementValue) { var bigNumber = new BigNumber(value); Assert.Throws <FormatException>(() => bigNumber[index] = newElementValue[0]); }
private static BigNumber CreateNumber(params int[] numbers) { return(BigNumber.FromBytes(numbers)); }
public void Constructor_NumbersIsEmpty() { Assert.Throws(typeof(ArgumentException), () => BigNumber.FromBytes(new int[0])); }
public ClickReward(BigNumber moneyToAdd) { MoneyToAdd = moneyToAdd; }
private static int[] Sum(int[] firstArray, int[] secondArray, BigNumber firstNumber, BigNumber secondNumber) { int temp = 0; var resultArray = new int[firstNumber.sourceNumber.Length]; for (int n = 0; n < firstNumber.sourceNumber.Length; n++) { if ((n + 1) <= secondNumber.sourceNumber.Length) { if (n < firstNumber.sourceNumber.Length - 1) { resultArray[n] = (firstArray[n] + secondArray[n] + temp) % 10; temp = (firstArray[n] + secondArray[n] + temp) / 10; } else { resultArray[n] = firstArray[n] + secondArray[n] + temp; } } else { if (n < firstNumber.sourceNumber.Length - 1) { resultArray[n] = (firstArray[n] + temp) % 10; temp = (firstArray[n] + temp) / 10; } else { resultArray[n] = firstArray[n] + temp; } } } return(resultArray); }
public void Should_return_default_BigNumber() { var bigNumber = new BigNumber(); bigNumber.ToString().ShouldBe("0.0"); }
public override string ToString() { return(BigNumber.FormatBigDouble(this, null, null)); }
private static BigNumber[][] StringToBigNumber(string[,] str, int n, string Record) { //这个函数可以将字符串数组转化为BigNumber的锯齿型数组 //n为变量数 BigNumber[][] data = new BigNumber[n][]; int q; int i = 0, j = 0; //GetLength(0),0代表的行数,1代表的列数 int data_row = 0; int data_column; int str_empty_counts; //AllEmpty的情况应该事先测试好; char[] separator = { ',' }; string[] RecordNumbers = Record.Split(separator); int Empty; int data_Counts = 0; //data_Counts用来给data计数,因为data的行数不能用i表示 //i表示字符串数组的行,j表示列 //先固定j,然后一行一行往下检测 for (j = 0; j < str.GetLength(1); j++) { data_column = 0; Empty = 0; //利用foreach语句确认本列是否为空列,有空列则Empty记为1 foreach (string FindEmptyColumn in RecordNumbers) { //MessageBox.Show("FindEmptyColumn = " + FindEmptyColumn ); if (FindEmptyColumn == j.ToString()) { Empty = 1; //MessageBox.Show("发现空列"); } } if (Empty == 0) { //如果Empty为0则不是空列,准备读数据 str_empty_counts = 0; //要计算第j列字符串中的空字符单元格数量 for (q = 0; q < str.GetLength(0); q++) { if (str[q, j] == null) { str_empty_counts++; } else if (str[q, j].Trim() == "") { str_empty_counts++; } } data[data_Counts] = new BigNumber[str.GetLength(0) - str_empty_counts]; data_Counts++; //对数组进行初始化 for (i = 0; i < str.GetLength(0); i++) { if (str[i, j] != null) { if (str[i, j].Trim() != "") { //MessageBox.Show("i = " + i + "j = " + j + "录入BigNumber的值 = " + str[i, j]+"data_row = "+data_row + "data_column = "+data_column ); data[data_row][data_column] = new BigNumber(str[i, j].Trim()); data_column++; } } } data_row++; } } return(data); }
public override PrivateKey GeneratePrivateKey(PrivateKeyParams pkp) { var rsaPkParams = pkp as RsaPrivateKeyParams; var ecPkParams = pkp as EcPrivateKeyParams; if (rsaPkParams != null) { int bits; // Bits less than 1024 are weak Ref: http://openssl.org/docs/manmaster/crypto/RSA_generate_key_ex.html if (rsaPkParams.NumBits < 1024) { bits = RSA_BITS_DEFAULT; } else { bits = rsaPkParams.NumBits; } BigNumber e; if (string.IsNullOrEmpty(rsaPkParams.PubExp)) { e = RSA_E_F4; } else if (rsaPkParams.PubExp.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) { e = BigNumber.FromHexString(rsaPkParams.PubExp); } else { e = BigNumber.FromDecimalString(rsaPkParams.PubExp); } using (var rsa = new RSA()) { BigNumber.GeneratorHandler cbWrapper = null; if (rsaPkParams.Callback != null) { cbWrapper = (x, y, z) => rsaPkParams.Callback(x, y, z); } Cipher enc = null; string pwd = null; PasswordHandler pwdCb = null; // If we choose to encrypt: // Cipher.DES_CBC; // Cipher.DES_EDE3_CBC; // Cipher.Idea_CBC; // Cipher.AES_128_CBC; // Cipher.AES_192_CBC; // Cipher.AES_256_CBC; // and pwd != null || pwdCb != null // We can use a pwdCb to get a password interactively or we can // simply pass in a fixed password string (no cbPwd, just pwd) if (pwd != null) { pwdCb = DefaultPasswordHandler; } // Ref: http://openssl.org/docs/manmaster/crypto/RSA_generate_key_ex.html rsa.GenerateKeys(bits, e, cbWrapper, rsaPkParams.CallbackArg); using (var bio = BIO.MemoryBuffer()) { // Ref: http://openssl.org/docs/manmaster/crypto/PEM_write_bio_RSAPrivateKey.html rsa.WritePrivateKey(bio, enc, pwdCb, pwd); return(new RsaPrivateKey(bits, e.ToHexString(), bio.ReadString())); } } } else if (ecPkParams != null) { throw new NotImplementedException("EC private keys have not yet been implemented"); //var curveName = Asn1Object.FromShortName("P-256"); ////var curveName = new Asn1Object("P-256"); //using (var ec =OpenSSL.Crypto.EC.Key.FromCurveName(curveName)) //{ // ec.GenerateKey(); //} } else { throw new NotSupportedException("unsupported private key parameter type"); } }
/// <summary> /// Если число вероятно простое, то возвращается true. /// </summary> private bool PrimeTestNumber(BigNumber number) { return(!multiplicityChecker.Check(number) && primeTest.CheckPrimality(number)); }
public string ToString(string format, IFormatProvider formatProvider) { return(BigNumber.FormatBigDouble(this, format, formatProvider)); }
public string ToString(string format) { return(BigNumber.FormatBigDouble(this, format, null)); }
private static IEnumerable <TestCaseData> TestCasesForDifference() { var value_1 = 1.56843; var value_2 = 3.65766; var defaultPow = 1; for (var pow = 1; pow < 200; pow++) { //same number but different pows var expectedResult_1 = (value_1 * Math.Pow(10, defaultPow)) - (value_1 * Math.Pow(10, pow)); var bigNumber_1 = new BigNumber() { Number = value_1, PowOfTen = defaultPow }; var bigNumber_2 = new BigNumber() { Number = value_1, PowOfTen = pow }; yield return(new TestCaseData(bigNumber_1, bigNumber_2, expectedResult_1).SetName($"[0]Check diff operator {bigNumber_1} - {bigNumber_2} = {expectedResult_1}")); var expectedResult_2 = (value_1 * Math.Pow(10, pow)) - (value_1 * Math.Pow(10, defaultPow)); var bigNumber_3 = new BigNumber() { Number = value_1, PowOfTen = pow }; var bigNumber_4 = new BigNumber() { Number = value_1, PowOfTen = defaultPow }; yield return(new TestCaseData(bigNumber_3, bigNumber_4, expectedResult_2).SetName($"[1]Check diff operator {bigNumber_3} - {bigNumber_4} = {expectedResult_2}")); //same pow but different numbers var expectedResult_3 = (value_1 * Math.Pow(10, pow)) - (value_2 * Math.Pow(10, pow)); var bigNumber_5 = new BigNumber() { Number = value_1, PowOfTen = pow }; var bigNumber_6 = new BigNumber() { Number = value_2, PowOfTen = pow }; yield return(new TestCaseData(bigNumber_5, bigNumber_6, expectedResult_3).SetName($"[2]Check diff operator {bigNumber_5} - {bigNumber_6} = {expectedResult_3}")); var expectedResult_4 = (value_2 * Math.Pow(10, pow)) - (value_1 * Math.Pow(10, pow)); var bigNumber_7 = new BigNumber() { Number = value_2, PowOfTen = pow }; var bigNumber_8 = new BigNumber() { Number = value_1, PowOfTen = pow }; yield return(new TestCaseData(bigNumber_7, bigNumber_8, expectedResult_4).SetName($"[3]Check diff operator {bigNumber_7} - {bigNumber_8} = {expectedResult_4}")); //different pow and different number var expectedResult_5 = (value_1 * Math.Pow(10, pow)) - (value_2 * Math.Pow(10, pow - 1)); var bigNumber_9 = new BigNumber() { Number = value_1, PowOfTen = pow }; var bigNumber_10 = new BigNumber() { Number = value_2, PowOfTen = pow - 1 }; yield return(new TestCaseData(bigNumber_9, bigNumber_10, expectedResult_5).SetName($"[4]Check diff operator {bigNumber_9} - {bigNumber_10} = {expectedResult_5}")); var expectedResult_6 = (value_2 * Math.Pow(10, pow)) - (value_1 * Math.Pow(10, pow - 1)); var bigNumber_11 = new BigNumber() { Number = value_2, PowOfTen = pow }; var bigNumber_12 = new BigNumber() { Number = value_1, PowOfTen = pow - 1 }; yield return(new TestCaseData(bigNumber_11, bigNumber_12, expectedResult_6).SetName($"[5]Check diff operator {bigNumber_11} - {bigNumber_12} = {expectedResult_6}")); } }
static string round(string number, int digits, int type) { //type为0时四舍五入,1为ground,2为ceiling int NumOriginLen = number.Length; char[] digit_dot = { '.' }; string[] NumberBroken; NumberBroken = number.Split(digit_dot); if (digits < 0) { digits = 0; } if (NumberBroken[0].Length == NumOriginLen) { if (digits <= 0) { return(number); } else { return(NumberBroken[0] + ".".PadRight(digits + 1, '0')); } } else { string decimal_part = " "; BigNumber zero_point_one = new BigNumber("0.1"); BigNumber one = new BigNumber("1"); if (NumberBroken[1].Length > digits) { if (type == 1) { decimal_part = NumberBroken[1].Substring(0, digits); } else if (type == 2) { BigNumber carry = new BigNumber(digits.ToString()); carry = zero_point_one.Power(carry, 200); BigNumber number_changed = new BigNumber(number); number_changed = number_changed + carry; if (digits <= 0) { return(number_changed.ToString().Substring(0, NumberBroken[0].Length)); } return(number_changed.ToString().Substring(0, NumOriginLen - (NumberBroken[1].Length - digits))); } else { if (Convert.ToInt32(NumberBroken[1].Substring(digits, 1)) > 4) { BigNumber carry = new BigNumber(digits.ToString()); carry = zero_point_one.Power(carry, 200); BigNumber number_changed = new BigNumber(number); number_changed = number_changed + carry; return(number_changed.ToString().Substring(0, NumOriginLen - (NumberBroken[1].Length - digits))); } else { decimal_part = NumberBroken[1].Substring(0, digits); } } } else { decimal_part = NumberBroken[1].PadRight(digits, '0'); } if (decimal_part == "") { return(NumberBroken[0]); } return(NumberBroken[0] + '.' + decimal_part); } }
private string Serialize(BigNumber number) { return(serializer.Serialize(number)); }
private void CreateInput() { while (true) { bool inputQueueIsLow = false; lock (_kernelInput) { inputQueueIsLow = _kernelInput.Count < 300; } if (inputQueueIsLow) { int num_exps = (get_der_len(EXP_MAX) - get_der_len(EXP_MIN) + 1); KernelInput input = new KernelInput(num_exps); profiler.StartRegion("generate key"); input.Rsa.GenerateKey(keySize); // Generate a key profiler.EndRegion("generate key"); // Build DERs and calculate midstates for exponents of representitive lengths profiler.StartRegion("cpu precompute"); int cur_exp_num = 0; BigNumber[] Exps = new BigNumber[num_exps]; bool skip_flag = false; for (int i = get_der_len(EXP_MIN); i <= get_der_len(EXP_MAX); i++) { ulong exp = (ulong)0x01 << (int)((i - 1) * 8); // Set the exponent in the RSA key // NO SANITY CHECK - just for building a DER input.Rsa.Rsa.PublicExponent = (BigNumber)exp; Exps[cur_exp_num] = (BigNumber)exp; // Get the DER byte[] der = input.Rsa.DER; int exp_index = der.Length % 64 - i; if (kernel_type == KernelType.Optimized4_9) { if (exp_index != 9) // exponent index assumed to be 9 in the kernel { Console.WriteLine("Exponent index doesn't match - skipping key"); skip_flag = true; break; } if (i != 4) // exponent length assumed to be 4 in the kernel { Console.WriteLine("Exponent length doesn't match - skipping key"); skip_flag = true; break; } } else if (kernel_type == KernelType.Optimized4_11) { if (exp_index != 11) // exponent index assumed to be 9 in the kernel { Console.WriteLine("Exponent index doesn't match - skipping key"); skip_flag = true; break; } if (i != 4) // exponent length assumed to be 4 in the kernel { Console.WriteLine("Exponent length doesn't match - skipping key"); skip_flag = true; break; } } // Put the DER into Ws SHA1 Sha1 = new SHA1(); List <uint[]> Ws = Sha1.DataToPaddedBlocks(der); // Put all but the last block through the hash Ws.Take(Ws.Count - 1).Select((t) => { Sha1.SHA1_Block(t); return(t); }).ToArray(); // Put the midstate, the last W block, and the byte index of the exponent into the CL buffers Sha1.H.CopyTo(input.Midstates, 5 * cur_exp_num); Ws.Last().Take(16).ToArray().CopyTo(input.LastWs, 16 * cur_exp_num); input.ExpIndexes[cur_exp_num] = exp_index; // Increment the current exponent size cur_exp_num++; break; } profiler.EndRegion("cpu precompute"); if (skip_flag) { continue; // we got a bad key - don't enqueue it } List <KernelInput> inputs = new List <KernelInput>(); inputs.Add(input); for (uint i = 1; i < (EXP_MAX - EXP_MIN) / 2 / workSize - 1; i++) { profiler.StartRegion("generate key"); if (EXP_MIN + workSize * 2 * i >= EXP_MAX) { throw new ArgumentException("base_exp > EXP_MAX"); } inputs.Add(new KernelInput(input, EXP_MIN + workSize * 2 * i)); profiler.EndRegion("generate key"); } lock (_kernelInput) //put input on queue { foreach (KernelInput i in inputs) { _kernelInput.Push(i); } } continue; //skip the sleep cause we might be really low } Thread.Sleep(50); } }
private string SerializeKey(BigNumber first, BigNumber second) { return(string.Format("{0}#{1}", Serialize(first), Serialize(second))); }
public void BigNumberConstructor() { var op1 = new BigNumber(); var op2 = new BigNumber("21389101312"); }
public void GetAffineCoordinatesGFp(BigNumber x, BigNumber y, BigNumber.Context ctx) { Native.ExpectSuccess( Native.EC_POINT_get_affine_coordinates_GFp(this.group.Handle, this.ptr, x.Handle, y.Handle, ctx.Handle) ); }
public void BigNumberFirst() { var op1 = new BigNumber("12345"); Console.WriteLine(op1.First.Value); }
public void BigNumberWrite() { var op1 = new BigNumber("123123213"); op1.Write(); }
public TimeReward(IUpgradeSystem upgrades, float time) { MoneyToAdd = upgrades.MoneyPerSec * time; }
private static void CheckNumber(BigNumber number, params int[] expectedNumbers) { TestHelper.CheckNumber(number, expectedNumbers); }
public void CheckDivide(BigNumber a, BigNumber b, double expectedResult) { var resultOfSum = a / b; Assert.AreEqual(expectedResult, resultOfSum.Number * Math.Pow(10, resultOfSum.PowOfTen), expectedResult * delta); }
public void IsEven_NumberIs3() { var number = BigNumber.FromInt(3); Assert.IsFalse(number.IsEven); }
public void CheckPow(BigNumber a, int pow, double expectedResult) { var resultOfPow = BigNumber.Pow(a, pow); Assert.AreEqual(expectedResult, resultOfPow.Number * Math.Pow(10, resultOfPow.PowOfTen), expectedResult * delta); }
static void Main(string[] args) { //目标为控制位数在10位 string Number; Console.WriteLine("请输入数字"); Number = Console.ReadLine(); Number = Number.Trim(); int CountDecimalPoint = 0; int ScientificNumber; string ScientificNotation = ""; int digits_part; BigNumber NumberProcess = new BigNumber("0"); string ProcessedNumber; char[] separator = { '.' }; //用于分割小数点 string[] NumberParts = new string[2]; int IsNegative = 0; //用来判定数字是否为负 int zero_count = 0; //用于计算小数点后有多少个零 NumberParts = Number.Split(separator); if (NumberParts[0].Length + 5 > 10) //四位小数加上1个小数点 { if (Number[0] == '-'){ IsNegative = 1; } foreach (char FindDecimalPoint in Number) { if (FindDecimalPoint == '.') { CountDecimalPoint = 1; break; } } if (CountDecimalPoint == 0) { //无小数点则只有整数部分 ScientificNumber = Number.Length - IsNegative - 1; //转换为科学计数法 //Console.WriteLine("ScientificNumber = {0}", ScientificNumber); if (ScientificNumber <= 9 && ScientificNumber > 0) { ScientificNotation = "0" + ScientificNumber.ToString(); //如果科学计数法为个位要补零 } else { ScientificNotation = ScientificNumber.ToString(); } //数字正负无需考虑 if (ScientificNotation.Length + 1 + 2 <= 9) { //例如:-3.1415E+05 //数字负号占一位,E和科学计数法的符号占两位 //大于9的情况不做考虑,数字太大。 digits_part = 9 - (ScientificNotation.Length + 1 + 2); //小数位由此算出 NumberProcess = new BigNumber (Number.ToString()) / (new BigNumber("10")).Power(new BigNumber(ScientificNumber.ToString()),30); //Console.WriteLine("ScientificNotation = {0},digits_part = {1},NumberProcess = {2}", ScientificNotation, digits_part, NumberProcess.ToString()); ProcessedNumber = MathV.round(NumberProcess.ToString(), digits_part, 0) + "E+"+ScientificNotation ; //Console.WriteLine("ProcessedNumber ={0}", ProcessedNumber); } else { //如果已经大于已经大于九位了,则不作处理 //这种情况极为罕见,不考虑 NumberProcess = new BigNumber(Number.ToString()) / (new BigNumber("10")).Power(new BigNumber(ScientificNumber.ToString()), 30); ProcessedNumber = MathV.round(NumberProcess.ToString(), 0, 0) + "E+" + ScientificNotation; } } else { //有小数点的情况 NumberParts = Number.Split(separator); if (NumberParts[0] != "0") { if (NumberParts[0].Length + 1 + 4 >= 9) { //如果保留四位小数之后依旧总长度超过九,则进行如下操作 //判断整数部分是否为0 //如果不为0,继续科学计数法的处理,舍去小数部分 ScientificNumber = NumberParts[0].Length - IsNegative - 1; //转换为科学计数法 if (ScientificNumber <= 9 && ScientificNumber > 0) { ScientificNotation = "0" + ScientificNumber.ToString(); //如果科学计数法为个位要补零 } else { ScientificNotation = ScientificNumber.ToString(); } //数字正负无需考虑 if (ScientificNotation.Length + 1 + 2 <= 9) { //例如:-3.1415E+05 //数字负号占一位,E和科学计数法的符号占两位 //大于9的情况不做考虑,数字太大。 digits_part = 9 - (ScientificNotation.Length + 1 + 2); //小数位由此算出 NumberProcess = new BigNumber(Number.ToString()) / (new BigNumber("10")).Power(new BigNumber(ScientificNumber.ToString()), 30); ProcessedNumber = MathV.round(NumberProcess.ToString(), digits_part, 0) + "E+" + ScientificNotation; } else { //如果已经大于已经大于九位了,则不作处理 //这种情况极为罕见,不考虑 NumberProcess = new BigNumber(Number.ToString()) / (new BigNumber("10")).Power(new BigNumber(ScientificNumber.ToString()), 30); ProcessedNumber = MathV.round(NumberProcess.ToString(), 0, 0) + "E+" + ScientificNotation; } } else { ProcessedNumber = MathV.round(Number, 4, 0); } } else { zero_count = 0; foreach (char EachDigit in NumberParts[1]) { if (EachDigit == '0') { zero_count++; } else { break; } } ScientificNumber = zero_count + 1; //科学计数法的数字为零的个数加1 if (ScientificNumber <= 9 && ScientificNumber > 0) { ScientificNotation = "0" + ScientificNumber.ToString(); //如果科学计数法为个位要补零 } else { ScientificNotation = ScientificNumber.ToString(); } if (ScientificNotation.Length + 1 + 2 <= 9) { //例如:-2.654E-05 //数字负号占一位,E和科学计数法的符号占两位 //大于9的情况不做考虑,数字太大。 digits_part = 9 - (ScientificNotation.Length + 1 + 2); //小数位由此算出 NumberProcess = new BigNumber(Number.ToString()) * (new BigNumber("10")).Power(new BigNumber(ScientificNumber.ToString()), 30); ProcessedNumber = MathV.round(NumberProcess.ToString(), digits_part, 0) + "E-" + ScientificNotation; } else { //如果已经大于已经大于九位了,则不作处理 //这种情况极为罕见,不考虑 NumberProcess = new BigNumber(Number.ToString()) * (new BigNumber("10")).Power(new BigNumber(ScientificNumber.ToString()), 30); ProcessedNumber = MathV.round(NumberProcess.ToString(), 0, 0) + "E-" + ScientificNotation; } } } } else { ProcessedNumber = MathV.round(Number,4,0); //如果本身长度就在十个单位以内,则不作处理 //保留四位小数 } if (ProcessedNumber.Length < 11) { ProcessedNumber = ProcessedNumber.PadLeft(11, ' '); //11个单位的长度是为了预留量 } Console.WriteLine("ProcessedNumber={0}", ProcessedNumber); Console.ReadKey(); }
public void CheckLow(BigNumber a, BigNumber b, bool expectedResult) { var result = a < b; Assert.AreEqual(expectedResult, result); }
/// <summary> /// Calls RSA_generate_key_ex() /// </summary> /// <param name="bits"></param> /// <param name="e"></param> /// <param name="callback"></param> /// <param name="arg"></param> public void GenerateKeys(int bits, BigNumber e, BigNumber.GeneratorHandler callback, object arg) { this.thunk = new BigNumber.GeneratorThunk(callback, arg); Native.ExpectSuccess(Native.RSA_generate_key_ex(this.ptr, bits, e.Handle, this.thunk.CallbackStruct)); }
public void Should_parse_BigNumber_initial_value(string number, string returnValue) { var bigNumber = new BigNumber(number); bigNumber.ToString().ShouldBe(returnValue); }