西电《网络空间安全数学基础》 网安数基

西电网络空间安全数学基础《第一章:线性系统与矩阵乘法》

讲在前面

大二下学期网络与信息安全学院开展了网络空间安全数学基础(网安数基)
个人认为这个对于只有概率论基础的普通大二学生是比较困难的,如果只听一遍基本消化不了,甚至我经常听着听着就听不懂了。
课程分两位老师讲解,第一位老师讲课很是有趣,并且在带着学生学知识,但是我说实话,有一些比较困难的的东西有点难听懂。并且老师对于考试的考察也比较灵活。
第二位老师讲课也是比较有趣的,但是第二部分的内容我感觉整体上是难度高于第一部分的,而且课程的知识量变多了,也挺难的,基本都是自己自学了,好的一点是由于比较困难,加上有ppt,考的内容比较固定,考试会相对轻松一点。
在此写出本课程的总结,方便后续的复习,并且帮助在这门课上迷茫的同学们。

平时作业建议: 本课程是没有教材的,也没有练习题和标准答案。所以需要自己在网上搜索相关的资料,并且根据出题人的意图对题目进行猜测,自己平常经一些练习。并且由于本课程的存在一下比较难的积分计算,所以需要大家了解一些积分公式。

备考建议: 平时作业认真做,老师上课讲过的题目都复习一遍,包括一些证明,不懂就背下来记忆,千万不要有侥幸心理(我就吃了这个亏),考试会出现比较多的作业题,这些复习到了基本就是80+的卷面分,剩下的就是曾老师的变式题,需要对知识了解的深刻一些。

个人总结:
本课程学到的东西确实是不少的,对于一些方法的实现,在编程的作业中有所感受,但是我认为这门课的考核是需要一些思考的。没有书,没有习题,没有答案,这个是一个比较开发的方式在锻炼我们的开放性思维,但是考试是有标准答案的,这个时候考生就不知道应该怎么办了。
一个建议,如果老师考察的知识变得灵活起来,建议老师可以讲解习题,或者可以把答案发给学生供学生思考,供学生参考。不然,建议老师考察的知识就是平时讲的习题,因为对于掌握知识比较少的学生是比较痛苦的一件事。

章节脉络

课程一共分为2个部分,每个部分6次课

  1. 线性系统与矩阵乘法
  2. 矩阵的分解
  3. 范数、距离与相似度
  4. 最优化入门
  5. 概率+矩阵
  6. pagerank的两个数学解释
  7. bloom过滤器
  8. 贝叶斯推理
  9. 信息熵与决策树
  10. 差分隐私
  11. 网络传播
  12. 随机过程

第一章 线性系统与矩阵乘法

概述

本章节主要讲了下关于矩阵乘法的的几何意义:伸缩和旋转。
并讲解了线性反馈移位寄存器,实现的原理,代码,求解其输出(用到了关于矩阵乘法的思想)。
重要考点:线性反馈移位寄存器的原理以及求解其输出;
ps:现在不懂不着急,下面将详细讲解,看完后在思考,便可以理解。

一、线性反馈移位寄存器(LFSR)的引入

1.1 移位寄存器:

移位寄存器(Shift Register,SR)曾在《数字电路与设计基础》,是指有若干个寄存器排成一行,每个寄存器中都存储着一个二进制数(0或1)。移位寄存器每次把最右端(末端)的数字输出,然后整体向右移动一位。
图片:
在这里插入图片描述

图1: D触发器构成的移位寄存器

假设一个5位移位寄存器中存储着数据10110,则不断移位、输出的效果如图所示:
在这里插入图片描述

图2:输出效果示意图

1.2 反馈移位寄存器:

在移位寄存器向右移位一位以后,左边就会空出一位(如上图所示),这时如果采用一个反馈函数,以寄存器中已有的某些序列作为反馈函数的输入,在函数中经过一定的运算后,将反馈函数输出的结果填充到移位寄存器的最左端,那么这样的移位寄存器就会有源源不断的输出。通俗来讲,就是通过已知的 r1 到rn-1,可以对这些数字通过定义一定的运算,从而得到rn,下面将会有具体实例讲到。这样的,拥有反馈函数的移位寄存器称为反馈移位寄存器(Feedback Shift Register,FSR)

图2:反馈移位寄存器示意图

1.3 线性反馈移位寄存器:

如果反馈移位寄存器的反馈函数是线性函数(即只进行简单线性运算的函数),那么这种寄存器就被称为线性反馈移位寄存器(Linear Feedback Shift Register,LFSR)。
图3 线性反馈移位寄存器示意图 图3 线性反馈移位寄存器示意图

二、线性反馈移位寄存器(LFSR)

2.1、LFSR的反馈函数:

LFSR的反馈函数就是简单地对移位寄存器中的某些位进行异或,并将异或的结果填充到LFSR的最左端,如图所示。对于LFSR中每一位的数据,可以参与异或,也可以不参与异或。其中,我们把参与异或的位称为抽头
在这里插入图片描述
图4 笔记
如ci表示第i位是否是抽头,如果是,则ci=1,表示该位将参与运算;如果不是,则 ci=0,表示该位将不参与运算。上式表示了LFSR的一种递推关系,在这个式子中,可以明显看出,ci将抽头位选出并留下来参与运算,并且将不是抽头的位剔除掉。

2.2、LFSR的级数:

我们通常把LFSR中的寄存器个数称为LFSR的级数。
状态的概念:一个LFSR寄存器中当前存储的序列被称为一个状态。在LFSR输出一位,由反馈函数补充一位后,LFSR就移动到了下一个状态。

2.3 运用矩阵的形式表达

在这里插入图片描述
可以看出,通过使用矩阵的可以实现状态的变换

三 实例分析:以三级线性反馈移位寄存器为例

图5 分析案例示意图
在这里插入图片描述

图5 分析案例示意图

四 实战演练:编程实现130级的线性反馈移位寄存器

题目:基本要求:80分

实现130级的线性反馈移位寄存器

不使用大数库提供的数据结构

至少给出一组测试向量,即给定初始寄存器的值,给定反馈多项式,移位129次以后,连续的32比特是多少

按照自己的理解给出实验报告,要求原理部分手写截图放入报告,代码部分给出核心代码并注释,测试向量列表展示
附加要求:20分
采用西电学报的论文模板10分
使用大数库提供的数据结构,和自己写的代码进行效率比较10分(本人尚未理解使用大数库是在哪里使用,欢迎大家提供思路)

4.1.问题的转化:

移位129位后,在该状态下,再移位32比特。
等价于向右移动161位,其中a130——a161,即为所求的连续的32位比特。

4.2.代码的实现:

结合老师上课讲的伪代码可以更好的理解代码
在这里插入图片描述
图六 核心代码:反馈多项式部分

4.3 测试用例:

移位寄存器:1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 1

反馈多项式:1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 0 1
在这里插入图片描述
具体的实现代码:

#include<stdio.h>
#define weishu 130 										//移位寄存器的寄存器个数 :130 
#define yiweishu 161 									//希望移位寄存器移位的数目 :161 
int main()
{
//	int weishu,yiweishu;
//	printf("请输入移位寄存器的级数:");
//	scanf("%d",&weishu);
//	printf("请输入移位数:");
//	scanf("%d",&yiweishu);
	
	int a[weishu+yiweishu]={0};									//寄存器中初始的130位  +移位129位 

	int x[weishu]={0};											//描述反馈函数表达式 寄存器130位 
	int function1,function2,temp;								//均作为临时变量 
	printf("请输入130级移位寄存器的数值 a1到a130:"); 
	for(int i=0;i<weishu;i++)  									//寄存器130位 
	{
		scanf("%d",&a[i]);										//输入 
	}
	printf("请输入反馈多项式的系数:c1到c130") ;
	for(int i=0;i<weishu;i++)									//寄存器130位 
	{
		scanf("%d",&x[i]);
	 } 
 
	int first_cnt;												//先找到第一个系数不是零的项,用来记录第一个不是零的项在第几位 
	for(int i=0;i<weishu;i++)
	{
		if(x[i]!=0)
		{
			first_cnt=i; 
			break;
		}
	 } 
	 int a_left=0; 												//开始时最右侧的项 
	 for(int i=0;i<yiweishu;i++)								//一共需要移位161次 
	 {	
 
	 	temp=a[first_cnt+a_left];								//找到在该状态下第一个系数不是零的项 								
	 	for(int j=a_left;j<a_left+weishu;j++)					//反馈多项式部分:关于反馈函数所有抽头的异或 
	 	{
	 		if(j!=first_cnt+a_left && x[j-a_left]!=0 ) 			//此时的j不是第一个系数不为零的项 //  表示此时a[j]的系数想不为零 
			
	 		{
	 			temp=temp^a[j];									//	进行异或 
			 }
		 }
		 a[a_left+weishu]=temp;									//将反馈函数的结果填到最左端 
		 a_left++;												//该状态下的第一位  下标加一 ,也就是向右面移一位 

	  } 

//	for(int i=0;i<weishu+yiweishu;i++)							
//	{
//		printf("%d %d\n",i+1,a[i]);
//		
//	}
	printf("\n移位129次后,线性反馈移位寄存器中的值(从左往右即a259到a130)\n");
	for(int i=258;i>=129;i--)
	{
		printf("%d",a[i]);
		
	 } 
//向右移动129位后,在移位32比特
//	等价于向右移动161位,其中输出连续的32比特就是a130-a161,所以连续的32位比特为

//	for(int i=129;i<161;i++)
//	{
//		printf("%d",a[i]);
//	
//	 } 
	printf("\n再次经过32位移位后连续输出的32比特(从左往右即a161到a130):") ; 
	for(int i=160;i>=129;i--)
	{
		printf("%d",a[i]);
	 } 

	return 0;
 }

