算法-整数-矩阵

算法

常用算法

搜索算法

  • 线性搜索或顺序搜索
  • 二分搜索:用于搜索排序后的集合

排序

  • 冒泡排序
  • 插入排序

贪心算法

每一步都选择最好的选项,而不考虑可能导致最优解的所有步骤序列

函数的增长

$\mathrm O$记号用于描述$g(x)$的上限,$\Omega$用于描述$g(x)$的下限,$\Theta$用于描述$g(x)$的上下限。

  • 令$f$和$g$为从整数集合或实数集合到实数集合的函数,如果存在正常数$C$和$k$,使得只要$x>k$,就有
    $$
    \mid f(x)\mid \le C\mid g(x)\mid
    $$我们就说$f(x)$是$\mathrm O(g(x))$
  • 令$f$和$g$为从整数集合或实数集合到实数集合的函数,如果有常数$C$和$k$,使得只要$x>k$,就有
    $$
    \mid f(x)\mid\ge C\mid g(x)\mid
    $$
  • 令$f$和$g$为从整数集合或实数集合到实数集合的函数,如果$f(x)$是$\mathrm O(g(x))$及$f(x)$是$\Omega (g(x))$,就说$f(x)$是$\Theta (g(x))$。

函数的组合增长

  • 假定$f_1(x)$是$\mathrm O(g_1(x))$,$f_2(x)$是$\mathrm O(g_2(x))$,那么$(f_1+f_2)(x)$是
    $$
    \mathrm O(max(\mid g_1(x)\mid , \mid g_2(x)\mid))
    $$
  • 假定$f_1(x)$是$\mathrm O(g_1(x))$,$f_2(x)$是$\mathrm O(g_2(x))$,那么$(f_1 f_2)(x)$是$\mathrm O(g_1(x)g_2(x))$

算法复杂度

复杂度 术语 复杂度 术语
$\Theta (1)$ 常数复杂度 $\Theta (n^b)$ 多项式复杂度
$\Theta (logn)$ 对数复杂度 $\Theta (b^n),b>1$ 指数复杂度
$\Theta (n)$ 线性复杂度 $\Theta (n!)$ 阶乘复杂度
$\Theta (nlogn)$ $nlogn$复杂度
  • 一般来讲,能用多项式复杂度的算法解决的问题都是易解的,反之是难解的。
  • 能用多项式时间验证解的问题属于NP类,易解的问题属于P类。
  • NP完全问题,这类问题的性质是,只要其中任何一个问题能用一个多项式时间最坏情形算法来解答,那么所有这些问题都能用多项式时间最坏情形算法解答。

整数

  • 如果$a$和$b$是整数,$a\neq 0$,若有整数$c$使$b=ac$,就说$a$整除$b$。在$a$整除$b$时,$a$是$b$的一个因子,$b$是$a$的倍数,符号$a\mid b$表示$a$整除$b$。当$a$不能整除$b$时写成$a∤b$
  • $a\mid b$也可以表示成$\exists c(ac=b)$,论域是整个整数集合。
  • 令$a$,$b$,$c$为整数。则
    • 若$a\mid b$和$a\mid c$,则$a\mid (b+c)$;
    • 若$a\mid b$和$a\mid c$,则$a\mid mb+nc$,其中$m$和$n$为整数;
    • 若$a\mid b$,那么对所有整数$c$都有$a\mid bc$;
    • 若$a\mid b$,$b\mid c$,则$a\mid c$;

同余

  • 带余除法:令$a$为整数,$d$为正整数,有唯一的整数$q$和$r$,并且$0\le rlt d$,满足$a=dq+r$。
  • 若$a$和$b$为整数而$m$为正整数,如果$m$整除$a-b$,就说$a$模m同余$b$。用$a\equiv b\pmod m$。也就是说$a\equiv b\pmod m$当且仅当$a \mod m=b\mod m$
  • 令$m$为正整数,整数$a$和$b$模$m$同余的充分必要条件是存在整数$k$,使$a=b+km$
  • 整数$a$模$m$所有整数同余的集合称为$a$模$m$的同余类
  • 令$m$为正整数。若$a\equiv b\pmod m$,$c\equiv d\pmod m$,那么
    $$
    a+c\equiv b+d\pmod m\
    ac\equiv bd\pmod m
    $$
  • 令$m$是正整数,$a$和$b$是整数,则有
    $$
    (a+b)\mod m = ((a\mod m)+(b\mod m))\mod m\
    ab\mod m = ((a\mod m)(b\mod m))mod m
    $$
  • 根据$\mod m$和关于模$m$同余的定义,可得$a\equiv (a\mod m)(\mod m)$,并且$b\equiv (b\mod m)(\mod m)$,因此
    $$
    a+b\equiv (a\mod m)+(b\mod m)(\mod m)\
    ab\equiv (a\mod m)(b\mod m)(\mod m)
    $$

