// scan tuple
let scan1 f = stdin.ReadLine() |> f
let scan2 f = stdin.ReadLine().Split() |> Array.map f |> (fun a -> (a.[0], a.[1]))
let scan3 f = stdin.ReadLine().Split() |> Array.map f |> (fun a -> (a.[0], a.[1], a.[2]))
let scan4 f = stdin.ReadLine().Split() |> Array.map f |> (fun a -> (a.[0], a.[1], a.[2], a.[3]))

// scan vec and matrix (using Array)
let scanVecH f = stdin.ReadLine().Split() |> Array.map f
let scanVecV f n = [| for i in 1..n -> stdin.ReadLine() |> f |]
let scanMatrix f n = [| for i in 1..n -> stdin.ReadLine().Split() |> Array.map f |]
let scanCharMatrix n = [| for i in 1..n -> stdin.ReadLine().ToCharArray() |]

(*
初期位置を含めて 全てが mod D で等しいことが必要十分条件。

そういうように入力が作成されているのだろう（さもなくば 1）。

全てが同値類の元なので、x - y は kで割り切れる

なので X - x1 と X - x2 でGCD Y を求め、それとGCDを求め、というように

GCDをfoldしていけば答えになる。ゼロになるときはスキップが必要か。

途中で 1 になったら打ち切りでよい。

*)

let rec gcd a b =
  if b > a 
  then gcd b a
  else match a % b with
       | 0 -> b
       | c -> gcd b c

let N, X = scan2 int
let xs = 
  scanVecH int
  |> Array.map (fun n -> abs (n - X))
  |> Array.filter ((<>) 0)

Array.fold gcd xs.[0] xs
|> printfn "%d"

