code: def randn(*sizes, device=None):
      """
      Returns a tensor with normally distributed elements. Samples are
      generated using the Box-Muller transform with optimizations for
      numerical precision and MPC efficiency.
      """
      u = crypten.rand(*sizes, device=device).flatten()
      odd_numel = u.numel() % 2 == 1
      if odd_numel:
          u = crypten.cat([u, crypten.rand((1,), device=device)])
  
      n = u.numel() // 2
      u1 = u[:n]
      u2 = u[n:]
  
      # Radius = sqrt(- 2 * log(u1))
      r2 = -2 * u1.log(input_in_01=True)
      r = r2.sqrt()
  
      # Theta = cos(2 * pi * u2) or sin(2 * pi * u2)
      cos, sin = u2.sub(0.5).mul(6.28318531).cossin()
  
      # Generating 2 independent normal random variables using
      x = r.mul(sin)
      y = r.mul(cos)
      z = crypten.cat([x, y])
  
      if odd_numel:
          z = z[1:]
  
      return z.view(*sizes)
  
imports: import crypten
  import torch
label_desc: Use image node_id 1 for calling a global function with example usage: randn() and returns: z