我的编程空间,编程开发者的网络收藏夹
学习永远不晚

聊聊Java BigInteger里面的mod和remainder的区别

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

聊聊Java BigInteger里面的mod和remainder的区别

BigInteger里的mod和remainder区别

下面直接上图吧,稍后解释关于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;

之后有的话继续更新。以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

聊聊Java BigInteger里面的mod和remainder的区别

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

聊聊git和github的区别

Git是一种分布式版本控制系统,它能够记录代码的变化并帮助开发者管理版本的历史记录。Git的创建者是Linus Torvalds,它于2005年发布并在开源社区中推广,现在已成为开发者们最常用的版本控制工具之一。GitHub则是一个在线代码
2023-10-22

聊聊Python中end=和sep=的区别

end: 默认是换行,表示两个字符串最后以什么结尾。 eg: 换行 end="\n" sep: 默认是空格,表示两个字符串之间用什么分割。 eg: 空格 sep=" "补充:python 中的 print(x, end=) 和 print(
2022-06-02

聊聊python dropna()和notnull()的用法区别

`dropna()`和`notnull()`是pandas库中用于处理缺失值的函数,它们的用法和功能有一些区别。`dropna()`是pandas库中DataFrame和Series对象的一个方法,用于删除含有缺失值的行或列。它的主要功能是
2023-08-16

聊聊码云和gitee的区别是什么

码云和gitee是当前国内最受欢迎的两个代码托管平台,二者许多人会认为他们是一样的,但实际上,它们在某些功能和用法方面还是存在一些差异的。下面,我们就来探讨一下码云和gitee的几个不同之处。管理者背景首先,码云和gitee的背景不同。码云
2023-10-22

聊聊Python 3 的字符串:str 和 bytes 的区别

Python2的字符串有两种:str 和 unicode,Python3的字符串也有两种:str 和 bytes。Python2 的 str 相当于 Python3 的bytes,而unicode相当于Python3的str。Python2
2023-06-02

关于在VPN里面PPTP/L2TP两种协议的区别和联系

  VPN,虚拟专用网络我们可以把它理解成是虚拟出来的企业内部专线。它可以通过特殊的加密的通讯协议在连接在Internet上的位于不同地方的两个或多个企业内部网之间建立一条专有的通讯线路。现在小编为大家分享的一篇教程,那就是关于在VPN里面PPTP/L2TP两种协议的区别和联系。  一、L2TP是国际尺度地道和谈  L
关于在VPN里面PPTP/L2TP两种协议的区别和联系
2024-04-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录