同余应用

  • 散列函数
  • 伪随机数

最常用的产生伪随机数的过程称为线性同余。选择4个数:模数$m$,乘数$a$,增量$c$和种子$x_0$,使得$2\le a\lt m$,$0\le c\lt m$,$0\le x_0 m$。生成伪随机序列${x_n}$,使得对所有$n$,$0\le x_n \lt m$。生成的办法是逐次同余:
$$
x_{n+1} = (ax_n +c)\mod m
$$

  • 密码学

凯撒密码:
$$
f(p)=(p+k)\mod 26\
f(p)=(ap+b)\mod 26
$$

素数和最大公约数

  • 每个大于1的正整数都可以唯一写为素数的乘积。对大整数进行素因子分解所需的时限在密码学中起着重要的作用。
  • 如果$n$是个合数,那么$n$必有小于或等于$\sqrt n$的一个素因子。
  • 梅森素数,是形如$2^p-1$这样的整数。目前已知最大的素数都是这种形式,可用卢卡斯-莱莫尔(Lucas-Lehmer)检验的方法判断$2^p-1$是否为素数。
  • 素数定理:当$x$无限增长时,不超过$x$的素数个数与$x/Inx$之比趋于1。
  • 令$a$和$b$是不全为$0$的两个整数。能使$d\mid a$和$d\mid b$的最大整数$d$称为$a$和$b$的最大公约数。$a$和$b$的_最大公约数_用$gcd(a, b)$表示。
  • 如果整数$a$和$b$的最大公约数是$1$,就说它们是互素的。
  • 整数$a_1,a_2,\cdots,a_n$是两两互素的,如果只要$1\le i\lt j\le n$,就有$gcd(a_i, b_j)=1$
  • 正整数$a$和$b$的_最小公倍数_是能被$a$和$b$整除的最小正整数。$a$和$b$的最小公倍数用$lcm(a, b)$表示。
  • 令$a$和$b$为正整数,则$ab = gcd(a, b)\cdot lcm(a, b)$

求最大公约数算法

  • 假定两个不全为$0$的整数$a$和$b$的素因子分解为:
    $$
    a=p_1^{a_1}p_2^{a_2}\dots p_n^{a_n} \
    b=p_1^{b_1}p_2^{b_2}\dots p_n^{b_n}
    $$
    每个整数都是非负整数,而且出现在$a$和$b$分解中的所有素数都包含在两个分解之中,必要时以0为指数出现。于是$gcd(a, b)$由下面的公式给出
    $$
    gcd(a, b) = p_1^{min(a_1,b_1)}p_2^{min(a_2, b_2)}\dots p_n^{min(a_n,b_n)}
    $$
    例如,求$120$和$500$的最大公约数:
    $$
    120 = 2^3\cdot 3\cdot 5 , 500 = 2^2\cdot 5^3\
    gcd(120, 500) = 2^{min(3,2)}\cdot 3^{min(1,0)}\cdot 5^{min(1,3)}\
    = 2^3\cdot 3^0\cdot 5^1 = 20
    $$
  • 另一个求最大公约数的算法就是欧几里得算法。
  • 令$a=bq+r$,其中$a,b,c,q$均为整数,则$gcd(a, b)=gcd(b,r)$。

求最小公倍数算法

同最大公约数算法类似,最小公倍数的由以下公式给出:
$$
lcm(a, b) = p_1^{max(a_1,b_1)}p_2^{max(a_2, b_2)}\dots p_n^{max(a_n,b_n)}
$$

整数和进制

令$b$为不等于$1$的正整数,那么如果$n$是个正整数,就可以唯一地表示为下面的形式:
$$
n = a_kb^k+a_{k-1}b^{k-1}+\cdots +a_1b+a_0
$$
其中$k$是非负整数,$a_0,a_1,\cdots,a_k$是小于$b$的非负整数,$a_k\neq 0$。该形式被称为$n$的$b$进制展开。

数论应用

*$a$和$b$为正整数,则存在整数$s$和$t$,使得为$gcd(a,b)=sa+tb$。

  • 如果$a,b,c$为正整数,使得$gcd(a, b)=1$且$a\mid bc$,那么$a\mid c$。
  • 如果$p$是素数,且$p\mid a_1a_2\cdots a_n$,其中$a_j$为整数,则对某个$i$,$p\mid a_i$
  • 令$m$为正整数,$a,b,c$为整数,如果$ac\equiv bc\pmod m$且$gcd(c, m)=1$,那么$a\equiv b\pmod m$