问题 BP: 2^x mod n = 1

题目描述

给你一个正整数n,要求你找到最小的x(x>0)满足2^x mod n = 1。

输入

输入包含多组测试数据。每行一个正整数,代表n的值。

输出

如果最小的x存在,则输出2^x mod n = 1(注意x和n要用具体的值代替),否则输出2^? mod n = 1。

样例输入 Copy

2
5

样例输出 Copy

2^? mod 2 = 1
2^4 mod 5 = 1

代码

#include <stdio.h>
 
int main() {
	int n,x,y;
 
 
	while(scanf("%d",&n)!=EOF) {
		if(n<=1||n%2==0) {
			printf("2^? mod %d = 1\n",n);
			continue;
		}
 
		int w=2,x=1;
		while(w!=1) {
			x++;
			w+=w;
			w%=n;
		}
 
		printf("2^%d mod %d = 1\n",x,n);
 
	}
	return 0;
}
以下为一个简单的二分类bp神经网络的matlab代码,其中使用了sigmoid作为激活函数,误差使用了均方误差(MSE)。 % 数据准备 x = [0 0 1 1; 0 1 0 1]; y = [0 1 1 0]; % 初始化参数 input_layer_size = 2; % 输入层节点数 hidden_layer_size = 3; % 隐藏层节点数 output_layer_size = 1; % 输出层节点数 epsilon_init = 0.12; % 权重初始化范围 % 随机初始化权重 theta1 = rand(hidden_layer_size, input_layer_size + 1) * 2 * epsilon_init - epsilon_init; theta2 = rand(output_layer_size, hidden_layer_size + 1) * 2 * epsilon_init - epsilon_init; % 训练参数 alpha = 0.1; % 学习率 num_iters = 10000; % 迭代次数 % 开始训练 for i = 1:num_iters % 前向传播 a1 = [ones(1, size(x, 2)); x]; z2 = theta1 * a1; a2 = [ones(1, size(z2, 2)); sigmoid(z2)]; z3 = theta2 * a2; a3 = sigmoid(z3); % 计算误差 delta3 = a3 - y; delta2 = theta2(:, 2:end)' * delta3 .* sigmoidGradient(z2); % 更新权重 theta2_grad = delta3 * a2'; theta1_grad = delta2 * a1'; theta2 = theta2 - alpha * theta2_grad; theta1 = theta1 - alpha * theta1_grad; % 打印误差 if mod(i, 1000) == 0 J = sum(sum((a3 - y).^2)) / size(x, 2); fprintf('迭代次数:%d,误差:%f\n', i, J) end end % 预测新数据 new_x = [0 1; 1 0; 1 1; 0 0]'; new_a1 = [ones(1, size(new_x, 2)); new_x]; new_z2 = theta1 * new_a1; new_a2 = [ones(1, size(new_z2, 2)); sigmoid(new_z2)]; new_z3 = theta2 * new_a2; new_a3 = sigmoid(new_z3); % 打印预测结果 fprintf('预测结果:%d %d %d %d\n', round(new_a3))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值