矩阵

AES算法

你离开我真会死。 提交于 2020-02-28 17:24:05
高级加密标准(Advanced Encryption Standard,AES),又称 高级加密标准Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。 对称密码体制的发展趋势将以分组密码为重点。分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成。密钥扩展算法将b字节用户主密钥扩展成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。混乱和密钥扩散是分组密码算法设计的基本原则。抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的设计要点。 AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。 AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。1999年3月完成了第二轮AES2的分析、测试。2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen 和

leetcode-48--旋转图像

天涯浪子 提交于 2020-02-28 14:31:21
题目描述:   给定一个 n × n 的二维矩阵表示一个图像,将图像顺时针旋转 90 度。 说明:   你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 1: 给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ] 示例 2: 给定 matrix = [ [ 5, 1, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7], [15,14,12,16] ], 原地旋转输入矩阵,使其变为: [ [15,13, 2, 5], [14, 3, 4, 1], [12, 6, 8, 9], [16, 7,10,11] ] 解题思路1:   按照以下旋转方式,先是淡黄色块,然后是浅蓝色块,依次替换位置 代码1: def rotate ( matrix ) : if matrix == [ ] or matrix [ 0 ] == [ ] : return 0 n = len ( matrix ) def get_rotate_xy ( i , j ) : return ( j , n - i - 1 ) for i in range ( n // 2 ) : for j in range ( i , n -

对于SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS的理解

情到浓时终转凉″ 提交于 2020-02-28 13:42:19
SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS的理解笔记总结 文章目录 SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS的理解笔记总结 前言 必备知识: GCN(Graph Convolutional network) 对于卷积核gθ​的定义 关于论文的2 (FAST APPROXIMATE CONVOLUTIONAS ON GRAPHS) 关于论文的2.1(SPECTRAL GRAPH CONVOLUTIONS) 关于论文2.2(lAYER-WISE LINEAR MODEL) 关于论文3.1(EXAMPLE) 部分代码 Reference 前言 在学习semi-supervised classification with graph convolutional networks之前,我认真的查阅了关于GCN(Graph Convolutional Networks)的知识,并且认为很有必要(对于像我这种小白, 去先了解清楚关于GCN的知识 ),这篇论文是基于前人的研究结果提出的新的方法。 因为是从零开始学,对于理解有误的地方欢迎大家指正! 必备知识: GCN(Graph Convolutional network)

Matlab基本函数用法笔记

南笙酒味 提交于 2020-02-28 05:59:25
ones() 和zeros() ones(n) 生成nxn全一矩阵 ones(m,n)生成mxn全一矩阵 zeros类似,是全0矩阵 cov() cov(x)输出x方差 cov(x,y)输出2阶矩阵: ( D ( x ) c o v ( x , y ) c o v ( x , y ) D ( y ) ) \begin{pmatrix} D(x)&cov(x,y)\\ cov(x,y)&D(y)\end{pmatrix} ( D ( x ) c o v ( x , y ) ​ c o v ( x , y ) D ( y ) ​ ) 操作矩阵 矩阵A,A(2,3)第二行第三个 A(1:10,3)第三列第一个到第10个 来源: CSDN 作者: Andrew_reid 链接: https://blog.csdn.net/Andrew_reid/article/details/104544039

Leetcode 搜索二维矩阵 II

让人想犯罪 __ 提交于 2020-02-28 05:52:08
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定 target = 5 ,返回 true 。 给定 target = 20 ,返回 false 。 思路:先二分target在哪一行,然后在对行进行二分找在哪一列 1 boolean searchMatrix(int[][] matrix, int target) { 2 if(matrix.length==0||matrix[0].length==0) 3 { 4 return false; 5 } 6 7 int l=0,r=matrix.length-1; 8 int mid=0; 9 while(l<=r) 10 { 11 mid=(l+r)/2; 12 if(target==matrix[mid][0]) 13 return true; 14 else if(target>matrix[mid][0]) 15 l=mid+1; 16 else r=mid-1

取石子游戏(博弈)

天大地大妈咪最大 提交于 2020-02-28 04:34:17
看来半天没想到竟然是这么屌丝,浪费了那么长的时间,证明完全NB,就靠我现在的智商想完全的独立的想出来完全没有可能 不过也“严重”说明了遇到这样困难的题目时,我们不应该轻言放弃。而应该仔细分析题目隐含的信息,学会分析和转化问题,从而找到问题的突破口,一举歼灭问题。 下面是转载的一篇详细的解释。。。 取石子游戏 Description 有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。 Input 输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。 Output 输出对应也有若干行,每行包含一个数字1或0,如果最后你是胜者,则为1,反之,则为0。 Sample Input 2 1 8 4 4 7 Sample Output 0 1 0 Source NOI 转载分析:大致看完题目,想当然就知道这是一道博弈论的问题,最容易想的就是直接用博弈论的必败、必胜态进行动态规划求解。但是朴素的动态规划是 O(N * M) 的,如果做一些优化可能可以过掉 RQNOJ

逆置一个二维数组(C语言)

邮差的信 提交于 2020-02-28 03:40:16
源码如下: # include <stdio.h> # include <stdlib.h> # if 0 二维数组要注意研究它的下标! # endif int main ( ) { int arr [ 4 ] [ 4 ] ; for ( int i = 0 ; i < 4 ; i ++ ) { for ( int j = 0 ; j < 4 ; j ++ ) { arr [ i ] [ j ] = rand ( ) % 100 ; printf ( "%3d" , arr [ i ] [ j ] ) ; } putchar ( 10 ) ; } printf ( "逆置后:\n" ) ; printf ( "即绕主对角线旋转180度!\n" ) ; //第一种方法 for ( int i = 0 ; i < 4 ; i ++ ) { for ( int j = 0 ; j < i + 1 ; j ++ ) { int t ; t = arr [ i ] [ j ] ; arr [ i ] [ j ] = arr [ j ] [ i ] ; arr [ j ] [ i ] = t ; } } for ( int i = 0 ; i < 4 ; i ++ ) { for ( int j = 0 ; j < 4 ; j ++ ) { printf ( "%3d" , arr [ i ]

软件构造Lab1-Part1总结

ⅰ亾dé卋堺 提交于 2020-02-28 00:29:42
首先分析一下,这题的要求就是判断输入的矩阵是不是一个幻方矩阵(记得MATLAB中的magic命令就可以生成)。那么检查条件从矩阵特点入手即可。 要满足: 1.矩阵为方阵 2.每列求和,列列之间和相等。行同理,对角线求和也和列/行求和相等。 思路: 有五个文件需要读取,并且我们需要处理字符串,由于不同文件中的间隔符可能不一致,需要处理不同的情况,显然单纯的利用spilt方法是不行的。这里最合适的方法应当是用 正则表达式 提取数字信息。 其次,矩阵的阶数不同,那么储存要用的二维数组大小也应该不同,恰好java中有 泛型 可以实现这一个技术。 另外就是需要输出异常信息,需要使用 try……catch 语句抛出异常。 综上,应该是比较完美的解决方法了。当然,我学习java的时间还不长,各种操作还不熟练,这个Part1虽然简单,但也因为java语法问题花了不少时间。 来源: CSDN 作者: 风声在耳 链接: https://blog.csdn.net/qq_44102479/article/details/104545224

面试题04:二维数组中的查找

☆樱花仙子☆ 提交于 2020-02-27 23:00:12
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路 通过每一行从左到右都是递增的,每一列从上到下也是递增的,可以去通过比较数字大小,来删除某一列或者某一个行。 将二维数组想象成矩阵。从数组的右上角数字 m 开始。 如果 m == target,那么说明数组中含有该整数,直接返回 true。 如果不相等,那么继续比较。 如果 m > target 成立,那么根据题意,m 所在那一列的所有数字都是比 target 大的,那么可以去除该列,然后继续取右上角的数字为 m。 如果 m < target 成立,那么根据题意,m 所在哪一行的所有数字都是比 target 小的,那么可以去除该行,然后继续取右上角的数字为 m。 去反复判断,直至所有的数字都不等于 target,那么返回 false。 代码 public class Solution { public boolean Find(int target, int [][] array) { if (array == null || array.length <= 0 || array[0].length <= 0) { return false; } // 获取行数 int

二维数组主对角线与次对角线输出(C语言)

岁酱吖の 提交于 2020-02-27 18:47:18
源码如下: //二维数组主对角线与次对角线输出 # include <stdio.h> # include <stdlib.h> # define N int main ( ) { int arr [ 4 ] [ 4 ] ; # if 0 //int[4] arr[3] //省3等价于省了一维数组的大小 //省4等价于省了类型的大小 //一维数组的数组名是一级指针 //二维数组的数组名是数组指针 & -- > reference 引用 * -- > dereference 间接引用 # endif for ( int i = 0 ; i < 4 ; i ++ ) { for ( int j = 0 ; j < 4 ; j ++ ) { arr [ i ] [ j ] = rand ( ) % 100 ; printf ( "%3d" , arr [ i ] [ j ] ) ; } putchar ( 10 ) ; } printf ( "主对角线输出:\n" ) ; //第一种方法 for ( int i = 0 ; i < 4 ; i ++ ) { printf ( "arr[%d][%d] = %d\n" , i , i , arr [ i ] [ i ] ) ; } //第二种方法 for ( int i = 0 ; i < 4 ; i ++ ) { for ( int j