聊聊Java BigInteger里面的mod和remainder的區別
下面直接上圖吧,稍后解釋關于mod和remainder以及負數求余求模的區別。
如果被除數是正整數,mod和remainder的結果沒區別。mod運算除數只能為正數。
取模運算(“Modulo Operation”)和取余運算(“Complementation ”)兩個概念有重疊的部分但又不完全一致。主要的區別在于對負整數進行除法運算時操作不同。取模主要是用于計算機術語中。取余則更多是數學概念。
假設有式子a ÷ b = c ··· r
當a和b符號一致時的情況:a,b均大于0時,求模運算和求余運算所得的c的值一致,r >= 0。a,b均小于0時,只能進行求余運算,因為求模運算除數b必須為正,r也是大于等于0。
當a和b符號不一致時,c不一樣,r也不一樣。
求余運算結果,r不為0時, r 的符號和a一致。即余數符號和被除數符號必須相同。 求模運算結果,r不為0時,r 的符號和b一致,而因為求模運算時,b必須大于0,所以r一定大于等于0,即模運算的結果一定是非負數。我們來從java的BigInteger源碼來看看實現,當b小于等于0時會出現什么情況,假設這里r = a.mod(b),那么b必須為正數,否則報異常
Exception in thread 'main' java.lang.ArithmeticException: BigInteger: modulus not positive
來看mod源碼:
public BigInteger mod(BigInteger m) {// signum是此BigInteger的符號:-1表示負數,0表示零,或1表示正數。// 請注意,BigInteger零必須具有0的符號。這對于確保每個BigInteger值只有一個表示是必要的。if (m.signum <= 0) throw new ArithmeticException('BigInteger: modulus not positive'); BigInteger result = this.remainder(m);return (result.signum >= 0 ? result : result.add(m));// 可以看出mod和remainder的區別就在于,mod的模必須為正,否則異常,并且取余的值小于0點話還要加上模數m }
比如 -14 ÷ 3 = -4 ··· -2(余數符號和被除數符號必須相同)
余數就是-2,這里如果是remainder取余運算,-14 remainder 3 = -2,結果是-2
如果是mod模運算,在remainder基礎上判斷正負,這里-2是負數,加上模數(可認為是除法的除數),這里加上3,mod模運算結果就是1,-14 mod 3 = 1
-10 ÷ 3 = -3 ··· -1
余數就是-1,這里如果是remainder取余運算,-10 remainder 3 = -1,結果是-1
如果是mod模運算,在remainder基礎上判斷正負,這里-1是負數,加上模數(可認為是除法的除數),這里加上3,mod模運算結果就是2,-10 mod 3 = 2
7 ÷ -3 = -2 ··· 1
余數是1,除數是負數,這里只能取模運算remiander 7 remainder -3 = 1,結果是1。但是這里余數居然大于除數了!!!!
所以可以這么說,我們小學所學的余數一定小于除數這個結論是針對除數為正數而言。并且由前兩個例子也可以看出,取模運算的值也一定小于除數,前提條件是除數為正才能取模。
如果被除數是0,不管是取模還是取余結果都是0。
0%-5=0
0mod3=0
0remainder-3=0
......
如果不是大整數,只是普通的int型,比如System.out.println(5 % -3);
打印出來是2
所以java中,%是求余運算,而不是取模運算。
另外各個環境下%運算符的含義不同,比如c/c++,java 為取余,而python則為取模。
BigInteger類的一些使用心得這幾天做信息安全作業的rsa算法,用到了很多大數的方法。
下面總結一下以后方便找1.給大數賦值BigInteger p = new BigInteger('10669721913248017310');
或者,X3是string或者int都行。
BigInteger cx= new BigInteger('' + X3) ; 2.把int型轉化為string型
int j=123;String X1=String.valueOf(j);3.把兩個字符串拼接
String X1=1234;String X2=1545;String X3=X2+X1;
之后有的話繼續更新。以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。
相關文章:
