当前位置: 首页 > 编程日记 > 正文

【转】初等数论 ——原根、指标及其应用


转自:http://blog.163.com/gc_chdch@126/blog/static/172279052201641935828402/


学习总结:初等数论(3)——原根、指标及其应用  

2016-05-19 15:58:28|  分类: 信息学——学习总 |  标签:初等数论  数学  |举报|字号 订阅

学习总结:初等数论(3)——原根、指标及其应用

最近知道了一本书叫《数论概论(第3版)》(A Friendly Introduction to Number Theory),简单翻了翻,感觉这本书写的非常好。想起以前刚接触数论时,没有看这本书来入门,真是十分遗憾。这本书面向非数学专业读者,语言生动幽默而不失严谨性,注重对知识的感性认识(用了大量的例子),和对数学思想和方法的渗透(比如:大胆猜想规律,证明时用“计数”法等)。这里强烈推荐这本书!

下面总结一下这几天学习的内容。

一、整数的阶

a与n是互质的两个数。可以发现,总存在某个数x,满足 ax ≡ 1(mod n)。

使ax ≡ 1(mod n)满足的最小的正整数x叫做a模n的阶(或次数),记做ena(有的地方记做ordna)。

怎么理解呢?你要不断计算a,a2,a3,…,(注意要模n)我们知道,根据鸽巢原理,一定会有循环。而a和n互质时,总会在某个时刻出现了1,下一个时刻又是a,……于是就有了循环。这个出现1的最小的指数,叫做a的阶。

比如:我们要找3模7的阶,计算31,32,…,36模7的值依次为:

3,2,6,4,5,1,

所以我们得到3模7的阶为6。

a与n互质时,根据欧拉定理有a?(n)≡1(mod n)。这么说来,刚才我们不断计算a的幂的循环节的长度(即a的阶)“扩增”若干次后应该为?(n)。所以,

ena | ?(n)。

同样的道理,为了使方程 ax≡1(mod n)有解,应该把循环节长度“扩增”若干次后得到x,所以

ena | x

二、原根

设a与n是互质的整数,当a模n的阶为?(n)时,把a叫做n的原根。

怎么理解呢?我们计算a的幂的序列,第一次得到1的时候,得到了完整的一个循环节。我们上面已经说了,?(n)一定是(a模n的阶)的倍数。如果这个循环节的长度恰好就是?(n)(循环节的长度已经达到最大了),那么a就是n的原根。

(1)原根的存在性

一个数可能有很多个原根,也可能没有原根。可以证明:

正整数n存在原根,当且仅当

n = 2, 4, pt或2pt(其中p是奇素数,t是正整数)。

举例:5的原根有2和3;7的原根有3和5。

(2)原根的一个性质

原根为什么这么重要?

设g是n的一个原根,那么:g,g2,g3,…,g?(n)(即g0≡1(mod n))一定两两不同。(如果有相同,比如说存在0≤i<j<?(n)满足gi≡gj(mod n),那么就会有gj-i≡1(mod n),而j – i<?(n),这时?(n)就不是g的阶了)

看看方程ax≡1(mod n),如果x是存在的,那么a一定是与n互质的数(如果a和n有某个大于1的公因子,无论a怎么取幂再模n,这个公因子都“消不掉”,不会有ax mod n = 1)。所以“合法”的a有?(n)个。而我们找到一个原根g后,g的幂(g,g2,g3,…,g?(n))一定就是这些合法的a(即与n互质的?(n)个数。因为g与n互质,g的幂也与n互质,而这些幂又两两不同,一定能把“与n互质的数”取尽)。

一句话总结上面的内容:对于n的一个原根g,满足

{ 1,g,g2,g3,…,g?(n) – 1 } = { x | x与n互质,1≤x<n }

特别地,对于奇质数p的一个原根g,满足

{ 1,g,g2,g3,…,gp – 2 } = { 1, 2, 3, …, p – 1 }

(3)原根的个数

一个数n,如果存在原根,就一定?(?(n))个。怎么证明呢?为此我们先讨论下面这个问题:

已知a模n的阶ena,怎么求au的模n的阶?

设au模n的阶为t,那么t应该是最小的正整数,满足(au)t≡aut≡1 (mod n)。

由之前的讨论,可以知道:u×t应该是ena的倍数,并且t最小。

由数论的基本知识可以得出,enau = t = ena / gcd(u, ena)。

如果我们找出一个原根g,怎么得出其他的原根?

首先,其他的原根一定是g的若干次幂。

哪些“g的若干次幂”可以成为原根?

用原根的定义!

对于某个“g的若干次幂”,比如gi (0≤i<?(n)),由上面的结论得出,它模n的阶为

?(n) / gcd(i, ?(n))

欲使它的阶也为?(n),即

?(n) / gcd(i, ?(n)) = ?(n)

需要使gcd(i, ?(n)) = 1,也就是i和?(n)互质。

有多少个i满足它和和?(n)互质?换句话说,在0 ~ ?(n)–1的数中,有多少个与?(n)互质?答案应该是?(?(n))。所以,一个数如果有原根,那么它有?(?(n))个原根。

下面举个例子:

7的原根有?(?(7)) = ?(6) = 2个,最小的一个是3。

在32,33,…,36中,哪个指数与6互质?只有5,所以另一个原根是35≡5(mod 7)。

怎么找原根?

通常最小的原根都比较小,所以暴力从1开始枚举就可以了。判断一个数a是不是n的原根,需要判断?(n)是否是a的阶,直接的判断方法是枚举?(n)的每一个因子d(除去它本身),判断是否ad≡1(mod n)。但这样做了很多重复的判断。

比如我们要判断a模n=37的阶是否为36,那么只需找出36的两个质因子2和3,只需判断36/2和36/3作为a的幂的指数时,(a的幂) mod n是否为1。如果a的阶为36/4,36/9,36/6,36/12,…,其实情况已经包含在上面的判断中了。(比如,如果a36/9≡a4≡1(mod n),那么一定也会满足a36/2≡3618≡1(modn))。

三、指标(离散对数)

求原根有什么作用?为了计算指标!

对于n的一个原根g,满足

{ 1,g,g2,g3,…,g?(n) – 1 } = { x | x与n互质,1≤x<n }

再具体一些,可以定义一种“求幂”的运算,这种运算揭示了两个集合的一一对应关系:

i → gi (1≤i≤?(n))

为什么是一一对应关系?因为gi一定两两不同。这一点已经讨论过了。

那么,是否有一种“求幂”运算的逆运算?有!

求出n的一个原根g,知道了某个与n互质的数a,n是g的多少次方?

我们用I(a)来表示这个“次方”数,叫做以g为底a模n的指标。(有的地方记做indga)

也就是,依照定义,应该有gI(a)≡a(mod n)(a与n互质)。

显然,指标的范围是0≤I(a)<?(n),当指标超过?(n)时,出现了循环,可以把指标mod ?(n)进行简化。

有点像我们以前学过的对数?(不严谨的说,有点像logga?)也许这就是为什么指标也叫离散对数了。

当n为质数时,原根g一定存在,而且?(n) = n – 1,这样,每个在1~n–1范围内的数都有指标!

我们可以根据幂的运算法则,对应得出指标的运算法则:

(1) I(ab) = I(a) + I(b) (mod ?(n))  (类比:logaNM = logaN + logbM)

(2) I(ak) = k×I(a)   (类比:logaNM = M×logaN)

指标把乘法变加法,把幂变乘法,这一点与对数的运算法则多么相似!

如果有一个指标表,我们可以十分简便地进行运算。举例:

n = 37,它的一个原根是a = 2。

要计算23×19 mod 17的值,可以计算

I(23×19) ≡ I(23) + I(19) ≡ 15 + 35 ≡ 50 ≡ 14 (mod 36)

然后,查表可以得出,指标为14的数是30,就是要求的答案了。

很麻烦?

再看一个例子:

I(2914) ≡ 14 × I(29) ≡ 294 ≡ 6 (mod 36)

由表得:I(27) = 6,所以2914 ≡ 27 (mod 37)

你也许会说:有快速幂!在前两个例子中,似乎指标的优势没有体现出来。不过,在解方程的时候,指标就很有用了。

解同余式:

扩展欧几里得?好像也能解。不过,像下面这样的同余式呢?

只能用指标来解。两边同时求离散对数:

可以解出:

