数论

Sage对数论有广泛的支持。例如我们可以在$\Zeta/N\Zeta$上进行运算:

  1. sage: R = IntegerModRing(97)
  2. sage: a = R(2) / R(3)
  3. sage: a
  4. 33
  5. sage: a.rational_reconstruction()
  6. 2/3
  7. sage: b = R(47)
  8. sage: b^20052005
  9. 50
  10. sage: b.modulus()
  11. 97
  12. sage: b.is_square()
  13. True

Sage包含标准的数论函数。如:

  1. sage: gcd(515,2005)
  2. 5
  3. sage: factor(2005)
  4. 5 * 401
  5. sage: c = factorial(25); c
  6. 15511210043330985984000000
  7. sage:[valuation(c,p) for p in prime_range(2,23)]
  8. [22, 10, 6, 3, 2, 1, 1, 1]
  9. sage: next_prime(2005)
  10. 2011
  11. sage: previous_prime(2005)
  12. 2003
  13. sage: divisors(28); sum(divisors(28)); 2*28
  14. [1, 2, 4, 7, 14, 28]
  15. 56
  16. 56

完美!

Sage的sigma(n,k)函数求n的所有因子的$k$次幂的和:

  1. sage: sigma(28,0); sigma(28,1); sigma(28,2)
  2. 6
  3. 56
  4. 1050

下面展示的是扩展Euclidean算法,Euler的$\phi$函数和中国剩余定理:

  1. sage: d,u,v = xgcd(12,15)
  2. sage: d == u*12 + v*15
  3. True
  4. sage: n = 2005
  5. sage: inverse_mod(3,n)
  6. 1337
  7. sage: 3 * 1337
  8. 4011
  9. sage: prime_divisors(n)
  10. [5, 401]
  11. sage: phi = n*prod([1 - 1/p for p in prime_divisors(n)]); phi
  12. 1600
  13. sage: euler_phi(n)
  14. 1600
  15. sage: prime_to_m_part(n, 5)
  16. 401

下面验证关于$3n+1$问题的一些内容。

  1. sage: n = 2005
  2. sage: for i in range(1000):
  3. ....: n = 3*odd_part(n) + 1
  4. ....: if odd_part(n)==1:
  5. ....: print i
  6. ....: break
  7. 38

最后我们展示中国剩余定理。

  1. sage: x = crt(2, 1, 3, 5); x
  2. -4
  3. sage: x % 3 # x mod 3 = 2
  4. 2
  5. sage: x % 5 # x mod 5 = 1
  6. 1
  7. sage:[binomial(13,m) for m in range(14)]
  8. [1, 13, 78, 286, 715, 1287, 1716, 1716, 1287, 715, 286, 78, 13, 1]
  9. sage:[binomial(13,m)%2 for m in range(14)]
  10. [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1]
  11. sage:[kronecker(m,13) for m in range(1,13)]
  12. [1, -1, 1, 1, -1, -1, -1, -1, 1, 1, -1, 1]
  13. sage: n = 10000; sum([moebius(m) for m in range(1,n)])
  14. -23
  15. Partitions(4).list()
  16. [[4],[3, 1],[2, 2],[2, 1, 1],[1, 1, 1, 1]]

$p$-adic数

Sage支持$p$-adic数域。注意,一旦建立了一个$p$-adic 数域,就不能再修改它的精度了。

  1. sage: K = Qp(11); K
  2. 11-adic Field with capped relative precision 20
  3. sage: a = K(211/17); a
  4. 4 + 4*11 + 11^2 + 7*11^3 + 9*11^5 + 5*11^6 + 4*11^7 + 8*11^8 + 7*11^9
  5. + 9*11^10 + 3*11^11 + 10*11^12 + 11^13 + 5*11^14 + 6*11^15 + 2*11^16
  6. + 3*11^17 + 11^18 + 7*11^19 + O(11^20)
  7. sage: b = K(3211/11^2); b
  8. 10*11^-2 + 5*11^-1 + 4 + 2*11 + O(11^18)

在$p$-adic域或数域上的整数环的实现工作已经完成了很多。感兴趣的读者可以通过阅读[$p$-adics介绍]或到Ssage-supportGoogle群组上向专家们询问相关细节。

许多相关方法已经在NumberField类中实现了。

  1. sage: R.<x> = PolynomialRing(QQ)
  2. sage: K = NumberField(x^3 + x^2 - 2*x + 8, 'a')
  3. sage: K.integral_basis()
  4. [1, 1/2*a^2 + 1/2*a, a^2]
  1. sage: K.galois_group(type="pari")
  2. Galois group 3T2 (S3) with order 6 of x^3 + x^2 - 2*x + 8
  1. sage: K.polynomial_quotient_ring()
  2. Univariate Quotient Polynomial Ring in a over Rational Field with modulus
  3. x^3 + x^2 - 2*x + 8
  4. sage: K.units()
  5. [3*a^2 + 13*a + 13]
  6. sage: K.discriminant()
  7. -503
  8. sage: K.class_group()
  9. Class group of order 1 with structure of Number Field in a with
  10. defining polynomial x^3 + x^2 - 2*x + 8
  11. sage: K.class_number()
  12. 1