问题 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;
}
%设置LDPC编码的矩阵参数 z=16; m_b=32; % m_b: 基矩阵行数 n_b=64; % n_b: 基矩阵列数 z_max=z-1; % z_max: 最大允许移位量 R=(n_b-m_b)/n_b; % 计算矩阵码率 %定义输入的信号 x=(n_b-m_b)*z; Eb = 1; message = randi([0, 1], x, 1); % 随机生成0或1模拟输入信号 %LDPC编码部分 H_b = zeros(m_b, n_b); shift_values = zeros(m_b, n_b); % 构造基矩阵 for i = 1:m_b for j = 1:n_b if rand < 0.3 % 非零元素概率30% H_b(i,j) = 1; shift_values(i,j) = randi(z_max)-1; % 生成0~z_max-1的移位量 end end end % 消除4环 % 检测并消除4环的简化实现 [M, N] = size(H_b); for i = 1:M-1 for j = 1:N-1 if H_b(i,j) && H_b(i+1,j) && H_b(i,j+1) && H_b(i+1,j+1) % 检测到2x21子矩阵→存在4环 shift_values(i+1,j) = (shift_values(i+1,j) + 1); % 修改移位量破坏环结构 end end end %将基矩阵通过扩展因子扩展成完整的校验矩阵 [m_b, n_b] = size(H_b); H = zeros(m_b*z, n_b*z); for i = 1:m_b for j = 1:n_b if H_b(i,j) == 1 % 生成循环移位矩阵 circ_mat = circshift(eye(z), shift_values(i,j)); H((i-1)*z+1:i*z, (j-1)*z+1:j*z) = circ_mat; end end end % 生成单位阵部分,构成系统码形式的生成矩阵G P = H(:, 1:x); I = eye(M*z); G = [I, P]; % 编码操作 encoded_message = mod(message' * G, 2); encoded_message = encoded_message'; %Chirp调制部分 Fs = 50e3; %采样率50KHZ T = 1e-3; %符号持续时间1ms t = 0:1/Fs:T-1/Fs; % 时间向量 B = 1000e3; % 带宽10KHZ k = B/T; % 扫频速率10MHZ/S f0 = 20e3; % 起始频率20KHZ %生成正负扫频chirp信号 up_chirp = cos(2*pi*(f0*t+0.5*k*t.^2)); % 正扫频(1) down_chirp = cos(2*pi*(f0*t-0.5*k*t.^2)); % 负扫频(0) modulated_signal = []; %判断0或1 bit = encoded_message; for num1=1:length(bit) if bit(num1) == 1 modulated_signal = [modulated_signal;up_chirp]; else modulated_signal = [modulated_signal;down_chirp]; end end numSamples = length(modulated_signal); % 样本数量 sigma = 1/sqrt(2); % 尺度参数 (保证平均功率为1) % 生成独立高斯随机变量 X = randn(numSamples,1 ); Y = randn(numSamples,1 ); % 生成复瑞利信道系数 (h = X + jY) h = sigma * (X + 1i*Y); % 计算幅度和相位 amplitude = abs(h); % 瑞利分布幅度 phase = angle(h); % 均匀分布相位 [0, 2π] a=1:length(modulated_signal); rxSignal = modulated_signal (a,:).* h; %高斯白噪声信道 % snr = 1:1:10; %snr = 10; output = zeros(length(modulated_signal),length(up_chirp),length(snr)); sigmaSq = zeros(1,length(snr)); for u = 1:10 sigmaSq(u) = 1/(10^(snr(u)/10)); output(:,:,u) = awgn(rxSignal,snr(u)); end %Chirp调 for jdx = 1:length(sigmaSq) for idx = 1:length(output) z0 = sum(output .* repmat(down_chirp, n_b*z, 1), 2)/Fs; % 与0相关 z1 = sum(output .* repmat(up_chirp, n_b*z, 1), 2)/Fs; % 与1相关 LLR = (2*Eb)/sigmaSq(jdx) * (z0(idx,1,jdx) - z1(idx,1,jdx)); llrs(idx,1,jdx) = LLR; decoded_bits = (llrs < 0); end end完成接下来的BP算法译码操作
05-31
clc; clear; close all; %% === 1. 读数据 === data = readmatrix('数据集.xls'); % Excel 文件 X = data(:,1:25); % 输入:25列 Y = data(:,26:30); % 输出:5列 %% === 2. 划分训练/测试 === % rng(1260); % 固定随机种子 N = size(X,1); idx = randperm(N); num_train = round(0.8*N); train_idx = idx(1:num_train); test_idx = idx(num_train+1:end); X_train_raw = X(train_idx,:); Y_train_raw = Y(train_idx,:); X_test_raw = X(test_idx,:); Y_test_raw = Y(test_idx,:); %% === 3. 使用mapminmax归一化训练集 === [^1] % 转置数据(mapminmax要求每行为一个特征) [X_train, X_ps] = mapminmax(X_train_raw', 0, 1); [Y_train, Y_ps] = mapminmax(Y_train_raw', 0, 1); % 转置回原始维度(样本×特征) X_train = X_train'; Y_train = Y_train'; %% === 4. 用训练集参数归一化测试集 === X_test = mapminmax('apply', X_test_raw', X_ps)'; Y_test = mapminmax('apply', Y_test_raw', Y_ps)'; %% === 5. 网络结构 === in_num = 25; hid1_num = 50; hid2_num = 40; out_num = 5; net_param_num = in_num*hid1_num + hid1_num*hid2_num + ... hid2_num*out_num + hid1_num + hid2_num + out_num; %% === 6. GA-PSO参数 === pop_size = 90; max_gen = 1000; % 更大群体,更长迭代 w_max = 0.8; w_min = 0.2; c1_ini = 1.7; c1_end = 0.5; c2_ini = 0.5; c2_end = 1.5; pm_min = 0.05; pm_max = 0.3; pop = randn(pop_size, net_param_num) * 0.1; % 初始化权值小点 v = zeros(pop_size, net_param_num); pbest = pop; pbest_fit = inf(pop_size,1); gbest_fit = inf; gbest = pop(1,:); fit_hist = zeros(max_gen,1); loss_weights = [1 1 0.5 4 4]; % 多输出加权 lambda = 0.01; % 正则化系数 %% === 7. 主循环 === for gen = 1:max_gen for i = 1:pop_size [fit, ~] = BP_fitness_ReLU(pop(i,:), X_train, Y_train, ... in_num, hid1_num, hid2_num, out_num, lambda, loss_weights); if fit < pbest_fit(i) pbest_fit(i) = fit; pbest(i,:) = pop(i,:); end if fit < gbest_fit gbest_fit = fit; gbest = pop(i,:); end end fit_hist(gen) = gbest_fit; % PSO参数自适应 w = w_max - (w_max-w_min)*gen/max_gen; c1 = c1_ini - (c1_ini-c1_end)*gen/max_gen; c2 = c2_ini + (c2_end-c2_ini)*gen/max_gen; lr = 0.01 * (1 - gen/max_gen); % 线性衰减 % PSO更新 for i = 1:pop_size v(i,:) = w*v(i,:) + c1*rand*(pbest(i,:)-pop(i,:)) + c2*rand*(gbest-pop(i,:)); pop(i,:) = pop(i,:) + v(i,:); end % GA部分 diversity = mean(std(pop)); pm = pm_min + (pm_max-pm_min)*(1 - diversity); ga_rate = min(0.8, gen/max_gen); ga_num = round(pop_size * ga_rate); for k = 1:2:ga_num idx_cross = randperm(pop_size,2); cp = randi([1, net_param_num-1]); child1 = [pop(idx_cross(1),1:cp), pop(idx_cross(2),cp+1:end)]; child2 = [pop(idx_cross(2),1:cp), pop(idx_cross(1),cp+1:end)]; if rand < pm, child1(randi(net_param_num)) = child1(randi(net_param_num)) + randn*0.05; end if rand < pm, child2(randi(net_param_num)) = child2(randi(net_param_num)) + randn*0.05; end pop(idx_cross(1),:) = child1; pop(idx_cross(2),:) = child2; end % 精英保留 [~, sort_idx] = sort(pbest_fit); pop(1,:) = pbest(sort_idx(1),:); if mod(gen,50)==0 || gen==1 fprintf('第 %d 代,最优适应度 %.6f\n', gen, gbest_fit); end end %% === 8. 预测+反归一化 === [~, Yp_train] = BP_fitness_ReLU(gbest, X_train, Y_train, ... in_num, hid1_num, hid2_num, out_num, lambda, loss_weights); % 反归一化 [^1] Y_pred_train = mapminmax('reverse', Yp_train', Y_ps)'; [~, Yp_test] = BP_fitness_ReLU(gbest, X_test, Y_test, ... in_num, hid1_num, hid2_num, out_num, lambda, loss_weights); % 反归一化 [^1] Y_pred_test = mapminmax('reverse', Yp_test', Y_ps)'; % === 9. 评估 === [RMSE_train, MAE_train, MAPE_train, R2_train] = calc_metrics(Y(train_idx,:), Y_pred_train); [RMSE_test, MAE_test, MAPE_test, R2_test] = calc_metrics(Y(test_idx,:), Y_pred_test); fprintf('\n=== 训练集 ===\nRMSE: %.4f, MAE: %.4f, MAPE: %.2f%%, R&sup2;: %.4f\n', RMSE_train, MAE_train, MAPE_train, R2_train); fprintf('=== 测试集 ===\nRMSE: %.4f, MAE: %.4f, MAPE: %.2f%%, R&sup2;: %.4f\n', RMSE_test, MAE_test, MAPE_test, R2_test); [R2v, MAPEv, RMSEv, MAEv] = calc_metrics_each(Y(test_idx,:), Y_pred_test); for j = 1:out_num fprintf('输出%d: R&sup2;=%.4f, RMSE=%.4f, MAE=%.4f, MAPE=%.2f%%\n', j, R2v(j), RMSEv(j), MAEv(j), MAPEv(j)); end figure; plot(fit_hist,'LineWidth',2); xlabel('迭代次数'); ylabel('最优适应度'); title('收敛曲线'); grid on; for j = 1:out_num figure; scatter(Y(test_idx,j), Y_pred_test(:,j),'filled'); hold on; plot(xlim,xlim,'r--','LineWidth',1.2); hold off; xlabel(['真实 输出',num2str(j)]); ylabel(['预测 输出',num2str(j)]); title(['输出',num2str(j),' 测试集']); grid on; end % === 将评估指标保存到Excel === output_metrics = table(... (1:out_num)', R2v', MAEv', MAPEv', RMSEv', ... 'VariableNames', {'输出编号', 'R2', 'MAE', 'MAPE', 'RMSE'}); filename = '测试集输出评估指标.xlsx'; writetable(output_metrics, filename, 'Sheet', '各输出评估指标'); save('GA_PSO_BP_ReLU_MinMax_NoLog.mat', 'gbest', 'in_num', 'hid1_num', 'hid2_num', 'out_num', ... 'X_ps', 'Y_ps'); % 保存归一化参数 disp('✅ Min-Max 归一化版模型已保存'); %% === === 函数 === === function [fit, Yp] = BP_fitness_ReLU(params, X, Y, in_num, hid1_num, hid2_num, out_num, lambda, loss_w) idx1 = in_num*hid1_num; idx2 = idx1 + hid1_num*hid2_num; idx3 = idx2 + hid2_num*out_num; W1 = reshape(params(1:idx1), in_num, hid1_num); W2 = reshape(params(idx1+1:idx2), hid1_num, hid2_num); W3 = reshape(params(idx2+1:idx3), hid2_num, out_num); b1 = params(idx3+1:idx3+hid1_num); b2 = params(idx3+hid1_num+1:idx3+hid1_num+hid2_num); b3 = params(idx3+hid1_num+hid2_num+1:end); H1 = max(0, X*W1 + b1); H2 = max(0, H1*W2 + b2); Yp = H2*W3 + b3; mse_each = mean((Y - Yp).^2,1); mae_each = mean(abs(Y - Yp),1); mse = sum(loss_w .* mse_each) / sum(loss_w); mae = sum(loss_w .* mae_each) / sum(loss_w); reg = lambda * mean(params.^2); fit = mse * 0.8 + mae * 0.2 + reg; end function [RMSE, MAE, MAPE, R2] = calc_metrics(Y, Yp) RMSE = sqrt(mean((Y(:)-Yp(:)).^2)); MAE = mean(abs(Y(:)-Yp(:))); MAPE = mean(abs((Y(:)-Yp(:)) ./ (Y(:)+eps))) * 100; SS_res = sum((Y(:)-Yp(:)).^2); SS_tot = sum((Y(:)-mean(Y(:))).^2); R2 = 1 - SS_res/SS_tot; end function [R2v, MAPEv, RMSEv, MAEv] = calc_metrics_each(Y, Yp) [~, m] = size(Y); R2v = zeros(1,m); MAPEv = zeros(1,m); RMSEv = zeros(1,m); MAEv = zeros(1,m); for j = 1:m y = Y(:,j); yp = Yp(:,j); SS_res = sum((y-yp).^2); SS_tot = sum((y-mean(y)).^2); R2v(j) = 1 - SS_res/SS_tot; RMSEv(j) = sqrt(mean((y-yp).^2)); MAEv(j) = mean(abs(y-yp)); yt = y; yt(abs(yt)<1e-4)=1e-4; MAPEv(j) = mean(abs((y-yp)./yt)) * 100; end end=== 测试集 === RMSE: 0.0137, MAE: 0.0069, MAPE: 223.61%, R&sup2;: 0.9052 输出1: R&sup2;=0.9676, RMSE=0.0130, MAE=0.0087, MAPE=78.95% 输出2: R&sup2;=0.9544, RMSE=0.0025, MAE=0.0019, MAPE=104.79% 输出3: R&sup2;=0.9812, RMSE=0.0000, MAE=0.0000, MAPE=4.65% 输出4: R&sup2;=0.1639, RMSE=0.0276, MAE=0.0216, MAPE=353.93% 输出5: R&sup2;=0.2119, RMSE=0.0026, MAE=0.0021, MAPE=371.11% 对该代码进行按前面给出的方案进行进行修改,让MAPE的值降低
最新发布
08-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值