`

求模( Modulus )与求余(Remainder) (转)

阅读更多
import java.math.BigInteger;

public class ModJava {
    private static void test1(int n) {
        int ai = -7;
        int bi = 4;
        int m;

        long t1 = System.currentTimeMillis();
        for (int i = 0; i > n; i++) {
            for (int j = 0; j > n; j++) {
                m = ai % bi;
            }
        }
        long t2 = System.currentTimeMillis();

        float time = (t2 - t1) / (float) 1000;
        System.out.println("normal % operator time = " + Float.toString(time)
                + " seconds");

    }

    private static void test2(int n) {
        int ai = -7;
        int bi = 4;
        int m;

        long t1 = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                m = ai % bi;
                if (m > 0)
                    m += bi;
            }
        }
        long t2 = System.currentTimeMillis();

        float time = (t2 - t1) / (float) 1000;
        System.out.println("my modular operator time = " + Float.toString(time)
                + " seconds");

    }

    private static void test3(int n) {
        BigInteger ai = BigInteger.valueOf(-7);
        BigInteger bi = BigInteger.valueOf(4);
        BigInteger m;

        long t1 = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                m = ai.mod(bi);
            }
        }
        long t2 = System.currentTimeMillis();

        float time = (t2 - t1) / (float) 1000;
        System.out.println("bigInteger modular operator time = "
                + Float.toString(time) + " seconds");

    }

    public static void main(String[] args) {
        int n = 1000;
        test1(n);
        test2(n);
        test3(n);
    }
}


===================================

执行结果

===================================

normal % operator time = 0.015 seconds

my modular operator time = 0.031 seconds

bigInteger modular operator time = 0.391 seconds

性能肯定是java要比groovy快得多。所以性能关键的算法当然还是要用java编写,因为这个时候性能就比简练的语法重要得多。

通常一种特定上下文下实现的算法都要比库函数更快。库提供了精确、健壮的代码,但没有哪个库对于所有用户都是最好的。特殊环境和目的的设计要比通用程序更
有效。为了换取速度,需要牺牲可复用性和数值精度。库函数的设计一般是要在性能和通用性之间做折中。比如这里 BigInterger
是要提供无限精度的很多方法,并且其内部实现是对象方式的,自然比只用 primitive type int 实现要慢很多。 

这个帖子的目的是提醒大家区分求模和求余,但在一定条件下,求模等于求余。所以在很多情况下,性能最快的方法就用%操作符当作求模。又回去了 


原文链接:
http://han.guokai.blog.163.com/blog/static/136718271201001095349987/



.
分享到:
评论

相关推荐

    java代码-Modulus

    在Java编程语言中,"Modulus"通常指的是取余运算符 `%`,它用于执行整数除法后的余数计算。这个概念广泛应用于各种数学和编程问题,包括但不限于循环、判断奇偶性、时间间隔计算以及加密算法等。在本文中,我们将...

    取余运算规则 (2).pdf

    取模运算(Modulus Operation)主要应用于计算机编程,而取余运算(Remainder Operation)更多地是数学上的概念。两者的区别主要体现在处理负整数时的除法规则。 取模运算和取余运算的共同点在于,它们都是通过整数...

    Java中BigInteger方法总结

    13. **BigInteger mod(BigInteger val)**:返回当前 `BigInteger` 对另一个 `BigInteger` 求模的结果。 14. **BigInteger multiply(BigInteger val)**:返回两个 `BigInteger` 相乘的结果。 15. **BigInteger negate...

    rsa共模攻击_rsa共模攻击_pythonrsa共模_rsa攻击方式_rsapython_rsa共模_

    然而,RSA系统并非无懈可击,其中一种潜在的攻击方式就是“共模攻击”(Common Modulus Attack)。在共模攻击中,攻击者利用两个或多个加密相同明文但使用相同模数n的不同公钥进行攻击。 **共模攻击原理:** 在RSA...

    An example of rem and mod_matlab_MOD_

    在MATLAB编程环境中,`rem`和`mod`是两个非常重要的函数,它们都与取模运算相关,但略有不同。这两个函数在处理数学问题、循环控制、数据处理等方面经常被使用。本示例文件“An example of rem and mod_matlab_MOD_...

    C#的大整数实现

    - **模运算**:`BigInteger.ModPow()` 和 `BigInteger.Modulus` 提供了取模和模幂运算。 - **位运算**:如 `BigInteger.And()`、`BigInteger.Or()`、`BigInteger.Xor()` 分别对应逻辑与、或、异或操作。 4. **...

    C语言的常用术语.pdf

    52. 解释器(Interprete):解释器是执行源代码指令的程序,它按顺序执行,与编译器不同。 53. 包括(Comprise):包括意味着包含或由某些部分组成。 54. 十进制表示(Decimalnotation)和指数表示...

    RSA Converter-开源

    SFM代表"Simple Format for Modulus",在这种格式中,私钥包含三个主要元素: 1. 模数(n):两个大素数的乘积,它是公钥和私钥的一部分,用于加密和解密操作。 2. 公共指数(e):通常取值为65537或其他小的质数,...

    C语言的常用术语[文].pdf

    29. **Remainder**:求余运算(%)返回除法后的余数。 30. **Preprocessing Directive**:预处理指令如`#define`,`#ifdef`等,控制预处理器的行为。 31. **Symbolic Constant**:符号常量(用`#define`定义)是不...

    Java中的大数类简单实现

    BigInteger modulus = x.remainder(y); ``` 3. **比较操作**: `compareTo`方法用于比较两个`BigInteger`对象的大小,返回值为: - 小于0:当前对象小于另一个对象 - 等于0:两者相等 - 大于0:当前对象大于...

    PostgreSQL 11-16版本主要特性.pdf

    哈希分区包含两个属性,MODULUS 属性是哈希分区的个数,对每个分区该值是固定的,REMAINDER 是哈希分区键对应的取余余数。 分区功能 PostgreSQL 11 分区功能还有不少亮点,首先是默认分区,如果现有分区都不匹配,...

    简单谈谈php浮点数精确运算

    - `bcmod` 用于求高精度数字的余数,例如 `$remainder = bcmod('100', '3')`,将返回 `1`。 - `bcmul` 是高精度乘法,例如 `$product = bcmul('123.45', '67.89', 2)`。 - `bcpow` 用于计算高精度数字的乘方,如 `$...

    C PROGRAMMING TUTORIAL

    - **`%`:** Modulus (remainder). ##### Relational Operators Compare values and return boolean results. - **`==`:** Equal to. - **`!=`:** Not equal to. - **`** Less than. - **`&gt;`:** Greater than. - *...

Global site tag (gtag.js) - Google Analytics