簡體   English   中英

用於java或scala中的整數分解的庫

[英]library for integer factorization in java or scala

關於如何實現分解有很多問題,但是對於生產用途,我寧願使用開源庫來獲得高效的東西並立即進行測試。 我正在尋找的方法如下:

static int[] getPrimeFactors(int n)

對於n = 12,它將返回{2,2,3}

庫也可能具有處理long或甚至BigInteger類型的重載

問題不是關於特定的應用程序,而是關於有一個處理這個問題的庫。 許多人認為根據數字的范圍需要不同的實現,在這方面,我希望庫在運行時選擇最合理的方法。

通過高效我並不意味着“世界上最快”(我不會在JVM上工作......),我只是意味着在一秒而不是一小時內處理int和long range。

這取決於你想做什么。 如果你的需求是適度的(例如,你想解決Project Euler問題),Pollard的rho算法的簡單實現將立即找到多達十或十二位的因子; 如果這就是你想要的,請告訴我,我可以發布一些代碼。 如果你想要一個用Java編寫的更強大的保理程序,你可以查看Dario Alpern的applet背后的源代碼; 我不知道測試套件,它真的不是用開放的api設計的,但它確實有很多用戶並且經過了充分的測試。 大多數重型開源因子分解程序都是用C或C ++編寫的,並使用GMP大整數庫,但您可以通過語言的外部函數接口訪問它們。 看起來像名稱GMP-ECMmsieve同等海亞福 如果那些不能讓您滿意的話, 梅森論壇就是尋求更多幫助的好地方。

如果你想解決問題,而不是得到你想要的東西,你需要一張桌子。 您可以使用愚蠢的慢速方法對其進行預計算,存儲它,然后以微秒為單位查找任意數字的因子。 特別是,您需要一個表,其中最小因子列在與該數字對應的索引中 - 如果您使用試驗除法刪除一些最小的素數,那么內存效率會更高 - 然后沿着表格向下走,直到你命中1(意味着沒有更多的除數;你剩下的是素數)。 每個表項只需要兩個字節,這意味着您可以將所有內容存儲在任何比智能手機更大的現代機器上。

如果您感興趣,我可以演示如何創建它,並展示如何檢查它是否正確,可靠性高於您希望通過活動社區和復雜算法的單元測試實現(除非您運行算法生成這張表並確認一切都好。)

如果多項式是原始的,我需要它們進行測試。

這比試圖找到所有數字的因子要快。

public static boolean gcdIsOne(int[] nums) {
    int smallest = Integer.MAX_VALUE;
    for (int num : nums) {
        if (num > 0 && smallest < num)
            smallest = num;
    }
    OUTER:
    for (int i = 2; i * i <= smallest; i = (i == 2 ? 3 : i + 2)) {
        for (int num : nums) {
            if (num % i != 0)
                continue OUTER;
        }
        return false;
    }
    return true;
}

我在scala中嘗試過這個函數。 這是我的結果:

def getPrimeFactores(i: Int) = {
  def loop(i: Int, mod: Int, primes: List[Int]): List[Int] = {
    if (i < 2) primes      // might be i == 1 as well and means we are done
    else {
      if (i % mod == 0) loop(i / mod, mod, mod :: primes)
      else loop(i, mod + 1, primes)
    }
  }
  loop(i, 2, Nil).reverse
}

我試過它盡可能多的功能。
if (i % mod == 0) loop(i / mod, mod, mod :: primes)檢查我們是否找到了除數。 如果我們這樣做,我們將它添加到素數並按mod除以。
如果我們沒有找到新的除數,我們只是增加除數。
loop(i, 2, Nil).reverse初始化函數並逐漸對結果進行loop(i, 2, Nil).reverse

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM