在Java中实现mod11函数

snz8szmq  于 2022-10-30  发布在  Java
关注(0)|答案(3)|浏览(339)

你好,用java实现下面的函数的最好方法是什么?mod 11(x),它计算x mod 11,我们假设x是整数或公式。例如,mod 11(14)返回3,mod 11(3*7-30)返回2。我尝试了下面的方法,但它不起作用:`

public static int PositiveMod(int value, int mod)
    {
        return ((value % mod + mod) % mod);
    }

public static double PositiveMod(double value, double mod)
    {
        return ((value % mod + mod) % mod);
    }

'例如,我期望((-7+1)/20)mod 11给予3,但它给出了10.7,如下所示:i =((-7+1)/20)mod 11 = -6/9 mod 11 = 5*5 mod 11 = 3

mctunoxg

mctunoxg1#

我写了两个例子如何使用它的数学mod mathMod方法和默认mod faultModCalJava mod。他们将给予相同的结果为正数,但为负数,他们有不同的输出。更多信息在这里:
https://en.wikipedia.org/wiki/Modulo_operation的最大值

public class MainClass2 {

    public static void main(String[] args) {
        System.out.println("Math mod:" + mathMod(14, 11));
        System.out.println("Math mod:" + mathMod((3 * 7 - 30), 11));
        System.out.println("Math mod:" + mathMod(-13, 10));

        System.out.println("Default Java mod: " + defaultModCalJava(14, 11));
        System.out.println("Default Java mod: " + defaultModCalJava((3 * 7 - 30), 11));
        System.out.println("Default Java mod:" + defaultModCalJava(-13, 10));
    }

    private static int mathMod(int a, int m) {
        int positiveM = Math.abs(m);
        int result = a % positiveM;
        if (result < 0) {
            result = result + positiveM;
        }
        return result;
    }

    private static int defaultModCalJava(int a, int m) {
        return a % m;
    }
}

输出量:

Math mod:3
Math mod:2
Math mod:7
Default Java mod: 3
Default Java mod: -9
Default Java mod:-3
rxztt3cl

rxztt3cl2#

您的问题令人困惑... %运算符已经是模数运算符,也称为余数...因此14% 11 = 3与mod 11(14)= 3相同。没有必要将其作为新函数来实现。
在你的等式中,((-7+1)/20)= -0.3,不清楚为什么你会期望3。
11 - 0.3等于10.7,所以这就是答案的来源。

o7jaxewo

o7jaxewo3#

%不是模数运算符。它是余数运算符,其行为与余数运算符的行为相同。

System.out.println(-10 % 3); //  -3 r -1 since 3 * -3 + -1 == -10
System.out.println(10 % -3); //  -3 r  1 since -3 * -3 + 1 == 10 
System.out.println(-10 % -3);//   3 r -1 since 3 * -3 + -1 == -10
System.out.println(10 % 3);  //   3 r 1 since 3 * 3 + 1 == 10

prints as expected
-1
1
-1
1

n = x mod(m)的真mod函数表示存在k,其中x - n = km

n = 20 mod(3) = 2  and k = 6   20 - 2 = 6*3
n = 20 mod(3) = -1 and k = 7   20 -(-1) = 3*7

对于任何mod函数的剩余的完全集是无限的,并且对于上面的是n = x - mk,对于k的任何整数值
因此,对于上面的表达式,完整的残数集将是n = 20 - 3k。返回的任何值都将是一个合法的结果。余数函数只是前面提到的残数集的大小为one的子集。
话虽如此,这可能会有帮助。这个mod函数简单地校正到最小的正值,假设一个正的模数。

Mod mod11 = Mod.forModulus(11);
int k = mod11.of(-3);
System.out.println(k);

Mod mod121 = Mod.forModulus(121);
k = mod121.of(-12);
System.out.println(k);

印刷品

8
109

这里有一个方法来创建mod函数,它只接受目标参数。

interface Mod {
     int of(int value);
     static Mod forModulus(int mod) {
         return v-> {
             int u = v % mod;
             return u < 0 ? u + mod : u;
         };
     }
 }

以上可能需要一些调整,要么是因为我误解了你的问题,要么是因为mod函数需要更复杂,以满足你的同余关系。

相关问题