数论基础的补充讲解

数论基础的补充讲解

整除的一些性质:

(1)能被2整除的数,个位上的数都能被2整除

(2*)能被4整除的数,个位和十位所组成的两位数能被4整除

(3*)能被8整除的数,百位、十位和个位所组成的三位数能被8整除

(4)能被5整除的数,末尾是05

(5*)能被25整除的数,十位和个位所组成的两位数能被25整除

(6*)能被125整除的数,百位、十位和个位所组成的三位数能被125整除

(7)能被3整除的数,各个数位上的数字之和能被3整除

(8*)能被9整除的数,各个数位上的数字和能被 9 整除

(9)如果一个数既能被 2 整除又能被 3 整除,那么这个数能被 6 整除

(10)如果一个数既能被 2 整除又能被 5 整除,那么这个数能被 10 整除(即个位为0

(11*)能被 11 整除的数,奇数位(从左往右数)上的数字和与偶数位上的数字和的差(大数减小数)能被 11 整除

 

小数的GCD:

eps控制精度,fmodC++的库函数,运算浮点数的mod运算。

 

拓展欧几里得:

Ps:关于欧几里得和拓展欧几里得可以参考我的另外一篇博文《欧几里得 & 拓展欧几里得算法 讲解 (Euclid & Extend- Euclid Algorithm)

1求解不定方程:

所谓不定方程,即未知数的个数多于方程个数,且未知数受到某些限制(如要求是有理数、整数或正整数等等)的方程或方程组。

3x-4y==6,方程只有一个,但是解却可以有多个。

求解不定方程的一组解,或者判断不定方程是否有解,扩展欧几里得就可以派上用场了。   

(2)求解模线性方程(线性同余方程):

求解ax≡b(mod p),未知数x的最小解。   

(3)求解模的逆元:     
同余方程ax≡b(mod n),如果gcd(a,n)==1,则方程只有唯一解。在这种情况下,如果b==1,同余方程就是ax  1(mod n),gcd(a,n)=1这时称求出的x为a的对模n乘法的逆元。
PS:关于逆元,有一个蛮有用的性质:    

设p为素数,(a/b)% p = a * b^(p-2) % p ,这样就可以将除法处理为乘法。

素数:

 定义

  素数是大于1的正整数,并且除了1和其本身不能被其他的正整数整除。

  非素数称为合数。

 素数的 eratosthenes 筛法

   筛法是数论中一个比较重要的算法,在O(sqrt(N))的时间内获得N以内所有的素数。


   所谓筛法,就是每次筛去一部分数。如图,起始所有的数都标记为素数,遇到2时,将所有2的倍数标记为合数,以此类推下去,剩下的都是素数了。

   

该算法适用于较小的MAXN,对于较大的MAXN,内存无法开如此大的空间。

 区间素数

  获得[L , U]区间的素数,LU很大,但是U-L不是很大。

  首先线性筛出1sqrt(2147483647)之间所有的素数(2147483647是啥?自个儿猜去~),然后再通过已经晒好素数筛出给定区间的素数。

算是模板吧,此处不贴代码~

素数判定

 试除法

   就是大家都会的简单算法,用小于该数的所有素数去试除,若都无法整除,则为素数,复杂度O(sqrt(N)).

 Miller-Robin随机素性测试

   关于Miller-Robin算法,可以另劈一章进行讲解,因而此处只做简略介绍。

   Miller-Rober 带有随机性,可能测出伪素数,概率为1/(2^s),一般 s  20 左右,

   因而失误概率很低,适用于大数素性判断。

   关于Miller-Robin的时间复杂度,最坏为(1+O(1))*log2(N)Miller- Rabin算法的性能是很好的。在实际应用中,Miller-Rabin的实际执行速度也很快。

唯一分解理论

定义:自然数N皆可以表示为素数之积

一些结论:

①、N的约数个数,为(x1+1)*(x2+1)*……*(xm+1)

分解质因子

普通的分解质因数

   对n进行分解质因子,将分解的因子存入数组facs中,长度为cnt

   先找一个最小的质数k

   若该质数等于n,则分解质因子的过程已经结束;

   若n>k,且k|n,则记录kn/=k,然后继续寻找;

   若n不能被k整除,k+=2,继续寻找。

Pollard_rho因数分解

   适用于大数的分解质因子,返回的质因子无序。

欧拉函数

中国剩余定理

 

参考资料:

①、东北师范大学数论基础讲解


<think>嗯,用户想学习Java算法设计与分析,包括数据结构、进阶知识、数论、图论和实战案例。首先,我需要确定用户的基础水平,可能已经有一定的Java和数据结构基础,现在想深入进阶内容。接下来,要覆盖他提到的各个模块,确保每个部分都有足够的理论和实践内容。 数据结构部分,用户可能已经了解基础结构如数组、链表,但进阶可能需要讲平衡树、图的高级表示。Java集合框架的TreeMap和TreeSet使用了红黑树,这个可以结合来讲。哈希表部分,可以深入讨论冲突解决和性能优化,比如双重哈希或动态扩容机制。 算法设计方面,分治、动态规划、贪心算法这些经典方法需要详细讲解。动态规划的例子像背包问题、最长公共子序列比较典型,最好有代码示例。回溯算法如八皇后问题,数独求解,这些实战案例能帮助用户理解应用场景。 数论和图论是数学基础较强的部分,需要结合Java实现。比如质数筛法、模运算应用,图论中的最短路径算法(Dijkstra、Floyd-Warshall)、最小生成树(Prim、Kruskal)。这部分可能需要数学模型和公式的支持,比如Dijkstra的松弛操作公式。 实战案例部分,应该选择综合性强的项目,比如社交网络分析,可以结合图论算法;加密算法涉及数论知识。同时,引用中提到的Java数据结构与算法项目实战有排序、查找等实现,可以推荐用户参考这些资料进行练习。 另外,用户提供的引用资料[1]到[4]提到Java数据结构的内部原理和算法效率分析,这些内容需要整合到各部分讲解中,强调算法的时间复杂度和空间复杂度分析。例如,在讲解快速排序时,引用[1]中的排序算法部分可以作为性能分析的参考。 可能用户的需求不仅仅是理论,更关注如何用Java实现,所以每个知识点都需要提供代码示例,比如动态规划用Java编写,图论算法用邻接表或矩阵实现。同时,测试用例和性能测试的方法也很重要,引用[2]中提到学生通过编写测试用例来加深理解,这点可以推荐给用户作为学习方法。 最后,考虑用户可能需要项目实战经验,建议他们参与开源项目或自己实现经典算法,如引用[4]中的Java代码示例。这样能提升编程和问题解决能力,符合用户提到的实战案例需求。 需要确保回答结构清晰,分模块讲解,每个部分有核心概念、Java实现和实战案例。同时,生成的相关问题要覆盖用户可能感兴趣的深入话题,比如算法优化、具体应用场景等。</think>我将根据您的要求,分模块系统化讲解Java算法设计与分析的核心内容,结合代码示例和实战案例。 ### 一、数据结构进阶(Java实现) 1. **平衡树结构** - 红黑树实现:Java的`TreeMap`内部采用红黑树结构 ```java TreeMap<Integer, String> map = new TreeMap<>(); map.put(3, "Red-Black"); map.put(1, "Tree"); System.out.println(map.firstKey()); // 输出1 ``` 2. **图的高级表示** - 邻接表实现(空间复杂度$O(V+E)$) ```java List<List<Integer>> adjList = new ArrayList<>(); adjList.add(Arrays.asList(1, 2)); // 节点0的邻居 adjList.add(Arrays.asList(0, 3)); // 节点1的邻居 ``` 3. **哈希冲突优化** - 双重哈希法实现(时间复杂度$O(1)$) ```java int hash1 = key.hashCode(); int hash2 = (key.hashCode() << 5) ^ 0x1fffffff; int index = (hash1 + i*hash2) % capacity; ``` ### 二、算法设计方法论 1. **动态规划** - 背包问题解法(时间复杂度$O(nW)$) $$ dp[i][w] = \max(dp[i-1][w], dp[i-1][w-w_i] + v_i) $$ 2. **回溯算法** - 八皇后问题实现 ```java void backtrack(int row, int[] queens) { if(row == n) recordSolution(); for(int col=0; col<n; col++){ if(isValid(queens, row, col)){ queens[row] = col; backtrack(row+1, queens); } } } ``` ### 三、数论核心算法 1. **质数筛法** - 埃拉托斯特尼筛法(时间复杂度$O(n\log\log n)$) ```java boolean[] sieve(int n) { boolean[] isPrime = new boolean[n+1]; Arrays.fill(isPrime, true); for(int i=2; i*i<=n; i++) if(isPrime[i]) for(int j=i*i; j<=n; j+=i) isPrime[j] = false; return isPrime; } ``` 2. **模运算应用** - 快速幂算法(时间复杂度$O(\log n)$) ```java int fastPow(int base, int exp, int mod) { int res = 1; while(exp > 0) { if((exp & 1) == 1) res = (res * base) % mod; base = (base * base) % mod; exp >>= 1; } return res; } ``` ### 四、图论实战案例 1. **最短路径算法** - Dijkstra算法实现(时间复杂度$O((V+E)\log V)$) ```java PriorityQueue<Node> pq = new PriorityQueue<>(); int[] dist = new int[n]; Arrays.fill(dist, Integer.MAX_VALUE); dist[src] = 0; pq.add(new Node(src, 0)); while(!pq.isEmpty()) { Node u = pq.poll(); for(Edge e : adj.get(u.id)) { if(dist[e.to] > dist[u.id] + e.weight) { dist[e.to] = dist[u.id] + e.weight; pq.add(new Node(e.to, dist[e.to])); } } } ``` ### 五、项目实战建议 1. **算法可视化工具开发** - 实现排序算法动画演示 - 构建图遍历可视化界面 2. **竞赛题目实战** - LeetCode 329(矩阵最长递增路径) - Codeforces 1353E(动态规划+字符串处理) 3. **工程化应用** - 使用红黑树实现实时排行榜 - 应用图算法进行社交网络分析 推荐学习路径: 1. 先掌握《算法导论》中的基础数学模型 2. 结合《Java数据结构与算法实战教程》进行代码实现[^1] 3. 通过《Java数据结构与算法项目实战》完成完整项目训练[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值