事实上,最后一个例子是指标最重要的运用之一。等会儿我们会详细讨论。

但是,之前的计算都是在指标表已经给了的情况下进行的。没有指标表怎么办呢?如何求某个数指标(离散对数)?

更准确地说,给出g, a, p,如何求gk ≡ a(mod p)的最小的k?为了简化问题,这里规定p为质数。

这里使用一种叫做大步小步(gaint-step baby-step)的算法。算法的核心思想是分块。取m = [ sqrt(p – 1) ] + 1,然后把k表示成xm + y (0 ≤ y < m)的形式。这样,x和y的范围都是0~m(y不含m)。于是gk ≡ (gm)x × gy,可以求出所有的gy(m个取值);然后枚举x,计算出(gm)x,查找:是否存在某个gy满足(gm)x × gy ≡ a(mod p)?也就是说:

是否存在某个gy,满足gy ≡ a × (gmx) –1 (mod p)?

用费马小定理和快速幂求出逆元(gmx) –1,然后求出a × (gmx) –1。检查是否有“匹配”的gy。如果我们先把gy放在一个哈希表(或者C++的map)中,那么这一步的查询就是O(1)(或O(log2m)=O(log2p))的。算法的核心步骤仍然是枚举,但分块使时间复杂度变成O(sqrt(P) × log2P)(注意算上求逆元的时间)。

四、N次剩余

这里要解决一个这样的问题:

给出N, a, p,求满足xN ≡ a (mod p)(p为质数)的所有解x。

可以形象地理解成求a在模p意义下的N次方根。

刚才我们已经借助例子,初步了解了做法:

xN ≡ a (mod p),找出p的一个原根g,用“大步小步”算法求出以g为底a模p的指标I(a)。

同余式变成:

N × I(x) ≡ a (mod p – 1)

由一次同余方程的知识可以知道,有解的条件是

gcd(N, p – 1) | a

而且,解有gcd(N, p – 1)个。

解出所有的可能的I(x),那么x = gI(x)。这些x中重复的要去掉。

代码:

#include  <cstdio>

#include  <cstring>

#include  <algorithm>

#include  <cmath>

#include  <vector>

#include  <map>

using  namespace std;

typedef  long long LL;

int  gcd(int a, int b)

{

return b == 0 ? a : gcd(b, a % b);

}

void  _gcd(int a, int b, LL &x, LL &y)

{

if (b == 0)

{

x = 1; y = 0;

return ;

}

_gcd(b, a%b, y, x);

y -= (a/b) * x;

}

int  extend_gcd(int a, int b, int c, LL &x, LL &y, int &dx, int  &dy)

{

int g = gcd(a, b);

if (c % g) return 0;

_gcd(a, b, x, y);

x *= (c/g);

y *= (c/g);

dx = b / g;

dy = a / g;

return g;

}

// Ax  = B (mod N)

// 设Ax =  -yN + B

// 则Ax +  Ny = B

bool  line_mod_equ(int A, int B, int N, int &x, int &k)

{

LL x0, y0;

int dx, dy;

if (!extend_gcd(A, N, B, x0, y0, dx, dy))  return false;

x0 %= dx;

if (x0 < 0) x0 += dx;

x = (int)x0;

k = dx;

return true;

}

LL  pow_mod(LL a, LL b, LL p)

{

if (b == 0) return 1;

LL tmp = pow_mod(a, (b>>1), p);

if (b & 1) return tmp * tmp % p * a %  p;

else return tmp * tmp % p;

}

//分解质因数

void  factor(int x, vector<int> &divs)

{

divs.clear();

for (int i = 2; i * i <= x; ++ i)

if (x % i == 0)

{

divs.push_back(i);

while (x % i == 0) x /= i;

}

if (x > 1) divs.push_back(x);

}

bool  g_test(int g, vector<int> &divs, int P)

{

for (int i = 0; i < (int) divs.size();  ++ i)

if (pow_mod(g, (P-1) / divs[i], P) ==  1) return false;

return true;

}

//找原根,p为质数,保证有原根

int  primitive_root(int P)

{

static vector<int> divs;

factor(P-1, divs);

int g = 1;

while (!g_test(g, divs, P)) ++ g;

return g;

}

// 求解在模P意义下,以a为底N的离散对数b (P为质数)

