2012-04-07 18 views
5

Daha hızlı bir BigInt uygulaması yapıyorum ve temel platform ile birlikte çalışma sağlamak için ne kadar ileri gitmem gerektiğinden emin değilim. Ben bir Java tipi sarma olmadığım içinYansıma kullanarak java.math.BigInteger ile kullanırken hangi sorunları beklemeliyim?

class BigInt(val bigInteger: BigInteger) ... 

, ben

final class BigInt private(final val signum: Int, 
          final private[math] val arr: Array[Int]) 
    def bigInteger: java.math.BigInteger = { 
    // Avoid copying of potentially large arrays. 
    val ctor = classOf[java.math.BigInteger] 
       .getDeclaredConstructor(classOf[Array[Int]], classOf[Int]) 
    ctor setAccessible true 
    ctor.newInstance(arr, signum.asInstanceOf[Object]) 
    } 
... 
} 
böyle bir şey yapmak zorunda kalacak:

Bugün BigInt sadece BigInteger ve değer bigInteger sadece sarılı değeri döndürür sarar

Bu sorun yaratır mı, yoksa daha iyi bir yolu var mı? Genelde

+0

Numara ne kadar büyük olduğunu bilmiyorum, ancak küçük bir init dizisini kopyalamak yansıma kullanmaktan daha hızlı olabilir ... – paradigmatic

+0

Evet, tabi. Küçük diziler için önemli değildir, ancak sayıların boyutu sadece RAM tarafından sınırlandırılmıştır. Verileri değişmez bir veri yapısından diğerine aktarırken sadece bellek yemek istemiyorum. – soc

+0

Bütün evrende bulunan atomların sayısının genellikle 10^80 olduğu tahmin edilmektedir. Sadece 9 * 32 bit ile, her birine benzersiz bir dizin atayabilirsiniz. Bundan daha büyük bir doğal sayıya ihtiyacınız varsa, muhtemelen bir hata ya da tasarım hatası olduğuna inanıyoruz ... – paradigmatic

cevap

3

İnsanların, böyle özel (veya başka şekilde belgesiz) kurucular veya yöntemleri kullanmak onlar NoSuchMethodException yakalamak ve alternatif üretmek gördüm:

object BigInt { 
    import java.math.BigInteger 

    private val toBigInteger: (Array[Int], Int) => BigInteger = try { 
    val ctor = classOf[BigInteger].getDeclaredConstructor(
     classOf[Array[Int]], classOf[Int] 
    ) 
    ctor.setAccessible(true) 

    (arr, signum) => ctor.newInstance(arr, signum.asInstanceOf[Object]) 
    } catch { case _: NoSuchMethodException => 
    (arr, signum) => 
     val buffer = java.nio.ByteBuffer.allocate(arr.length * 4) 
     buffer.asIntBuffer.put(arr) 
     new BigInteger(signum, buffer.array) 
    } 
} 

final class BigInt(final val signum: Int, final val arr: Array[Int]) { 
    def bigInteger = BigInt.toBigInteger(arr, signum) 
} 

Ben de kapalı yansıma iş taşıdığınız bigInteger numaralı telefonu aradığınızda her zaman için ödeme yapmaktan kaçınmak için bir eşlik eden nesne.

+0

İlginç bir yaklaşım, teşekkürler! – soc

+0

'NoSuchMethodException' yerine' SecurityException 'yerine bakmak zorunda kalmaz mıyım? Eğlenceli olan şey şu ki, JavaDoc bu kurucuyu halka açık bile söyleyebilir, bu yüzden hiç bir zaman ortadan kaybolacağını düşünmüyorum. – soc