Nov 11,2019 ~ Nov 17,2019

Algorithm

本周来介绍快速求一个数字n次方的余数。

理论基础

我们先定义运算$ x \bmod p = r \(与\) x \equiv r \pmod p \(的含义是一样的。若\) p = 5 $,则可以将所有整数划分到5个不相交的集合里,具体如下:

\[\left\{\begin{matrix}
& \{\dots -10, -5, 0, 5, 10 \dots \} \bmod 5 = 0 & \\
& \{\dots -9, -4, 1, 6, 11 \dots \} \bmod 5 = 1 & \\
& \{\dots -8, -3, 2, 7, 12 \dots \} \bmod 5 = 2 & \\
& \{\dots -7, -2, 3, 8, 13 \dots \} \bmod 5 = 3 & \\
& \{\dots -6, -1, 4, 9, 14 \dots \} \bmod 5 = 4 & \\
\end{matrix}\right.
\]

可能有人不懂为什么\(-4 \bmod 5 = 1\),我来解释一下,因为$ -4 = 5 \times (-1) + 1 \(,故\) -4 \div 5 = -0.8 = -1 \cdots 1 \(。因此\)-4 \bmod 5 = 1$

那么根据上面的描述,就可以将数之间的运算通过取余映射在有限个集合内。那么,有如下两条基本性质,可以更加方便我们进行求解

  1. 若存在 $ a \equiv b \pmod p, c \equiv d \pmod p $ ,则 $ a+c \equiv b+d \pmod p $ 。
  2. 若存在 $ a \equiv b \pmod p, c \equiv d \pmod p $ ,则 $ ac \equiv bd \pmod p $

通过这样的性质就很容易求解一个大数的对某个数字取余的结果。以计算\((2^{32} + 5)\bmod 7 = ?\)为例

  1. $ 2 \bmod 7 = 2 $
  2. $ 2^2 \bmod 7 = (2 \times 2) \bmod 7 = 4$
  3. $ 2^4 \bmod 7 = (2^2 \times 2^2) \bmod 7 = 4 \times 4 \bmod 7 = 2 $
  4. $ 2^8 \bmod 7 = {2^4 \times 2^4} \bmod 7 = [(2^4 \bmod 7) \times (2^4 \bmod 7)] \bmod 7 = (2 \times 2) \bmod 7 = 4 $
  5. $ 2^{16} \bmod 7 = {2^8 \times 2^8} \bmod 7 = [(2^8 \bmod 7) \times (2^8 \bmod 7)] \bmod 7 = (4 \times 4) \bmod 7 = 2 $
  6. $ 2^{32} \bmod 7 = (2^{16} \times 2^{16}) \bmod 7 = [(2^{16} \bmod 7) \times (2^{16} \bmod 7)] \bmod 7 = (2 \times 2) \bmod 7 = 4 $
  7. $ (2^{32}+5) \bmod 7 = [(2^{32} \bmod 7) + (5 \bmod 7)] \bmod 7 = (4 + 5) \bmod 7 = 2 $

具体实现

设问题为:求解$ a^x \bmod b = ? \(。因此问题的关键在于如何分解\)x$,具体有两种基本思路,分别是按照210进行分解。当然也可以按照其他数进行分解,但实现起来较复杂。

  1. 按数字2来分解,分解的基本原理如下:

\[\begin{cases}
& x = x // 2 + x // 2,\quad a^x = a^{x//2} \times a^{x//2} \quad \text{ if } x \bmod 2 = 0 \\
& x = x // 2 + x // 2 + 1,\quad a^x = a^{x//2} \times a^{x//2} \times a \quad \text{ if } x \bmod 2 = 1
\end{cases}
\]

根据上述公式不难写出代码:

def my_mod(a, x, b):
if x == 1:
return a % b
else:
tmp = my_mod(a, x//2, b)
if x % 2 == 0:
return ( tmp * tmp ) % b
else:
return ( tmp * tmp * my_mod(a, 1, b) ) % b
  1. 按数字10来分解,分解的基本原理如下,因为是递归的,为了方便理解,使用数字123为例:

    $ 123 = (1 \times 10 + 2) \times 10 + 3 \(
    \) a^{123} = ({3^1} ** 3^{10} \times 3^2 ) ** 3^{10} \times 3^3 $

    实现代码如下:
def my_mod(a, x, b):
def cal_mod(a, b):
L = []
for i in range(11):
L.append( (a**i) % b )
return L def recursive(x):
if 0 <= x <= 9:
return L[x]
else:
return ( recursive(x//10) ** L[10] * recursive(x%10) ) % b if 0 <= x <= 10:
return (a**x) % b
L = cal_mod(a, b)
return recursive(x)

Review

Why is the gets function so dangerous that it should not be used?

在一个比较早的代码时,运行总会出错,后面通过查找资料,发现是gets函数的问题。

当我查阅gets函数时发现,在DESCRIPTION部分直接写道Never use this function.

在阅读了一些关于gets英文文章后,我明白了为什么gets会带来问题。

简单地说,带来隐患的根源在于gets函数不会控制读入的量,而只是以\n\0作为读入的终止。例如下面这个代码:

#include<stdio.h>

int main()
{
char str1[] = "hello";
char str2[] = "world";
char *str = gets(str1);
return 0;
}

程序开始运行后,输入任意个字符,点击回车将会直接带来段错误从而终结程序。

Tips

根据上述的描述,凡要涉及到gets函数,都可以使用fgets函数进行代替

fgets函数原型如下

char *fgets(char *s, int size, FILE *stream);

从标准输入的读取方法如下:

char buffer[100];
while (fgets(buffer, sizeof(buffer), stdin))
{
// operations
}

Share

本周分享一个关于vim配置的项目——VimPlus

不少vim用户都喜欢安装或多或少的插件以增强原生vim的功能,但不少新手第一次安装插件时可能会遇到某些问题,同时也未必会一次安装配置好需要的插件。而这个项目就是为了方便新手可以通过简单的运行命令就可以安装许多常用的插件,进而配置出一个像IDE似的vim。

其中可以一键安装的插件包括vim-plugYou Complete Me

目前项目的作者的维护也比较及时。希望未来可以越做越好!

更多内容可去上述项目链接中进行查看。

(注:我与作者没有任何联系,只是发现了这个项目并且个人尝试后觉得不错,所以分享在这里)

ARTS Week 3的更多相关文章

  1. KDE声音服务器 arts

    KDE声音服务器 arts arts介绍arts是KDE的核心声音系统,支持多音频流.全双工.网络声音请求.ALSA与OSS驱动后端.JACK声音服务器后端等扩展,它既是声音服务器,也 提供一套音频软 ...

  2. 【ARTS】01_21_左耳听风-201900401~201900407

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  3. 【ARTS】01_20_左耳听风-20190325~20190331

    zz## ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 ...

  4. 【ARTS】01_19_左耳听风-20190318~20190324

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  5. 【ARTS】01_18_左耳听风-20190311~20190317

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  6. 【ARTS】01_17_左耳听风-20190304~20190310

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  7. 【ARTS】01_16_左耳听风-20190225~20190303

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  8. 【ARTS】01_15_左耳听风-20190218~20190224

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  9. 【ARTS】01_14_左耳听风-20190211~20190217

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  10. 【ARTS】01_13_左耳听风-20190204~20190210

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

随机推荐

  1. 阿里云ECS单节点Kubernetes部署

    参考资料: kubernetes官网英文版 kubernetes官网中文版 环境.工具 阿里云学生机ECS.Ubuntu.docker.kubectl1.15.4.kubelet1.15.4.kube ...

  2. win10下使用mklink命令给C盘软件搬家

    在windows下,大多数软件会默认安装在C盘,即使小心翼翼地点开“自定义”->“安装路径”,然后把软件安装到其他盘,还是会有很多软件用到的数据文件被塞到C盘,虽然可以到注册表修改软件默认安装路 ...

  3. 配置本地目录作为yum端

    ---恢复内容开始--- 最近在配置gnome-session中发现需要太多依赖的包,又由于实验室使用的是局域网,没有办法连接网络,所以想着配置本地yum安装.在网上找了一些资料,经过整理,把自己这次 ...

  4. FIND_IN_SET 精确查找

    FIND_IN_SET(str,strlist) mysql专为精确匹配字符串而设置的函数 一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串 1,2,3,4,5,6,7,8,9: 此函数 ...

  5. schedule of 2016-11-7~2016-11-10(Monday~Thursday)——1st semester of 2nd Grade

    most important things to do 1.joint phd preparations 2.journal paper to write 3.solid fundamental kn ...

  6. C# 阿里云查询、删除文件

    class Program { static string regionId = "cn-shanghai"; static string accessKeyId = " ...

  7. vue 项目中运用到的插件 或者依赖安装

    1.安装less ,less-load npm install less less-loader --save-dev 2.安装vux npm install vux --save npm insta ...

  8. 快速搭建一个自己的个人博客(Github Pages~二次元主题)

    前言 本次的一个布局技术都写的非常详细了,只要按着来就行,不过,先说明本次主题为二次元主题. 如果真的喜欢本主题的不妨可以试一试(==建议跟据目录来看==) 在很久很久以前.... 嘛,就在前不久我正 ...

  9. cf - 920 c 求能否实现交换

    C. Swap Adjacent Elements time limit per test 1 second memory limit per test 256 megabytes input sta ...

  10. VMware Workstation CentOS7 Linux 学习之路(1)--系统安装

      前言 很早就想学习Linux了,出去面试很多家公司都问会不会Linux,都很尴尬,一直没学过Linux,在网上也看过很多资料,也安装了VM,自己摸索着学习Linux,之前看网上的一些命令一顿操作, ...