// 即 a ^ b  = N (mod P)

// 大步小步算法(分块)

// 取s =  sqrt(P), 设b = x * s + y

// 则 a ^  (x*s + y) = (a^s)^x * a^y = N (mod P)

// 求出y =  0~s-1时, a^y的取值;然后枚举s,算出(a^s)^x,查找是否有匹配的y

int  discrete_log(int a, int N, int P)

{

map<int, int> rec;

int s = (int)sqrt(P + 0.5);

while (s * s <= P) ++ s;

LL cur = 1;

for (int y = 0; y < s; ++ y)

{

rec[ cur ] = y;

cur = cur * a % P;

}

LL a_s = cur; // a^s

cur = 1;

for (int x = 0; x < s; ++ x)

{

LL a_y = pow_mod(cur, P-2, P) * LL(N) %  P;

map<int,int> :: iterator it =  rec.find( a_y );

if (it != rec.end()) return x * s + it  -> second;

cur = cur * a_s % P;

}

return -1;

}

// x ^  K = A (mod P) (where P is a prime)

// 找p的一个原根g,求出指标

// K  I(x) = I(A) (mod P-1)

// 有解的条件 gcd(  I(x), P-1 ) | I(A)

void  discrete_root(int K, int A, int P, vector<int> &x)

{

x.clear();

if (A == 0) { x.push_back(0); return ; }

int g = primitive_root(P);

int IA = discrete_log(g, A, P);

int Ix, delta;

if (!line_mod_equ(K, IA, P-1, Ix, delta))  return ;

while (Ix < P)

{

x.push_back( pow_mod(g, Ix, P) );

Ix += delta;

}

sort(x.begin(), x.end());

x.erase(unique(x.begin(), x.end()),  x.end());

}

int  main()

{

int P, K, A;

scanf("%d%d%d", &P, &K,  &A);

static vector<int> x;

discrete_root(K, A, P, x);

printf("%u\n", x.size());

for (int i = 0; i < (int) x.size(); ++  i) printf("%d\n", x[i]);

return 0;

}


2016-09-06 20:59:38

转载于:https://www.cnblogs.com/Konjakmoyu/p/5847136.html

相关文章:

互联网产品评论索引

这里收集一些评论文章&#xff0c;定期查看文章观点的正确性&#xff0c;索引持续更新中 网站前期如何获得推广资源 专访陶瑾&#xff1a;微信公众平台开发先行者转载于:https://www.cnblogs.com/needrunning/p/3000353.html

Apache服务器部署(1)

apache&#xff08;web服务器&#xff09;简介&#xff1a; Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充&…

JavaScript关键字this指向

在js中this始终指向一个调用函数的那个对象 var a有种你干掉我啊; //纯粹调用函数 function test(){ console.log(this.a);//默认指向全局对象 } //test();//>windows.test() //作为对象的方法被调用 Function.prototype.logfunction(){ console.log(this.a); } //此时t为一…

项目开发过程中的收获与思考

2013年7月&#xff0c;我正式毕业了&#xff0c;到公司入职&#xff0c;也就正式成为了一名菜鸟程序员。到今天&#xff0c;2014年1月3日&#xff0c;目前主要的工作是公司一个项目中的一个功能模块&#xff0c;到我进入项目组算起&#xff0c;已经过了四个月了。因此&#xff…

【仿汽车之家】价格区间选择控件

仿照汽车之家iOS客户端“找车”栏目的价格区间选择控件&#xff0c;最终实现效果如下&#xff1a; 一、界面实现 *根据屏幕大小以及刻度的大小&#xff0c;宏定义需要用到的一些值 #define SCREENW [UIScreen mainScreen].bounds.size.width #define SCREENH [UIScreen mainScr…

Apache服务器部署(2)

签名CA证书 环境&#xff1a;server1:172.25.1.1 重置虚拟机 挂载yum源 [rootserver1 ~]# yum install mod_ssl -y //下载ssl模块 [rootserver1 ~]# yum install crypto-utils -y //安装加密软件 [rootserver1 ~]# genkey …

ASCII、Unicode、GBK和UTF-8字符编码的区别联系

