首页 > 其他分享 >数论学习笔记

数论学习笔记

时间:2023-12-15 17:25:19浏览次数:24  
标签:phi 数论 dfrac biggl 笔记 times 学习 pmod equiv

数论分块

求 \(\sum f(i)g(\biggl\lfloor \dfrac{n}{i} \biggr\rfloor)\),并且 \(f(i)\) 的前缀和可以快速计算。

发现 \(\biggl\lfloor \dfrac{n}{i} \biggr\rfloor\) 的取值只有根号种,暴力做就完事了。

问题是已知 \(l\),怎么求出最大的 \(r\) 满足 \(\biggl\lfloor \dfrac{n}{l} \biggr\rfloor=\biggl\lfloor \dfrac{n}{r} \biggr\rfloor\) 呢?

推一推柿子,\(r=\biggl\lfloor\dfrac{n}{\biggl\lfloor\dfrac{n}{l}\biggr\rfloor}\biggr\rfloor\)。

做完了。

原根

本节的所有定义都是在模 \(p\) 意义下的。

如果 \(\gcd(a,p)=1\),那么我们定义 \(a\) 的阶为最小的 \(l\) 满足 \(a^l \equiv 1 \pmod p\),记为 \(\text{ord}_p a =l\)。

有一些性质:

  • \(\text{ord}_p a | \phi(p)\)。

  • \(a^l \equiv a^{l \bmod \text{ord}_p a} \pmod p\)。

  • 若 \(a^l \equiv 1 \pmod p\),则 \(l \equiv 0 \pmod {\text{ord}_p a}\)。

对于某个原根 \(g\),它满足 \(\text{ord}_p g=\phi(p)\)。

于是可以得到,\(\forall b,\gcd(b,p)=1\),\(b=g^x\),又因为这个性质,所以我们只要找出最小原根 \(g\) 就能求出所有原根。

有结论:形如 \(2,4,p^k,2 \times p^k\)(\(p\) 为奇素数,\(k\) 为正整数)的数有原根。

如何求最小原根?

从小到大枚举,最小原根不会超过 \(n^{0.25}\)(不会证明)。

暴力 \(\rm check\) 是 \(\mathcal O(n)\) 的,设 \(\phi(n)=\prod p_i^{a_i}\),我们可以只检验 \(\dfrac{\phi(n)}{p_i}\)。

杜教筛

求 \(\phi(i)\),\(\phi(i) \times i\),\(\phi(i) \times i^2\),\(\mu(i)\) 等积性函数的前缀和。

假设我们要求函数 \(f\) 的前缀和,设 \(S(n)=\sum_{i=1}^n f(i)\)。那么我们需要寻找另一个积性函数 \(g\),得到一个柿子:

\[g(1)S(n)=\sum_{i=1}^n (f*g)(i)-\sum_{i=2}^n g(i)S(\biggl\lfloor \dfrac{n}{i} \biggr\rfloor) \]

也就是说,如果我们能快速求出 \(f\) 和 \(g\) 的狄利克雷卷积前缀和以及 \(g\) 的前缀和,那么我们就能快速求出 \(f\) 的前缀和。

如果直接做是 \(\mathcal O(n^{\frac{3}{4}})\) 的,若能线性筛筛出前 \(n^{\frac{2}{3}}\) 个 \(f(i)\) 的话,可以优化到 \(\mathcal O(n^{\frac{2}{3}})\)。

杜教筛的关键在于那个柿子以及 \(g\) 的选取。

离散对数

给定一个质数 \(p\),以及一个整数 \(b\),一个整数 \(n\),现在要求你计算一个最小的非负整数 \(l\),满足 \(b^l \equiv n \pmod p\)。

由于 \(b,p\) 互质,\(b\) 有逆元,所以可以在模意义下乘除 \(b\)。

首先有 \(l=xB-y\),\(b^{xB-y} \equiv n \pmod p\),然后 \(b^{xB} \equiv nb^y \pmod p\)。

取 \(B=\sqrt p\),那么前面的 \(b^{xB}\) 可以暴力跳,后面的 \(nb^y\) 可以暴力预处理。

做完了,时间复杂度 \(\mathcal O(\sqrt p)\)。

求 \(x^A \equiv B \pmod {2k+1}\),\(x \in [0,2k]\) 的 \(x\) 的个数,要求根号复杂度。

首先由于 \({2k+1}\) 并不是质数,很难做。

发现 \({2k+1}=\prod {p_i^{a_i}},p_i \in \text{Prime}\),我们可以解出所有 \(x^A \equiv B \pmod {p_i^{a_i}}\) 方程,然后原方程解的个数就是这些方程的解的个数的乘积(由 \(\rm CRT\) 可知)。

考虑一个 \(x^A \equiv B \pmod {p_i^{a_i}}\) 怎么解,设 \(d\) 为最小解,不难发现方程的解一定是 \(x_i=kd\) 的形式(一个数满足条件它的倍数一定满足)。

