(java / math)如何在mod中找到商

时间:2018-07-31 13:44:08

标签: java math cryptography discrete-mathematics modulus

这可能是一个非常简单的问题。我会举一个例子。

我有 A B (将其作为客户端和服务器设置)。 A 执行以下操作 class TeamMember extends Component { constructor(props) { super(props); this.state = { teamMember: this.props.teamMember, startDate: null, } } static async getInitialProps ( context ) { const { slug } = context.query; const res = await fetch(``); const teamMember = await res.json(); return { teamMember:teamMember } } async componentDidMount() { this.setState({ startDate: Date.now() }) Tracker.pushObjectToStorage('profilesViewed',{ title:this.state.teamMember[0].title.rendered, id:this.state.teamMember[0].id }) } async componentWillUnmount(props) { alert("ddffff"); console.log("ddsds"); } }

然后将值12发送到 B

现在, B 具有公式(2^10) mod 23 = 12。 (具有模数和基值)。我将如何找到值10?我尝试了逆mod,但这似乎仅适用于-1的幂。 Google似乎也没有太大帮助。只是数学上的帮助会很棒,但是如果有Java函数,那就更好了。

3 个答案:

答案 0 :(得分:1)

我们可以用来解决此问题的属性是 A 只能有23个唯一的输出。因此,您可以预先计算所有可能传递给 B 左侧的值,并记录获得这些值的输入,直到获得完整列表:

2^0 % 23 == 1
2^1 % 23 == 2
2^2 % 23 == 4
2^3 % 23 == 8
2^4 % 23 == 16
2^5 % 23 == 9
2^6 % 23 == 18
2^7 % 23 == 13
2^8 % 23 == 3
2^9 % 23 == 6
2^10 % 23 == 12
   .
   .
   .

您会发现,在第10个输出之后,上述值会有一个重复序列,因此,这些是 B 应该作为输入的唯一值。

答案 1 :(得分:1)

很抱歉添加此内容:

基本上是由于2^11 mod 23 = 1(a * b) mod c = (a mod c) * (b mod c) mod c(即mod multiplication rule)引起的循环。

因此,我们可以肯定地使用loop来获得最终结果,只需使用一个简单的列表即可(无论i有多大):

 int getMod(int i) {
     int[] ret = new int {1, 2, 4, 8, 16, 9, 18, 13, 3, 6, 12};
     return ret[i % 11];
 }

对于OP,有一个tutorial很好地解释了数学解决程序问题。可能会有所帮助。

答案 2 :(得分:0)

有时您可以通过尝试第一个值来找到解决方案,然后看看会发生什么情况:

public static void main(String[] args) {
    for(int i = 0; i< 100; i++) {
        System.out.println("" + i +" : " + (int)Math.pow(2, i) % 23);
    }
}

这是结果:

0 : 1
1 : 2
2 : 4
3 : 8
4 : 16
5 : 9
6 : 18
7 : 13
8 : 3
9 : 6
10 : 12
11 : 1
12 : 2
13 : 4
14 : 8
15 : 16
16 : 9
17 : 18
18 : 13
19 : 3
20 : 6
21 : 12
22 : 1
23 : 2
24 : 4
25 : 8
26 : 16
27 : 9
28 : 18
29 : 13
30 : 3
31 : 5
32 : 5
33 : 5

我剪切了输出,但是对于33之后的每个值,由于一些溢出,结果将为5

但是您可以看到结果中存在一个循环:1 2 4 8 16 9 18 13 3 6 12

这是由于这种数学关系而解释的:

(2^(n+1)) mod 23 = ((2 ^ n) mod 23) * 2 mod 23

(用英语,将前一个结果乘以2,并在必要时应用mod 23)

所以

  • n = 10时,结果为12
  • n = 11时,结果为12 * 2 mod 23 = 24 mod 23 = 1,在那里您进行了新的周期1、2、4等

因此,答案是,您在前10次尝试中都找到了相应的值,否则将永远找不到。 试图找到57的值将以无限循环结束。