没有合适的资源?快使用搜索试试~ 我知道了~
《算法竞赛中的初等数论》(七)剩余章节(0x70 - 0xA0)1
需积分: 0 1 下载量 16 浏览量
2022-08-03
22:12:52
上传
评论
收藏 1.92MB PDF 举报
温馨提示
试读
22页
引入勒让德符号:表示是否为 的二次剩余, 和表示是与否, 表示的情况。定理定理72.1:定理72.2: 若找到一个 使得, 且则为的解定理72.3: 对于二次同
资源详情
资源评论
资源推荐
0x70 二次剩余
0x71 二次剩余与二次非剩余
定义
对于二次同余方程 有解,则称 为 的二次剩余, 为该二次同余方程的解。
二次剩余 ,就是一个二次项 后的剩余。
当对任意 , 不成立时,称 是模 的二次非剩余。
应用
求 ,若 为 的二次剩余,则 。
即:若该二次同余方程有解,则 可以在模 的意义下开根。
0x72 Cipolla 算法解算法二次同余方程
需要保证模 是奇素数。
引入勒让德符号:
表示 是否为 的二次剩余, 和 表示是与否, 表示 的情况。
定理
定理72.1:
定理72.2: 若找到一个 使得 , 且 则 为
的解
定理72.3: 对于二次同余方程 有 个 使此方程有解
实现
求解方程 。保证 是奇素数。 输入一个 代表数据组数,接下来 行,每
行一个 和一个 。 对于每一行输出:若有解,则按 后递增的顺序输出在
意义下的全部解. 若两解相同,只输出其中一个 若无解,则输出
N
o
S
olution
有了上面的三个定理,现在我们的唯一问题就是如何找到合适的 使得 满足条件,我们考虑随机,
由定理72.3可知, 在模p意义下为非二次剩余的概率为 ,那么这样随机的期望次数就接
近于 ,可以看做是 求。因为在整个过程中使用过快速幂,所以时间复杂度为 。
int
mod
;
ll
I
_
mul
_
I
;
虚数单位的平方
stru
c
t
C
omplex
{
建议自己实现复数
ll
re
a
l
,
im
a
g
;
C
omplex
(
ll
re
a
l
=
0
,
ll
im
a
g
=
0
):
re
a
l
(
re
a
l
),
im
a
g
(
im
a
g
) { }
1
2
3
4
5
};
inline
b
ool
oper
a
tor
(
C
omplex
x
,
C
omplex
y
) {
return
x
.
re
a
l
y
.
re
a
l
a
nd
x
.
im
a
g
y
.
im
a
g
;
}
inline
C
omplex
oper
a
tor
* (
C
omplex
x
,
C
omplex
y
) {
return
C
omplex
((
x
.
re
a
l
*
y
.
re
a
l
+
I
_
mul
_
I
*
x
.
im
a
g
%
mod
*
y
.
im
a
g
)
%
mod
,
(
x
.
im
a
g
*
y
.
re
a
l
+
x
.
re
a
l
*
y
.
im
a
g
)
%
mod
);
}
C
omplex
qpow
(
C
omplex
x
,
int
k
) {
C
omplex
res
=
1
;
while
(
k
) {
if
(
k
&
1
)
res
=
res
*
x
;
x
=
x
*
x
;
k
1
;
}
return
res
;
}
b
ool
c
he
c
k
_
if
_
residue
(
int
x
) {
return
qpow
(
x
, (
mod
-
1
)
1
)
1
;
}
int
solve
(
int
n
,
int
p
) {
n
%=
p
,
mod
=
p
;
if
(
p
2
)
return
n
;
ll
a
=
r
a
nd
()
%
mod
;
if
(
qpow
(
n
,(
mod
-
1
) /
2
)
p
-
1
)
return
-
1
;
不存在
while
(!
a
c
he
c
k
_
if
_
residue
((
a
*
a
+
mod
-
n
)
%
mod
))
a
=
r
a
nd
()
%
mod
;
I
_
mul
_
I
=
(
a
*
a
+
mod
-
n
)
%
mod
;
return
int
(
qpow
(
C
omplex
(
a
,
1
), (
mod
+
1
)
1
).
re
a
l
);
}
int
n
,
m
,
p
,
t
;
int
m
a
in
()
{
sr
a
nd
(
time
(
0
));
s
ca
nf
("
%
d
",
&
t
);
while
(
t
) {
s
ca
nf
("
%
d
%
d
",
&
n
,
&
p
);
int
a
ns
1
=
0
,
a
ns
2
=
0
;
if
(
n
0
) {
puts
("
0
");
c
ontinue
;
}
a
ns
1
=
solve
(
n
,
p
);
if
(
a
ns
1
-
1
)
puts
("
N
o
S
olution
");
else
{
a
ns
2
=
p
-
a
ns
1
;
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
0x80 某些非线性丢番图方程
0x81 毕达哥斯拉三元组(勾股数)
满足 的 三元组称为毕达哥拉斯三元组,当 时,称其为本
原的毕达哥斯拉三元组。
毕达哥拉斯三元组,也称为勾股数。
基本性质定理
引理81.1: 如果 为一个本原毕达哥拉斯三元组,则
。
引理81.2: 设 为一个本原毕达哥拉斯三元组,则 为偶数且 为奇数或者 为奇数, 为
偶数。
引理81.3: 若 和 为正整数,且 , ,则存在整数 ,使得
, 。(两个平方数的乘积还是一个平方数)
由此,我们可以证明得到所有的毕达哥拉斯三元组的解了。
定理81.4: 由正整数 构成的三元组 ,其中 为偶数,那么由他们构成的本原的
毕达哥拉斯三
、 、
元组当且仅当存在
互素的一奇一偶的正整数 ,且 ,满足
、
我们可以看出,本原的毕达哥拉斯三元组中,最大的数一定是奇数。
特别地,由 构成毕达哥拉斯三元组,将
即得
求解 以内本原的毕达哥拉斯三元组个数
根据 ,只要枚举一下 ,然后将三元组乘以 (保证
在范围内),即可求出所有的毕达哥拉斯三元组。
、 ( )
if
(
a
ns
1
>
a
ns
2
)
sw
a
p
(
a
ns
1
,
a
ns
2
);
if
(
a
ns
1
a
ns
2
)
printf
("
%
d
\
n
",
a
ns
1
);
else
printf
("
%
d
%
d
\
n
",
a
ns
1
,
a
ns
2
);
}
}
return
0
;
}
53
54
55
56
57
58
59
Problem A Find Integer (18年CCPC网络赛)
给你两个整数 ,找到整数 ,使 ,其中 组数据,
。
Solution
费马大定理可知, 或 时,不存在正整数解。
当 时我们直接构造即可。当 时,既是一个毕达哥斯拉三元组,按照上述定理求解即
可。
int
x
[
N
],
y
[
N
],
z
[
N
];
int
pyth
a
gor
a
s
(
int
n
) {
int
num
=
0
;
数组下标
int
res
=
0
;
本原三元组的个数
int
m
=
sqrt
(
n
*
1
.
0
);
for
(
int
i
=
1
;
i
m
;
i
+=
2
) {
从
1
开始,每次
+
2
,保证为奇数
for
(
int
j
=
2
;
j
m
;
j
+=
2
) {
从
2
开始,每次
+
2
,保证为偶数
a
=
m
a
x
(
i
,
j
);
大的为
m
b
=
min
(
i
,
j
);
小的为
n
if
(
g
c
d
(
i
,
j
)
1
)
要求
m
,
n
互质
c
ontinue
;
x
[
num
]
=
a
*
a
-
b
*
b
;
y
[
num
]
=
2
*
a
*
b
;
z
[
num
]
=
a
*
a
+
b
*
b
;
num
;
if
((
a
*
a
+
b
*
b
)
n
)
保证在范围内
res
;
}
}
return
res
;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int
m
a
in
() {
int
t
,
a
,
n
;
ll
b
,
c
;
s
ca
nf
("
%
d
",
&
t
);
while
(
t
) {
s
ca
nf
("
%
d
%
d
",
&
n
,
&
a
);
if
(
n
>
2
n
0
)
puts
("-
1
-
1
");
else
if
(
n
1
)
printf
("
1
%
d
",
a
+
1
);
else
{
if
(
a
&
1
) {
c
=
(
a
*
a
+
1
) /
2
;
b
=
c
-
1
;
}
else
{
1
2
3
4
5
6
7
8
9
10
11
12
13
14
0x82 费马大定理
费马大定理:
时, 无正整数解
当 ,对于式子 ( 为任意正整数):
当 为奇数时:
当 为偶数时:
0x83 平方和
费马平方和定理
奇质数能表示为两个平方数之和的充分必要条件是该质数被4除余1。
1.如果两个整数都能表示为两个平方数之和的形式,则他们的积也能表示为两个平方数之和的形式。
2.如果一个能表示为两个平方数之和的整数,能被另一个能表示为两个平方数之和的素数整除,则他们
的商也能表示为两个平方数之和。
即
3.如果 互质,则 的所有因子都可以表示为两个平方数的和
4.任何形如 的素数都能表示为两个平方数之和的形式
拉格朗日四平方和定理
每个正整数都能表示为四个整数的平方和形式。
欧拉恒等式
0x84 佩尔方程与连分数
c
=
(
a
*
a
/
2
+
2
) /
2
;
b
=
c
-
2
;
}
printf
("
%
lld
%
lld
\
n
",
b
,
c
);
}
}
}
15
16
17
18
19
20
21
剩余21页未读,继续阅读
十二.12
- 粉丝: 35
- 资源: 276
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0