费马大定理与费马小定理

费马大定理

费马大定理,又被称为“费马最后的定理”,由17世纪法国数学家皮耶·德·费玛提出。
他断言当整数n >2时,关于x, y, z的方程 xn + yn = zn 没有正整数解。
德国佛尔夫斯克曾宣布以10万马克作为奖金奖给在他逝世后一百年内,第一个证明该定理的人,吸引了不少人尝试并递交他们的“证明”。
被提出后,经历多人猜想辩证,历经三百多年的历史,最终在1995年被英国数学家安德鲁·怀尔斯彻底证明。

证明过程:
过于麻烦,请自己百度。

推荐例题
hdu6441:
地址:http://acm.hdu.edu.cn/showproblem.php?pid=6441

题意:对于xn + yn = zn这个式子给出x和n,问你y和z的值。

解题思路:
由费马大定理知道,当n>2的时候,是没有正整数解的。又当n=0时,也是无解的,所以直接输出-1,-1。
当n=1时,只要输出 1 和 x+1就行了。
当n=2时,式子变为了x2 + y2 = z2,进行变换后得到,x2 = z2 - y2 => x2 = (z-y)(z+y),又容易得到z+y一定大于z-y,所以找到x2的两个约数,让z+y等于大的,z-y等于小的。我们又看到联立方程组后 得到:2z = 大的约数+小的约数。 为了让z为整数,两约数之和必须为偶数。

AC代码:

#include 
#include 

typedef long long ll;

using namespace std;

int main()
{
	int t;
	
	cin >> t;
	
	while (t--)
	{
		ll n, a;
		
		scanf("%lld %lld", &n, &a);
		
		if (n > 2 || n == 0)
		{
			printf("-1 -1\n");
		}
		else if (n == 1)
		{
			printf("1 %lld\n", a+1);
		}
		else
		{
			ll b = 0, c = 0;
			ll d = pow(a, 2);
			
			for (int i=1; i<=sqrt(d); i++)
			{
				if (d % i == 0 && (i+d/i)%2 == 0)
				{
					c = (i+d/i)/2;
					b = i>d/i ? (i-c):(d/i-c);
					
					printf("%lld %lld\n", b, c);
					break;
				}
			}
		}
	}
	
	return 0;
}

费马小定理

费马小定理(Fermat’s little theorem)是数论中的一个重要定理,在1636年提出。如果p是一个质数,而整数a不是p的倍数,则有a(p-1)≡1(mod p)。

推荐例题:
hdu6440
地址:http://acm.hdu.edu.cn/showproblem.php?pid=6440

题意:给你一个数字p,让你打印出符合(m+n)p=mp+np的加法表和乘法表。

解题思路:由费马小定理知道 a(p-1)≡1(mod p),又由题意我们看到ap = ap-1a,因此我们得到 ap≡a(mod p)。设a等于m+n的话,得到(m+n)p = (m+n) mod p。对于mp+np,如果对其模p得到(mp mod p + np mod p)mod p,由上面定理的到(m+n) mod p。因此可得出:
(m+n)p = (m+n) mod p = mp+np ,对于加法表我们推理出来了,乘法表只要把(m
n)看作a就行了。
AC代码:

#include 

using namespace std;

int main()
{
	int t;
	
	cin >> t;
	
	while (t--)
	{
		int p;
		
		cin >> p;
		
		for (int i=0; i

你可能感兴趣的:(笔记)