五 求解线性反馈移位寄存器的输出(考试重点考察

5.1 反馈多项式已知,通过观测连续的输出,可以得到Y0

在这里插入图片描述

5.2反馈多项式未知

反馈多项式未知,那么我们就求解得到反馈多项式,从而转换为情形一,进而求解
在这里插入图片描述
线性反馈多项式的状态输出我们是可以通过观测得到的,那么我们就可以构造上面的4个等式,并且四个等式中的未知量有4个,这样我们转换为情形1了。

参考文献:

[1] url:https://zhuanlan.zhihu.com/p/366067972
[2] url: https://blog.youkuaiyun.com/Drifter_Galaxy/article/details/107618275

### Apache SeaTunnel 2.3.8 安装指南 #### 下载地址 用户可以从官方提供的链接下载 Apache SeaTunnel 2.3.8 版本的二进制文件[^1]。具体下载页面位于以下地址: - **下载页**: https://seatunnel.apache.org/download/ #### 配置环境 在安装之前,需确保本地已正确配置 Java 环境以及必要的依赖项。Java 版本建议为 JDK 8 或更高版本。 #### 启动集群服务 完成解压后,可以通过 `seatunnel-cluster.sh` 脚本来启动 SeaTunnel 集群服务。以下是具体的命令示例[^3]: ```bash ./bin/seatunnel-cluster.sh start ``` 如果需要后台运行该进程,则可使用重定向操作符将其放入后台执行: ```bash nohup ./bin/seatunnel-cluster.sh start > sea_tunnel.log 2>&1 & ``` #### 停止集群服务 当不再需要运行 SeaTunnel 集群时,可通过如下脚本停止服务: ```bash ./bin/stop-seatunnel-cluster.sh ``` #### 使用 Docker 运行 (新增特性) 自 2.3.8 版本起,SeaTunnel 提供了官方支持的 Docker 镜像。这使得通过容器化部署变得更为便捷。以下是基于 Docker 的快速启动方式: 1. 拉取最新镜像: ```bash docker pull apache/seatunnel:2.3.8 ``` 2. 启动容器实例: ```bash docker run -d --name seatunnel-container -p 8081:8081 apache/seatunnel:2.3.8 ``` 上述命令会以后台模式启动 SeaTunnel 并映射默认 Web UI 到主机端口 8081 上。 --- ### 示例代码片段:MySQL 数据迁移至 MySQL 下面是一个简单的作业配置案例,展示如何利用 SeaTunnel 将数据从一个 MySQL 表迁移到另一个表中: ```yaml env { execution.parallelism = 1 } source { mysql { url = "jdbc:mysql://localhost:3306/source_db" username = "root" password = "password" table-name = ["table_source"] } } transform {} sink { mysql { url = "jdbc:mysql://localhost:3306/target_db" username = "root" password = "password" table-name = ["table_target"] } } ``` 此 YAML 文件定义了一个完整的 ETL 流程,其中包含源数据库连接参数、目标数据库连接参数及对应的数据表名称。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值