然后先分类讨论一下:

  • \(B \equiv 0 \pmod {p_i^{a_i}}\),此时 \(B=p_i^b\),设 \(d=p_i^{s}\),那么显然有 \(As \ge a_i\),所以 \(s\) 的最小值就是 \(\biggl\lceil \dfrac{a_i}{A} \biggr\rceil\),那么 \(d=p_i^{s}\),解的个数为 \(\frac{{p_i^{a_i}}}{d}=p_i^{a_i-s}\)。

  • \(B \not \equiv 0 \pmod {p_i^{a_i}}\),此时 \(B=p_i^{b} \times q\),显然如果 \(b\) 不是 \(A\) 倍数无解,那么设 \(b=k \times A\),所以得到 \((p_i^k \times y)^A \equiv p_i^{b} \times q \pmod {p_i^{a_i}}\),也就是 \(p_i^b \times y^A \equiv p_i^{b} \times q\pmod {p_i^{a_i}}\)。

    然后就可以等式两边同除 \(p_i^b\)(吗)?

    如果上述成立,那么 \(p_i^b \times y^A \equiv p_i^b \times q \pmod {p_i^{a_i}}\) 的解的个数等价于 \(y^A \equiv q \pmod {p_i^{a_i-b}}\) 的解的个数,但是我们发现出问题了,原方程的解的个数应该是放缩后方程的解的个数的 \(p_i^{b-k}\) 倍,因为原来 \(y\) 的范围是 \([0,p_i^{a_i-k})\),但是后面变成了 \([0,p_i^{a_i-b})\),范围缩小到原来的 \(p_i^{b-k}\),解数自然也缩小到原方程的 \(p_i^{b-k}\)。

    问题转化为求方程 \(y^A \equiv q \pmod {p_i^{a_i}}\) 的解的个数,显然 \(\gcd(p_i,q)=1\),设 \(p_i\) 的原根为 \(g\),那么有 \(p_i=g^{kp}\),\(y=g^{ky}\)。

    \(kp\) 和 \(ky\) 可以 \(\rm BSGS\) 直接来。

    然后就变成了 \(g^{ky \times A} \equiv g^{kp} \pmod {p_i^{a_i}}\),然后有 \(ky \times A \equiv kp \pmod {\phi({p_i^{a_i}})}\)。

    此时只要求出这个同余方程的解数即可,不难发现该方程的解与原方程的解一一对应。

    而这个同余方程若有解,解数必然为 \(\gcd(\phi({p_i^{a_i}}),A)\)。

然后这题就做完了,复杂度瓶颈在于 \(\rm BSGS\)。

标签:phi,数论,dfrac,biggl,笔记,times,学习,pmod,equiv
From: https://www.cnblogs.com/tx-lcy/p/17903482.html

相关文章

  • 秦疆的Java课程笔记:72 面向对象 instanceof和类型转换
    instanceof关键字,用于判断左边的实例对象是否是右边的类的实例。先创建4个类,父类Person,其子类Student和Teacher,测试类Application。在Application中测试instanceof语句://父类publicclassPerson{}//子类publicclassTeacherextendsPerson{}//子类publicclassStud......
  • 秦疆的Java课程笔记:71 面向对象 什么是多态
    多态即同一方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。(指向父类或者有关系的类。)//父类=======================================publicclassPerson{}//子类=================================......
  • c++ 学习
     c++中常用的class:在C++中,有一些常用的标准库类和一些常见的自定义类,它们提供了各种功能,从容器和算法到文件处理和输入/输出。以下是一些在C++中常用的类:###标准库类:1.**std::string:**-用于处理字符串的类,提供了许多字符串操作的方法。2.**std::vector:**-动态......
  • [最优化方法笔记] 梯度下降法
    1.梯度下降法无约束最优化问题一般可以概括为:\[\min_{x\in\mathbb{R}^n}f(x)\]通过不断迭代到达最优点\(x^*\),迭代过程为:\[x^{k+1}=x^k+\alpha_kd^k\]其中\(d^k\)为当前的搜索方向,\(\alpha_k\)为当前沿着搜索方向的步长。我们需要寻找可以不断使得\(f(x^{......
  • 《Java编程思想第四版》学习笔记47--关于handleEvent
    (4)增加可以被handleEvent()方法测试事件的组件到练习3中。过载handleEvent()并在文字字段中为每个组件显示特定的消息。                                                ......
  • 机器学习的里程碑:从基础理论到大语言模型的进步
     在人工智能的迅猛发展中,大语言模型和传统机器学习是不同发展阶段下的产物。大语言模型,如广为人知的GPT系列和BERT,主要依赖于复杂的神经网络结构,它们能够处理和生成人类语言,为自然语言处理带来了革命性的变化。这些模型的发展标志着从简单的任务特定模型向更通用、更灵活的解决......
  • 鸢尾花yuan 训练学习 - xedu
            #coding:utf-8fromMMEduimportMMDetectionasdetdefgenerated_train():model=det(backbone='Yolov3')model.num_classes=3model.load_dataset(path=r'D:\XEdu\datasets\mmedu_det\hand_gray')m......
  • Power BI - 5分钟学习增加索引列
    每天5分钟,今天介绍PowerBI增加索引列。什么是增加索引列?增加索引列就是向表中添加一个具有显式位置值的新列,一般从0或者从1开始。举例:首先,导入一张【Sales】样例表(Excel数据源导入请参考每天5分钟第一天)。操作步骤:1,【Home】->【Transformdata】->【Transformdata】;......
  • 【graphviz笔记】用graphviz画UML类图
    digraphUMLClassDiagram{//指定节点类型,这样节点才会变成UML的类图矩形node[shape=record,fontname="Arial"];//定义节点数据//其中“|”会渲染成横线;//\l表示向左对齐,同时换行//\n表示居中对齐,同时换行class1[label="{ Class1 | +attribute1:type\l +me......
  • 12 15学习内容
    今天做软件需求分析课堂测试十一 绘制系统工作上下范围图:前面的一些内容都是概括问题啥的,没啥用。主要就是看用户期望那部分:大体可以分为系统外部(外包人员,发包人员,接包人员与系统的联系)和系统分内之事。系统工作上下范围图: 绘制系统业务流程图: 然后文档明显没有给出实......