一直对编码这块晕晕乎乎&#xff0c;今天终于看到一篇写的很清楚也很风趣的文章&#xff0c;转过来mark一下。 很久很久以前&#xff0c;有一群人&#xff0c;他们决定用8个可以开合的晶体管来组合成不同的状态&#xff0c;以表示世界上的万物。他们看到8个开关状态是好的&…

【iOS】快速集成轮播控件

自己写的一个轮播控件&#xff0c;初始化后只要实现两个数据源方法&#xff0c;几行代码就能快速集成&#xff0c;支持本地图片和网络图片&#xff0c;支持点击事件&#xff0c;可定制播放速度、指示器颜色/位置、默认加载图等&#xff0c;效果&#xff1a; 1.下载地址&#xf…

Hibernate中get方法和load方法的区别

一、get和load方法都是根据id去获得对应数据的&#xff0c;但是获得机制不同&#xff1a;如果使用get方法&#xff0c;hibernate会去确认该id对应的数据是否存在&#xff0c;它首先会去session中去查询(session缓存其实就hibernate的一级缓存)&#xff0c;如果没有&#xff0c;…

DNS高速缓存

DNS相关资料&#xff1a; 1.什么是DNS DNS&#xff08;Domain Name System域名系统&#xff09; 是互联网上存储域名和ip映射关系的一个分布式数据库&#xff0c;它负责把域名转换成ip地址&#xff0c;或ip地址转换为域名。DNS运行于TCP/UDP的53端口上。 2.什么是高速…

将时间改为显示:几天前,几小时前,或者几分钟前

&#xff08;原博客地址&#xff1a;http://blog.csdn.net/kenhins/article/details/38010811&#xff09; 方法一&#xff1a; 个人做法是保存时间戳&#xff0c;然后在前端用jq插件做转换&#xff0c;比如 smart-time-ago ----------------------------------------------- 方…

支持placeholder和自适配高度的TextView控件

一.应用于项目的效果如下&#xff1a; 二.使用方法&#xff1a; 1.导入JXTextView.h头文件 2.初始化,并添加到view中&#xff1a; JXTextView *textView [[JXTextView alloc] initWithFrame:CGRectMake(10, 10, 200, 30)];textView.placeholder "请输入内容";tex…

ZOJ 3735 dp

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode3735 好久没做DP题了&#xff0c;一开始没理解题目里的C(M,3)是干什么&#xff0c;原来就是组合&#xff0c;C M 取3&#xff0c;就等于n*&#xff08;n-1&#xff09;*&#xff08;n-2&#xff09;/6;题目里还有…

haproxy实现高可用及负载均衡

Haproxy简介&#xff1a; Haproxy是一个使用c语言编写的自由开发源代码软件&#xff0c;它提供高可用性、负载均衡、以及基于http和tcp的应用程序代理。Haproxy特别使用于那些负载特别大的web站点。Haproxy运行在当前的硬件上&#xff0c;完全可以支持数以万计的并发连接&#…

Apache转发到Tomcat

#vi /etc/httpd/conf/httpd.conf 添加下面配置 NameVirtualHost *:80 <VirtualHost *:80>ProxyPreserveHost OnServerName www.域名.comProxyPass / http://www.域名.com:8080/system/ErrorLog logs/error_logCustomLog logs/access_log common</VirtualHost> 作者…

.net基础问题

string sqlstr "select BranchCode,BranchName from t_sys_Branch where Jglx_DataDm{0} and IsVisible1"; sqlstr string.Format(sqlstr, departType); 上述代码运行之后 sqlstr"select BranchCode,BranchName from t_sys_Branch where Jglx_DataDmdepartTyp…

【iOS】NSDate分类,获得中国农历

1.说明&#xff1a; 参考网上代码写的一个分类&#xff0c;只需一句代码就可得到NSDate对象所对应的中国农历、星期。 2.使用方法&#xff1a; &#xff08;1&#xff09;导入分类头文件&#xff1a; #import "NSDateChineseDate.h"&#xff08;2&#xff09;NSDat…

LVS_NAT实现负载均衡

简介&#xff1a; 基于NAT机制实现。当用户请求到达director之后&#xff0c;director将请求报文的目标地址(即VIP)改成选定的realserver地址&#xff0c;同时将报文的目标端口也改成选定的realserver的相应端口&#xff0c;最后将报文请求发送到指定的realserver&#xff1b;…

