证明<R,·>与<Z,·>不同构
时间: 2023-06-27 13:07:41 浏览: 76
设存在双射 $\phi: \mathbb{R} \rightarrow \mathbb{Z}$,满足 $\phi(a+b) = \phi(a) + \phi(b)$,其中 $a,b \in \mathbb{R}$。
首先,由于 $\phi$ 是双射,因此存在 $r \in \mathbb{R}$,使得 $\phi(r) = 1$。则 $\phi(nr) = n\phi(r) = n$,其中 $n \in \mathbb{Z}$。
又由于 $\mathbb{R}$ 是有理数的代数闭包,因此存在 $s \in \mathbb{R}$,使得 $s^2 = 2$。则 $\phi(s)^2 = \phi(s^2) = \phi(2) = 2$,因此 $\phi(s)$ 必须是 $\mathbb{Z}$ 中的一个平方数,即 $\phi(s) = \pm 1$ 或 $\pm 2$。
考虑 $\phi(\sqrt{2}r)$ 和 $\phi(-\sqrt{2}r)$。由于 $\phi$ 是双射,$\phi(\sqrt{2}r)$ 和 $\phi(-\sqrt{2}r)$ 必须不同,且都是 $\mathbb{Z}$ 中的平方数。但是,$\mathbb{Z}$ 中没有平方数等于 $2$,因此不存在这样的双射 $\phi$,从而证明了 $\langle \mathbb{R}, \cdot \rangle$ 和 $\langle \mathbb{Z}, \cdot \rangle$ 不同构。
相关问题
#include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int N = 10; int n, m; int a[N]; int main() { cout << "请输入结点数:" << endl; while (cin >> n >> m) //输入图1、2的结点数 { if (m != n) { cout << "两图不同构!!!" << endl; continue; } //根据结点数n、m,动态生成两个二维数组来存图(使用邻接矩阵的方式) vector<int> w1(n + 1, 0); vector<vector<int> > g1(n + 1, w1); vector<int> w2(m + 1, 0); vector<vector<int> > g2(m + 1, w2); for (int i = 1; i <= n; i++) a[i] = i; //初始化a数组 for (int i = 1; i <= n; i++) //输入图1的邻接矩阵 for (int j = 1; j <= n; j++) cin >> g1[i][j]; for (int i = 1; i <= m; i++) //输入图2的邻接矩阵 for (int j = 1; j <= m; j++) cin >> g2[i][j]; //全排列 do { bool f = 0; int temp[N][N]; memset(temp, 0, sizeof temp); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { temp[i][j] = g1[a[i]][a[j]]; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (temp[i][j] != g2[i][j]) { f = 1; break; } } if (f == 1) break; } if (f == 0) cout << "两图同构^-^" << endl; } while (next_permutation(a + 1, a + 1 + n)); cout << "两图不同构!!!" << endl; } return 0; }简化的完整代码
这是一个判断两个图是否同构的程序,输入两个图的邻接矩阵,通过枚举两个图的节点的排列顺序,判断它们是否同构。如果是同构的,则输出"两图同构^-^",否则输出"两图不同构!!!"。
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 10;
int n, m;
int a[N];
int main() {
cout << "请输入结点数:" << endl;
while (cin >> n >> m) { //输入图1、2的结点数
if (m != n) {
cout << "两图不同构!!!" << endl;
continue;
}
//根据结点数n、m,动态生成两个二维数组来存图(使用邻接矩阵的方式)
vector<int> w1(n + 1, 0);
vector<vector<int> > g1(n + 1, w1);
vector<int> w2(m + 1, 0);
vector<vector<int> > g2(m + 1, w2);
for (int i = 1; i <= n; i++) a[i] = i; //初始化a数组
for (int i = 1; i <= n; i++) //输入图1的邻接矩阵
for (int j = 1; j <= n; j++)
cin >> g1[i][j];
for (int i = 1; i <= m; i++) //输入图2的邻接矩阵
for (int j = 1; j <= m; j++)
cin >> g2[i][j];
//全排列
do {
bool f = 0;
int temp[N][N];
memset(temp, 0, sizeof temp);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
temp[i][j] = g1[a[i]][a[j]];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (temp[i][j] != g2[i][j]) {
f = 1;
break;
}
}
if (f == 1) break;
}
if (f == 0) cout << "两图同构^-^" << endl;
} while (next_permutation(a + 1, a + 1 + n));
cout << "两图不同构!!!" << endl;
}
return 0;
}
```
给定两个半群U=<S ,*>和V=<T,> f:S→T 是U到V的同构。试证,若z是U的零元,则f(z)是V的 零元
首先,我们需要明确什么是半群的零元。对于半群U=<S ,*>,如果存在元素z∈S,使得对于任何元素a∈S,都有z*a=a*z=a,则称z为U的零元。
同样地,对于半群V=<T ,>,如果存在元素e∈T,使得对于任何元素b∈T,都有e>b=b>e=b,则称e为V的零元。
现在假设z是U的零元,我们需要证明f(z)是V的零元。
首先,由于f是U到V的同构,因此它是一个双射。也就是说,对于任意的s1,s2∈S,如果s1≠s2,则f(s1)≠f(s2)。这意味着f(z)≠e,因为如果f(z)=e,则对于任何元素t∈T,都有f(z) * t = t * f(z) = t * e = t,这与V的零元的定义矛盾。
接下来,我们需要证明f(z)是V的左零元和右零元。首先考虑左零元。对于任何元素b∈T,我们有:
f(z) * b = f(z * f⁻¹(b)) = f(z) * e = f(z)
因此,f(z)是V的左零元。同样地,我们可以证明f(z)是V的右零元:
b * f(z) = f(f⁻¹(b) * z) = e * f(z) = f(z)
因此,f(z)是V的右零元。
综上所述,我们证明了如果z是U的零元,则f(z)是V的零元。