Karma işlevinizin çok iyi bir işlev olmadığı gerçeğinin dışında * , kodunuzla ilgili en büyük sorun, .NET sürümüne bağlı olarak farklı bir sayı döndürmesi değil, her iki durumda da tamamen anlamsız bir sayı döndürmesidir: sorunun doğru cevabı
49 103 = 114 (143 mod Wolfram Alpha link )
Bu cevabı hesaplamak için bu kodu kullanabilirsiniz:
private static int PowMod(int a, int b, int mod) {
if (b == 0) {
return 1;
}
var tmp = PowMod(a, b/2, mod);
tmp *= tmp;
if (b%2 != 0) {
tmp *= a;
}
return tmp%mod;
}
Hesaplamanızın farklı bir sonuç üretmesinin nedeni, bir cevap üretmek için 49103 sayısının önemli basamaklarının çoğunu düşüren bir ara değer kullanmanızdır : 175 basamağının yalnızca ilk 16'sı doğrudur!
1230824813134842807283798520430636310264067713738977819859474030746648511411697029659004340261471771152928833391663821316264359104254030819694748088798262075483562075061997649
Kalan 159 hanenin hepsi yanlış. Bununla birlikte mod işlemi, sonuncular da dahil olmak üzere her bir rakamın doğru olmasını gerektiren bir sonuç arar. Bu nedenle, Math.Pow
.NET 4'te uygulanmış olabilecek kesinlikteki en ufak bir iyileştirme bile, hesaplamanızda esasen keyfi bir sonuç üreten büyük bir farkla sonuçlanacaktır.
* Bu soru, parola karması bağlamında tam sayıları yüksek güçlere yükseltmekten bahsettiğinden , mevcut yaklaşımınızın potansiyel olarak daha iyi bir yaklaşım için değiştirilip değiştirilmeyeceğine karar vermeden önce bu yanıt bağlantısını okumak çok iyi bir fikir olabilir .