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. matlab写入excel数据

    使用xlswrite 可以help xlswrite查看用法 xlswrite(filename,A)xlswrite(filename,A,sheet)xlswrite(filename,A,xlR ...

  2. C# 微信h5支付

    相关文档  https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1 需要准备 公众号ID.商户号.商家私钥 1.登 ...

  3. Spring--2.Spring之IOC--了解IOC容器

    IOC(容器),用来集成别的框架 1.IOC(Inversion(反转)Of Control):控制反转 控制:资源的获取方式: 主动式: BookServlet{ BookService bs=ne ...

  4. linux下解压缩文件中文乱码问题的解决

    在windows上压缩的文件,是以系统默认编码中文来压缩文件.由于zip文件中没有声明其编码,所以linux上的unzip一般以默认编码解压,中文文件名会出现乱码. 虽然2005年就有人把这报告为bu ...

  5. 执行sql中的 函数,function

    CREATE FUNCTION [dbo].[GetWeight] ( ,)--重量/体积重 ) ,) as begin --顺丰重量/体积重以0.5kg为单位向上取值(小数点后两位4舍5入) ,) ...

  6. 手写vue中v-bind:style效果的自定义指令

    自定义指令 什么是自定义指令 以 v- 为前缀,然后加上自己定义好的名字组成的一个指令就是自定义指令.为什么要有自定义指令呢?在有些时候,你仍然需要对普通的DOM元素进行底层的操作,这个时候就可以用到 ...

  7. 【Flink】Flink作业调度流程分析

    1. 概述 当向Flink集群提交用户作业时,从用户角度看,只需要作业处理逻辑正确,输出正确的结果即可:而不用关心作业何时被调度的,作业申请的资源又是如何被分配的以及作业何时会结束:但是了解作业在运行 ...

  8. Nmap使用教程(二)

    TCP空闲扫描 这种先进的扫描方法允许对目标进行一个真正的盲目TCP端口扫描(即没有数据包从你的真实IP地址发送到目标).相反独特的侧信道攻击利用僵尸主机上可预测的IP分段ID序列生成来收集关于目标的 ...

  9. [bzoj4524] [loj#2047] [Cqoi2016] 伪光滑数

    Description 若一个大于 \(1\) 的整数 \(M\) 的质因数分解有 \(k\) 项,其最大的质因子为 \(Ak\) ,并且满足 \(Ak^K \leq N\) , \(Ak<12 ...

  10. 添加动态输出 Adding Dynamic Output 精通ASP-NET-MVC-5-弗瑞曼 Listing 2-7

    ViewBag Dynamic Output