1
0
mirror of https://github.com/exaloop/codon.git synced 2025-06-03 15:03:52 +08:00
codon/stdlib/numpy/random/logfactorial.codon
A. R. Shajii b8c1eeed36
2025 updates (#619)
* 2025 updates

* Update ci.yml
2025-01-29 15:41:43 -05:00

20 lines
3.8 KiB
Python

# Copyright (C) 2022-2025 Exaloop Inc. <https://exaloop.io>
from ..util import log
@pure
@llvm
def logfact(idx: int) -> float:
@data = private unnamed_addr constant [126 x double] [double 0.000000e+00, double 0.000000e+00, double 0x3FE62E42FEFA39EF, double 0x3FFCAB0BFA2A2002, double 0x40096CA77C922CF9, double 0x401326643C4479C9, double 0x401A51273ACF01CA, double 0x40210CE1F32DCC30, double 0x4025358E82FCB70D, double 0x40299A8921A7F7CF, double 0x402E357590954D15, double 0x403180973F3A8D74, double 0x4033FCBA16D50143, double 0x40368D5A9C3B32CE, double 0x403930F3DF162A42, double 0x403BE636A63FD346, double 0x403EABFF061F1A84, double 0x4040C0A63F2F353A, double 0x4042329DF2D5EE52, double 0x4043AB8153363985, double 0x40452AF57AED77BE, double 0x4046B0A8643472A9, double 0x40483C4FABA84F06, double 0x4049CDA78B856A45, double 0x404B6472034E8D14, double 0x404D007622CD65E7, double 0x404EA17F717C6794, double 0x405023AEB67E4FEF, double 0x4050F8F18D330240, double 0x4051D07353917231, double 0x4052AA208B59D0E5, double 0x405385E6FD9E5A40, double 0x405463B59B942084, double 0x4055437C633ACE4A, double 0x4056252C474896BA, double 0x405708B719E11658, double 0x4057EE0F79B26758, double 0x4058D528C1243D96, double 0x4059BDF6F75257A3, double 0x405AA86EC2969812, double 0x405B94855C702BA2, double 0x405C8230869CA105, double 0x405D7166813E12EE, double 0x405E621E01EEBA4F, double 0x405F544E2BA69CF1, double 0x406023F743ADDD9F, double 0x40609E7B7EA41EA9, double 0x406119AFE762626B, double 0x40619590C853A559, double 0x4062121A930C6EC3, double 0x40628F49DDEB1F31, double 0x40630D1B61E86335, double 0x40638B8BF8931DDB, double 0x40640A989A33A6CD, double 0x40648A3E5C12AF19, double 0x40650A7A6EE08711, double 0x40658B4A1D39DA73, double 0x40660CAACA474746, double 0x40668E99F0757979, double 0x406711152043B2C4, double 0x40679419FF26DC59, double 0x406817A6467F6FB9, double 0x40689BB7C2A0AEA1, double 0x4069204C51E7C761, double 0x4069A561E3E1A4BD, double 0x406A2AF6787E4609, double 0x406AB1081F509726, double 0x406B3794F6D9D7AF, double 0x406BBE9B2BDFB621, double 0x406C4618F8CC56F7, double 0x406CCE0CA5179100, double 0x406D567484B8B7B6, double 0x406DDF4EF7A05A70, double 0x406E689A69396BEF, double 0x406EF2554FF15148, double 0x406F7C7E2CC66183, double 0x40700389C56E3462, double 0x40704909FF8B652B, double 0x40708EBF13DBF263, double 0x4070D4A85602B129, double 0x40711AC51DF8932A, double 0x40716114C7E34736, double 0x4071A796B3EDE1AC, double 0x4071EE4A46236D3E, double 0x4072352EE64B46D5, double 0x40727C43FFC72962, double 0x4072C3890172D057, double 0x40730AFD5D851956, double 0x407352A089728F1B, double 0x40739A71FDD14947, double 0x4073E271363E0DF7, double 0x40742A9DB142A36A, double 0x407472F6F03D410C, double 0x4074BB7C77491066, double 0x4075042DCD27AF64, double 0x40754D0A7B2BA658, double 0x407596120D23C4EC, double 0x4075DF4411475A1C, double 0x407628A018233BED, double 0x40767225B4879462, double 0x4076BBD47B7669B6, double 0x407705AC0412D89F, double 0x40774FABE790F7BE, double 0x407799D3C1265C0E, double 0x4077E4232DFB367D, double 0x40782E99CD1C0368, double 0x407879373F6BC4FE, double 0x4078C3FB2796C21C, double 0x40790EE52A05C35F, double 0x407959F4ECD1C8B3, double 0x4079A52A17B831CC, double 0x4079F084540F545E, double 0x407A3C034CBB7B2C, double 0x407A87A6AE24493A, double 0x407AD36E262A7CC0, double 0x407B1F59641E0DB5, double 0x407B6B6818B4A3EB, double 0x407BB799F600610A, double 0x407C03EEAF66FACD, double 0x407C5065F9992226, double 0x407C9CFF8A8A340D, double 0x407CE9BB196830EA, double 0x407D36985E93F7B8, double 0x407D83971399C213, double 0x407DD0B6F329DEA4, double 0x407E1DF7B911A74C], align 16
%p = getelementptr inbounds [126 x double], ptr @data, i64 0, i64 %idx
%x = load double, ptr %p, align 8
ret double %x
def logfactorial(k: int):
halfln2pi = 0.9189385332046728
if k < 126:
return logfact(k)
return (k + 0.5)*log(float(k)) - k + (halfln2pi + (1.0/k)*(1/12.0 - 1/(360.0*k*k)))