user: What is the c source code of the assembly code below?

```asm
<Fletcher_Powell_Davidon>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x78,%rsp
  mov    %rdi,0x20(%rsp)
  mov    %rsi,0x30(%rsp)
  mov    %rdx,0x38(%rsp)
  mov    %rcx,%r12
  mov    %r8,%r13
  movsd  %xmm0,0x40(%rsp)
  movsd  %xmm1,0x48(%rsp)
  movsd  %xmm2,0x50(%rsp)
  mov    %r9d,%ebx
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  lea    0x0(,%r9,8),%r14d
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,%rbp
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,0x10(%rsp)
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,%r15
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,0x18(%rsp)
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,0x28(%rsp)
  lea    0x1(%rbx),%edi
  imul   %ebx,%edi
  sar    %edi
  shl    $0x3,%edi
  call   <malloc@plt>
  mov    %rax,0x8(%rsp)
  test   %rax,%rax
  je     L4
  mov    %r13,%rsi
  mov    %r12,%rdi
  mov    0x30(%rsp),%rax
  call   *%rax
  mov    %ebx,%r14d
  mov    $0x0,%eax
  lea    0x60(%rsp),%rcx
  mov    %rcx,0x58(%rsp)
  mov    %r15,(%rsp)
  mov    %eax,%r15d
  jmp    L22
L55:
  mov    %ebx,%ecx
  mov    %r13,%rdx
  mov    0x8(%rsp),%rsi
  mov    0x10(%rsp),%rdi
  call   <Multiply_Sym_Matrix_by_Vector_ut@plt>
  mov    %r12,%rdi
  mov    0x20(%rsp),%rax
  call   *%rax
  mov    %ebx,%r9d
  movsd  0x50(%rsp),%xmm3
  movsd  0x48(%rsp),%xmm2
  movsd  0x40(%rsp),%xmm1
  mov    %rbp,%r8
  mov    0x10(%rsp),%rcx
  mov    0x58(%rsp),%rdx
  mov    %r12,%rsi
  mov    0x20(%rsp),%rdi
  call   <Minimize_Down_the_Line@plt>
  mov    %ebx,%ecx
  mov    %r12,%rdx
  mov    %rbp,%rsi
  mov    (%rsp),%rdi
  call   <Subtract_Vectors@plt>
  mov    %ebx,%edx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <Copy_Vector@plt>
  mov    %ebx,%edx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <Copy_Vector@plt>
  mov    %r13,%rsi
  mov    %r12,%rdi
  mov    0x30(%rsp),%rax
  call   *%rax
  mov    %ebx,%ecx
  mov    %rbp,%rdx
  mov    %r13,%rsi
  mov    0x18(%rsp),%rdi
  call   <Subtract_Vectors@plt>
  mov    %ebx,%r8d
  mov    0x28(%rsp),%rcx
  mov    0x18(%rsp),%rdx
  mov    (%rsp),%rsi
  mov    0x8(%rsp),%rdi
  call   <Update_H@plt>
  mov    %ebx,%ecx
  mov    %r15d,%edx
  mov    %r13,%rsi
  mov    (%rsp),%rdi
  mov    0x38(%rsp),%rax
  call   *%rax
  test   %eax,%eax
  jne    L21
L22:
  add    $0x1,%r15d
  add    $0x1,%r14d
  cmp    %r14d,%ebx
  jge    L55
  mov    %ebx,%esi
  mov    0x8(%rsp),%rdi
  call   <Identity_Matrix_ut@plt>
  mov    $0x1,%r14d
  jmp    L55
L21:
  mov    (%rsp),%r15
  mov    %eax,%ebx
L24:
  mov    0x28(%rsp),%rdi
  call   <free@plt>
  mov    0x8(%rsp),%rdi
  call   <free@plt>
  mov    0x18(%rsp),%rdi
  call   <free@plt>
  mov    %r15,%rdi
  call   <free@plt>
  mov    0x10(%rsp),%rdi
  call   <free@plt>
  mov    %rbp,%rdi
  call   <free@plt>
  mov    0x68(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L16
  mov    %ebx,%eax
  add    $0x78,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L4:
  mov    $0xffffffff,%ebx
  jmp    L24
L16:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int Fletcher_Powell_Davidon(double (*f)(double *), void (*df)(double *, double *), int (*Stopping_Rule)(double *, double *, int, int), double *a, double *dfa, double line_search_cutoff, double line_search_cutoff_scale_factor, double line_search_tolerance, int n) {
  double *x;
  double *dx;
  double *dg;
  double *H;
  double *Hg;
  double *v;
  double p;
  int iteration = 0;
  int count_between_resets = n;
  int err = 0;
  x = (double *)malloc(n * sizeof(double));
  v = (double *)malloc(n * sizeof(double));
  dx = (double *)malloc(n * sizeof(double));
  dg = (double *)malloc(n * sizeof(double));
  Hg = (double *)malloc(n * sizeof(double));
  H = (double *)malloc(((n * (n + 1)) >> 1) * sizeof(double));
  if (H == 0)
    err = -1;
  else {
    df(a, dfa);
    do {
      iteration++;
      count_between_resets++;
      if (count_between_resets > n) {
        Identity_Matrix_ut(H, n);
        count_between_resets = 1;
      }
      Multiply_Sym_Matrix_by_Vector_ut(v, H, dfa, n);
      Minimize_Down_the_Line(f, a, f(a), &p, v, x, line_search_cutoff, line_search_cutoff_scale_factor, line_search_tolerance, n);
      Subtract_Vectors(dx, x, a, n);
      Copy_Vector(a, x, n);
      Copy_Vector(x, dfa, n);
      df(a, dfa);
      Subtract_Vectors(dg, dfa, x, n);
      Update_H(H, dx, dg, Hg, n);
      err = Stopping_Rule(dx, dfa, iteration, n);
    } while (!err);
  }
  free(Hg);
  free(H);
  free(dg);
  free(dx);
  free(v);
  free(x);
  return err;
}
```