计算相对论速度


10

狭义相对论中,移动物体相对于另一个在相反方向移动的物体的速度由以下公式给出:

s=v+ü1个+vü/C2

s = ( v + u ) / ( 1 + v * u / c ^ 2)

在这个公式中,和是物体速度的大小,是光速(大约是,对此非常接近挑战)。vüC3.0×108/s

例如,如果一个对象在移动v = 50,000 m/s,而另一个对象在移动u = 60,000 m/s,则每个对象相对于另一个的速度大约为s = 110,000 m/s。这就是您在伽利略相对论(速度简单地相加)下所期望的。但是,如果v = 50,000,000 m/su = 60,000,000 m/s,则相对速度将约为106,451,613 m/s,这与110,000,000 m/s伽利略相对论所预测的速度明显不同。

挑战

给定两个整数vu使得0 <= v,u < c,计算相对论添加剂速度,使用上面的公式,用c = 300000000。输出必须是十进制值或减少的分数。0.001对于十进制值,输出必须在实际值范围内,对于小数,输出必须在精确值范围内。

测试用例

格式: v, u -> exact fraction (float approximation)

50000, 60000 -> 3300000000000/30000001 (109999.99633333346)
50000000, 60000000 -> 3300000000/31 (106451612.90322581)
20, 30 -> 7500000000000000/150000000000001 (49.999999999999666)
0, 20051 -> 20051 (20051.0)
299999999, 299999999 -> 53999999820000000000000000/179999999400000001 (300000000.0)
20000, 2000000 -> 4545000000000/2250001 (2019999.1022226212)
2000000, 2000000 -> 90000000000/22501 (3999822.2301231055)
1, 500000 -> 90000180000000000/180000000001 (500000.9999972222)
1, 50000000 -> 90000001800000000/1800000001 (50000000.972222224)
200000000, 100000000 -> 2700000000/11 (245454545.45454547)

7
s/velocity/Velocity of an Unladen Swallow/g
mbomb007 '16

1
“伽利略相对论”?也许是盖利良机制,但我会把你的短语称为矛盾(也可能是过时的回顾)。很好的PPCG问题!
Toby Speight

Answers:


6

MATL,9字节

sG3e8/pQ/

在线尝试!

s      % Take array [u, v] implicitly. Compute its sum: u+v
G      % Push [u, v] again
3e8    % Push 3e8
/      % Divide. Gives [u/c, v/c]
p      % Product of array. Gives u*v/c^2
Q      % Add 1
/      % Divide. Display implicitly

11

Mathematica,17个字节

+##/(1+##/9*^16)&

一个未命名的函数,它使用两个整数并返回精确的分数。

说明

这里使用两个漂亮的技巧与参数序列##,这让我避免引用参数的方式uv独立。##扩展为所有参数的序列,有点像“未包装的列表”。这是一个简单的示例:

{x, ##, y}&[u, v]

{x, u, v, y}

任意函数内部的工作原理相同(因为{...}它只是的简写形式List[...]):

f[x, ##, y]&[u, v]

f[x, u, v, y]

现在,我们还可以##交给运算符,就运算符而言,它们将首先将它们视为单个运算数。然后,运算符将展开为完整的形式f[...],然后序列才展开。在这种情况下+##Plus[##]它是Plus[u, v],即我们想要的分子。

另一方面,在分母中##显示为的左手运算符/。原因之所以成倍增加uv是相当微妙的。/根据以下方面实现Times

FullForm[a/b]
(* Times[a, Power[b, -1]] *)

所以当a是时##,它会在之后扩展,最后我们得到

Times[u, v, Power[9*^16, -1]]

在这里,*^它只是Mathematica的科学计数法运算符。


4

果冻,9个字节

÷3ȷ8P‘÷@S

在线尝试!另外,如果您喜欢小数,则可以使用M执行相同的代码

怎么运行的

÷3ȷ8P‘÷@S  Main link. Argument: [u, v]

÷3ȷ8       Divide u and v by 3e8.
    P      Take the product of the quotients, yielding uv ÷ 9e16.
     ‘     Increment, yielding 1 + uv ÷ 9e16.
        S  Sum; yield u + v.
      ÷@   Divide the result to the right by the result to the left.

3

Python3,55 31 29字节

Python非常糟糕,无法按每个输入的需要获取输入,int(input()) 但是无论如何这是我的解决方案:

v,u = int(输入()),int(输入());打印((v + u)/(1 + v * u / 9e16))

感谢@Jakube,我实际上不需要整个程序,只需要函数即可。因此:

lambda u,v:(v+u)/(1+v*u/9e16)

自我解释,获取输入,计算。我使用c ^ 2并简化为9e16比(3e8 ** 2)短。

Python2,42个字节

v,u=input(),input();print(v+u)/(1+v*u/9e16)

感谢@muddyfish


1
如果您使用python2,则可以将放下int(input())并替换为input(),还可以将括号放到print语句的周围
Blue

@Jakube您将如何获得输入?OP说“给出两个整数v和u”
乔治

@Jakube是的,这就是我在其中使用lambda的方式,但是OP隐式地要求整个程序,而不仅仅是一个函数。即它具有输入和输出
乔治

@Jakube很好,在这种情况下我会打低一点。干杯!
乔治,

你可以有lambda u,v:(v+u)/(1+v*u/9e16),这同时适用于Python 2和3
mbomb007

2

J,13 11字节

+%1+9e16%~*

用法

>> f =: +%1+9e16%~*
>> 5e7 f 6e7
<< 1.06452e8

>>STDIN和<<STDOUT 在哪里。


2

Matlab,24个字节

@(u,v)(u+v)/(1+v*u/9e16)

带有两个输入的匿名函数。没什么,只是为了完整性而提交。


我建议您从标题中删除“常规”。如果使用工具箱,则必须提及;因此您可以放心地说“ Matlab”。哦,欢迎来到PPCG!
路易斯·门多


2

Dyalog APL,11个字节

+÷1+9E16÷⍨×

总和的分数和[90四十进制的除法增量与乘积]:

┌─┼───┐         
+ ÷ ┌─┼──────┐  
    1 + ┌────┼──┐
        9E16 ÷⍨ ×

÷⍨是“除数”,如“九十亿除以n ”,即等于n除以九十四千万。


当然是11个字符,而不是字节,因为我敢肯定其中一些符号不是ASCII吗?
Jules

@Jules当然在UTF-8中,但是APL有自己的代码页,比Unicode早几十年。
丹尼斯

2

Haskell,24个字节

作为可以提供浮点数或小数的单个函数,具体取决于使用它的上下文...

r u v=(u+v)/(1+v*u/9e16)

在REPL中的用法示例:

*Main> r 20 30
49.999999999999666
*Main> default (Rational)
*Main> r 20 30 
7500000000000000 % 150000000000001

通过定义u#v而不是来节省两个字节r u v
Zgarb







0

PowerShell,34个字节

param($u,$v)($u+$v)/(1+$v*$u/9e16)

极其简单的实现。但是,由于需要6个,$所以没有希望赶上任何人。


0

Oracle SQL 11.2,39个字节

SELECT (:v+:u)/(1+:v*:u/9e16)FROM DUAL;


0

ForceLang,116个字节

禁止竞争,使用发布挑战后添加的语言功能。

def r io.readnum()
set s set
s u r
s v r
s w u+v
s c 3e8
s u u.mult v.mult c.pow -2
s u 1+u
io.write w.mult u.pow -1


0

dc,21位元组

svddlv+rlv*9/I16^/1+/

假设已经设置了精度,例如使用20k。如果您不能进行此假设,请添加3个字节。

一个更准确的版本是

svdlv+9I16^*dsc*rlv*lc+/

24个字节。

两者都是该公式的忠实复制品,唯一值得注意的高尔夫是9I16^*c² 的使用。


0

PHP,44 45字节

匿名函数,非常简单。

function($v,$u){echo ($v+$u)/(1+$v*$u/9e16);}

3
您需要c^2输入分母...即9e16等价物。
AdmBorkBork

0

其实是12个位元组

;8╤3*ì*πu@Σ/

在线尝试!

说明:

;8╤3*ì*πu@Σ/
;             dupe input
 8╤3*ì*       multiply each element by 1/(3e8)
       πu     product, increment
         @Σ/  sum input, divide sum by product


0

第四(gforth),39个字节

: f 2dup + s>f * s>f 9e16 f/ 1e f+ f/ ;

在线尝试!

代码说明

: f            \ start a new work definition
  2dup +       \ get the sum of u and v
  s>f          \ move to top of floating point stack
  * s>f        \ get the product of u and v and move to top of floating point stack
  9e16 f/      \ divide product by 9e16 (c^2)
  1e f+        \ add 1
  f/           \ divide the sum of u and v by the result
;              \ end word definition
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.