#!/usr/bin/python3.7
# -*- coding: utf-8 -*-
# @Time : 2019/5/17 14:43
# @Author: Jtyoui@qq.com
from jtyoui.error import NotLegitimateNumberError
from jtyoui.file_zip import load_zip
from functools import reduce
import math
[文档]def real_number(value):
"""判断是否是实数"""
if isinstance(value, (int, float)):
return value
elif isinstance(value, str):
return float(value)
elif isinstance(value, complex):
raise TypeError('不支持复数')
else:
raise ValueError('类型错误')
[文档]def sign_function(value):
"""符号函数"""
value = real_number(value)
if value < 0:
return -1
elif value > 0:
return 1
return 0
[文档]def abs_function(value):
"""绝对值函数"""
value = real_number(value)
return abs(value)
[文档]def integral_function(value):
"""取整函数"""
value = real_number(value)
return value // 1
[文档]def dirichlet_function(value):
"""狄利克雷函数:只是简单的判断"""
value = real_number(value)
a, b = value.as_integer_ratio()
if len(str(a)) >= 15 and len(str(b)) >= 15:
return 0
return 1
[文档]def is_prime(n):
"""判断一个数是否为质数"""
if (not isinstance(n, int)) or (n <= 1):
raise NotLegitimateNumberError('不是一个合法的数字')
if n % 2 == 0: # 判断偶数
return False
else:
for i in range(3, int(math.sqrt(n)) + 1, 2): # 判断奇数
if n % i == 0:
return False
return True
[文档]def primes(n):
"""埃拉托斯特尼质数筛法
print(len(list(primes(1_0000_0000)))) # 时间5.5541136264801025秒
10万内:9592
100万内:78498
1000万内:664579
1亿内:5761455
:param n: 表示[0,n]范围的质数
"""
n += 1
ps = [True] * n
total = [2]
half = int(math.sqrt(n))
for index in range(3, half + 1, 2):
if is_prime(index): # 取开平方的质数
ps[index * index: n: index] = [False] * math.ceil((n - index * index) / index)
for y in range(3, n, 2):
if ps[y]:
total.append(y)
return total
[文档]def collatz(n):
"""Collatz猜想:也叫3n+1猜想,给一个正整数,如果是偶数,则减半;如果是奇数,则变为它的三倍加一。直到变为一停止"""
if n > 1 and isinstance(n, int):
total = 0
while n != 1:
if n % 2 == 0:
n /= 2
else:
n = 3 * n + 1
total += 1
else:
raise TypeError('类型错误。必须是大于1的整数')
return total
[文档]def tetrahedron_volume(r1, r2, r3, r4, r5, r6):
"""知道四面体的边求体积,r1-r6都是边"""
R1, R2, R3, R4, R5, R6 = r1 ** 2, r2 ** 2, r3 ** 2, r4 ** 2, r5 ** 2, r6 ** 2
one = R1 * R2 * R4 + R1 * R3 * R6 + R2 * R3 * R5 + R4 * R5 * R6
two = R1 * R2 * R5 + R1 * R2 * R6 + R1 * R3 * R4 + R1 * R3 * R5 + R1 * R4 * R5 + R1 * R5 * R6 + R2 * R3 * R4 + R2 * R3 * R6 + R2 * R4 * R6 + R2 * R5 * R6 + R3 * R4 * R5 + R3 * R4 * R6
three = R1 * R1 * R5 + R1 * R5 * R5 + R2 * R2 * R6 + R2 * R6 * R6 + R3 * R3 * R4 + R3 * R4 * R4
s = two - one - three
v = math.sqrt(s / 144)
return v
[文档]def tetrahedron_volume2(a, b, c, m, n, l):
"""知道四面体的边求体积,a, b, c, m, n, l都是边"""
v = math.sqrt((4.0 * a * a * b * b * c * c - a * a * (b * b + c * c - m * m) * (b * b + c * c - m * m) - b * b * (
c * c + a * a - n * n) * (c * c + a * a - n * n) - c * c * (a * a + b * b - l * l) * (
a * a + b * b - l * l) + (a * a + b * b - l * l) * (b * b + c * c - m * m) * (
c * c + a * a - n * n))) / 12.0
return v
[文档]def factorial(n, number=1):
"""求n的阶乘
当number==1时,表示n!
当number==2时,表示n!!
当number==3时,表示n!!!
...................
:param n: 输入大于1的整数
:param number: 阶乘数
:return: n的number阶乘
"""
return reduce(lambda x, y: x * y, range(1, n + 1, number))
[文档]def pi(n=7):
"""计算PI,能精确到小数点:15万5千6百42位
:param n: 表示精确的小数,n的范围是:0-155640
:return: 返回的是字符串,默认是返回小数点7位
"""
line = load_zip('pi.zip', 'pi.txt')
return line[0][:n + 2]
if __name__ == '__main__':
print(sign_function(123.22))
print(integral_function(25.2))
print(integral_function('-3.1'))
print(dirichlet_function(math.pi))
print(is_prime(915452))
# print(len(primes(1_0000_0000))) # 时间5.5541136264801025秒
print(collatz(27))
print(helen_formula(3, 3, 3))
print(tetrahedron_volume(3, 3, 3, 3, 3, 3))
print(tetrahedron_volume2(3, 3, 3, 3, 3 * math.sqrt(3), 3 * math.sqrt(3)))
print(factorial(5, 2))
print(pi())