这可能是一个非常简单的问题。我会举一个例子。
我有 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函数,那就更好了。
答案 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次尝试中都找到了相应的值,否则将永远找不到。
试图找到5
或7
的值将以无限循环结束。