Trình tự căn bậc hai


17

Hãy xác định một chuỗi các căn bậc hai nguyên. Đầu tiên, a (1) = 1. Sau đó, a (n) là số nguyên dương nhỏ nhất chưa từng thấy trước đó sao cho

sqrt(a(n) + sqrt(a(n-1) + sqrt(... + sqrt(a(1)))))

là một số nguyên. Vài ví dụ:

a (2) là 3 vì đó là số nguyên nhỏ nhất sqrt(a(2) + sqrt(a(1))) = sqrt(a(2) + 1)là số nguyên và 3 chưa xảy ra trong chuỗi trước đó.

a (3) là 2 vì đó là số nguyên nhỏ nhất sqrt(a(3) + sqrt(a(2) + sqrt(a(1)))) = sqrt(a(3) + 2)là số nguyên và 2 chưa xảy ra trong chuỗi trước đó.

a (4) là 7 vì sqrt(a(4) + 2)là số nguyên. Chúng tôi không thể có (4) = 2 vì 2 đã xảy ra trong chuỗi của chúng tôi.

Viết chương trình hoặc hàm đã cho tham số n trả về một chuỗi các số a (1) cho a (n).

Trình tự bắt đầu 1,3,2,7,6,13,5, ....

Nguồn của chuỗi này là từ câu hỏi Math.SE này .


Một âm mưu của 1000 phần tử đầu tiên trong chuỗi:

âm mưu



1
@ Mr.Xcoder Điều đó chỉ làm cho nó thú vị!
orlp

@ Mr.Xcoder Vâng, tôi đồng ý rằng thật tệ khi bạn không thể sao chép-dán công thức ...
Erik the Outgolfer

2
@EriktheOutgolfer Không. Khi bạn nhận n làm đầu vào, bạn nên trả lại hoặc in danh sách (1) thành a (n). Nói cách khác, n số đầu tiên trong chuỗi. Không có "lập chỉ mục".
orlp

1
Các lỗi gây ra bởi sự thiếu chính xác của dấu phẩy động có thể chấp nhận được đối với các đầu vào rất lớn không?
Zgarb

Câu trả lời:



3

Haskell , 103 87 byte

Không hiệu quả khủng khiếp, nhưng không dựa vào số học dấu phẩy động. Dưới đây a(x) = sqrt(f(x)+a(x-1))là một chuỗi trợ giúp, đơn giản hóa việc tính toán.

a 0=0
a x=[k|k<-[1..],m<-[k^2-a(x-1)],m>0,notElem m$f<$>[1..x-1]]!!0
f x=(a x)^2-a(x-1)

Hãy thử trực tuyến!



3

MATL , 30 27 byte

lXHiq:"`@ymH@+X^1\+}8MXHx@h

Hãy thử trực tuyến! Hoặc xem màn hình đồ họa (mất một lúc; hết thời gian cho các đầu vào vượt quá khoảng 60).

Giải trình

l          % Push 1. This is the array that holds the sequence, initialized to
           % a single term. Will be extended with subsequent terms
XH         % Copy into clipboard H, which holds the latest result of the 
           % "accumulated" square root
iq:"       % Input n. Do the following n-1 times
  `        %   Do...while
    @      %     Push interaton index k, starting at 1. This is the candidate
           %     to being the next term of the sequence
    y      %     Push copy of array of terms found so far
    m      %     Ismbmer? True if k is in the array
    H      %     Push accumulated root
    @+     %     Add k
    X^     %     Square root
    1\     %     Modulo 1. This gives 0 if k gives an integer square root
    +      %     Add. Gives nonzero if k is in the array or doesn't give an
           %     integer square root; that is, if k is invalid.
           %   The body of the do...while loop ends here. If the top of the
           %   stack is nonzero a new iteration will be run. If it is zero that
           %   means that the current k is a new term of the sequence
  }        %   Finally: this is executed after the last iteration, right before
           %   the loop is exited
    8M     %     Push latest result of the square root
    XH     %     Copy in clipboard K
    x      %     Delete
    @      %     Push current k
    h      %     Append to the array
           % End do...while (implicit)
           % Display (implicit)

3

Toán học, 104 byte

(s=f={i=1};Do[t=1;While[!IntegerQ[d=Sqrt[t+s[[i]]]]||!f~FreeQ~t,t++];f~(A=AppendTo)~t;s~A~d;i++,#-1];f)&  


Hãy thử trực tuyến!

Chuỗi các căn bậc hai cũng rất thú vị ...
và đưa ra một mô hình tương tự

1,2,2,3,3,4,3,5,3,6,4,4,5,4,6,5,5,6,6,7,4,7,5,7,6, 8.4,8,5,8,6,9,5,9,6,10,5,10,6,11,5,11,6,12,6,13,6,14,7,7, 8,7,9,7,10,7,11,7,12,7,13,7,14,8,8,9,8,10 ...

nhập mô tả hình ảnh ở đây

đây cũng là sự khác biệt của trình tự chính

nhập mô tả hình ảnh ở đây



2

JavaScript (ES7), 89 82 77 76 byte

i=>(g=k=>(s=(++n+k)**.5)%1||u[n]?g(k):i--?[u[n]=n,...g(s,n=0)]:[])(n=0,u=[])

Bản giới thiệu

Định dạng và nhận xét

i => (                             // given i = number of terms to compute
  u = [],                          // u = array of encountered values
  g = p =>                         // g = recursive function taking p = previous square root
    (s = (++n + p) ** .5) % 1      // increment n; if n + p is not a perfect square,
    || u[n] ?                      // or n was already used:
      g(p)                         //   do a recursive call with p unchanged
    :                              // else:
      i-- ?                        //   if there are other terms to compute:
        [u[n] = n, ...g(s, n = 0)] //     append n, set u[n] and call g() with p = s, n = 0
      :                            //   else:
        []                         //     stop recursion
  )(n = 0)                         // initial call to g() with n = p = 0


2

Husk , 21 byte

!¡oḟȯΛ±sFo√+Som:`-N;1

Hãy thử trực tuyến!

Làm sao?

!¡oḟȯΛ±sFo√+Som:`-N;1    Function that generates a list of prefixes of the sequence and indexes into it
                   ;1    The literal list [1]
 ¡                       Iterate the following function, collecting values in a list
  oḟȯΛ±sFo√+Som:`-N        This function takes a prefix of the sequence, l, and returns the next prefix.
                `-N      Get all the natural numbers that are not in l.
            Som:         Append l in front each of these numbers, generates all possible prefixes.
    ȯΛ±sFo√+               This predicate tests if sqrt(a(n) + sqrt(a(n-1) + sqrt(... + sqrt(a(1))))) is an integer.
        F                Fold from the left
         o√+             the composition of square root and plus
       s                 Convert to string
    ȯΛ±                  Are all the characters digits, (no '.')
  oḟ                     Find the first list in the list of possible prefixes that satisfies the above predicate
!                        Index into the list
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.