自定义Push和Pop过渡动画

一、效果和源码 本文介绍如何实现一个NavigationController的自定义Push和Pop过渡动画&#xff0c;运行效果如下&#xff1a; 源码&#xff1a;https://github.com/dolacmeng/TransitionDemo 或http://download.csdn.net/detail/dolacmeng/9572384二、准备工作 首先&#xff0…

centos 安装 mysql 5.7

一&#xff0c;wget http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm 二&#xff0c;yum localinstall mysql57-community-release-el6-8.noarch.rpm 三&#xff0c;yum install mysql-server 四&#xff0c;mysqld --initialize --usermysql 五&#xf…

c语言:婚礼上的谎言

/* 三对新人参加婚礼&#xff0c;三位新郎A,B,C,三位新娘X,Y,Z。 有人想知道谁与谁结婚&#xff0c;于是就问他们&#xff1a; A说他将和X结婚&#xff1b; X说他的未婚夫是C&#xff1b; C说他将和Z结婚。 这人时候知道他们都在说谎。编程求谁与谁结婚&#xff01; */ /* 思路…

redis主从复制、高可用和集群

redis简介&#xff1a; redis是一个key-value存储系统.和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs&#xff08;哈希类型&#xff09;;这些数据类型都支持push/pop、…

对学习编译原理的看法

我认为编译原理这本书是一门与代码做斗争的课程&#xff0c;学习编译原理能够追寻程序设计语言的本质&#xff0c;了解计算机各种语言编译的原理。学习了编译原理能够更加深入的了解计算机各种高级语言使用的原理&#xff0c;能使自己更加容易更加好的学习好程序语言&#xff0…

iOS提示气泡,带动画

1.效果如图&#xff1a; 从项目中抠出来的&#xff0c;做了简单的封装。 2.用法&#xff1a; //顶部提示HYNoticeView *noticeTop [[HYNoticeView alloc] initWithFrame:CGRectMake(50, 66, 250, 40) text:"这里可以查询全城婚礼人的档期哦&#xff01;" position:…

GIt/Github常用命令

1&#xff09;git init:初始化本地仓库 2&#xff09;创建文件&#xff1a;touch read.txt 3&#xff09;当操作本地的文件时&#xff0c;使用常用的命令&#xff0c;如&#xff08;mv&#xff0c;ls。。&#xff09;就可以操作&#xff0c;当操作暂存区的文件时需要在命令前家…

python练习题(python之“求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数” 等)

实验环境&#xff1a;python2.7 题目1&#xff1a;python之“求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数”程序&#xff1a; import math def factorial(n): #定义一个函数&#xff0c;返回一个数的阶乘 if n0: return 1 else: sumn*factorial(n-…

【动画1】UIView动画

讲一下动画。将分为以下5篇博客。 一&#xff09;UIView动画 二&#xff09;Layer动画 三&#xff09;3D动画 四&#xff09;转场动画 五&#xff09;第三方动画框架 相关代码&#xff1a;https://github.com/dolacmeng/AnimationDemo 参考资料&#xff1a;iOS Animation…

【python】解压文件

参考&#xff1a;http://essen.iteye.com/blog/1941489 tarfile模块 具体使用方法&#xff1a; https://docs.python.org/2/library/tarfile.html 例子&#xff1a;一次性解压所有文件 import tarfilet tarfile.open("abc.tgz", "r:gz")t.extractall(path…

JS设计模式——3.封装与信息隐藏

封装、信息隐藏与接口的关系 信息隐藏是目的&#xff0c;封装是手段。 接口提供了一份记载着可供公共访问的方法的契约。它定义了两个对象间可以具有的关系。只要接口不变&#xff0c;这个关系的双方都是可以替换的。 一个理想的软件系统应该为所有类定义接口。 创建对象的基本…

nginx源码编译、负载均衡及模块的扩展

1、nginx源码编译 实验环境&#xff1a; iptables和selinux关闭 redhat6.5 nginx&#xff1a;test1: 172.25.1.11 [roottest1 ~]# ls nginx-1.14.0.tar.gz [roottest1 ~]# tar zxf nginx-1.14.0.tar.gz [roottest1 ~]# useradd -s /sbin/nologin nginx [roottest1 ~]# i…